180 lines
6.0 KiB
Python
180 lines
6.0 KiB
Python
# -*- 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="DW0100046361",
|
||
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)": "DW0100046361",
|
||
"extendDataFormInfo.value(fd_customername)": "重庆亿昊药业有限公司",
|
||
"extendDataFormInfo.value(fd_contract_cate_type)": "采购协议",
|
||
"fdAccount": "50000.00",
|
||
"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()
|