我正在使用watir网页驱动程序进行网页抓取,我填写表格并获得结果。结果还包括下拉列表,从中我必须提取当前选定的文本。我使用了以下查询。
selectedList = browser.select_list(:id => "itemType")
从这里我可以使用以下查询:
selectedText = selectedList.selected_options.map(&:text)[0]
使用此查询,我可以获取所选文本。但问题是,下拉列表包含数千个选项,并且使用此查询时,watir需要很长时间才能找到所选选项。
感谢任何更快的方法。 我也尝试过以下查询:
selected = selectedList.selected_options()[0]
selectedText = selected.text
但问题是一样的。我还有其他较小选项的下拉列表,其中这两个查询都表现良好,但有数千个选项,它真的很慢。
答案 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代码。