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