快速获取选择列表中的所有项目作为字符串数组的方法?

时间:2013-09-06 21:20:59

标签: watir watir-webdriver

我有一个页面,其中包含一个包含大量项目的选择列表。

我想获取它包含的所有项目(作为String对象)并将它们粘贴到数组中。

Select#options返回一个OptionsCollection,这意味着到目前为止我能想出的最好的是:

text_array = my_huge_select_list.options.map { |opt| opt.text }

......但是,哇,这太慢了!

有没有更快的方法来做同样的事情?

2 个答案:

答案 0 :(得分:1)

不可否认,这不是替补标记(我很好奇选择列表中有多少选项),但您可以使用Nokogiri

这是一个人为的选择列表。首先,选择列表中的选项是通过css方法获得的。然后,每个选项的文本都会添加到text_array数组中。此时,text_array是一个字符串数组。

require 'nokogiri'

doc = Nokogiri::HTML <<DOC
<select id="list">
  <option value="AL">AL</option>
  <option value="AK">AK</option>
  <option value="AS">AS</option>
  <option value="AZ">AZ</option>
<select>
DOC

options = doc.css("select option")
text_array = []
options.each { |opt| text_array << opt.text}

text_array[0]
# =>  AL
text_array[0].class
# =>  String

答案 1 :(得分:1)

对于包含450个选项的选择列表,手动解析html会将时间从113秒缩短(使用Watir映射选项文本时)到16秒。

这是通过以下命令完成的:

text_array = browser.select_list.html.scan(/<option[^>]*?>(.*?)<\/option>/i).flatten

有关正则表达式的几点注意事项:

  • 开场选项标记中的[^>]*?用于处理元素上的任何属性。如果你知道没有,可以省略它。
  • 正则表达式由i参数设置为不区分大小写。在Firefox和Chrome中,html中的元素将为小写。但是,IE将它们资本化。

风险:

  • 假设该选项仅包含文字。虽然如果选项中有html元素,它会起作用,但需要更多的手动解析。
  • 假设您的选项包含结束标记。我相信如果缺少IE,IE不会自动添加结束标记。如果您没有结束标记,则可能需要修改正则表达式。

它不漂亮,但它似乎比通过Watir的选项集合收集文本更快。然而,它并不比Nokogiri快3秒。