如何提高watir-webdriver自动脚本的性能

时间:2012-03-27 20:36:08

标签: ruby performance automation watir watir-webdriver

我遇到的主要问题是从表中提取数据,但任何其他一般提示也会受到欢迎。我正在处理的表格大约有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,没有明显的区别。

3 个答案:

答案 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端检查结果来减少远程调用的数量。