Fix ZTO actual-download date-cell click blocked by hover tooltip

中通实到流程选日期时,Playwright 的 .click() 会先 hover 日期格子,
触发“范围长度”提示气泡(.date-range-length-tip)盖住格子,导致点击被
判遮挡而超时(query_days=1 时尤甚,起始日==今日,点的是同一格子两次)。

改为直接在日期格子元素上派发 mousedown+mouseup+click 事件(新增
_dom_click helper),不经过坐标命中测试,气泡根本不会出现、也无法拦截。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-07-06 23:26:37 +08:00
parent 63ee8bbae1
commit 3ae94bef0d

View File

@@ -30,6 +30,18 @@ def _wait_and_get_frame(page, text_indicator, timeout_ms=20000):
raise TimeoutError(f"超时:未找到包含 [{text_indicator}] 的窗口。")
def _dom_click(locator):
"""直接在元素上派发 mousedown+mouseup+click 事件,不走 Playwright 的坐标命中测试,
避免被遮挡元素(如日期控件的 hover 提示气泡)拦截。事件直接发到目标元素并冒泡,
兼容绑定 mousedown 或 click 的控件。"""
locator.evaluate(
"el => { const o = { bubbles: true, cancelable: true, view: window, button: 0 };"
" el.dispatchEvent(new MouseEvent('mousedown', o));"
" el.dispatchEvent(new MouseEvent('mouseup', o));"
" el.dispatchEvent(new MouseEvent('click', o)); }"
)
def zto_smart_menu_click(page, menu_path):
"""中通菜单导航"""
print(f">> 正在导航: {' -> '.join(menu_path)}")
@@ -295,18 +307,20 @@ def zto_actual_download(page):
start_time = today_time - (query_days - 1) * 86400000
start_cell = arr_frame.locator(f"td div.day[time='{start_time}']").first
# 日期格子用 _dom_click 直接派发事件Playwright 的 .click() 会先 hover 格子,
# 触发“范围长度”提示气泡(.date-range-length-tip)盖住格子,导致点击被判遮挡而超时。
if start_cell.is_visible():
start_cell.click()
_dom_click(start_cell)
page.wait_for_timeout(300)
today_cell.click()
_dom_click(today_cell)
else:
today_cell.click()
_dom_click(today_cell)
page.wait_for_timeout(300)
today_cell.click()
_dom_click(today_cell)
else:
today_cell.click()
_dom_click(today_cell)
page.wait_for_timeout(300)
today_cell.click()
_dom_click(today_cell)
page.wait_for_timeout(500)