From 7c9217d1979cb62892e5ba414550f57b7f350a96 Mon Sep 17 00:00:00 2001 From: 34BFF76918A9449ABAB323149DDCEA73 Date: Thu, 13 Aug 2026 11:38:46 +0800 Subject: [PATCH] 5D3420315FA54219AB2427B0C674AD66auto --- Project.pro | 2 +- build_seq.py | 181 +++-------- codes/Main.py | 166 ++++------ codes/__pycache__/GlobalFun.cpython-38.pyc | Bin 0 -> 136 bytes codes/__pycache__/Main.cpython-38.pyc | Bin 0 -> 4214 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 179 -> 164 bytes .../apa_browser_adapter.cpython-38.pyc | Bin 7840 -> 10437 bytes .../callback_client.cpython-38.pyc | Bin 3235 -> 3233 bytes .../contract_create_node.cpython-38.pyc | Bin 7155 -> 10576 bytes .../__pycache__/contract_draft.cpython-38.pyc | Bin 3632 -> 3878 bytes .../contract_flow_steps.cpython-38.pyc | Bin 10339 -> 14241 bytes .../diag_template_click.cpython-38.pyc | Bin 0 -> 2684 bytes .../__pycache__/errors.cpython-38.pyc | Bin 0 -> 1499 bytes .../__pycache__/pdf_utils.cpython-38.pyc | Bin 1191 -> 1176 bytes .../verify_selenium_fill.cpython-38.pyc | Bin 0 -> 5715 bytes .../yisaiqi_adapter_template.cpython-38.pyc | Bin 3108 -> 4193 bytes codes/rpa_yisaiqi/apa_browser_adapter.py | 104 +++++- codes/rpa_yisaiqi/contract_create_node.py | 302 +++++++++++++----- codes/rpa_yisaiqi/contract_draft.py | 6 +- codes/rpa_yisaiqi/contract_flow_steps.py | 197 ++++++++++-- codes/rpa_yisaiqi/errors.py | 42 +++ .../examples/contract_draft_yyc.json | 6 +- codes/rpa_yisaiqi/requirements.txt | 3 + codes/rpa_yisaiqi/yisaiqi_adapter_template.py | 16 + 24 files changed, 658 insertions(+), 367 deletions(-) create mode 100644 codes/__pycache__/GlobalFun.cpython-38.pyc create mode 100644 codes/__pycache__/Main.cpython-38.pyc create mode 100644 codes/rpa_yisaiqi/__pycache__/diag_template_click.cpython-38.pyc create mode 100644 codes/rpa_yisaiqi/__pycache__/errors.cpython-38.pyc create mode 100644 codes/rpa_yisaiqi/__pycache__/verify_selenium_fill.cpython-38.pyc create mode 100644 codes/rpa_yisaiqi/errors.py diff --git a/Project.pro b/Project.pro index df171da..e056416 100644 --- a/Project.pro +++ b/Project.pro @@ -5,7 +5,7 @@ "ProInfo": { "CodeCustomCount": "0", "ProAbsolutePath": "D:/RPA/AutoRpa", - "ProChange": "2026/08/13 10:38:45", + "ProChange": "2026/08/13 11:38:45", "ProColorRef": "4", "ProCreate": "2026/08/12 10:13:31", "ProDesc": "", diff --git a/build_seq.py b/build_seq.py index 0097384..df30794 100644 --- a/build_seq.py +++ b/build_seq.py @@ -1,6 +1,6 @@ # coding=utf-8 """ -构建 Main.seq - 合同建单流程(Chrome浏览器版本) +构建 Main.seq - 合同建单流程(输入驱动 + 状态中心回调版本) """ import json import base64 @@ -11,150 +11,67 @@ def b64_apa(val): def b64_raw(val): return base64.b64encode(str(val).encode()).decode() -s01_body = """\ -import sys, os, json, time +# 单节点代码块:读取入参(input_arg / -c params / JSON 文件)→ 调用 run_contract_create +# run_contract_create 内部完成 start/complete/fail 回调、Selenium 起草与合同编号读取。 +body = """\ +import sys, os, json from pathlib import Path _CODES_DIR = Path(r'd:\\RPA\\AutoRpa\\codes') if str(_CODES_DIR) not in sys.path: sys.path.insert(0, str(_CODES_DIR)) -from rpa_yisaiqi.contract_flow_steps import ContractFlowContext, ContractGoodsLine - -print("=" * 60) -print("合同建单 CONTRACT_CREATE - 初始化") -print("=" * 60) - -self._ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", password="1", - supplier_name="测试供应商", - order_date="2026-08-12", - source_type="YYC", template_type="NON_FORMAT", - template_name="非格式--采购协议", - customer_code="CUST-001", customer_name="测试供应商", - contract_category="采购协议", settlement_type="付款", - contract_background="自动化测试合同起草", contract_nature="主合同", - amount_currency="人民币", amount="50000.00", - contract_end_date="2026-12-31", - is_major_contract="否", is_prepayment="否", - belong_year="2026", payment_method="账期支付", - payment_days="30", contract_status="正式合同", - contains_blood_products="否", - submit_mode="dry_run", - goods_lines=[ - ContractGoodsLine( - operation_code="ADD", goods_code="YP-001", - goods_name="测试药品A", approval_no="国药准字H00000001", - spec="50mg*30片", unit="盒", quantity=10.0, - ), - ], - merged_pdf_path=None, +from rpa_yisaiqi.contract_create_node import ( + ContractCreateError, load_input_data, run_contract_create, ) -print(f"[OK] 上下文就绪: source={self._ctx.source_type}") -print(f"[OK] 模板: {self._ctx.template_name}") -print(f"[OK] 货品行数: {len(self._ctx.goods_lines)}") -""" +def _first(*values): + for value in values: + if value is not None and str(value).strip(): + return str(value).strip() + return "" -s02_body = """\ -from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter - -print("[S02] 启动 Chrome + 打开合同系统...") -print(f" URL: {self._ctx.contract_url}") -adapter = ApaBrowserAdapter(url=self._ctx.contract_url) -adapter.open_url(self._ctx.contract_url) -self._adapter = adapter -print("[OK] Chrome 已打开并导航到合同系统") -""" - -s03_body = """\ -from rpa_yisaiqi.contract_flow_steps import login_contract_system, enter_contract_create - -adapter = self._adapter -print("[S03] 登录合同系统...") -login_contract_system(adapter, self._ctx) -print("[OK] 登录完成") -print("[S04] 进入合同起草...") -enter_contract_create(adapter) -print("[OK] 已进入合同起草页面") -""" - -s04_body = """\ -from rpa_yisaiqi.contract_flow_steps import select_contract_template, fill_contract_signatory_info - -adapter = self._adapter - -print("[S05] 选择合同模板...") -select_contract_template(adapter, self._ctx) -print(f"[OK] 模板: {self._ctx.template_name}") -print("[S06] 填写签约方信息...") -fill_contract_signatory_info(adapter, self._ctx) -print(f"[OK] 签约方: {self._ctx.customer_name}") -""" - -s05_body = """\ -from rpa_yisaiqi.contract_flow_steps import fill_contract_basic_info, fill_contract_amount_and_dates - -adapter = self._adapter - -print("[S07] 填写基础表单...") -fill_contract_basic_info(adapter, self._ctx) -print(f"[OK] 类别={self._ctx.contract_category}, 结算={self._ctx.settlement_type}") -print("[S08] 填写金额与日期...") -fill_contract_amount_and_dates(adapter, self._ctx) -print(f"[OK] 金额={self._ctx.amount}, 结束日期={self._ctx.contract_end_date}") -""" - -s06_body = """\ -from rpa_yisaiqi.contract_flow_steps import ( - fill_contract_goods_lines, fill_contract_payment_info, - upload_contract_document_if_needed, submit_contract_for_approval, - read_contract_number -) - -adapter = self._adapter - -print("[S09] 填写货品明细...") -fill_contract_goods_lines(adapter, self._ctx) -print(f"[OK] 货品: {len(self._ctx.goods_lines)} 行") -print("[S10] 填写付款信息...") -fill_contract_payment_info(adapter, self._ctx) -print(f"[OK] 付款方式={self._ctx.payment_method}") - -if self._ctx.source_type == "YYC": - print("[S11] 合并PDF [YYC专属]... (单PDF, 跳过合并)") - print("[S12] 上传PDF附件 [YYC专属]... (dry_run 跳过)") - -print() -print("[S13] 提交审批...") -if not submit_contract_for_approval(adapter, self._ctx): - print("[DRY-RUN] 演练模式,跳过实际提交") - print("=" * 60) - print("合同建单流程演练完成") - print("=" * 60) +raw = (self.input_arg or "").strip() +if raw: + data = load_input_data(raw) +elif isinstance(params, dict) and params: + nested = params.get("inputJson") or params.get("inputArg") or params.get("input") + data = load_input_data(str(nested)) if nested else dict(params) else: - print("[S14] 读取合同编号...") - contract_no = read_contract_number(adapter) - print(f"[OK] 合同编号: {contract_no}") - print("=" * 60) - print(f"[COMPLETED] 合同创建成功: {contract_no}") - print("=" * 60) + raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径,或通过 -c/--params 传入参数") + +state_center_url = _first( + data.get("stateCenterUrl"), data.get("stateCenterURL"), + os.getenv("STATE_CENTER_URL"), params.get("stateCenterUrl"), + "http://127.0.0.1:8000", +) +agent_token = _first( + data.get("agentToken"), os.getenv("AGENT_TOKEN"), + params.get("agentToken"), "dev-agent-token", +) + +print("=" * 60) +print("合同建单 CONTRACT_CREATE - 开始") +print("jobId=%s sourceType=%s submitMode=%s" % ( + data.get("jobId"), data.get("sourceType"), data.get("submitMode"))) +print("=" * 60) + +result = run_contract_create( + data, + state_center_url=state_center_url, + agent_token=agent_token, +) +print(json.dumps(result, ensure_ascii=False)) """ steps = [ - ("S01 初始化 & 上下文构建", s01_body, "设置环境变量并构建YYC测试上下文"), - ("S02 启动Chrome", s02_body, "Selenium打开Chrome浏览器并导航到合同系统"), - ("S03-S04 登录 & 进入起草", s03_body, "登录系统并进入合同起草页面"), - ("S05-S06 模板选择 & 签约方", s04_body, "选择模板并填写签约方信息"), - ("S07-S08 基础表单 & 金额日期", s05_body, "填写合同类别、金额、日期"), - ("S09-S15 货品/付款/提交", s06_body, "填写货品明细、付款信息并提交"), + ("读取入参并执行合同建单", body, "读取艺赛旗入参并执行 CONTRACT_CREATE(含状态中心回调)"), ] nodes = [] lines = [] -begin_tag = "20260812100000" +begin_tag = "20260813100000" nodes.append({ "NodePanelData": { "ExpandedGroups": [], "InputProperty": {"mouse_x": 0, "mouse_y": 0}, @@ -174,12 +91,12 @@ start_x = 500 start_y = 200 space_y = 120 -for i, (title, body, note) in enumerate(steps): - tag = f"20260812{200000 + i:06d}" +for i, (title, body_text, note) in enumerate(steps): + tag = f"20260813{200000 + i:06d}" py = start_y + i * space_y pimport_b64 = b64_raw("") - pbody_b64 = b64_raw(body) + pbody_b64 = b64_raw(body_text) props = { "EP_CONTROL": { @@ -218,9 +135,9 @@ for i, (title, body, note) in enumerate(steps): "LineStart": { "Pidx": f"{prev_tag}/EPin_Flow_Out", "Px": str(start_x - 100) if i > 0 else "415", - "Py": str(start_y + 30) if i == 0 else str(start_y + (i-1) * space_y + 30) + "Py": str(start_y + 30) if i == 0 else str(start_y + (i - 1) * space_y + 30) }, - "LineTag": f"20260812{300000 + i:06d}" + "LineTag": f"20260813{300000 + i:06d}" }) prev_tag = tag diff --git a/codes/Main.py b/codes/Main.py index 46adf91..a50b3db 100644 --- a/codes/Main.py +++ b/codes/Main.py @@ -40,124 +40,66 @@ class AutoRpa: self.input_arg = iinput.load_init(__file__) if self.input_arg is None: sys.exit(0) - - def Main(self): - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200000,Title:插入代码块#1,Note:设置环境变量并构建YYC测试上下文') - import sys, os, json, time + + def _resolve_input_data(self, params): + """优先 input_arg(JSON 字符串或文件路径),其次 -c 传入的 params 字典。""" + from rpa_yisaiqi.contract_create_node import ContractCreateError, load_input_data + raw = (self.input_arg or "").strip() + if raw: + return load_input_data(raw) + if isinstance(params, dict) and params: + nested = params.get("inputJson") or params.get("inputArg") or params.get("input") + if nested: + return load_input_data(str(nested)) + return dict(params) + raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径,或通过 -c/--params 传入参数") + + @staticmethod + def _first(*values): + for value in values: + if value is not None and str(value).strip(): + return str(value).strip() + return "" + + def Main(self, **params): + self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260813000000,Title:合同建单,Note:读取入参并执行 CONTRACT_CREATE') + import sys, os, json from pathlib import Path _CODES_DIR = Path(r'd:\RPA\AutoRpa\codes') if str(_CODES_DIR) not in sys.path: sys.path.insert(0, str(_CODES_DIR)) - from rpa_yisaiqi.contract_flow_steps import ContractFlowContext, ContractGoodsLine - print("=" * 60) - print("合同建单 CONTRACT_CREATE - 初始化") - print("=" * 60) - self._ctx = ContractFlowContext( - contract_url="http://contract-test.gzmpc.com:8080/", - username="test002", password="1", - supplier_name="测试供应商", - order_date="2026-08-12", - source_type="YYC", template_type="NON_FORMAT", - template_name="非格式--采购协议", - customer_code="CUST-001", customer_name="测试供应商", - contract_category="采购协议", settlement_type="付款", - contract_background="自动化测试合同起草", contract_nature="主合同", - amount_currency="人民币", amount="50000.00", - contract_end_date="2026-12-31", - is_major_contract="否", is_prepayment="否", - belong_year="2026", payment_method="账期支付", - payment_days="30", contract_status="正式合同", - contains_blood_products="否", - submit_mode="dry_run", - goods_lines=[ - ContractGoodsLine( - operation_code="ADD", goods_code="YP-001", - goods_name="测试药品A", approval_no="国药准字H00000001", - spec="50mg*30片", unit="盒", quantity=10.0, - ), - ], - merged_pdf_path=None, + + from rpa_yisaiqi.contract_create_node import run_contract_create + + data = self._resolve_input_data(params) + state_center_url = self._first( + data.get("stateCenterUrl"), + data.get("stateCenterURL"), + os.getenv("STATE_CENTER_URL"), + params.get("stateCenterUrl"), + "http://127.0.0.1:8000", ) - print(f"[OK] 上下文就绪: source={self._ctx.source_type}") - print(f"[OK] 模板: {self._ctx.template_name}") - print(f"[OK] 货品行数: {len(self._ctx.goods_lines)}") - - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200001,Title:插入代码块#1,Note:Selenium打开Chrome浏览器并导航到合同系统') - from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter - print("[S02] 启动 Chrome + 打开合同系统...") - print(f" URL: {self._ctx.contract_url}") - adapter = ApaBrowserAdapter(url=self._ctx.contract_url) - adapter.open_url(self._ctx.contract_url) - self._adapter = adapter - print("[OK] Chrome 已打开并导航到合同系统") - - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200002,Title:插入代码块#1,Note:登录系统并进入合同起草页面') - from rpa_yisaiqi.contract_flow_steps import login_contract_system, enter_contract_create - adapter = self._adapter - print("[S03] 登录合同系统...") - login_contract_system(adapter, self._ctx) - print("[OK] 登录完成") - print("[S04] 进入合同起草...") - enter_contract_create(adapter) - print("[OK] 已进入合同起草页面") - - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200003,Title:插入代码块#1,Note:选择模板并填写签约方信息') - from rpa_yisaiqi.contract_flow_steps import select_contract_template, fill_contract_signatory_info - adapter = self._adapter - print("[S05] 选择合同模板...") - select_contract_template(adapter, self._ctx) - print(f"[OK] 模板: {self._ctx.template_name}") - print("[S06] 填写签约方信息...") - fill_contract_signatory_info(adapter, self._ctx) - print(f"[OK] 签约方: {self._ctx.customer_name}") - - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200004,Title:插入代码块#1,Note:填写合同类别、金额、日期') - from rpa_yisaiqi.contract_flow_steps import fill_contract_basic_info, fill_contract_amount_and_dates - adapter = self._adapter - print("[S07] 填写基础表单...") - fill_contract_basic_info(adapter, self._ctx) - print(f"[OK] 类别={self._ctx.contract_category}, 结算={self._ctx.settlement_type}") - print("[S08] 填写金额与日期...") - fill_contract_amount_and_dates(adapter, self._ctx) - print(f"[OK] 金额={self._ctx.amount}, 结束日期={self._ctx.contract_end_date}") - - #插入代码块#1 - self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200005,Title:插入代码块#1,Note:填写货品明细、付款信息并提交') - from rpa_yisaiqi.contract_flow_steps import ( - fill_contract_goods_lines, fill_contract_payment_info, - upload_contract_document_if_needed, submit_contract_for_approval, - read_contract_number + agent_token = self._first( + data.get("agentToken"), + os.getenv("AGENT_TOKEN"), + params.get("agentToken"), + "dev-agent-token", ) - adapter = self._adapter - print("[S09] 填写货品明细...") - fill_contract_goods_lines(adapter, self._ctx) - print(f"[OK] 货品: {len(self._ctx.goods_lines)} 行") - print("[S10] 填写付款信息...") - fill_contract_payment_info(adapter, self._ctx) - print(f"[OK] 付款方式={self._ctx.payment_method}") - if self._ctx.source_type == "YYC": - print("[S11] 合并PDF [YYC专属]... (单PDF, 跳过合并)") - print("[S12] 上传PDF附件 [YYC专属]... (dry_run 跳过)") - print() - print("[S13] 提交审批...") - if not submit_contract_for_approval(adapter, self._ctx): - print("[DRY-RUN] 演练模式,跳过实际提交") - print("=" * 60) - print("合同建单流程演练完成") - print("=" * 60) - else: - print("[S14] 读取合同编号...") - contract_no = read_contract_number(adapter) - print(f"[OK] 合同编号: {contract_no}") - print("=" * 60) - print(f"[COMPLETED] 合同创建成功: {contract_no}") - print("=" * 60) - + + print("=" * 60) + print("合同建单 CONTRACT_CREATE - 开始") + print("jobId=%s sourceType=%s submitMode=%s" % ( + data.get("jobId"), data.get("sourceType"), data.get("submitMode"))) + print("=" * 60) + + result = run_contract_create( + data, + state_center_url=state_center_url, + agent_token=agent_token, + ) + print(json.dumps(result, ensure_ascii=False)) + return result + if __name__ == '__main__': ILog.begin_init() diff --git a/codes/__pycache__/GlobalFun.cpython-38.pyc b/codes/__pycache__/GlobalFun.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7afa54c98ab11cfdac78674d7facedfe76c1f3f GIT binary patch literal 136 zcmWIL<>g`kf@^{`S$lx=V-N=!FabFZKwQiNBvKht7_ym)I8qpc88n%0am2^xCT8Zv z$NOnAf;f4JxvBB-D;bKIfoj3TFQMf8l+fZl literal 0 HcmV?d00001 diff --git a/codes/__pycache__/Main.cpython-38.pyc b/codes/__pycache__/Main.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de021abf0c96e667a14f4a9b8cdfbd633879511c GIT binary patch literal 4214 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 literal 0 HcmV?d00001 diff --git a/codes/rpa_yisaiqi/__pycache__/__init__.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/__init__.cpython-38.pyc index 822817f4fb3e0b47677e2227ef7708ecdd541b63..8bc89394eb6102b0e7fed4dcc60a11c5978d46a3 100644 GIT binary patch delta 56 zcmdnYxP);+v7u~oeoAVweo;YUd}U^FVrF5cetdjpUS>&ryk0@&Ee@O9{FKt1R69ln K28Pc-%m4sQSrX3x delta 44 zcmZ3&xS4T6v64=TRZLKTV~k^INq$g4VoY*=N@{UTQ9)vSWoB_=W?^Q`#5OqqWaki) diff --git a/codes/rpa_yisaiqi/__pycache__/apa_browser_adapter.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/apa_browser_adapter.cpython-38.pyc index 6b60130b2dd13bf1a127081cd6c6fb12681f5096..e056e1b9658822a2999f1a1cc4bd152ef694a2f6 100644 GIT binary patch delta 4118 zcma)9U2s#!6~4Q=y85v!3(1mg*_dnoEE%xPf8rkq7()XIDVSgoxT?@zu&^wdz1PHX zuTYZar|tA7ot^1JaT>W#C7repOs7B7CnoJfrw??R2S)8=`p`*AL#C5Ark$3avyyDd zkeObO&fPtG_UzqrzVqYK=xffK9j)NZE14u(%6GamqdLN{IKh8!b&R!rvJDOg9y$T+{Bi z3HRHC`NXTPu=v2Wr3efkQSfhZ#8$4lN^aY6)x(-??WV%K?>Lre$;(=nNx^Nq`GXaS zCfmJCClyUOuS_VDN-m-*wmRblZE8i^c_l~BDX+mgzHL%+vcNKd_2Y27#?&`xhf>m* z_=c-V&C5iG8#KH?*8 zhnKX&JK*riHzh$5ppO8=`mR1zftqKO^8H-c@jF|JCla_Qf8@xE^>$%{{X zd&t0Tz4;H6+!CL*bT;2|NLQDsk>xu@IIx9SVmL6a?F0>cK)f0FjO-K(>vr$x2S(YM z&KfCR_LxSFC1;G6O}+=&p7DjWF=u7+Io^l+_KSP#wst**L)26DW>cn>G&s-mvcrUv z_K9e)hrA_5g3oJGY(RV`c&GR=2*dN&gNv={Y$iREyqw{trC&~EvIZN{`4B9|-Mj-{ z9KVNaNOmJRfaD;OQ6$d*iEHv|Tpn-;xrdSLLxN!Dm<}og@m+2bcSB8NNu)YL;-8`I z#WV$O?ZL2EiGuIL#8yhmGT@yNMzds=7ATCBg2N_9lqptF7Y9MYVXJ_7r%eIz>Q@21 zwsV=3G~8!Fj4;PCA%J__IiaYE<(cvF8$>B+5J$y;trZ-T0R10o*SaQ^y{KNhp`8QH zwXSpUv%E~T31HG`J8mlPzyYs8E`zw&PI5?XN}QB^htlYlv1x=J9|z`QC(F-Y${NYf zw{VlRFirG|e|e+Dl+=(+S5zDW6|1&S`0AA8&b>v;gTTBuUq@E zKNfe}BE7A|OWc5Wm2{EC&4=bvhk5=b)8L0#YR)ovfAzaWptTPGKioP%$a7*Qtdr-( zH^XCORNM`B3?IkKoIvs%kOUnc02yjK5nkT{Xw`wl0U()1 zkn{mc+yD}F4LD)|ju8zz`$cG=#UnGyPvI3HvX!?lg2{E zw9F4c+6(}}tJf~=$1CfPU%7FsNJXOLp|B%*@ebhT+cNDynki_DyKIN8LE2GmiiyT@ zLaCG~2V`8f23*Q7POe}J3UDhVAvfF`@(2D^%dS%LRHQ#g#}6v#?3z$yN}`aAC?=yx zNK#dWe-VF*#EV`?RhY0eTWv^Ku9bwPO~CEa7JnK{G2eq$k@IRL_-N_9`>%ZcZ@>J> z$2WiaQR%Jw%fA}Z7sCxAjm4sp%J>VQh@XWF3%N_2Z|l0WQZCAoWM#X-WMC&}Q&xJ~ zFl8Aj`>Tt|>zP#Ys#z&3?mFMfGIN#qEqhjZv;DB?8XHRzby=ugqhxn->PBhBKG-n33(T8R6L+GZyroQ9U=G z&Bpbw=sIr8!!8iY%NlQ9SSvp@tn1vc=6Mbz59+aeKjz3W=y))t*tQOgB5-in+Z*q< zcxE;h*N0#-T&QlukGP)7&Kr$F!yIGyXxv#>>tn!?jfZp+EXi1tW=DS{G&9XJb5_D# zyA&4rcwO}INf3JoKhqCHA(YZb)a{1`%1;(!;)Ossgdki439+epw;RhVJ(*I(?dGXs z)gBGT!Oy=iHSE>v9;h064DFZ!(ZOMOjp)_A{aGV-#hM1*wrybUhHa<;cUiD2RY+Ssk_Kcf7!xZAFukUgZUE?*;!bCr!oMY- zc8qe4gI8Tdh>$~YF5hvCkX?+&f;)GXUQhBFXTHjy9#-IC; zM3CTlWk)7wRhq*=cMuN_-5Yg8i8p1^2CMpd$-5qXEa5&%$go5EfOQ5CI*Xj>=gHafVg8o*&-^H<; O2XJIj#Q`zfz59Qqgt?CZ delta 1870 zcmZuxUu;uV7{A}W?d|Q~bzQr)&~072e|NaivB_{Swy_N`2*L&#HihM;=MKucww~J| zEVn`gAB-_kk1-^Sr1iyD;~q#fJV3&W@c|7Fqz}Z9_@FUBG%@<5-?^Q-$nMSko%8+w z&Ue1=-ak?J8MaviNBtG)}9C(V9E~J16DUm=*BK^z-?J&UlVD<{xsoQjg z_(*h3BCVwDx;@pPdvqIeLda<+vFo;!e}mJ3oH$7!r;#K%5A`~c*G0O~E`U_e8jxP1 zqDGS??OPMc4)PMxLE@Ve)WKTgWKlan3vU@Zog^B2UHm#eGCi7}JwBP9TqzZ1i&{EU zAi9yJMQ!17*3hzVX4C7f(sv@H*faZI5Ms~d2-KL<@pgj;kEY-^g`e>&uumQ5MfwMO zs)X4#rTZ-X9R&UouPNUYNW(3utPnqaXbKk`6~&Y;I8CK0R$Qd93VD&(%1+ZspZ_a$ zo6f2z3vUQ>!aIn0@w8w<#ZCfM_z>tY`%+0nnk>)3TT)e=t4l+cw1`P0#+o-vNs9?f zGFpCR+ACfXHlZq(U8c+8xGKJ?kQU4CvP>eT8?)WUjyc<#BHWwty%l%6<@pJ_>g<5% z`e)AF;9gbY>Y1Griv@a+J#y_2M|uZ#jH{!WLcXMB^G3QiZZYC)kNdVOC7+{(m7<|~ z*q`n}`BG6Uo!`ZJJ;|N}SU;1fO21~v$?4?OP%no(7?Q9CX) z#G!?Cdb?qX9q|ss!1`71w<4(QsDHaxm8cUHYNDQ_NtR3m*?ay*D6*UW89B)<2iV8U*=ox ztLDmSMrlE(v_NZ;ff0w;YM=wIv9-Wa*-{%|&jR|%KAN=8D?KMx-d9@-j_PjF)j6`{(90*IJ{Ww9*bUMSm4 zm=?~QE!$W7P(w29RVd4*WXji|Vl%}mfKakmWFqn1Jh#WOun8r{l8asfq3i%*)o(h= zwt2QA8U=-=BatZz7*K_pJg4XMOo{GBay5jvgT$7Fch(F4D(cbKIP|k`qS4W$GFl9X(kh0;yr=QCk_RyxUP#@Zbe_n zYs)$Y{vxryY@Lzc>}nI$HL_*-Rvh)g>pTe4y&6nzrhiaGb*&hm#!6u#w)5Bp(q4Y@*+;L=6%+*WUI1v}x~Z?NBENYt^f*)kSeAC?dE>K|&!ElghbNb9NBi+D$}C zHYtJ#f}7G$;8&39;Oy+?Dkeot$dmW^y$QVc`MbQ^a9v9g>pgvOd^>Op;Av25Aey4F zwwhNEq;cxd^pX1KnQeubB+*w$f_gm-`NAz?3%7eJ$`VIxcc_viN%eI!MIcF&4Dp5< z@kv%Bx#!mh;LRR(2#o@E(!%Fq)Cy0-V05GIYXFVDVm`<%iGdz<2F1mS67v!j{$hB1 z!MKjgKC24d0~HRa0ls8t4 zq(#8CWYhbHFRQY^fjE&Wpn!=pQT~Ozj_F`fB!@!ty4lza+#_jG| mmr;zF{Lj|;n>{B+{jsZhK?J<)lt7s`oej$YP=iLY4)tG%b6WfW delta 399 zcmX|*y-UMD7{+r++I+WZn_4>5!O1Gp)>ywlp=ePNL@EUdfg|)%sY~jm9mGXw|ABIj zT~rVqrIY>-Iyq%kaC3F_u7h{n@80Km-WT56{C(bN8ivZz^YVFhels!(;BmCrY&c0j z?(4pJ#{020pXZ#^9*1P43^}Cu>4D&6s8*3iwKm`#3+eP4V;&_?aws}kWTF&Gqs&-9 z7Rpj*<~e!*bN240+c>VdwSF&XbUn8fAU||**Mpax(Cb`u+zH`N1Q1QWV;0Dj=w44E zHtC0p3=0f4NlSNemf;ohDjflvDDoGG$dCM?txY=^HprV&1!W?ruDQ&ND#I#6nFQ+f zK_rG=+sAS06an66LFOM8t11+y^o2YH2c{a!w8XOv0!2~4b+WD?j3Z|6UF~vXU$6spz diff --git a/codes/rpa_yisaiqi/__pycache__/contract_create_node.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/contract_create_node.cpython-38.pyc index 2fd64e4980bfb42d50e8a9c340c46b0f8a7ac8b8..e421521a480ac15b1d8695a36fc4667bb9f17f20 100644 GIT binary patch literal 10576 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 literal 7155 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 diff --git a/codes/rpa_yisaiqi/__pycache__/contract_draft.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/contract_draft.cpython-38.pyc index 557d9eedb5b20569c85ed5ccd7ff7312c758f045..4282f76d62fc84edeaf7868874e405865972b38f 100644 GIT binary patch delta 774 zcmZuv&1(}u6rb57o9t$HiCQ%DOHe}GXpK@eme#hAmU<}FwkWbthGl0PR+>yYy8(sv zAnn0R1R3z+CA}!Uh?2jf{sFlN9z;ATDuN*RCbf+fXPNijypP|``^|ej_+r?)W12dG zHC@`gzhb?ymN1@gyLb#|{ZoFHo@rudkmmdtElePqUq<%%c1yXX9P5~jQ=gL>BWpnz z*+b$>{8f%$0;pZYuYu}{pJzQr{jkXEE_oP)Zm=E{#oNRHz9K#)u3|$BtBncUPl=_@&x-OngrF>8By7j1UgD+p|fAr>L@x zHc$)Ea}~6s%%Cky?PfpRy|Cb6$URsJ7#Y~hvi2Dm6)0PIBHpFw#d?jVws3?ua7&>Y z#XHL3N#8%wbW?k(tj7V@5R2O4l#{H|Y8l#fv_>t6Zu7wNZOyS*-REu;uo|=gLA}Bl z4UgD0x9U4$Pa8PtqyXbjOoEWQL=hjg-1s4<`=sa-l6Q|)>ywi7FbhI8lL9l=g@eM;qifz*mGF$_#{6L;t2)V%i)n z;Jy#tsGaE~38Bm*#L)>^ZA1<36T;=Y@^KK3cy3;X@!B)(Ob@+lm4s^LV?&w5Z#)6E Aj{pDw delta 587 zcmY*WPiqrF6yG;(cg>g#K|-+@1rHL(+7t^-YpBIgL8PEH!CQ0~cGI%b?rdi_LTNpD z@YF+@yGOx`X!8Lo6ngUu%(0h#14U8rO`x`&;r-?}Z{Gj;c;iczy(pEahwBKoUnixn ztPRi{NVpGvRO@*B&S0NBBZODYm9fvupFBN_wnO+m^QhTvue7?Yey-Z7?1n1pWnG<0 zu@z@B-i%R`*d=8a%G?KYI%b*+PuYVP| z84ozjn}_FqDq7dxK=n+woo|rdWvBJBSLq z!5-NhML%jj6rNA=z%rHgw9I3b2-k$AYf44g1)j)_o;7uP%?NsH?*9;U1LIq|upVc5 zs5a8YX}o6@1fPFp99 z(U0AOo8hVVqT^EzE|#PppstRREg*Q{Q~JX%64PQg%?iVqP=QM)Ln~gkfe?`jg|JkJ k)qdXBJt4Fkqi!Ntv&Zh?HytuwKFcy>4fBW9Mylnpe@D!Q8UO$Q diff --git a/codes/rpa_yisaiqi/__pycache__/contract_flow_steps.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/contract_flow_steps.cpython-38.pyc index 33559a1008f88d35f76584e05c6582a4c4a3f978..90e29db770e0fbbac9ef539e62c5f9edec61f542 100644 GIT binary patch literal 14241 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 BaJm2h diff --git a/codes/rpa_yisaiqi/__pycache__/diag_template_click.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/diag_template_click.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52b109bc501a8c88fbb8a0ae7aedaed16322670b GIT binary patch literal 2684 zcmbVO+jA3D7~kC_Omi#UxHS^v$6oc|7qAa;b@sH zvtn$~76Z8%H)Adr9*bIo^j&H}EN(7yEUg#PR^;Pi9OSUrisL9U$%+Y_D6K@1GRrbJ zR9c0ad?`_CL(wdYVl)#X+E6oSEsNS}v?2?*%QD(g94B&Xa%(4pjFq^x9uY|G2(aoA z?Pw)hMfK7;)P`1XjCq^UxnmS_3&kw%_v<}@c--apjCOVjd+TFj zbJorV?BpY`pIC;y?IGAtJ~sAj1NQbuVDF&Vh&#;mbUR1k9#`i+s$BZyhWQ%!I5fmez-qp9OFEy4=$yp2IJk|*)QeBZ`)6@znWXU5WScRNzzNFfR)x4?U zeKNsW!z%0^ku@7{&&#TQz(80#DChBRs4i%-4!H$kEN|Pe2=&53p2i8U<@=X#`zg|P z-~4~l2Z2v<+ke??4Q2^b>`-;nAwxQ4n#@TKw2aEhVKGWO)YrH3pCP7f+vA3XlEW_h zY_UTgQZ%qUwL7U9Syh)Z4k3n~9Ci{=J~-dS6HC`ZVDjw`4jWD~?Q92o-BkH(&O7&Y z<;oOax$Q-+0$&(#|>>dHrg2?xJ`0 z+QNlvyrQYf7%vEdvzEFVjZ3ZbljzQP@7(viH~VGf^zDWDOA95yiPNM8iw|78aJf1+ zm-bl)VEn6xA0QRi$X3>&_uL-p8y0*9-91hll&Xi-u~#)(mkMv8sKG8~&r~knxc~FV z_wU@QefrA-5cw^ZVOsdb=eTU~SmSr|jmXb0b6Z#;5CA`jEGBymM@Ooj-KVKQ^ANbY zdzObQ6A(;u1PzZ6{^>v-R}mRa?d;{1!jhX9=8|_5tJzVK+WDZ;(2l$T*B%+;`i|Z} zc1)1`p6nPFMht5}Rz|x=99Ufoy01|;CP^cz zh9yZ1@9jT4AU3_(e`w&~pxXq$D{K*Qi)G4ELA7P|9aWG)&IAKkl7k6s(QzY2_8;nh zdC+BLF=m)pmmEuTBesUIDYig)4KOU5h%5Z&2Z|dpEmbFCR6>?|99!UYEDM@Ulg0Rm zsv`+&{>+9g;0Ypbv_aQZCohcSOprupeBRK7Ou=gMc^rGQfAAHN!TcLpi&%{K#N6hA2?d+JoyG8P(gao@SF#mLHOY63)d?8> z@>jP41Kv(GG$(~rIV%wigBt#9NPa=VEV!{3VCXv}GZ~yAd=FSwlP418jYF|6CZeyH=oovw+O&2fAg!vb>(hk5KP^8G%=$8$X#_G94|hXu_)>{kT9O*jBJpb3DR z05{_x;Gl~GfI~P8IPBtPz%4ieIO5_UZq0ICZPrQnRV*##GL>6hWg%!7KR;>-`)_vh)`Ti8g)><}z8PT@hF5A%v2`xF5Kdn_mc+ysmQwT_sfn?&t1V?boF zEzA~ysTJyGqxWbmb4ja=69dKr`(#005Fz-uO+=w$g?{^V%@k#1ezvu7&yjz(or^o;R literal 0 HcmV?d00001 diff --git a/codes/rpa_yisaiqi/__pycache__/pdf_utils.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/pdf_utils.cpython-38.pyc index ad75b51ed34bce6fae2243f9f36ce429e62d6307..e956af7ef1a3ee71ab4c90a46380959ee8f88240 100644 GIT binary patch delta 37 tcmZ3^IfHYV*R3m#Q4h0;>66tO#R7!nIjpaCWo^G000Ot4V?f0 delta 52 zcmbQixtw#uZDu817ps_{0LK`|(vtk3g2b5Q{FKz(LX%dqGr!%>(yR+6^i^Y;w+}$PE zk!PTUSAq*|APF%KyD7v;OFYwt0yYVqX+QS|?5EDeD@&j9Dbs1bwCCKFWf@YBNmrx$ zIQN`$&)z-H`&vy+M1W`e%E5zwTP_G+;iUYjfXPqbZ~Yw_DiDE+R7#3OkR_=G(vVt8mZp}GWvS(4Ip9~26?!cVUKVMHhToFON?J)H zZwX`-t)kV?uh!Slnm&pBRbPEv0DNh`5Uq7O;Z>$Dj7?v@=6!Zm*{>({wBe+b_5;jJ z=}O_#v-$C3-ucts`Lo{Sgg1228~sCmbS!u4*!0*tU*9`TS-;Ah^w;;!PTd*GojX4@ z@%yjuo%!nMuL{6d=!lALeOpF*o|$i0I%}g^#@1Oh;x1`7(>BxM_MW8q29EV3wp%{~ z{HbYD>t!RYyGxU1!bq#}BDQMvTehBZm+C;lX2Ef$YqsvLut5B{JqriiOcGbt^cudRqo;(~YaYYHsA7ckkTh!l_gF&u@A|=klL@_HDTRwf&u& zW3iTRsu8Jd$q52rYVw2JAHQ@~!!Up9Q}69D@9ca2*1iJfZ{5xhopCA=_0FUZb1SyR z;3Ot3v5m5#BB=>$>~WMwwl8Ct|~L@Xn>)5xz+7^ zJ39BZwRfto?R%NY0Qy8=tDxh}w^2MWYYWS0YQJG=#vx=(EM`eP@ai{8(wylg(gdj;>_0 zN@HVG*`YKxr3}k5(uruJPcg{pQ0P9r-vY6_ii{dT7SPaLnyu|IS?WcIAwILFUigqj zn=vz}1JTB(ABBjY*8)jqVj@}}H{Y_odTCocjV>ndu*0tvwjpgUSPwrU$G9RfM{fCUm+4oK&_ zl?764r7dxN>kqeW?QLn<-nu{{s)N5uwlv3@LDe2f#pY0QkM;=4Hiww$3B$6%hSTQv zk(%%Q2%lrl-kcZ%;`iS95QNZ1Zj;@1Hu>y`jFXp$1rDetH3=|m3vid4*)C-i-IIS#@0d~$H~l71p~~C{5S+r$%aUD zTokdFioHJ6@D*&rLD-R2FakgSuxFRFPdGXL1 zNa`CNOz1CH4hCnq42J01!EiQMKJ%#=l}6I+d;W7ui(Y(!}Y6Q*D6iLtp91H zRJ}%>CxEo8Wy|(%C3ogs@7__Ldiu|k)05Y{yMLL!H0gbDQE6^&E?_q0z(s+e@TY6< zOWlgUoI8Eqd;6NR9$B>_tNi_8NT7UHejQU7y@gDi$LG>RvgPCE#zu2j?iY@p$-VOl z;PSevYb)~dVg5R2fq7?{2>uE%@)4aTl;Q_SiD}%)OVc;MoSwLmd+#o!R^GLV>CvN8 z_eXQb#yPKsxx9+G-^oi(GjiEB%cXGYH-+C_$-RFaDl1@=|NLVpkYM0fahw;Hf?eA= z3C}3~gb|ktn3Ot;N_+VkCnT3U7_JP2{nt^HfdF_jRu3?Sl_*<`%@S;on4z=`Ychs= z5ve5>tsK}ip9g&)JsXHF1er(5fi3f*KAet`%2FCeBD3iif_M8V*1*R3Sk7cE^S=;a zm1ipht@E*bIF@2K>~!Ji_P#{Iue`V)O8E8{_6&rI`ZOSQE4<>~p$ z<9DI%h^}xeG7!6LhL*@yVuK|Q2}8A=#^TtOF_CjCtfa1I7~bD8ylG$|Z16=G-X<^% zMGRvS!;1kPu1HArqn#@sw9K?yku)`GxfKRf%$6H~SnmcPa6;2>xw3u)GLkA1()=4P z5`c2f4f>&wZ3LdK*yoCe;TG@+l=QYvq2`U-j+TTTE~d;r5=fXf1Xf;`J{VZ#6x66m z;9_N<5yUY5q_7x-e}w;V=EHD~v+}+S0$9t$74iesqA2|RdfUw1B6sS@ag`$HA(1Tz+| z%XuZf;O|^g82-ge?}^r~s%0O6*Y!Nb2|oun0!~u@5h|R81-s18C>&^jlZ%M8QneVX Pkps0&;U~j;!s34cN_<56 literal 0 HcmV?d00001 diff --git a/codes/rpa_yisaiqi/__pycache__/yisaiqi_adapter_template.cpython-38.pyc b/codes/rpa_yisaiqi/__pycache__/yisaiqi_adapter_template.cpython-38.pyc index e9a8ba2a1bf368bba3a51a4788537f9811796a3a..e37f26ca3377509967b5c2e6ce5067d1c8782edf 100644 GIT binary patch delta 1107 zcmZuvO-vI(7-jmmZI><;X!$A7Z7E14Z9!sC55$A$MM(&7kZ3kbXNfD7h3zWPglHlN z#2-v1A~7{FN{kpm4PI1Y^rSbBCcT-sZSaBz@A}QQXsGNYZ~MJ@@9UdycBT3o&keX- z&JuXmJEt!Y_7!&@p$u6?T~}<_gq>*h(kcR zz=UuUglWe6q2_Q)UrD$%;~^id9&*m~xgru*u#}9cW1=u6Cq;Q&j%}PYcbm{Exn&(7 zXPq7WhvASX63RsUyr^pYDCm#!`r=J}?wvk+E%*B2_U634{z$)jee3E%_Qq=N**$&n zac*s4dvhV0YCA2C@tVS)k^4lsSLU&DX(%B@NW#h=QY)ad%Kn8?_?0QoD};DLj*ke# zvYOPYfKQqLN=&I1NbY3{8uHcp!&VKvT0=hB0?0?UY_Za?S>+54fRx$28HcN|nXwEhN`j90RCtes`us|EX)T{HyZl1G^F&`;*3(a;se?sxE%b{>lX6l^ zLQ-G*p5x^TLLo1tW7!E8qTw2M?}w4ffFzCpb{<4#O@0(6BM$#4KcwI(KD#uRO+SyO znu|iIl87Tz5z(YcjThsZd|B3}dQ>~~g4V_)i|(JJCV`p+YT6IVT>*>sNxS0+>1C!- zEBV6wL_GOmZ$hz+ti2xbLGTt|kJD&xd{!N#fen&w=Nl9vznu-J6Y4gXHy_P-m63in z7OkXhJQQjv_$bsJ`{#D1qA>4%79DmaRW1zkm2x|Bc&Jr3>CFFV+||KKbl1s4}b z6$Cd&e?tbvv77z@@!aC#x$waIT+Ykoe%9^^MmL#^M|g(o#jvA27&iddbPq>?gMbD~ zXs)7Y;r24tQ&3?ip~@zO>80FL|4fEW7ISR0jRDNFDWJ_}i+2EvD+xq3ZiM>id33b?f*S D(O^}* diff --git a/codes/rpa_yisaiqi/apa_browser_adapter.py b/codes/rpa_yisaiqi/apa_browser_adapter.py index 23971a2..e58d940 100644 --- a/codes/rpa_yisaiqi/apa_browser_adapter.py +++ b/codes/rpa_yisaiqi/apa_browser_adapter.py @@ -71,10 +71,14 @@ class ApaBrowserAdapter: return self._driver.find_element(By.XPATH, xpath) except NoSuchElementException: # Fallback: find the label's "for" attribute - xpath2 = f'//label[contains(text(),"{text_val}")]/@for' - for_id = self._driver.find_element(By.XPATH, xpath2).get_attribute("for") if False else None - if for_id: - return self._driver.find_element(By.ID, for_id) + try: + for_id = self._driver.find_element( + By.XPATH, f'//label[contains(text(),"{text_val}")]' + ).get_attribute("for") + if for_id: + return self._driver.find_element(By.ID, for_id) + except NoSuchElementException: + pass raise # 3. aria=xxx → aria-label 属性 @@ -87,9 +91,9 @@ class ApaBrowserAdapter: text_val = selector[6:].strip('"').strip("'") return self._driver.find_element(By.CSS_SELECTOR, f'[title="{text_val}"]') - # 5. :contains() → 转 XPath + # 5. :contains() → 转 XPath(支持 button:contains(文本) / a:contains("文本")) if ":contains(" in selector: - m = re.match(r'(.+?):contains\("(.+?)"\)', selector) + m = re.match(r'(.+?):contains\(["\']?(.+?)["\']?\)', selector) if m: tag_part, text_val = m.groups() xpath = f'//{tag_part}[contains(.,"{text_val}")]' @@ -164,6 +168,21 @@ class ApaBrowserAdapter: continue raise RuntimeError(f"click_first failed: {selectors}, last: {last_error}") + def double_click_first(self, selectors: list) -> None: + self._ensure_open() + from selenium.webdriver.common.action_chains import ActionChains + last_error = None + for sel in selectors: + try: + el = self._find(sel) + ActionChains(self._driver).double_click(el).perform() + time.sleep(0.5) + return + except Exception as e: + last_error = e + continue + raise RuntimeError(f"double_click_first failed: {selectors}, last: {last_error}") + def wait_for_text(self, text: str, timeout_seconds: int = 15) -> None: self._ensure_open() from selenium.webdriver.support.ui import WebDriverWait @@ -176,6 +195,30 @@ class ApaBrowserAdapter: except Exception as e: raise TimeoutError(f"wait_for_text '{text}' timed out: {e}") + def wait_for_element(self, selectors: list, timeout_seconds: int = 15) -> None: + self._ensure_open() + deadline = time.time() + timeout_seconds + last_error = None + while time.time() < deadline: + for sel in selectors: + try: + self._find(sel, timeout=1) + return + except Exception as e: + last_error = e + time.sleep(0.5) + raise TimeoutError(f"wait_for_element timed out: {selectors}, last: {last_error}") + + def element_exists(self, selectors: list) -> bool: + self._ensure_open() + for sel in selectors: + try: + self._find(sel, timeout=1) + return True + except Exception: + continue + return False + def select_first(self, selectors: list, value: str) -> None: self._ensure_open() from selenium.webdriver.support.ui import Select @@ -183,14 +226,59 @@ class ApaBrowserAdapter: for sel in selectors: try: el = self._find(sel) - Select(el).select_by_visible_text(value) + # 原生