6f5668b7ec
Add tests/cross_end/ directory with dual-driver architecture:
- conftest.py: Playwright admin_page + Appium app_driver fixtures
- Admin Page Objects: FreightSourcePage, WaybillManagementPage, SettlementPage
- App Page Objects: DriverOrderListPage, DriverTransportPage, DriverHomePage (re-export)
- test_freight_full_flow.py: 8-step end-to-end test (publish → accept → load → unload → accounting → review → shipper pay → platform pay)
- Shared context dict for cross-step data passing
- Graceful skip when either Playwright or Appium is unavailable
- All selectors marked with ⚠️ placeholders for discovery against real environments
Add cross_end marker to pytest.ini for selective execution.
99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
"""管理端 — 运输管理 — 运单核算 Page Object。
|
|
|
|
覆盖步骤:
|
|
5. 核算运单 (do_accounting)
|
|
6. 核算审核 (do_review)
|
|
|
|
Usage:
|
|
waybill_page = WaybillManagementPage(page)
|
|
waybill_page.do_accounting(order_no)
|
|
waybill_page.do_review(order_no)
|
|
"""
|
|
|
|
from playwright.sync_api import Page
|
|
|
|
from tests.web.admin.pages.base_page import BasePage
|
|
|
|
|
|
class WaybillManagementPage(BasePage):
|
|
"""管理端 - 运输管理 - 运单管理/核算。"""
|
|
|
|
def __init__(self, page: Page):
|
|
super().__init__(page)
|
|
# ⚠️ 以下定位器需要根据实际 DOM 调整
|
|
|
|
# ── 搜索区 ──
|
|
self.search_order_input = page.get_by_placeholder("请输入订单号") # ⚠️
|
|
self.search_btn = page.get_by_role("button", name="查询") # ⚠️
|
|
|
|
# ── 操作按钮 ──
|
|
self.accounting_btn = page.get_by_role("button", name="核算") # ⚠️ 核算运单
|
|
self.review_btn = page.get_by_role("button", name="审核") # ⚠️ 核算审核
|
|
self.confirm_btn = page.get_by_role("button", name="确定") # ⚠️ 确认弹窗
|
|
|
|
# ── 结果元素 ──
|
|
self.success_toast = page.locator(".el-message--success") # ⚠️
|
|
self.table_first_row = page.locator(".el-table__body tr:first-child") # ⚠️ 列表第一行
|
|
|
|
def search_order(self, order_no: str) -> None:
|
|
"""搜索运单。"""
|
|
self.fill_field(self.search_order_input, order_no)
|
|
self.click_when_ready(self.search_btn)
|
|
self.page.wait_for_timeout(1000)
|
|
|
|
def click_accounting(self) -> None:
|
|
"""点击核算按钮。"""
|
|
self.click_when_ready(self.accounting_btn)
|
|
self.page.wait_for_timeout(500)
|
|
|
|
def click_review(self) -> None:
|
|
"""点击审核按钮(核算审核)。"""
|
|
self.click_when_ready(self.review_btn)
|
|
self.page.wait_for_timeout(500)
|
|
|
|
def confirm_action(self) -> None:
|
|
"""确认操作弹窗。"""
|
|
# ⚠️ 可能没有确认弹窗,try 一下
|
|
try:
|
|
if self.confirm_btn.is_visible():
|
|
self.click_when_ready(self.confirm_btn)
|
|
self.page.wait_for_timeout(500)
|
|
except Exception:
|
|
pass
|
|
|
|
def do_accounting(self, order_no: str) -> None:
|
|
"""完整的核算运单流程: 搜索 → 核算 → 确认。
|
|
|
|
Args:
|
|
order_no: 订单号
|
|
"""
|
|
self.search_order(order_no)
|
|
self.page.wait_for_timeout(500)
|
|
self.click_accounting()
|
|
self.confirm_action()
|
|
|
|
# 等待核算完成
|
|
self.has_success_toast()
|
|
|
|
def do_review(self, order_no: str) -> None:
|
|
"""完整的核算审核流程: 搜索 → 审核 → 确认。
|
|
|
|
Args:
|
|
order_no: 订单号
|
|
"""
|
|
self.search_order(order_no)
|
|
self.page.wait_for_timeout(500)
|
|
self.click_review()
|
|
self.confirm_action()
|
|
|
|
# 等待审核完成
|
|
self.has_success_toast()
|
|
|
|
def has_success_toast(self) -> bool:
|
|
"""检查操作是否成功(有成功 toast)。"""
|
|
try:
|
|
self.wait_visible(self.success_toast, timeout_ms=5_000)
|
|
return True
|
|
except Exception:
|
|
return False
|