You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium航班价格追踪器日历循环无法选中指定日期

解决Expedia日历日期选择超时问题

核心问题分析

你遇到的问题本质是未判断当前日历显示的月份是否匹配目标月份就盲目循环点击下月箭头,同时可能存在日期元素定位不准确、未等待元素加载完成的情况。

具体解决方案

以下是可落地的代码步骤和注意事项:

  • 拆分目标日期信息
    先把要选择的日期解析成年、月、日的结构化数据,方便后续对比月份:

    from datetime import datetime
    target_date = datetime(2024, 6, 15)  # 替换成你的目标日期
    target_month_year = target_date.strftime("%B %Y")  # 格式化为"June 2024"样式
    
  • 动态判断并切换月份
    不要一直点击下月,而是通过日历头部的月份文本,判断当前月份与目标月份的关系,按需点击下月/上月箭头,直到匹配:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 等待日历头部加载完成
    calendar_header = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="calendar-month-header"]'))
    )
    
    while True:
        current_month_text = calendar_header.text.strip()
        if current_month_text == target_month_year:
            break  # 月份匹配,停止切换
        
        # 解析当前月份,判断切换方向
        current_month = datetime.strptime(current_month_text, "%B %Y")
        if current_month < target_date:
            # 点击下月箭头
            next_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="calendar-next-button"]'))
            )
            next_btn.click()
        else:
            # 点击上月箭头
            prev_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="calendar-prev-button"]'))
            )
            prev_btn.click()
        
        # 等待新月份加载后,更新日历头部元素
        calendar_header = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="calendar-month-header"]'))
        )
    
  • 精准定位可点击的目标日期
    月份匹配后,要确保定位的是当前月份下未灰化、可点击的日期元素,避免定位到相邻月份的无效日期:

    target_day = str(target_date.day)
    # 用XPath筛选出当前月份下的有效日期
    target_date_xpath = f'//div[@data-testid="calendar-day" and text()="{target_day}" and not(@disabled)]'
    target_date_elem = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, target_date_xpath))
    )
    target_date_elem.click()
    

关键注意事项

  • 定期检查Expedia的元素属性:data-testid这类标识可能会随网站更新变化,需要用浏览器开发者工具重新确认定位器。
  • 避免使用绝对XPath:绝对路径极易受页面结构变化影响,优先用data-testid、CSS类名等相对定位方式。
  • 处理边界日期:如果目标日期是当月的首尾几天,可能会显示在相邻月份的日历区域,此时可以结合父容器的月份属性进一步筛选元素。

内容的提问来源于stack exchange,提问作者Yamar Lyons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:18:35