8

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

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

2 回答 2

27

问题是all('#MainContent_dd')返回所有具有 id 的元素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. all('option')- 获取选择列表中的所有选项元素
  3. collect(&:text)- 收集每个选项的文本并将其作为数组返回
于 2013-02-21T16:33:53.133 回答
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()")
于 2013-03-01T20:54:14.593 回答