页面跳转和异步渲染不稳定时,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/关键容器,再解析字段。
  • 不同信息用不同超时,避免一个慢节点拖死全流程。
  • 选择器会变,建议集中配置并定期回归。