我们可以利用 extract_delivered_time_fedex 函数中的一些元素选择器来改进显式等待。以下是如何修改显式等待部分的建议:

python

try:
    WebDriverWait(driver, 15).until(
        lambda d: "track" in d.current_url.lower()
    )
    
    # 使用显式等待来等待页面上的特定元素
    try:
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "span[data-test-id='delivery-date-header']"))
        )
        logging.info("追踪结果页面加载完成")
    except TimeoutException:
        logging.warning("等待追踪结果页面元素超时")
    
    # 额外等待一些可能的动态内容
    try:
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "statCode"))
        )
        logging.info("追踪状态信息加载完成")
    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("包裹未送达或正在运输中")

except TimeoutException:
    logging.warning("页面未能正确跳转到追踪结果页面")
    return "页面加载超时", None, "否"

这个修改版本利用了 extract_delivered_time_fedex 函数中的一些元素选择器:

  1. 我们使用 span[data-test-id='delivery-date-header'] 来等待页面的主要内容加载。这个元素似乎是包含交付日期信息的关键元素。

  2. 我们使用 id="statCode" 来等待状态代码元素,这可能包含更详细的包裹状态信息。

  3. 我们添加了一个额外的检查,查找包含 "DELIVERED" 文本的 span 元素,这可以快速确定包裹是否已送达。

这种方法有以下优点:

  • 它更精确地定位了包含关键信息的元素。

  • 它可以更好地处理不同的包裹状态(已送达vs正在运输)。

  • 它提供了更详细的日志信息,有助于调试和监控。

请注意,你可能需要根据实际的页面结构和加载行为来调整等待时间和元素选择器。此外,考虑到网页结构可能会随时间变化,定期检查和更新这些选择器是个好习惯。