使用Selenium(Ruby)单击下拉菜单中的选项

使用Selenium(Ruby)单击下拉菜单中的选项,ruby,selenium,drop-down-menu,html-select,Ruby,Selenium,Drop Down Menu,Html Select,我知道这个问题听起来像是重复,但我已经尝试了我在这里找到的解决方案,到目前为止没有一个对我有效 从以下问题实施解决方案: Ruby中的方法参考: 我正在用硒和黄瓜来测试一个网站。我在IE8工作 chan_text = @driver.find_element(:css,'select#check-list option').text select_list = @driver.find_element(:css,'select#check-list') dropdown = Seleniu

我知道这个问题听起来像是重复,但我已经尝试了我在这里找到的解决方案,到目前为止没有一个对我有效

从以下问题实施解决方案:

Ruby中的方法参考:

我正在用硒和黄瓜来测试一个网站。我在IE8工作

chan_text = @driver.find_element(:css,'select#check-list option').text
select_list = @driver.find_element(:css,'select#check-list')
dropdown = Selenium::WebDriver::Support::Select.new(select_list)
dropdown.select_by(:text, chan_text)
源代码如下所示:

<select id="check_list" multiple="">
<option selected="" value="81" label="MILK">MILK</option>
<option value="82" label="CHEESE">CHEESE</option>
<option value="83" label="DOUGHNUTS">DOUGHNUTS</option>
</select>

牛奶
奶酪
甜甜圈

选择选项后,页面应刷新。这根本没有发生,菜单只是保持打开状态。感谢您的帮助,如果需要,请提供更多信息。如果这是一个重复的问题,我将删除它

如果你这样做会得到什么

chan_text = @driver.find_element(:css,'select#check-list option').text
puts chan_text
我敢打赌,这不是你想要的

但如果你这样做-

chan_text = @driver.find_element(:css,'select#check-list option:nth-child(2)').text
puts chan_text #"CHEESE" is what will be returned

原因是find_元素(用于chan_文本)的选择器返回所有选项值,我假设您只需要一个。因此,在css选择器中添加第n个子项(n),将帮助您选择您特别感兴趣的选项。

我发现了一个更好的选项:

#Select the dropdown button 
dropdown_list = driver.find_element(:id, 'check_list')

#Get all the options from the dropdown
options = dropdown_list.find_elements(tag_name: 'option')

#Find the dropdown value by text
options.each { |option| option.click if option.text == 'CHEESE' }

需要网页url,才能查看网页源html。很抱歉,我无法共享该网页。如果没有它,答案是不可能的,我将删除这个问题,并找到另一种方式提问。这不是确切的解决方案,但它确实引导了我!通过选择第n个子项,我注意到该项未高亮显示。这让我意识到啊,这个项目已经被选中了!因此,我没有尝试访问特定的选项,而是做了一个send_keys:return,它起作用了。我意识到,看不到源头,人们很难提供帮助。我想我会删除这个问题,因为我的问题很多都不知道,所以找不到具体的解决办法。事实上,我想我会把这个标记为答案。如果这正是我的问题,那么您的解决方案就会起作用。实际上,在确定所有选项值都将返回时,答案是不正确的。他使用的是
find_element
(而不是
find_elements
),它只返回一个元素,即找到的第一个元素。我的猜测是,正如他所指出的,当他从option元素获取文本时,焦点被赋予select控件,但是更新页面的事件侦听器从未被触发。我鼓励@megaxelize与开发人员一起确定监听的确切事件,然后适当地触发它。@bLoad,答案是正确的。根据Megaxelize的问题,是否提供了此答案。如果她想收集所有可用的选项,然后从获得的列表/数组中选择一个特定的选项,那么使用
find_elements
将有助于做到这一点。然后迭代该元素列表/数组,可以找到每个元素的文本并存储在另一个数组中。另一个解决方案是编写javascript,在一行/一步中完成所有这些工作。@b加载,我的答案提供了选择一个选项而不是所有选项的方法。