Selenium 显式等待:按业务元素而不是死 sleep
页面跳转和异步渲染不稳定时,time.sleep(5) 既慢又脆。更稳的方式是 WebDriverWait 等“业务上真正就绪”的条件。
示例:追踪结果页
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import logging
def wait_tracking_ready(driver):
try:
WebDriverWait(driver, 15).until(lambda d: "track" in d.current_url.lower())
except TimeoutException:
logging.warning("未跳转到追踪结果页"); return False
try:
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "span[data-test-id='delivery-date-header']"))
)
except TimeoutException:
logging.warning("交付信息区域超时")
try:
WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.XPATH, "//span[contains(text(), 'DELIVERED')]"))
)
logging.info("包裹已送达")
except TimeoutException:
logging.info("未检测到 DELIVERED,可能仍在运输")
return True
原则
- 先等 URL/关键容器,再解析字段。
- 不同信息用不同超时,避免一个慢节点拖死全流程。
- 选择器会变,建议集中配置并定期回归。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 HT Notes