Selenium Python问题:无法用ARROW_DOWN选择自动提示下拉框指定元素
问题分析
你的代码存在几个关键问题导致ARROW_DOWN操作失效:
- 发送ARROW_DOWN时,未等待下拉选项列表完全加载,按键可能发送到了空的列表上
- 第二种方法中,判断
"New Plymouth" in depart_from.text是错误的,输入框的文本不会随下拉选项选中而改变,应该检查下拉选项的文本 - 循环中的
break缩进错误,导致语法错误
修正方案
我们需要先等待下拉选项列表加载完成,再通过ARROW_DOWN导航到目标选项,最后按ENTER确认选择。以下是修正后的代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.chrome.options import Options from time import sleep options = Options() options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_argument('--ignore-certificate-errors') options.add_argument('--incognito') driver = webdriver.Chrome(options=options) driver.get('https://www.yatra.com/flights') driver.maximize_window() sleep(2) wait = WebDriverWait(driver, 10) # 处理Cookie弹窗 try: wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'I Agree')]"))).click() sleep(1) except NoSuchElementException: print("无Cookie同意按钮!") # 定位出发城市输入框并点击激活 depart_from = wait.until(EC.presence_of_element_located((By.ID, "BE_flight_origin_city"))) depart_from.click() sleep(1) depart_from.clear() # 输入部分城市名 depart_from.send_keys('New') # 等待下拉选项列表加载完成 wait.until(EC.visibility_of_element_located((By.XPATH, "//ul[@class='ac-list']"))) # 循环发送ARROW_DOWN,直到选中目标选项 target_city = "New Plymouth" for i in range(10): # 发送向下箭头 depart_from.send_keys(Keys.ARROW_DOWN) sleep(0.5) # 给页面一点响应时间 # 获取当前选中的选项文本 selected_option = wait.until(EC.visibility_of_element_located((By.XPATH, "//ul[@class='ac-list']//li[@class='ac-selected']"))) if target_city in selected_option.text: # 按ENTER确认选择 depart_from.send_keys(Keys.ENTER) break print("出发城市:", depart_from.get_attribute('value')) driver.quit()
关键改动说明
- 新增等待下拉选项列表(
ul[@class='ac-list'])可见的步骤,确保选项已加载 - 循环中定位当前选中的选项(
li[@class='ac-selected']),检查其文本是否为目标城市 - 选中目标后发送
Keys.ENTER确认选择,而非直接点击输入框 - 修正了原代码中的语法错误(
break的缩进)
内容的提问来源于stack exchange,提问作者user14209738
相关产品推荐
相关产品推荐

