我想将下拉列表的选项放入通常在水豚中的数组中。在这个过程之后,我期望有一个字符串数组,包含所有下拉选项。我已经尝试了下面的代码,但是无论选项计数是多少,我的数组的长度都保持为 1。
periods = Array.new()
periods = all('#MainContent_dd')
print periods.length
问题是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"]
这是做什么的:
find('#MainContent_dd')
- 查找要从中获取选项的选择列表all('option')
- 获取选择列表中的所有选项元素collect(&:text)
- 收集每个选项的文本并将其作为数组返回如果使用的驱动程序不快,@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()")