Capybara将选项文本下拉到数组中

时间:2013-02-21 15:13:21

标签: ruby capybara

我想将一个下拉列表的选项放入一个通常在capybara中的数组中。在这个过程之后,我希望有一个字符串的arrray,包含所有下拉选项。我已经尝试了下面的代码,但无论选项计数是什么,我的数组的长度都保持为1。

periods = Array.new()
periods = all('#MainContent_dd')
print periods.length

2 个答案:

答案 0 :(得分:24)

问题是all('#MainContent_dd')会返回标识为MainContent_dd的所有元素。假设这是您的下拉列表并且ID是唯一的,则periods.length为1(即periods是选择列表)。

您要做的是获取option元素而不是select元素。

假设你的html是:

<select id="MainContent_dd">
    <option>Option A</option>
    <option>Option B</option>
    <option>Option C</option>
</select>

然后你可以这样做:

  periods = find('#MainContent_dd').all('option').collect(&:text)
  p periods.length
  #=> 3
  p periods
  #=> ["Option A", "Option B", "Option C"]

这是做什么的:

  1. find('#MainContent_dd') - 查找要从
  2. 获取选项的选择列表
  3. all('option') - 获取选择列表中的所有选项元素
  4. collect(&:text) - 收集每个选项的文本并将其作为数组返回

答案 1 :(得分:2)

如果使用的驱动程序不快,@ JustinCo的答案有问题:Capybara会在每次调用text时向驱动程序发出查询。因此,如果select包含200个元素,Capybara将对浏览器进行201查询,而不是1,这可能很慢。

我建议您使用一个带有Javascript的查询来执行此操作:

periods = page.execute_script("options = document.querySelectorAll('#MainContent_dd > option'); texts=[]; for (i=0; i<options.length; i++) texts.push(options[i].textContent); return texts")

或(使用jQuery的较短变体):

periods = page.evaluate_script("$('#MainContent_dd').map(function() { return $(this).text() }).get()")