# 合同 S02–S05:打开系统、登录、直达起草表单。 # # 不点 SPA 菜单。登录后走 FORM_PAGE_URL。 from __future__ import annotations import time from accept import evidence_shot from errors import LoginFailed from contract_common import ( FORM_PAGE_URL, BrowserAdapter, ContractFlowContext, _ACCEPT, _is_logged_in, contract_version_label, ) # 打开合同系统首页(S02)。 def open_contract_system(browser: BrowserAdapter, ctx: ContractFlowContext) -> None: browser.open_url(ctx.contract_url) _ACCEPT.note("S02", "打开合同系统", {"url": ctx.contract_url}, ok=True) # 登录合同系统(S03)。已登录则跳过填表。 def login_contract_system(browser: BrowserAdapter, ctx: ContractFlowContext) -> None: try: if _is_logged_in(browser): evidence_shot(browser, "contract-already-logged-in") _ACCEPT.note("S03", "登录", {"user": ctx.username, "via": "already"}, ok=True) return browser.wait_for_element( ['input[name="j_username"]', 'input[placeholder="用户名"]'], timeout_seconds=15, ) browser.fill_first(['input[name="j_username"]', 'input[placeholder="用户名"]'], ctx.username) browser.fill_first(['input[name="j_password"]', 'input[placeholder="密码"]'], ctx.password) browser.click_first(['a[class*="login_button"]', 'a:contains("登录")', 'input[name="btn_submit"]']) deadline = time.time() + 20 while time.time() < deadline: if _is_logged_in(browser): evidence_shot(browser, "contract-login-ok") _ACCEPT.note("S03", "登录", {"user": ctx.username, "portal": "yes"}, ok=True) return time.sleep(0.5) raise TimeoutError("登录后未进入门户(未看到切换门户/待办/待阅)") except Exception as exc: evidence_shot(browser, "contract-login-failed", failed=True) _ACCEPT.note("S03", "登录", {"user": ctx.username, "error": exc}, ok=False, raise_error=False) raise LoginFailed(f"合同系统登录失败:{exc}") from exc # 直达起草表单页(S04),不点 SPA 菜单。 def enter_contract_create(browser: BrowserAdapter) -> None: # 登录后直接导航到起草表单页,跳过模板选择(前端委托事件 Selenium 点击无效) reopen = getattr(browser, "reopen_url", None) if callable(reopen): reopen(FORM_PAGE_URL) else: browser.open_url(FORM_PAGE_URL) browser.wait_for_text("客户编码", timeout_seconds=20) on_form = "客户编码" in (browser.read_body_text() or "") _ACCEPT.check( "S04", "进入起草", [("formMarker", "客户编码" if on_form else (browser.read_body_text() or "")[:40], "客户编码")], browser=browser, screenshot_on_fail="contract-login-ok", ) # 确认已在指定模板的表单页(S05)。未进表单则再导航一次。 def select_contract_template(browser: BrowserAdapter, ctx: ContractFlowContext) -> None: # 已通过 URL 直接指定模板,本步骤仅兜底:若尚未进入表单则再次导航 if "客户编码" not in (browser.read_body_text() or ""): browser.open_url(FORM_PAGE_URL) browser.wait_for_text("客户编码", timeout_seconds=20) on_form = "客户编码" in (browser.read_body_text() or "") _ACCEPT.check( "S05", "选择模板", [ ("formMarker", "客户编码" if on_form else "", "客户编码"), ("templateType", contract_version_label(ctx), contract_version_label(ctx)), ], browser=browser, screenshot_on_fail="contract-login-ok", )