Watir 网络驱动程序需要太长时间才能从下拉列表中获取所选项目
Watir web driver taking too long to get the selected item from drop down
我正在使用 watir 网络驱动程序进行网络抓取,我在其中填写表格并获得结果。结果还包括下拉列表,我必须从中提取当前选定的文本。我使用了以下查询。
selectedList = browser.select_list(:id => "itemType")
由此我可以使用以下查询:
selectedText = selectedList.selected_options.map(&:text)[0]
使用此查询,我能够获取选定的文本。但问题是,下拉列表包含数千个选项,而 watir 使用此查询查找所选选项的时间太长。
感谢任何更快的方法。
我也尝试过以下查询:
selected = selectedList.selected_options()[0]
selectedText = selected.text
但问题是一样的。我还有其他带有较小选项的下拉菜单,其中这两个查询都表现良好,但是有数千个选项,它真的很慢。
问题是要获得 selected 选项,需要为每个单独的选项调用浏览器。即使每次通话只花费几分之一秒,加起来也很快。
您可以通过使用 execute_script
:
在单个电汇电话中获得 selected 选项
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 个选项 select 列表的页面,这将执行时间从 64 秒减少到仅 0.2 秒。
以上内容适用于下拉菜单和多selects。如果你知道它是一个下拉列表(即单个 selected 选项),你可以通过返回文本(而不是 selected 选项的集合)来获得更快的速度:
selected_list = browser.select_list(id: 'itemType')
selected_text = browser.execute_script("return arguments[0].selectedOptions[0].text;", selected_list)
这将时间减半至 0.08 秒。然而,对于这么小的收益,我个人更喜欢第一种方法,因为它最大限度地减少了 JavaScript 代码。
我正在使用 watir 网络驱动程序进行网络抓取,我在其中填写表格并获得结果。结果还包括下拉列表,我必须从中提取当前选定的文本。我使用了以下查询。
selectedList = browser.select_list(:id => "itemType")
由此我可以使用以下查询:
selectedText = selectedList.selected_options.map(&:text)[0]
使用此查询,我能够获取选定的文本。但问题是,下拉列表包含数千个选项,而 watir 使用此查询查找所选选项的时间太长。
感谢任何更快的方法。 我也尝试过以下查询:
selected = selectedList.selected_options()[0]
selectedText = selected.text
但问题是一样的。我还有其他带有较小选项的下拉菜单,其中这两个查询都表现良好,但是有数千个选项,它真的很慢。
问题是要获得 selected 选项,需要为每个单独的选项调用浏览器。即使每次通话只花费几分之一秒,加起来也很快。
您可以通过使用 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 个选项 select 列表的页面,这将执行时间从 64 秒减少到仅 0.2 秒。
以上内容适用于下拉菜单和多selects。如果你知道它是一个下拉列表(即单个 selected 选项),你可以通过返回文本(而不是 selected 选项的集合)来获得更快的速度:
selected_list = browser.select_list(id: 'itemType')
selected_text = browser.execute_script("return arguments[0].selectedOptions[0].text;", selected_list)
这将时间减半至 0.08 秒。然而,对于这么小的收益,我个人更喜欢第一种方法,因为它最大限度地减少了 JavaScript 代码。