Watir网络驱动程序花费太长时间从下拉菜单中获取所选项目

时间:2017-03-10 17:17:30

标签: ruby web-scraping watir

我正在使用watir网页驱动程序进行网页抓取,我填写表格并获得结果。结果还包括下拉列表,从中我必须提取当前选定的文本。我使用了以下查询。

selectedList = browser.select_list(:id => "itemType")

从这里我可以使用以下查询:

selectedText = selectedList.selected_options.map(&:text)[0]

使用此查询,我可以获取所选文本。但问题是,下拉列表包含数千个选项,并且使用此查询时,watir需要很长时间才能找到所选选项。

感谢任何更快的方法。 我也尝试过以下查询:

selected = selectedList.selected_options()[0]
selectedText = selected.text

但问题是一样的。我还有其他较小选项的下拉列表,其中这两个查询都表现良好,但有数千个选项,它真的很慢。

1 个答案:

答案 0 :(得分:2)

问题是,要获取所选选项,将为每个选项调用浏览器。即使每次调用只需要几分之一秒,它也会非常快速地增加。

您可以使用execute_script

在一个有线通话中获取所选选项
selected_list  = browser.select_list(id: 'itemType')
selected_options = browser.execute_script("return arguments[0].selectedOptions;", selected_list)
selected_text = selected_options.map(&:text)

对于只有1000个选项选择列表的页面,这会将执行时间从64秒减少到仅0.2秒。

上述内容适用于下拉列表和多项选择。如果你知道它是一个下拉列表(即单个选择的选项),你只需返回文本(而不是选定的选项集合)就可以更快:

selected_list  = browser.select_list(id: 'itemType')
selected_text = browser.execute_script("return arguments[0].selectedOptions[0].text;", selected_list)

这将时间缩短为0.08秒。但是,对于这么小的收益,我个人更喜欢第一种方法,因为它最小化了JavaScript代码。