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

使用Python Selenium自动化Expedia时无法定位日期字段元素

Expedia航班自动化:日期元素定位失败问题

操作流程

  • 访问Expedia.com
  • 点击Flights(航班)按钮
  • 默认选择Round trip(往返)选项
  • 点击Leaving from(出发地)并选择SFO
  • 点击Going to(目的地)并选择NYC
  • 尝试点击Dates(日期)时失败

代码示例

import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()

driver.implicitly_wait(10)

driver.maximize_window()

driver.get("https://www.expedia.com/")

driver.implicitly_wait(10)

# Click on RoundTrip
driver.find_element(By.XPATH,"//span[normalize-space()='Flights']").click()

# Leaving From
leaving_from = driver.find_element(By.XPATH,"//button[@aria-label='Leaving from']")
leaving_from.click()
search_by_city= driver.find_element(By.XPATH,"//input[@id='origin_select']")
search_by_city.click()
time.sleep(10)
search_by_city.send_keys("SFO")
time.sleep(10)
search_by_city.send_keys(Keys.ENTER)

# Going To
going_to = driver.find_element(By.XPATH,"//button[@aria-label='Going to']")
going_to.click()
search_going_to = driver.find_element(By.XPATH,"//input[@id='destination_select']")
search_going_to.click()
time.sleep(10)
search_going_to.send_keys("NYC")
time.sleep(10)
search_going_to.send_keys(Keys.ENTER)

time.sleep(10)

# Dates 
dates = driver.find_element(By.CSS_SELECTOR,"#date_form_field-btn")
dates.click()
time.sleep(10)

错误信息

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#date_form_field-btn"}

解决方法
  1. 更换稳定的元素定位器
    Expedia的元素ID可能动态变更,建议改用基于aria-label的XPATH定位,更可靠:
dates = driver.find_element(By.XPATH, "//button[@aria-label='Departure date']")
dates.click()

如果是往返的日期区域,也可以用文本包含的方式定位:

dates = driver.find_element(By.XPATH, "//span[contains(text(),'Departure')]/parent::button")
  1. 用显式等待替代强制等待
    time.sleep()无法确保元素加载完成,改用Selenium显式等待,等待元素可点击后再操作:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待日期按钮加载并可点击,最长等待20秒
dates = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Departure date']"))
)
dates.click()
  1. 检查是否存在iframe嵌套
    如果日期选择器被嵌套在iframe中,需要先切换到iframe再定位元素:
# 定位目标iframe(根据实际页面调整定位器)
iframe = WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.XPATH, "//iframe[contains(@src,'datepicker')]"))
)
driver.switch_to.frame(iframe)

# 定位并点击日期按钮
dates = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Departure date']"))
)
dates.click()

# 操作完成后切回主文档
driver.switch_to.default_content()
  1. 提前处理页面弹窗
    页面可能存在cookie同意弹窗或其他模态框,干扰元素定位,需先关闭:
# 处理cookie弹窗(示例,根据实际页面调整)
try:
    accept_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'Accept')]"))
    )
    accept_btn.click()
except Exception:
    # 没有弹窗则跳过
    pass

内容的提问来源于stack exchange,提问作者Falguni Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:18:16