使用WebDriver和Ruby与JavaScript下拉菜单交互?

我正在使用Ruby和Selenium WebDriver为网页编写自动化,但遇到了一个阻塞问题,网站上的一些下拉菜单是使用JavaScript而不是标准HTML制作的。 在这些下拉菜单中,用户可以从下拉列表中选择一个选项或单击它并开始键入它以根据键入的内容过滤结果(我假设这些下拉列表可能是非常长的列表选项)。

问题是我无法找到使用WebDriver与它们交互的方法,虽然我已经设法使用下面的代码在Selenium IDE中使用它,但是将此IDE脚本导出到Ruby不起作用:

 select css=select[name=dsref] demo  

我使用的WebDriver代码是:

 def clickOn (parameters = {}) # This will accept a locator type and name to click on # # EXAMPLE # # clickOn( # locatorType: :link, # locatorName: 'Home' # ) # # This will click on the link named 'Home' locatorType = parameters[:locatorType] locatorName = parameters[:locatorName] $driver.find_element(locatorType, locatorName).click end clickOn( locatorType: :xpath, locatorName: '/html/body/form/fieldset[4]/div[2]/div/div/div/a/span' ) 

然后我尝试使用隐藏值字段的xpath以相同的方式从下拉列表中找到选择,但是它无法找到隐藏的值。

我想与之互动的javascript是:

 

chosen=Chosen { form_field=select#sel2DZ.admn_dropdownmenu, options= {...}, active_field= true , more...} demo demo download
demo
  • demo
  • demo download

关于如何使用Ruby WebDriver设置此下拉值的任何想法?

javascript只是与隐藏的下拉列表进行交互,因此您可以使用以下命令取消隐藏实际的下拉菜单:

 @driver.execute_script("document.getElementsByName('#{ 

这会将隐藏下拉列表的显示设置为“阻止”,以便您可以正常地与其进行交互。

我使用Python API,但我认为你应该理解这种方法。 这是我在测试中使用的方法。 所以我实际点击链接,等待下拉列表显示,单击选项。

 def select_random_js_dropdown_option(driver, link_to_call_dropdown_xpath, dropdown_option_xpath): options = driver.find_elements_by_xpath(dropdown_option_xpath) driver.find_element_by_xpath(link_to_call_dropdown_xpath).click() wait_for_element_to_load(driver, dropdown_option_xpath) random.choice(options).click() def wait_for_element_to_load(driver, element_xpath, time_to_wait): try: return WebDriverWait(driver, time_to_wait).until(lambda driver : driver.find_element_by_xpath(element_xpath).is_displayed()) finally: pass 

这就是我使用ruby与下拉列表进行交互的方式

 Selenium::WebDriver::Support::Select.new(@driver.find_element(:name, name)).select_by(:text, data_to_select) 

这是我从Ruby中的下拉列表中选择的方式: –

 option = Selenium::WebDriver::Support::Select.new(browser.find_element(:id => "00NZ0000001G35y") ) option.select_by(:text, "Mumbai") 

希望它能帮到你!