refactor(pages): PO 层框架化 — 细粒度操作 + 显式等待 + 消除静默吞异常
DriverFreightFlowPage (APP): - 流程方法拆为单一职责的细粒度操作(open_freight_tab/fill_quantity/upload_photo_from_album/...), 流程方法仅做编排,公共 API 不变,用例零改动 - 移除全部 implicitly_wait 全局副作用,每步显式等待目标元素 - 容错点击(已知晓/确定)改为 _tap_by_text_if_present,跳过时记录 warning FreightAccountingPage (Web): - _go/_click_search 改显式等待(搜索框出现/列表数据行或空态),替代固定 2s/1s sleep - 表格等待升级为 td:visible,避开 vxe-table 固定列隐藏占位单元格 - 点击行操作按钮后显式等待弹窗出现,替代固定 800ms - 车队长下拉选择改显式等待下拉项渲染 - 可选弹窗操作统一收敛到 _try_click,跳过时记录 warning;关键确认按钮保持严格 两条 E2E 用例在真实环境回归通过(TC-D2S-001 116s / TC-D2S-002 112s)。
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="1" failures="1" skipped="0" tests="2" time="10.769" timestamp="2026-07-29T08:45:34.712886+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="9.577"><failure message="selenium.common.exceptions.WebDriverException: Message: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details Stacktrace: UnknownError: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13) at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23) at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20) at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24) at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12) at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16) at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:76: in test_driver_to_settlement_full_flow
|
||||
ensure_driver_login(app_driver)
|
||||
tests\cross_end\conftest.py:161: in <lambda>
|
||||
return lambda d: fn(d)
|
||||
^^^^^
|
||||
tests\app\_shared.py:100: in _ensure_logged_in
|
||||
wait.until(EC.visibility_of_element_located(mine_tab))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:112: in until
|
||||
value = method(self._driver)
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\expected_conditions.py:188: in _predicate
|
||||
return _element_if_visible(driver.find_element(*locator))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:899: in find_element
|
||||
return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E Stacktrace:
|
||||
E UnknownError: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13)
|
||||
E at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23)
|
||||
E at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20)
|
||||
E at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24)
|
||||
E at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12)
|
||||
E at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16)
|
||||
E at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="0.704"><error message="failed on teardown with "selenium.common.exceptions.WebDriverException: Message: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details Stacktrace: UnknownError: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)"">tests\cross_end\conftest.py:100: in app_driver
|
||||
save_failure_screenshot(d, cfg, "android", request)
|
||||
tests\app\_shared.py:190: in save_failure_screenshot
|
||||
driver.save_screenshot(path)
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:979: in save_screenshot
|
||||
return self.get_screenshot_as_file(filename)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:956: in get_screenshot_as_file
|
||||
png = self.get_screenshot_as_png()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:987: in get_screenshot_as_png
|
||||
return b64decode(self.get_screenshot_as_base64().encode("ascii"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:997: in get_screenshot_as_base64
|
||||
return self.execute(Command.SCREENSHOT)["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E Stacktrace:
|
||||
E UnknownError: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="1" failures="1" skipped="0" tests="2" time="65.851" timestamp="2026-07-29T08:46:45.040615+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="64.875"><failure message="selenium.common.exceptions.WebDriverException: Message: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details Stacktrace: UnknownError: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13) at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23) at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20) at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24) at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12) at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16) at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:87: in test_driver_to_settlement_full_flow
|
||||
driver_flow.accept_order_flow(quantity="1")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:127: in accept_order_flow
|
||||
self._wait_and_fill(self.quantity_input, quantity) # ③ 填写数量
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:76: in _wait_and_fill
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:112: in until
|
||||
value = method(self._driver)
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\expected_conditions.py:188: in _predicate
|
||||
return _element_if_visible(driver.find_element(*locator))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:899: in find_element
|
||||
return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E Stacktrace:
|
||||
E UnknownError: 'POST /element' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13)
|
||||
E at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23)
|
||||
E at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20)
|
||||
E at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24)
|
||||
E at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12)
|
||||
E at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16)
|
||||
E at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="0.515"><error message="failed on teardown with "selenium.common.exceptions.WebDriverException: Message: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details Stacktrace: UnknownError: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)"">tests\cross_end\conftest.py:100: in app_driver
|
||||
save_failure_screenshot(d, cfg, "android", request)
|
||||
tests\app\_shared.py:190: in save_failure_screenshot
|
||||
driver.save_screenshot(path)
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:979: in save_screenshot
|
||||
return self.get_screenshot_as_file(filename)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:956: in get_screenshot_as_file
|
||||
png = self.get_screenshot_as_png()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:987: in get_screenshot_as_png
|
||||
return b64decode(self.get_screenshot_as_base64().encode("ascii"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:997: in get_screenshot_as_base64
|
||||
return self.execute(Command.SCREENSHOT)["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E Stacktrace:
|
||||
E UnknownError: 'GET /screenshot' cannot be proxied to UiAutomator2 server because the instrumentation process is not running (probably crashed). Check the server log and/or the logcat output for more details
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:274:19)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="1" failures="1" skipped="0" tests="2" time="228.437" timestamp="2026-07-29T08:49:41.143650+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="227.192"><failure message="selenium.common.exceptions.WebDriverException: Message: Could not proxy command to the remote server. Original error: socket hang up Stacktrace: UnknownError: Could not proxy command to the remote server. Original error: socket hang up at ProxyRequestError.getActualError (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\errors.js:701:16) at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:272:27) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13) at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23) at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20) at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24) at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12) at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16) at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:76: in test_driver_to_settlement_full_flow
|
||||
ensure_driver_login(app_driver)
|
||||
tests\cross_end\conftest.py:161: in <lambda>
|
||||
return lambda d: fn(d)
|
||||
^^^^^
|
||||
tests\app\_shared.py:100: in _ensure_logged_in
|
||||
wait.until(EC.visibility_of_element_located(mine_tab))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:112: in until
|
||||
value = method(self._driver)
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\expected_conditions.py:188: in _predicate
|
||||
return _element_if_visible(driver.find_element(*locator))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:899: in find_element
|
||||
return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: Could not proxy command to the remote server. Original error: socket hang up
|
||||
E Stacktrace:
|
||||
E UnknownError: Could not proxy command to the remote server. Original error: socket hang up
|
||||
E at ProxyRequestError.getActualError (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\errors.js:701:16)
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:272:27)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.doFindElementOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/find.js:20:13)
|
||||
E at async doFind (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:24:23)
|
||||
E at async wrappedCondFn (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:93:20)
|
||||
E at async spin (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:261:24)
|
||||
E at async waitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\asyncbox\build\lib\asyncbox.js:279:12)
|
||||
E at async AndroidUiautomator2Driver.implicitWaitForCondition (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\timeout.js:95:16)
|
||||
E at async AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:45:9)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="0.944"><error message="failed on teardown with "selenium.common.exceptions.WebDriverException: Message: Could not proxy command to the remote server. Original error: socket hang up Stacktrace: UnknownError: Could not proxy command to the remote server. Original error: socket hang up at ProxyRequestError.getActualError (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\errors.js:701:16) at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:272:27) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)"">tests\cross_end\conftest.py:100: in app_driver
|
||||
save_failure_screenshot(d, cfg, "android", request)
|
||||
tests\app\_shared.py:190: in save_failure_screenshot
|
||||
driver.save_screenshot(path)
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:979: in save_screenshot
|
||||
return self.get_screenshot_as_file(filename)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:956: in get_screenshot_as_file
|
||||
png = self.get_screenshot_as_png()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:987: in get_screenshot_as_png
|
||||
return b64decode(self.get_screenshot_as_base64().encode("ascii"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:997: in get_screenshot_as_base64
|
||||
return self.execute(Command.SCREENSHOT)["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.WebDriverException: Message: Could not proxy command to the remote server. Original error: socket hang up
|
||||
E Stacktrace:
|
||||
E UnknownError: Could not proxy command to the remote server. Original error: socket hang up
|
||||
E at ProxyRequestError.getActualError (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\errors.js:701:16)
|
||||
E at UIA2Proxy.command (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\jsonwp-proxy\proxy.js:272:27)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.getScreenshot (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/build/lib/commands/screenshot.js:61:19)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="76.007" timestamp="2026-07-29T09:06:35.634456+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="75.623"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:87: in test_driver_to_settlement_full_flow
|
||||
driver_flow.accept_order_flow(quantity="1")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:127: in accept_order_flow
|
||||
self._wait_and_fill(self.quantity_input, quantity) # ③ 填写数量
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:76: in _wait_and_fill
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="77.279" timestamp="2026-07-29T09:31:32.428260+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="76.710"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:87: in test_driver_to_settlement_full_flow
|
||||
driver_flow.accept_order_flow(quantity="1")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:127: in accept_order_flow
|
||||
self._wait_and_fill(self.quantity_input, quantity) # ③ 填写数量
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:76: in _wait_and_fill
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="68.476" timestamp="2026-07-29T09:38:46.256136+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="68.060"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:87: in test_driver_to_settlement_full_flow
|
||||
driver_flow.accept_order_flow(quantity="1")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:127: in accept_order_flow
|
||||
self._wait_and_fill(self.quantity_input, quantity) # ③ 填写数量
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:76: in _wait_and_fill
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="108.050" timestamp="2026-07-29T10:04:55.314436+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="107.612"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:128: in test_driver_to_settlement_full_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:257: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="106.184" timestamp="2026-07-29T10:16:45.572481+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="105.745"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:128: in test_driver_to_settlement_full_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:257: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="1" time="108.793" timestamp="2026-07-29T10:49:03.078350+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="108.462"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="200.337" timestamp="2026-07-29T11:04:11.233754+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="92.181" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="107.764"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="203.579" timestamp="2026-07-29T11:13:57.704319+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="96.949" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="106.180"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="199.840" timestamp="2026-07-29T11:27:04.272914+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="93.248" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="106.258"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="197.683" timestamp="2026-07-29T11:35:24.721518+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="90.745" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="106.565"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="196.819" timestamp="2026-07-29T11:45:51.292254+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="89.565" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="106.876"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="201.854" timestamp="2026-07-29T13:56:50.384665+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="93.491" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="107.874"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="198.770" timestamp="2026-07-29T14:06:03.838607+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="92.343" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="106.049"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="197.608" timestamp="2026-07-29T14:21:04.270151+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="89.262" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="107.866"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="197.498" timestamp="2026-07-29T14:46:15.819401+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="91.124" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="105.929"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="1" failures="2" skipped="0" tests="3" time="297.930" timestamp="2026-07-29T14:57:35.238149+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="111.649"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:133: in test_driver_to_settlement_full_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:315: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="185.546"><failure message="playwright._impl._errors.TimeoutError: Locator.click: Timeout 120000ms exceeded. Call log: - waiting for locator("#app > div > div.main-container.hasTagsView > section > div > div > div > div.vxe-modal--wrapper.type--modal.is--animat.lock--view.is--mask.is--visible.is--active > div > div.vxe-modal--body > div.vxe-modal--content > div > form > div:nth-child(2) > div:nth-child(5) > div > div > div > div > input").first - locator resolved to <input type="text" placeholder="请选择" autocomplete="off" readonly="readonly" disabled="disabled" class="el-input__inner"/> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not enabled - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not enabled - retrying click action - waiting 100ms 231 × waiting for element to be visible, enabled and stable - element is not enabled - retrying click action - waiting 500ms">tests\cross_end\tests\test_driver_to_settlement.py:225: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_freight_accounting(
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:158: in do_freight_accounting
|
||||
self._select_team_leader_payment()
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:207: in _select_team_leader_payment
|
||||
payment_mode_input.click()
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:17672: in click
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_locator.py:163: in click
|
||||
return await self._frame._click(self._selector, strict=True, **params)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:591: in _click
|
||||
await self._channel.send("click", self._timeout, locals_to_params(locals()))
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Locator.click: Timeout 120000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("#app > div > div.main-container.hasTagsView > section > div > div > div > div.vxe-modal--wrapper.type--modal.is--animat.lock--view.is--mask.is--visible.is--active > div > div.vxe-modal--body > div.vxe-modal--content > div > form > div:nth-child(2) > div:nth-child(5) > div > div > div > div > input").first
|
||||
E - locator resolved to <input type="text" placeholder="请选择" autocomplete="off" readonly="readonly" disabled="disabled" class="el-input__inner"/>
|
||||
E - attempting click action
|
||||
E 2 × waiting for element to be visible, enabled and stable
|
||||
E - element is not enabled
|
||||
E - retrying click action
|
||||
E - waiting 20ms
|
||||
E 2 × waiting for element to be visible, enabled and stable
|
||||
E - element is not enabled
|
||||
E - retrying click action
|
||||
E - waiting 100ms
|
||||
E 231 × waiting for element to be visible, enabled and stable
|
||||
E - element is not enabled
|
||||
E - retrying click action
|
||||
E - waiting 500ms</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="0.158"><error message="failed on teardown with "selenium.common.exceptions.InvalidSessionIdException: Message: A session is either terminated or not started; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#invalidsessionidexception Stacktrace: NoSuchDriverError: A session is either terminated or not started at asyncHandler (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\protocol.js:336:23) at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\protocol.js:504:14 at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17) at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\route.js:157:13) at Route.dispatch (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\route.js:117:3) at handle (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:435:11) at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17) at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:295:15 at param (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:600:14) at param (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:610:14) at processParams (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:664:3) at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:291:5) at logger (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\morgan\index.js:170:5) at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17) at trimPrefix (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:342:13) at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:297:9 at processParams (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:582:12) at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:291:5) at read (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\body-parser\lib\read.js:53:5) at jsonParser (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\body-parser\lib\types\json.js:88:5) at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17) at trimPrefix (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:342:13)"">tests\cross_end\conftest.py:100: in app_driver
|
||||
save_failure_screenshot(d, cfg, "android", request)
|
||||
tests\app\_shared.py:229: in save_failure_screenshot
|
||||
driver.save_screenshot(path)
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:979: in save_screenshot
|
||||
return self.get_screenshot_as_file(filename)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:956: in get_screenshot_as_file
|
||||
png = self.get_screenshot_as_png()
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:987: in get_screenshot_as_png
|
||||
return b64decode(self.get_screenshot_as_base64().encode("ascii"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:997: in get_screenshot_as_base64
|
||||
return self.execute(Command.SCREENSHOT)["value"]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py:492: in execute
|
||||
self.error_handler.check_response(response)
|
||||
D:\Python\Python312\Lib\site-packages\appium\webdriver\errorhandler.py:125: in check_response
|
||||
raise exception_class(msg=message, stacktrace=format_stacktrace(stacktrace))
|
||||
E selenium.common.exceptions.InvalidSessionIdException: Message: A session is either terminated or not started; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#invalidsessionidexception
|
||||
E Stacktrace:
|
||||
E NoSuchDriverError: A session is either terminated or not started
|
||||
E at asyncHandler (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\protocol.js:336:23)
|
||||
E at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\protocol\protocol.js:504:14
|
||||
E at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17)
|
||||
E at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\route.js:157:13)
|
||||
E at Route.dispatch (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\route.js:117:3)
|
||||
E at handle (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:435:11)
|
||||
E at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17)
|
||||
E at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:295:15
|
||||
E at param (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:600:14)
|
||||
E at param (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:610:14)
|
||||
E at processParams (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:664:3)
|
||||
E at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:291:5)
|
||||
E at logger (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\morgan\index.js:170:5)
|
||||
E at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17)
|
||||
E at trimPrefix (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:342:13)
|
||||
E at C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:297:9
|
||||
E at processParams (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:582:12)
|
||||
E at next (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:291:5)
|
||||
E at read (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\body-parser\lib\read.js:53:5)
|
||||
E at jsonParser (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\body-parser\lib\types\json.js:88:5)
|
||||
E at Layer.handleRequest (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\lib\layer.js:152:17)
|
||||
E at trimPrefix (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\router\index.js:342:13)</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="199.792" timestamp="2026-07-29T15:33:57.516037+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="94.003" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="105.380"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:327: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="2" skipped="0" tests="2" time="18.848" timestamp="2026-07-31T15:44:51.672339+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="9.302"><failure message="RuntimeError: 登录态已过期!请运行: python tests/web/admin/save_auth.py --role super_admin">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:80: in test_driver_to_settlement_full_flow
|
||||
ensure_admin_login("super_admin")
|
||||
E:\test\QaAutomationHub\tests\cross_end\conftest.py:134: in _ensure_login
|
||||
raise RuntimeError(
|
||||
E RuntimeError: 登录态已过期!请运行: python tests/web/admin/save_auth.py --role super_admin</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="9.257"><failure message="RuntimeError: 登录态已过期!请运行: python tests/web/admin/save_auth.py --role super_admin">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:189: in test_driver_to_settlement_team_leader_flow
|
||||
ensure_admin_login("super_admin")
|
||||
E:\test\QaAutomationHub\tests\cross_end\conftest.py:134: in _ensure_login
|
||||
raise RuntimeError(
|
||||
E RuntimeError: 登录态已过期!请运行: python tests/web/admin/save_auth.py --role super_admin</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="216.872" timestamp="2026-07-31T15:46:16.527461+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="101.468" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="115.038"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:243: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_shipper_payment(transport_order_no)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:327: in do_shipper_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
D:\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:8928: in wait_for_selector
|
||||
self._sync(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:69: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
D:\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:563: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="2" time="209.551" timestamp="2026-07-31T15:51:54.361633+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="106.424" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="102.838" /></testsuite></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="2" time="212.829" timestamp="2026-07-31T16:44:52.269076+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="109.487" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="103.076" /></testsuite></testsuites>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="2" skipped="0" tests="2" time="116.851" timestamp="2026-08-03T14:32:59.202912+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="60.015"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:97: in test_driver_to_settlement_full_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:150: in load_goods_flow
|
||||
self._wait_and_click(self.agreement_checkbox) # ⑬ 勾选协议
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="56.357"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:206: in test_driver_to_settlement_team_leader_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:138: in load_goods_flow
|
||||
self._tap_by_text("装货") # ⑥ 点击装货
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:83: in _tap_by_text
|
||||
self._wait_and_click(locator, timeout_s)
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="2" skipped="0" tests="2" time="149.974" timestamp="2026-08-03T15:04:44.737373+08:00" hostname="Y8126"><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="88.744"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:102: in test_driver_to_settlement_full_flow
|
||||
driver_flow.unload_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:177: in unload_goods_flow
|
||||
self._wait_and_click(self.load_unload_confirm) # ㉖ 卸货确认
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="60.810"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">E:\test\QaAutomationHub\tests\cross_end\tests\test_driver_to_settlement.py:206: in test_driver_to_settlement_team_leader_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:138: in load_goods_flow
|
||||
self._tap_by_text("装货") # ⑥ 点击装货
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:83: in _tap_by_text
|
||||
self._wait_and_click(locator, timeout_s)
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
D:\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (C:\Users\23184\.appium\node_modules\appium-uiautomator2-driver\node_modules\appium-android-driver\build\lib\commands\find.js:62:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="0" time="0.067" timestamp="2026-09-02T09:41:47.607548+08:00" hostname="yunba-126" /></testsuites>
|
||||
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="5" skipped="0" tests="5" time="188.019" timestamp="2026-09-02T09:44:09.398477+08:00" hostname="yunba-126"><testcase classname="cross_end.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="36.897"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\test_driver_to_settlement.py:105: in test_driver_to_settlement_full_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\pages\driver\freight_flow_page.py:140: in load_goods_flow
|
||||
self._wait_and_click(self.cancel_btn) # ⑦ 点击取消(系统弹窗)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\pages\driver\freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="33.816"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\test_driver_to_settlement.py:218: in test_driver_to_settlement_team_leader_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\pages\driver\freight_flow_page.py:138: in load_goods_flow
|
||||
self._tap_by_text("装货") # ⑥ 点击装货
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\pages\driver\freight_flow_page.py:83: in _tap_by_text
|
||||
self._wait_and_click(locator, timeout_s)
|
||||
tests\pages\driver\freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="34.556"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:97: in test_driver_to_settlement_full_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:138: in load_goods_flow
|
||||
self._tap_by_text("装货") # ⑥ 点击装货
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:83: in _tap_by_text
|
||||
self._wait_and_click(locator, timeout_s)
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="35.009"><failure message="selenium.common.exceptions.TimeoutException: Message: Stacktrace: NoSuchElementError: An element could not be located on the page using the given search parameters. at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15) at process.processTicksAndRejections (node:internal/process/task_queues:104:5) at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16) at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16) at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)">tests\cross_end\tests\test_driver_to_settlement.py:206: in test_driver_to_settlement_team_leader_flow
|
||||
driver_flow.load_goods_flow(weight="10")
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:138: in load_goods_flow
|
||||
self._tap_by_text("装货") # ⑥ 点击装货
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:83: in _tap_by_text
|
||||
self._wait_and_click(locator, timeout_s)
|
||||
tests\cross_end\pages\app\driver_freight_flow_page.py:71: in _wait_and_click
|
||||
wait.until(EC.visibility_of_element_located(locator))
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\support\wait.py:121: in until
|
||||
raise TimeoutException(message, screen, stacktrace)
|
||||
E selenium.common.exceptions.TimeoutException: Message:
|
||||
E Stacktrace:
|
||||
E NoSuchElementError: An element could not be located on the page using the given search parameters.
|
||||
E at AndroidUiautomator2Driver.findElOrEls (file:///C:/Users/23184/.appium/node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver/build/lib/commands/find.js:54:15)
|
||||
E at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
E at async AndroidUiautomator2Driver.findElOrElsWithProcessing (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:12:16)
|
||||
E at async AndroidUiautomator2Driver.findElement (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\commands\find.js:28:16)
|
||||
E at async runCommandPromise (C:\Users\23184\AppData\Roaming\npm\node_modules\appium\node_modules\@appium\base-driver\build\lib\basedriver\driver.js:119:24)</failure></testcase><testcase classname="cross_end.tests.test_freight_full_flow.TestFreightFullFlow" name="test_full_freight_flow" time="46.395"><failure message="AssertionError: Locator expected to be visible Actual value: hidden Call log: - Expect "to_be_visible" with timeout 30000ms - waiting for get_by_text("运输管理").first 60 × locator resolved to <span>运输管理</span> - unexpected value "hidden" Aria snapshot: - text: - heading "系统布局配置" [level=3] - text: 主题色 开启 Tags-View - switch [checked]: - checkbox [checked] - text: 固定 Header - switch: - checkbox - text: 侧边栏 Logo - switch [checked]: - checkbox [checked] - img - link: - /url: "#/" - img - menubar: - link "首页": - /url: "#/home" - menuitem "首页" - menuitem "基础信息 " - menuitem "整车运输 " - menuitem "管理服务 " - menuitem "同城运输 " - menuitem "增值服务 " - menuitem "财务统计 " - menuitem "系统管理 " - link "资源控制": - /url: "#/resourceController" - menuitem "资源控制" - img - navigation "Breadcrumb": - link "首页" - textbox "搜索" - button "超级管理员 ": - text: 超级管理员 - emphasis: - text: 首页 RELEASE SOURSE 发布货源 ORDER MANAGEMENT 订单管理 CUSTOMER SERVICE 客服管理 - link "BIG DATA CENTER 大数据中心": - /url: https://ybxcx.ynyun8.com:8000/Bigdata/ - link "ZHONGMIN BIG DATA 中闽大数据": - /url: https://ybxcx.ynyun8.com:8000/zm/ - img - text: ZHONGMIN BIG DATA 中闽大数据 - text: 运输流程 官网 货源发布 货源审核 货源管理 运输核算 运单管理 预付 财务打款 - link: - /url: https://www.ynyun8.com/ - text: 平台车辆 平台订单 平台车辆总计 12,832 平台车辆 153,938 平台运力(吨) 货源单总数: 9948 1763 未接单 116 已接单 1347 已结算 30 已撤销 运输单总数: 29939 10073 待运输 460 运输中 7189 已卸货 货源单类型 9519 正常单 138 内容报价单 交易数据 充值总额(元) 158,232 交易总额(元) 117,687,370 运费总额(元) 37,980,384 开票总额(元) 838,947">tests\cross_end\tests\test_freight_full_flow.py:67: in test_full_freight_flow
|
||||
navbar.go_to_submenu("运输管理", "货源管理")
|
||||
tests\web\admin\pages\components\navbar.py:42: in go_to_submenu
|
||||
self.go_to(parent_menu)
|
||||
tests\web\admin\pages\components\navbar.py:33: in go_to
|
||||
self.click_when_ready(menu_item)
|
||||
tests\web\admin\pages\base_page.py:53: in click_when_ready
|
||||
self.wait_visible(locator)
|
||||
tests\web\admin\pages\base_page.py:33: in wait_visible
|
||||
expect(locator).to_be_visible(timeout=timeout_ms or self.timeout)
|
||||
E AssertionError: Locator expected to be visible
|
||||
E Actual value: hidden
|
||||
E Call log:
|
||||
E - Expect "to_be_visible" with timeout 30000ms
|
||||
E - waiting for get_by_text("运输管理").first
|
||||
E 60 × locator resolved to <span>运输管理</span>
|
||||
E - unexpected value "hidden"
|
||||
E
|
||||
E Aria snapshot:
|
||||
E - text:
|
||||
E - heading "系统布局配置" [level=3]
|
||||
E - text: 主题色 开启 Tags-View
|
||||
E - switch [checked]:
|
||||
E - checkbox [checked]
|
||||
E - text: 固定 Header
|
||||
E - switch:
|
||||
E - checkbox
|
||||
E - text: 侧边栏 Logo
|
||||
E - switch [checked]:
|
||||
E - checkbox [checked]
|
||||
E - img
|
||||
E - link:
|
||||
E - /url: "#/"
|
||||
E - img
|
||||
E - menubar:
|
||||
E - link "首页":
|
||||
E - /url: "#/home"
|
||||
E - menuitem "首页"
|
||||
E - menuitem "基础信息 "
|
||||
E - menuitem "整车运输 "
|
||||
E - menuitem "管理服务 "
|
||||
E - menuitem "同城运输 "
|
||||
E - menuitem "增值服务 "
|
||||
E - menuitem "财务统计 "
|
||||
E - menuitem "系统管理 "
|
||||
E - link "资源控制":
|
||||
E - /url: "#/resourceController"
|
||||
E - menuitem "资源控制"
|
||||
E - img
|
||||
E - navigation "Breadcrumb":
|
||||
E - link "首页"
|
||||
E - textbox "搜索"
|
||||
E - button "超级管理员 ":
|
||||
E - text: 超级管理员
|
||||
E - emphasis:
|
||||
E - text: 首页 RELEASE SOURSE 发布货源 ORDER MANAGEMENT 订单管理 CUSTOMER SERVICE 客服管理
|
||||
E - link "BIG DATA CENTER 大数据中心":
|
||||
E - /url: https://ybxcx.ynyun8.com:8000/Bigdata/
|
||||
E - link "ZHONGMIN BIG DATA 中闽大数据":
|
||||
E - /url: https://ybxcx.ynyun8.com:8000/zm/
|
||||
E - img
|
||||
E - text: ZHONGMIN BIG DATA 中闽大数据
|
||||
E - text: 运输流程 官网 货源发布 货源审核 货源管理 运输核算 运单管理 预付 财务打款
|
||||
E - link:
|
||||
E - /url: https://www.ynyun8.com/
|
||||
E - text: 平台车辆 平台订单 平台车辆总计 12,832 平台车辆 153,938 平台运力(吨) 货源单总数: 9948 1763 未接单 116 已接单 1347 已结算 30 已撤销 运输单总数: 29939 10073 待运输 460 运输中 7189 已卸货 货源单类型 9519 正常单 138 内容报价单 交易数据 充值总额(元) 158,232 交易总额(元) 117,687,370 运费总额(元) 37,980,384 开票总额(元) 838,947</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,130 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="4" skipped="0" tests="5" time="383.862" timestamp="2026-09-02T09:53:58.487570+08:00" hostname="yunba-126"><testcase classname="cross_end.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="73.097"><failure message="RuntimeError: 运费核算 SQL 重试失败!单号: RHJC040026090100010951040132, 错误: 'database'">tests\cross_end\test_driver_to_settlement.py:126: in <lambda>
|
||||
retry_sql=lambda: update_risk_control_status(transport_order_no, status=1),
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:75: in update_risk_control_status
|
||||
return execute_sql(sql, (status, order_code), config)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:32: in execute_sql
|
||||
conn = get_connection(config)
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:27: in get_connection
|
||||
return pymysql.connect(**_resolve_config(config))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:20: in _resolve_config
|
||||
cfg = dict(load_config()["database"])
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E KeyError: 'database'
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
tests\cross_end\test_driver_to_settlement.py:124: in test_driver_to_settlement_full_flow
|
||||
admin_accounting.do_freight_accounting(
|
||||
tests\pages\admin\freight_accounting_page.py:149: in do_freight_accounting
|
||||
raise RuntimeError(f"运费核算 SQL 重试失败!单号: {order_no}, 错误: {e}")
|
||||
E RuntimeError: 运费核算 SQL 重试失败!单号: RHJC040026090100010951040132, 错误: 'database'</failure></testcase><testcase classname="cross_end.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="65.581"><failure message="RuntimeError: 运费核算 SQL 重试失败!单号: RHJC040026090100010952080133, 错误: 'database'">tests\cross_end\test_driver_to_settlement.py:239: in <lambda>
|
||||
retry_sql=lambda: update_risk_control_status(transport_order_no, status=1),
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:75: in update_risk_control_status
|
||||
return execute_sql(sql, (status, order_code), config)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:32: in execute_sql
|
||||
conn = get_connection(config)
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:27: in get_connection
|
||||
return pymysql.connect(**_resolve_config(config))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
tests\core\db_helper.py:20: in _resolve_config
|
||||
cfg = dict(load_config()["database"])
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E KeyError: 'database'
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
tests\cross_end\test_driver_to_settlement.py:237: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_freight_accounting(
|
||||
tests\pages\admin\freight_accounting_page.py:149: in do_freight_accounting
|
||||
raise RuntimeError(f"运费核算 SQL 重试失败!单号: {order_no}, 错误: {e}")
|
||||
E RuntimeError: 运费核算 SQL 重试失败!单号: RHJC040026090100010952080133, 错误: 'database'</failure></testcase><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlement" name="test_driver_to_settlement_full_flow" time="100.261" /><testcase classname="cross_end.tests.test_driver_to_settlement.TestDriverToSettlementTeamLeader" name="test_driver_to_settlement_team_leader_flow" time="102.671"><failure message="playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. Call log: - waiting for locator("table tbody tr") to be visible 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr>">tests\cross_end\tests\test_driver_to_settlement.py:239: in test_driver_to_settlement_team_leader_flow
|
||||
admin_accounting.do_finance_payment(transport_order_no, verify_code="1234")
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:266: in do_finance_payment
|
||||
self._click_table_action(button_index=2)
|
||||
tests\cross_end\pages\admin\freight_accounting_page.py:82: in _click_table_action
|
||||
self.page.wait_for_selector("table tbody tr", timeout=5_000)
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\playwright\sync_api\_generated.py:9033: in wait_for_selector
|
||||
self._sync(
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\playwright\_impl\_page.py:427: in wait_for_selector
|
||||
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\playwright\_impl\_frame.py:394: in wait_for_selector
|
||||
await self._channel.send(
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:76: in send
|
||||
return await self._connection.wrap_api_call(
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\site-packages\playwright\_impl\_connection.py:632: in wrap_api_call
|
||||
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
|
||||
E playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
E Call log:
|
||||
E - waiting for locator("table tbody tr") to be visible
|
||||
E 14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></failure></testcase><testcase classname="cross_end.tests.test_freight_full_flow.TestFreightFullFlow" name="test_full_freight_flow" time="41.624"><failure message="AssertionError: Locator expected to be visible Actual value: hidden Call log: - Expect "to_be_visible" with timeout 30000ms - waiting for get_by_text("运输管理").first 60 × locator resolved to <span>运输管理</span> - unexpected value "hidden" Aria snapshot: - text: - heading "系统布局配置" [level=3] - text: 主题色 开启 Tags-View - switch [checked]: - checkbox [checked] - text: 固定 Header - switch: - checkbox - text: 侧边栏 Logo - switch [checked]: - checkbox [checked] - img - link: - /url: "#/" - img - menubar: - link "首页": - /url: "#/home" - menuitem "首页" - menuitem "基础信息 " - menuitem "整车运输 " - menuitem "管理服务 " - menuitem "同城运输 " - menuitem "增值服务 " - menuitem "财务统计 " - menuitem "系统管理 " - link "资源控制": - /url: "#/resourceController" - menuitem "资源控制" - img - navigation "Breadcrumb": - link "首页" - textbox "搜索" - button "超级管理员 ": - text: 超级管理员 - emphasis: - text: 首页 RELEASE SOURSE 发布货源 ORDER MANAGEMENT 订单管理 CUSTOMER SERVICE 客服管理 - link "BIG DATA CENTER 大数据中心": - /url: https://ybxcx.ynyun8.com:8000/Bigdata/ - link "ZHONGMIN BIG DATA 中闽大数据": - /url: https://ybxcx.ynyun8.com:8000/zm/ - img - text: ZHONGMIN BIG DATA 中闽大数据 - text: 运输流程 官网 货源发布 货源审核 货源管理 运输核算 运单管理 预付 财务打款 - link: - /url: https://www.ynyun8.com/ - text: 平台车辆 平台订单 平台车辆总计 12,832 平台车辆 153,938 平台运力(吨) 货源单总数: 9948 1763 未接单 116 已接单 1347 已结算 30 已撤销 运输单总数: 29939 10073 待运输 460 运输中 7189 已卸货 货源单类型 9519 正常单 138 内容报价单 交易数据 充值总额(元) 158,232 交易总额(元) 117,687,373 运费总额(元) 37,980,387 开票总额(元) 838,947">tests\cross_end\tests\test_freight_full_flow.py:67: in test_full_freight_flow
|
||||
navbar.go_to_submenu("运输管理", "货源管理")
|
||||
tests\web\admin\pages\components\navbar.py:42: in go_to_submenu
|
||||
self.go_to(parent_menu)
|
||||
tests\web\admin\pages\components\navbar.py:33: in go_to
|
||||
self.click_when_ready(menu_item)
|
||||
tests\web\admin\pages\base_page.py:53: in click_when_ready
|
||||
self.wait_visible(locator)
|
||||
tests\web\admin\pages\base_page.py:33: in wait_visible
|
||||
expect(locator).to_be_visible(timeout=timeout_ms or self.timeout)
|
||||
E AssertionError: Locator expected to be visible
|
||||
E Actual value: hidden
|
||||
E Call log:
|
||||
E - Expect "to_be_visible" with timeout 30000ms
|
||||
E - waiting for get_by_text("运输管理").first
|
||||
E 60 × locator resolved to <span>运输管理</span>
|
||||
E - unexpected value "hidden"
|
||||
E
|
||||
E Aria snapshot:
|
||||
E - text:
|
||||
E - heading "系统布局配置" [level=3]
|
||||
E - text: 主题色 开启 Tags-View
|
||||
E - switch [checked]:
|
||||
E - checkbox [checked]
|
||||
E - text: 固定 Header
|
||||
E - switch:
|
||||
E - checkbox
|
||||
E - text: 侧边栏 Logo
|
||||
E - switch [checked]:
|
||||
E - checkbox [checked]
|
||||
E - img
|
||||
E - link:
|
||||
E - /url: "#/"
|
||||
E - img
|
||||
E - menubar:
|
||||
E - link "首页":
|
||||
E - /url: "#/home"
|
||||
E - menuitem "首页"
|
||||
E - menuitem "基础信息 "
|
||||
E - menuitem "整车运输 "
|
||||
E - menuitem "管理服务 "
|
||||
E - menuitem "同城运输 "
|
||||
E - menuitem "增值服务 "
|
||||
E - menuitem "财务统计 "
|
||||
E - menuitem "系统管理 "
|
||||
E - link "资源控制":
|
||||
E - /url: "#/resourceController"
|
||||
E - menuitem "资源控制"
|
||||
E - img
|
||||
E - navigation "Breadcrumb":
|
||||
E - link "首页"
|
||||
E - textbox "搜索"
|
||||
E - button "超级管理员 ":
|
||||
E - text: 超级管理员
|
||||
E - emphasis:
|
||||
E - text: 首页 RELEASE SOURSE 发布货源 ORDER MANAGEMENT 订单管理 CUSTOMER SERVICE 客服管理
|
||||
E - link "BIG DATA CENTER 大数据中心":
|
||||
E - /url: https://ybxcx.ynyun8.com:8000/Bigdata/
|
||||
E - link "ZHONGMIN BIG DATA 中闽大数据":
|
||||
E - /url: https://ybxcx.ynyun8.com:8000/zm/
|
||||
E - img
|
||||
E - text: ZHONGMIN BIG DATA 中闽大数据
|
||||
E - text: 运输流程 官网 货源发布 货源审核 货源管理 运输核算 运单管理 预付 财务打款
|
||||
E - link:
|
||||
E - /url: https://www.ynyun8.com/
|
||||
E - text: 平台车辆 平台订单 平台车辆总计 12,832 平台车辆 153,938 平台运力(吨) 货源单总数: 9948 1763 未接单 116 已接单 1347 已结算 30 已撤销 运输单总数: 29939 10073 待运输 460 运输中 7189 已卸货 货源单类型 9519 正常单 138 内容报价单 交易数据 充值总额(元) 158,232 交易总额(元) 117,687,373 运费总额(元) 37,980,387 开票总额(元) 838,947</failure></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="0" time="0.441" timestamp="2026-09-02T10:05:00.843692+08:00" hostname="yunba-126" /></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="0" time="0.458" timestamp="2026-09-02T10:05:27.343275+08:00" hostname="yunba-126" /></testsuites>
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="0" time="0.480" timestamp="2026-09-02T10:09:04.957655+08:00" hostname="yunba-126" /></testsuites>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="3" failures="0" skipped="0" tests="3" time="0.743" timestamp="2026-09-02T10:09:06.437700+08:00" hostname="yunba-126"><testcase classname="" name="app.driver_ios.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\driver_ios\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase><testcase classname="" name="app.shipper_android.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\shipper_android\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase><testcase classname="" name="app.shipper_ios.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\shipper_ios\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="3" failures="0" skipped="0" tests="3" time="0.724" timestamp="2026-09-02T10:09:19.673898+08:00" hostname="yunba-126"><testcase classname="" name="app.driver_ios.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\driver_ios\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase><testcase classname="" name="app.shipper_android.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\shipper_android\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase><testcase classname="" name="app.shipper_ios.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\shipper_ios\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase></testsuite></testsuites>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="1" failures="0" skipped="0" tests="1" time="0.211" timestamp="2026-09-02T10:09:33.933529+08:00" hostname="yunba-126"><testcase classname="" name="app.driver_ios.tests.test_smoke" time="0.000"><error message="collection failure">ImportError while importing test module 'E:\Desktop\xst_files\test\QaAutomationHub\tests\app\driver_ios\tests\test_smoke.py'.
|
||||
Hint: make sure your test modules/packages have valid Python names.
|
||||
Traceback:
|
||||
C:\Users\23184\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py:90: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E ModuleNotFoundError: No module named 'tests.test_smoke'</error></testcase></testsuite></testsuites>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,216 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 10:18:31</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
|
||||
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
|
||||
.header h1{font-size:22px;font-weight:500}
|
||||
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
|
||||
.summary{display:flex;gap:20px;padding:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
|
||||
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
|
||||
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
|
||||
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
|
||||
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
|
||||
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
|
||||
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
|
||||
table{width:100%;border-collapse:collapse;min-width:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail{}
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-grid{display:grid;grid-template-columns:200px 1fr;gap:0;padding:12px 20px 16px}
|
||||
.detail-col{display:contents}
|
||||
.detail-label{font-size:12px;color:#909399;padding:4px 8px;font-weight:500}
|
||||
.detail-val{font-size:12px;color:#333;padding:4px 8px}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}
|
||||
.case-shots{margin-top:10px}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
|
||||
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
|
||||
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 10:18:31</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">1</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">0</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">1</div><div class="label">失败</div></div>
|
||||
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span>执行时间: 2026-07-29 10:18:31</span>
|
||||
<span>套件耗时: 106.2s</span>
|
||||
<span>通过率: 0.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="8" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款完整流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-001 用例名称: 司机APP接单到管理端核算打款完整流程 优先级: P0 标签: cross</span>
|
||||
<span class="case-time">105.7s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-grid">
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">用例ID</div><div class="detail-val">TC-D2S-001</div>
|
||||
<div class="detail-label">优先级</div><div class="detail-val">P0</div>
|
||||
<div class="detail-label">标签</div><div class="detail-val">cross_end, smoke</div>
|
||||
<div class="detail-label">耗时</div><div class="detail-val">105.7s</div>
|
||||
</div>
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">阶段详情</div><div class="detail-val">无</div>
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator("table tbody tr") to be visible
|
||||
14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_101650.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:59 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_100500.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:05:06 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:05:17 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:05:17 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:05:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:05:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:05:55 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:05:55 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:05:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011002460003
|
||||
2026-07-29 10:05:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:06:07 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:07 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:06:14 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:06:22 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:22 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_095615.log</summary>
|
||||
<pre class="log-content">2026-07-29 09:56:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 09:56:15 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 09:56:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 09:56:31 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 09:56:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 09:56:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 09:56:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 09:56:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 09:57:11 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 09:57:11 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 09:57:12 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700010954080002
|
||||
2026-07-29 09:57:12 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 09:57:24 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700010954080002
|
||||
2026-07-29 09:57:24 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 09:57:31 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700010954080002
|
||||
2026-07-29 09:57:31 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 09:57:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700010954080002
|
||||
2026-07-29 09:57:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 当次测试截图 </div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 10:18:31 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
@@ -0,0 +1,269 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 10:41:51</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
|
||||
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
|
||||
.header h1{font-size:22px;font-weight:500}
|
||||
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
|
||||
.summary{display:flex;gap:20px;padding:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
|
||||
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
|
||||
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
|
||||
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
|
||||
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
|
||||
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
|
||||
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
|
||||
table{width:100%;border-collapse:collapse;min-width:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail{}
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-grid{display:grid;grid-template-columns:200px 1fr;gap:0;padding:12px 20px 16px}
|
||||
.detail-col{display:contents}
|
||||
.detail-label{font-size:12px;color:#909399;padding:4px 8px;font-weight:500}
|
||||
.detail-val{font-size:12px;color:#333;padding:4px 8px}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}
|
||||
.case-shots{margin-top:10px}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
|
||||
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
|
||||
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 10:41:51</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">2</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">0</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">2</div><div class="label">失败</div></div>
|
||||
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span>执行时间: 2026-07-29 10:41:51</span>
|
||||
<span>套件耗时: 177.3s</span>
|
||||
<span>通过率: 0.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="8" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款完整流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-001 用例名称: 司机APP接单到管理端核算打款完整流程 优先级: P0 标签: cross</span>
|
||||
<span class="case-time">104.0s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-grid">
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">用例ID</div><div class="detail-val">TC-D2S-001</div>
|
||||
<div class="detail-label">优先级</div><div class="detail-val">P0</div>
|
||||
<div class="detail-label">标签</div><div class="detail-val">cross_end, smoke</div>
|
||||
<div class="detail-label">耗时</div><div class="detail-val">104.0s</div>
|
||||
</div>
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">阶段详情</div><div class="detail-val">无</div>
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator("table tbody tr") to be visible
|
||||
14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="8" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">2</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款-车队长全额收款流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-002 用例名称: 司机APP接单到管理端核算打款-车队长全额收款流程 优先级: P0 标签:</span>
|
||||
<span class="case-time">72.8s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-grid">
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">用例ID</div><div class="detail-val">TC-D2S-002</div>
|
||||
<div class="detail-label">优先级</div><div class="detail-val">P0</div>
|
||||
<div class="detail-label">标签</div><div class="detail-val">cross_end, smoke</div>
|
||||
<div class="detail-label">耗时</div><div class="detail-val">72.8s</div>
|
||||
</div>
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">阶段详情</div><div class="detail-val">无</div>
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">AssertionError: Locator expected to be visible
|
||||
Actual value: hidden
|
||||
Call log:
|
||||
- Expect "to_be_visible" with timeout 5000ms
|
||||
- waiting for locator("body > div.el-select-dropdown.el-popper > div.el-scrollbar > div.el-select-dropdown__wrap.el-scrollbar__wrap > ul > li.el-select-dropdown__item.selected").first
|
||||
11 × locator resolved to <li data-v-74ef66d8="" class="el-select-dropdown__item selected hover">…</li>
|
||||
- unexpected value "hidden"
|
||||
|
||||
Aria snapshot:
|
||||
- text:
|
||||
- heading "系统布局配置" [</pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_103859.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:39:07 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011036430005
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:47 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011038250006
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_101650.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:59 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_100500.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:05:00 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:05:06 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:05:17 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:05:17 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:05:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:05:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:05:55 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:05:55 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:05:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011002460003
|
||||
2026-07-29 10:05:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:06:07 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:07 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:06:14 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:06:22 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011002460003
|
||||
2026-07-29 10:06:22 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 当次测试截图 </div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 10:41:51 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
@@ -0,0 +1,229 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 10:46:22</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
|
||||
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
|
||||
.header h1{font-size:22px;font-weight:500}
|
||||
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
|
||||
.summary{display:flex;gap:20px;padding:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
|
||||
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
|
||||
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
|
||||
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
|
||||
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
|
||||
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
|
||||
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
|
||||
table{width:100%;border-collapse:collapse;min-width:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail{}
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-grid{display:grid;grid-template-columns:200px 1fr;gap:0;padding:12px 20px 16px}
|
||||
.detail-col{display:contents}
|
||||
.detail-label{font-size:12px;color:#909399;padding:4px 8px;font-weight:500}
|
||||
.detail-val{font-size:12px;color:#333;padding:4px 8px}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}
|
||||
.case-shots{margin-top:10px}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
|
||||
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
|
||||
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 10:46:22</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">1</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">0</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">1</div><div class="label">失败</div></div>
|
||||
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span>执行时间: 2026-07-29 10:46:22</span>
|
||||
<span>套件耗时: 76.0s</span>
|
||||
<span>通过率: 0.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="8" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款-车队长全额收款流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-002 用例名称: 司机APP接单到管理端核算打款-车队长全额收款流程 优先级: P0 标签:</span>
|
||||
<span class="case-time">75.7s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-grid">
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">用例ID</div><div class="detail-val">TC-D2S-002</div>
|
||||
<div class="detail-label">优先级</div><div class="detail-val">P0</div>
|
||||
<div class="detail-label">标签</div><div class="detail-val">cross_end, smoke</div>
|
||||
<div class="detail-label">耗时</div><div class="detail-val">75.7s</div>
|
||||
</div>
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">阶段详情</div><div class="detail-val">无</div>
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">AssertionError: Locator expected to be visible
|
||||
Actual value: hidden
|
||||
Call log:
|
||||
- Expect "to_be_visible" with timeout 5000ms
|
||||
- waiting for locator("body > div.el-select-dropdown.el-popper > div.el-scrollbar > div.el-select-dropdown__wrap.el-scrollbar__wrap > ul > li.el-select-dropdown__item.selected").first
|
||||
11 × locator resolved to <li data-v-74ef66d8="" class="el-select-dropdown__item selected hover">…</li>
|
||||
- unexpected value "hidden"
|
||||
|
||||
Aria snapshot:
|
||||
- text:
|
||||
- heading "系统布局配置" [</pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_104511.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:45:17 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:45:26 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:45:26 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:45:47 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:45:47 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:46:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:46:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:46:04 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011042550007
|
||||
2026-07-29 10:46:04 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_103859.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:39:07 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011036430005
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:47 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011038250006
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_101650.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:16:50 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:16:59 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:17:06 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:17:27 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:17:44 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:45 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:17:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011014350004
|
||||
2026-07-29 10:18:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 当次测试截图 </div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 10:46:22 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
@@ -0,0 +1,222 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 10:50:51</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
|
||||
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
|
||||
.header h1{font-size:22px;font-weight:500}
|
||||
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
|
||||
.summary{display:flex;gap:20px;padding:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
|
||||
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
|
||||
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
|
||||
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
|
||||
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
|
||||
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
|
||||
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
|
||||
table{width:100%;border-collapse:collapse;min-width:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail{}
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-grid{display:grid;grid-template-columns:200px 1fr;gap:0;padding:12px 20px 16px}
|
||||
.detail-col{display:contents}
|
||||
.detail-label{font-size:12px;color:#909399;padding:4px 8px;font-weight:500}
|
||||
.detail-val{font-size:12px;color:#333;padding:4px 8px}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}
|
||||
.case-shots{margin-top:10px}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
|
||||
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
|
||||
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 10:50:51</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">1</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">0</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">1</div><div class="label">失败</div></div>
|
||||
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span>执行时间: 2026-07-29 10:50:51</span>
|
||||
<span>套件耗时: 108.8s</span>
|
||||
<span>通过率: 0.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="8" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款-车队长全额收款流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-002 用例名称: 司机APP接单到管理端核算打款-车队长全额收款流程 优先级: P0 标签:</span>
|
||||
<span class="case-time">108.5s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-grid">
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">用例ID</div><div class="detail-val">TC-D2S-002</div>
|
||||
<div class="detail-label">优先级</div><div class="detail-val">P0</div>
|
||||
<div class="detail-label">标签</div><div class="detail-val">cross_end, smoke</div>
|
||||
<div class="detail-label">耗时</div><div class="detail-val">108.5s</div>
|
||||
</div>
|
||||
<div class="detail-col">
|
||||
<div class="detail-label">阶段详情</div><div class="detail-val">无</div>
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator("table tbody tr") to be visible
|
||||
14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_104907.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:49:07 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:49:07 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:49:07 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:49:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:49:22 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:49:22 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:49:45 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:49:45 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:50:00 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:50:00 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:50:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011046510008
|
||||
2026-07-29 10:50:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
2026-07-29 10:50:16 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成(车队长全额收款): RHJC040026072700011046510008
|
||||
2026-07-29 10:50:16 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:50:23 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011046510008
|
||||
2026-07-29 10:50:23 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:50:30 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011046510008
|
||||
2026-07-29 10:50:30 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_104511.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:45:11 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:45:17 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:45:26 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:45:26 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:45:47 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:45:47 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:46:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:46:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:46:04 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011042550007
|
||||
2026-07-29 10:46:04 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
</pre>
|
||||
</details>
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_103859.log</summary>
|
||||
<pre class="log-content">2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 10:38:59 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:39:07 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:39:14 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:39:36 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:39:50 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011036430005
|
||||
2026-07-29 10:39:51 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:09 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011036430005
|
||||
2026-07-29 10:40:16 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 10:40:42 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 10:40:47 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 10:40:56 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 10:41:18 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 10:41:32 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011038250006
|
||||
2026-07-29 10:41:33 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 当次测试截图 </div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 10:50:51 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
@@ -0,0 +1,225 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>自动化测试报告 - 2026-07-29 11:07:31</title>
|
||||
<style>
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:'Microsoft YaHei','PingFang SC',sans-serif;background:#f5f7fa;color:#333;line-height:1.6}
|
||||
.header{background:linear-gradient(135deg,#409eff,#337ecc);color:#fff;padding:24px 32px}
|
||||
.header h1{font-size:22px;font-weight:500}
|
||||
.header .sub{font-size:13px;opacity:.75;margin-top:6px}
|
||||
.summary{display:flex;gap:20px;padding:24px 32px 12px;background:#fff}
|
||||
.card{flex:1;text-align:center;padding:16px;border-radius:8px}
|
||||
.card .num{font-size:36px;font-weight:600}
|
||||
.card .label{font-size:14px;color:#909399;margin-top:4px}
|
||||
.card.total{background:#f0f5ff}.card.total .num{color:#409eff}
|
||||
.card.pass{background:#f0f9eb}.card.pass .num{color:#67c23a}
|
||||
.card.fail{background:#fef0f0}.card.fail .num{color:#f56c6c}
|
||||
.card.skip{background:#fdf6ec}.card.skip .num{color:#e6a23c}
|
||||
.meta-row{display:flex;gap:24px;padding:8px 32px 20px;background:#fff;border-bottom:1px solid #e4e7ed;font-size:13px;color:#909399}
|
||||
.section-title{font-size:16px;font-weight:500;padding:20px 32px 12px;background:#fff}
|
||||
.tbl-wrap{margin:0 32px 20px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto}
|
||||
table{width:100%;border-collapse:collapse;min-width:600px}
|
||||
th{background:#f5f7fa;text-align:left;padding:10px 14px;font-size:13px;color:#909399;font-weight:500;border-bottom:2px solid #e4e7ed;white-space:nowrap}
|
||||
td{padding:0;border-bottom:1px solid #ebeef5;vertical-align:top}
|
||||
|
||||
/* ── 可折叠用例行 ── */
|
||||
.case-detail[open] .case-summary{background:#f0f5ff}
|
||||
.case-summary{display:flex;align-items:center;gap:12px;padding:10px 14px;cursor:pointer;list-style:none;user-select:none}
|
||||
.case-summary::-webkit-details-marker{display:none}
|
||||
.case-summary::before{content:'▶';font-size:10px;color:#909399;transition:transform .15s;width:14px;text-align:center}
|
||||
details[open]>.case-summary::before{transform:rotate(90deg)}
|
||||
.case-summary:hover{background:#f5f7fa}
|
||||
.case-idx{font-size:12px;color:#909399;min-width:24px;text-align:center;font-variant-numeric:tabular-nums}
|
||||
.case-title{flex:1;font-weight:500;font-size:13px}
|
||||
.case-desc-inline{font-size:12px;color:#909399;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.case-time{font-size:12px;color:#909399;min-width:48px;text-align:right}
|
||||
.s-pass{color:#67c23a;font-weight:600}
|
||||
.s-fail{color:#f56c6c;font-weight:600}
|
||||
.s-skip{color:#e6a23c;font-weight:600}
|
||||
.case-row-s-pass .case-summary{border-left:3px solid #67c23a}
|
||||
.case-row-s-fail .case-summary{border-left:3px solid #f56c6c}
|
||||
.case-row-s-skip .case-summary{border-left:3px solid #e6a23c}
|
||||
|
||||
/* ── 展开后详情 ── */
|
||||
.detail-body{padding:12px 20px 16px;border-top:1px solid #ebeef5}
|
||||
.detail-meta{display:flex;flex-wrap:wrap;gap:8px 24px;margin-bottom:10px}
|
||||
.meta-item{display:flex;gap:4px;font-size:12px}
|
||||
.meta-label{color:#909399;font-weight:500}
|
||||
.meta-value{color:#333}
|
||||
.case-err{margin-top:8px}
|
||||
.err-label{font-size:12px;color:#f56c6c;font-weight:600;margin-bottom:4px}
|
||||
.err-msg{font-size:11px;background:#fff7f7;color:#f56c6c;padding:8px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}
|
||||
.case-shots{margin-top:10px}
|
||||
.case-shots-title{font-size:12px;color:#606266;font-weight:500;margin-bottom:6px}
|
||||
.case-log-section{margin-top:10px;border:1px solid #e4e7ed;border-radius:4px;overflow:hidden}
|
||||
.case-log-section summary{font-size:12px;font-weight:500;cursor:pointer;padding:6px 10px;background:#fafafa;color:#606266}
|
||||
.case-log-content{font-size:10.5px;background:#1e1e1e;color:#d4d4d4;padding:8px;white-space:pre-wrap;word-break:break-all;max-height:300px;overflow-y:auto;font-family:'Consolas','Courier New',monospace;margin:0}
|
||||
|
||||
.phases{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px}
|
||||
.phases span{font-size:11px;padding:2px 8px;border-radius:10px;white-space:nowrap}
|
||||
.phase-phase{background:#e6f7ff;color:#1890ff}
|
||||
.phase-done{background:#f6ffed;color:#52c41a}
|
||||
|
||||
/* ── 日志 ── */
|
||||
.log-section{margin:0 32px 12px;background:#fff;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.06);padding:12px 20px}
|
||||
.log-section summary{font-size:14px;font-weight:500;cursor:pointer;padding:4px 0}
|
||||
.log-content{font-size:11px;background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;white-space:pre-wrap;word-break:break-all;max-height:400px;overflow-y:auto;font-family:'Consolas','Courier New',monospace}
|
||||
|
||||
/* ── 截图 ── */
|
||||
.shot-gallery{display:flex;flex-wrap:wrap;gap:12px;padding:4px 0}
|
||||
.shot-card-sm{width:200px;border-radius:6px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.08);background:#fff;transition:box-shadow .2s}
|
||||
.shot-card-sm:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}
|
||||
.shot-card-sm .shot-thumb{width:100%;height:140px;overflow:hidden;cursor:pointer;position:relative;background:#f5f7fa}
|
||||
.shot-card-sm .shot-thumb img{width:100%;height:100%;object-fit:contain;display:block}
|
||||
.shot-card-sm .shot-label{font-size:10px;color:#606266;padding:4px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
||||
.shot-thumb.expanded{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90vw;height:90vh;z-index:9999;background:rgba(0,0,0,.85);border-radius:0!important}
|
||||
.shot-thumb.expanded img{width:auto;height:auto;max-width:100%;max-height:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
||||
.shot-thumb::after{content:'🔍';position:absolute;bottom:4px;right:6px;font-size:12px;opacity:0;transition:opacity .2s}
|
||||
.shot-thumb:hover::after{opacity:.7}
|
||||
.shot-group{margin:0 0 8px}
|
||||
.shot-group summary{font-size:13px;font-weight:500;cursor:pointer;padding:4px 0;color:#606266}
|
||||
.ft{text-align:center;padding:24px;font-size:12px;color:#c0c4cc}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<h1>🚀 自动化测试报告</h1>
|
||||
<div class="sub">运八网络货运平台 · QaAutomationHub · 2026-07-29 11:07:31</div>
|
||||
</div>
|
||||
|
||||
<div class="summary">
|
||||
<div class="card total"><div class="num">2</div><div class="label">总计</div></div>
|
||||
<div class="card pass"><div class="num">1</div><div class="label">通过</div></div>
|
||||
<div class="card fail"><div class="num">1</div><div class="label">失败</div></div>
|
||||
<div class="card skip"><div class="num">0</div><div class="label">跳过</div></div>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span>执行时间: 2026-07-29 11:07:31</span>
|
||||
<span>套件耗时: 200.3s</span>
|
||||
<span>通过率: 50.0%</span>
|
||||
<span style="cursor:pointer;color:#409eff" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=true)">📂 全部展开</span>
|
||||
<span style="cursor:pointer;color:#909399" onclick="document.querySelectorAll('.case-detail').forEach(d=>d.open=false)">📁 全部折叠</span>
|
||||
</div>
|
||||
<div class="tbl-wrap">
|
||||
<table>
|
||||
<thead><tr>
|
||||
<th style="width:36px">#</th><th>状态</th><th>用例名称 / 描述</th><th>耗时(s)</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr class="case-row case-row-s-pass">
|
||||
<td colspan="4" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">1</span>
|
||||
<span class="s-pass">✅ 通过</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款完整流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-001 用例名称: 司机APP接单到管理端核算打款完整流程 优先级: P0 标签: cross</span>
|
||||
<span class="case-time">92.2s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-body">
|
||||
<div class="detail-meta">
|
||||
<div class="meta-item"><span class="meta-label">用例ID</span><span class="meta-value">TC-D2S-001</span></div>
|
||||
<div class="meta-item"><span class="meta-label">优先级</span><span class="meta-value">P0</span></div>
|
||||
<div class="meta-item"><span class="meta-label">标签</span><span class="meta-value">cross_end, smoke</span></div>
|
||||
<div class="meta-item"><span class="meta-label">耗时</span><span class="meta-value">92.2s</span></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="case-row case-row-s-fail">
|
||||
<td colspan="4" style="padding:0">
|
||||
<details class="case-detail">
|
||||
<summary class="case-summary">
|
||||
<span class="case-idx">2</span>
|
||||
<span class="s-fail">❌ 失败</span>
|
||||
<span class="case-title">司机APP接单到管理端核算打款-车队长全额收款流程</span>
|
||||
<span class="case-desc-inline">用例ID: TC-D2S-002 用例名称: 司机APP接单到管理端核算打款-车队长全额收款流程 优先级: P0 标签:</span>
|
||||
<span class="case-time">107.8s</span>
|
||||
</summary>
|
||||
|
||||
<div class="detail-body">
|
||||
<div class="detail-meta">
|
||||
<div class="meta-item"><span class="meta-label">用例ID</span><span class="meta-value">TC-D2S-002</span></div>
|
||||
<div class="meta-item"><span class="meta-label">优先级</span><span class="meta-value">P0</span></div>
|
||||
<div class="meta-item"><span class="meta-label">标签</span><span class="meta-value">cross_end, smoke</span></div>
|
||||
<div class="meta-item"><span class="meta-label">耗时</span><span class="meta-value">107.8s</span></div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="case-err">
|
||||
<div class="err-label">错误信息</div>
|
||||
<pre class="err-msg">playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator("table tbody tr") to be visible
|
||||
14 × locator resolved to 5 elements. Proceeding with the first one: <tr>…</tr></pre>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</details>
|
||||
</td>
|
||||
</tr></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="section-title">📋 测试日志</div>
|
||||
|
||||
<details class="log-section">
|
||||
<summary>📄 test_run_20260729_110415.log (全文)</summary>
|
||||
<pre class="log-content">2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程开始
|
||||
2026-07-29 11:04:15 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:04:24 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 11:04:32 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 11:04:32 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 11:04:54 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 11:04:54 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 11:05:08 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 11:05:08 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 11:05:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(首次查询无数据时自动 SQL 重试)
|
||||
2026-07-29 11:05:20 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:20 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 11:05:27 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:27 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 11:05:35 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:35 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-货主打款完成: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款 完整流程结束!
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 运输单号: RHJC040026072700011102010009
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 核算完成: True
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — 审核完成: True
|
||||
2026-07-29 11:05:43 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — 跨端 E2E: 司机APP → 管理端核算打款(车队长全额收款)完整流程开始
|
||||
2026-07-29 11:05:48 [INFO] tests.cross_end.test_driver_to_settlement — ============================================================
|
||||
2026-07-29 11:05:53 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始接单流程
|
||||
2026-07-29 11:06:03 [INFO] tests.cross_end.test_driver_to_settlement — -> 接单流程完成
|
||||
2026-07-29 11:06:03 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始装货流程
|
||||
2026-07-29 11:06:25 [INFO] tests.cross_end.test_driver_to_settlement — -> 装货流程完成
|
||||
2026-07-29 11:06:25 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 开始卸货流程
|
||||
2026-07-29 11:06:39 [INFO] tests.cross_end.test_driver_to_settlement — -> 卸货流程完成
|
||||
2026-07-29 11:06:39 [INFO] tests.cross_end.test_driver_to_settlement — Phase 1: 司机 APP — 获取运输单号
|
||||
2026-07-29 11:06:41 [INFO] tests.cross_end.test_driver_to_settlement — -> 运输单号: RHJC040026072700011103320010
|
||||
2026-07-29 11:06:41 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运费核算(车队长全额收款模式)
|
||||
2026-07-29 11:06:55 [INFO] tests.cross_end.test_driver_to_settlement — -> 运费核算完成(车队长全额收款): RHJC040026072700011103320010
|
||||
2026-07-29 11:06:55 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 运单审核
|
||||
2026-07-29 11:07:02 [INFO] tests.cross_end.test_driver_to_settlement — -> 运单审核完成: RHJC040026072700011103320010
|
||||
2026-07-29 11:07:02 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-财务打款
|
||||
2026-07-29 11:07:10 [INFO] tests.cross_end.test_driver_to_settlement — -> 垫资-财务打款完成: RHJC040026072700011103320010
|
||||
2026-07-29 11:07:10 [INFO] tests.cross_end.test_driver_to_settlement — Phase 2: Web管理端 — 垫资-货主打款
|
||||
</pre>
|
||||
</details>
|
||||
<div class="section-title">📸 截图汇总</div>
|
||||
<div class="log-section"><p style="color:#909399">暂无截图</p></div>
|
||||
<div class="ft">报告自动生成于 2026-07-29 11:07:31 · QaAutomationHub 自动化测试框架</div>
|
||||
</body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user