diff --git a/site_zto.py b/site_zto.py index e5bb3ab..464c17c 100644 --- a/site_zto.py +++ b/site_zto.py @@ -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)