我遇到的主要问题是从表中提取数据,但任何其他一般提示也会受到欢迎。我正在处理的表格大约有25列和不同的行数(从5-50开始)。
目前我抓住了桌子并将其转换为数组:
require "watir-webdriver"
b = Watir::Browser.new :chrome
b.goto "http://someurl"
# The following operation takes way too long
table = b.table(:index, 1).to_a
# The rest is fast enough
table.each do |row|
# Code for pulling data from about 15 of the columns goes here
# ...
end
b.close
当表格有20行时,操作table = b.table(:index, 5).to_a
需要一分钟。看起来将20 X 25表格的单元格放入阵列应该非常快。我需要为超过80个表执行此操作,因此最终需要1-2个小时才能运行。为什么需要这么长时间才能提高速度?
我已尝试迭代表行而不先转换为数组,但性能没有改善:
b.table(:index, 1).rows.each do |row|
# ...
使用Windows 7和Ubuntu的结果相同。我也试过Firefox而不是Chrome,没有明显的区别。
答案 0 :(得分:4)
如果您只是从大页面阅读数据,那么快速解决方法就是使用Nokogiri:
require 'nokogiri'
doc = Nokogiri::HTML.parse(b.table(:index, 1).html))
我很想看到更多细节。如果您可以提供演示此问题的代码+ HTML示例,请在issue tracker。
中提交答案 1 :(得分:0)
在尝试提高代码速度时,有一些方法可以测试执行时间(例如ruby benchmark)。您可能还希望查看ruby-prof以详细了解每种方法所花费的时间。
我首先尝试确定它是不是to_a
方法而不是导致该行代码延迟的table
。 Watir的内部(或根据jarib的答案,nokogiri)可能会更快。
答案 2 :(得分:0)
为提高使用watir的脚本的性能,您可以做的第一件事是减少进入浏览器的远程调用次数。每次找到或操作DOM元素时,这都是对浏览器的调用,可能需要5ms或更长时间。
在您的情况下,您可以通过execute_script()在浏览器端执行工作并在ruby端检查结果来减少远程调用的数量。