# -*- coding: utf-8 -*- """用真实 Selenium Chrome 验证合同建单填表流程(dry_run,不提交)。""" import os import sys import time # 确保能 import rpa_yisaiqi 包 BASE = os.path.dirname(os.path.abspath(__file__)) PARENT = os.path.dirname(BASE) if PARENT not in sys.path: sys.path.insert(0, PARENT) from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter from rpa_yisaiqi.contract_flow_steps import ( ContractFlowContext, ContractGoodsLine, login_contract_system, enter_contract_create, select_contract_template, fill_contract_signatory_info, fill_contract_basic_info, fill_contract_amount_and_dates, fill_contract_goods_lines, fill_contract_payment_info, ) CONTRACT_URL = "http://contract-test.gzmpc.com:8080/" def build_ctx() -> ContractFlowContext: return ContractFlowContext( contract_url=CONTRACT_URL, 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="50000", 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, ) ], ) def read_values(driver): """回读表单中已填入的值,用于校验。""" script = """ function getVal(name) { var el = document.querySelector('input[name="' + name + '"],textarea[name="' + name + '"],select[name="' + name + '"]'); return el ? (el.value || '') : '(missing)'; } var keys = [ 'extendDataFormInfo.value(fd_customeropcode)', 'extendDataFormInfo.value(fd_customername)', 'extendDataFormInfo.value(fd_contract_cate_type)', 'fdAccount', 'fdSigndate', 'fdEffedate', 'fdEnddate', 'extendDataFormInfo.value(fd_is_major_contract)', 'extendDataFormInfo.value(fd_advance_amout)', 'extendDataFormInfo.value(fd_contract_year_text)', 'extendDataFormInfo.value(fd_paytype)', 'extendDataFormInfo.value(fd_pay_time_limit)', 'extendDataFormInfo.value(fd_suconstatus)', 'extendDataFormInfo.value(fd_3d1ce3953f1162)', 'extendDataFormInfo.value(fd_detail1.0.fd_opcode)', 'extendDataFormInfo.value(fd_detail1.0.fd_goodsname)', 'extendDataFormInfo.value(fd_detail1.0.fd_registdocno)', 'extendDataFormInfo.value(fd_detail1.0.fd_goodstype)', 'extendDataFormInfo.value(fd_detail1.0.fd_goodsunit)', 'extendDataFormInfo.value(fd_detail1.0.fd_goodsqty)' ]; var out = {}; for (var i = 0; i < keys.length; i++) { out[keys[i]] = getVal(keys[i]); } var bg = document.querySelector('textarea[name="extendDataFormInfo.value(fd_desc_info)"]'); out['background'] = bg ? bg.value : '(missing)'; return JSON.stringify(out); """ return driver.execute_script(script) def main(): print("=" * 60) print("Selenium 合同建单填表验证 (dry_run, 不提交)") print("=" * 60) adapter = ApaBrowserAdapter(CONTRACT_URL) ctx = build_ctx() print("[1/6] 打开合同系统并登录 ...") adapter.open_url(CONTRACT_URL) time.sleep(2) login_contract_system(adapter, ctx) print(" [OK] 登录成功") print("[2/6] 进入合同起草页 ...") enter_contract_create(adapter) print(" [OK] 已进入模板选择页") print("[3/6] 选择模板 ...") select_contract_template(adapter, ctx) time.sleep(2) print(" [OK] 模板已选择") print("[4/6] 填写签约方 + 基础信息 ...") fill_contract_signatory_info(adapter, ctx) fill_contract_basic_info(adapter, ctx) print(" [OK] 已填写") print("[5/6] 填写金额日期 + 货品 + 付款 ...") fill_contract_amount_and_dates(adapter, ctx) fill_contract_goods_lines(adapter, ctx) fill_contract_payment_info(adapter, ctx) print(" [OK] 已填写") print("[6/6] 回读校验 ...") time.sleep(1) values = read_values(adapter._driver) print(" 回读值:") import json for k, v in json.loads(values).items(): print(f" {k} = {v}") # 校验关键字段 expected = { "extendDataFormInfo.value(fd_customeropcode)": "CUST-001", "extendDataFormInfo.value(fd_customername)": "测试供应商", "extendDataFormInfo.value(fd_contract_cate_type)": "采购协议", "fdAccount": "50000", "fdSigndate": "2026-08-12", "fdEnddate": "2026-12-31", "extendDataFormInfo.value(fd_paytype)": "账期支付", "extendDataFormInfo.value(fd_pay_time_limit)": "30", "extendDataFormInfo.value(fd_detail1.0.fd_goodsqty)": "10", } actual = json.loads(values) all_ok = True for k, v in expected.items(): got = actual.get(k, "") status = "OK" if str(got) == str(v) else "MISMATCH" if status != "OK": all_ok = False print(f" [{status}] {k}: 期望={v} 实际={got}") print("=" * 60) print("验证结果:", "全部通过" if all_ok else "存在不匹配,请检查") print("=" * 60) print("浏览器保持打开(detach),可人工核对。") sys.exit(0 if all_ok else 1) if __name__ == "__main__": main()