用Selenium 2操作JavaScript下拉菜单

1 投票
1 回答
2066 浏览
提问于 2025-04-17 05:42

我已经尝试了大约一周,想用selenium 2来做一个下拉菜单。这是我在做的一个项目,目的是自动化搜索航班,使用的是ITA Matrix 2(http://matrix.itasoftware.com/)。其他功能都正常,但在下拉菜单中选择乘客数量时遇到了问题。点击下拉菜单是没问题的,但我尝试发送键盘输入或使用箭头键去选择时,无论是对下拉菜单本身,还是弹出后新生成的ID,都没有任何反应。非常感谢任何帮助!(我对python非常陌生,这个项目是我自学的练习)

from selenium import webdriver
from time import sleep
import time

driver = webdriver.Firefox()
driver.get("http://matrix.itasoftware.com/")


driver.find_element_by_id("advancedfrom1").send_keys(lport) #starting airport
driver.find_element_by_id("advancedto1").send_keys(rport) #destination airport
driver.find_element_by_id("advanced_rtDeparture").send_keys(ldate) #leaving date
driver.find_element_by_id("advanced_rtReturn").send_keys(rdate)    #return date
driver.find_element_by_id("ita_form_location_RouteLanguageTextBox_0").send_keys(lflight) #going flight number
driver.find_element_by_id("ita_form_location_RouteLanguageTextBox_1").send_keys(rflight) #return flight number

#problem code:


driver.find_element_by_id("ita_form_pax_Passenger_0").click()#.send_keys("2")
time.sleep(2)  #allow drop down to pop up

from selenium.webdriver.common.keys import Keys
driver.find_element_by_id("dijit_MenuItem_4_text").send_keys(Keys.DOWN)  #tried to scroll down
driver.find_element_by_id("ita_form_pax_Passenger_0").send_keys(Keys.DOWN)
#also tried just sending the number directly:
driver.find_element_by_id("dijit_MenuItem_4_text").send_keys(numpax)
driver.find_element_by_id("ita_form_pax_Passenger_0").send_keys(numpax)

1 个回答

2

在这种情况下,它失败了,因为乘客下拉菜单实际上并不是一个真正的下拉菜单,而是一些巧妙的HTML和JavaScript组合,所以它不会像我们预期的那样对常规事件做出反应。

试试这个:

点击ID为:

ita_form_pax_Passenger_0

的列表,然后点击XPath中的菜单项(把'NUMBER_OF_PASSENGERS'替换成乘客的数量):

//td[contains(@id,'dijit_MenuItem')][text()='NUMBER_OF_PASSENGERS']

撰写回答