92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
# 合同 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",
|
||
)
|