Watir在嵌套表上变慢

时间:2011-06-17 15:49:09

标签: ruby screen-scraping watir html-table watir-webdriver

我正在使用watir-webdriver从具有嵌套表格布局的页面中删除。举个例子,我在http://veryslow.staticloud.com/建造了一个非常小的玩具网站。要搜索包含USSR和Brazil元素的最里面的表,我使用以下代码:

require "rubygems"
require "watir-webdriver"
r = Watir::Browser.new
br.goto("http://veryslow.staticloud.com/")
reg = /USSR.+Brazil/m
mytable = br.table(:text,reg).table(:text,reg).table(:text,reg).table(:text,reg).table(:text, reg).table(:text, reg)
mytable.text

我有两个问题:

  1. 有没有更好的方法来搜索这些内部表?
  2. 为什么这么慢?要实际找到该表(在我调用mytable.text时完成),需要花费大量时间。对于具有嵌套表格布局的复杂网站,这非常痛苦。
  3. 我知道嵌套表设计是一个坏主意,但是如果你必须从它们中读取,那么有更快的方法吗?

5 个答案:

答案 0 :(得分:1)

到目前为止,我已经能够找出xpath是一种更好的方法来处理已知的页面结构。所以,像

mytable = br.table(:xpath,"/html/body/table/tbody/tr[3]/td/table/tbody/tr[3]/td/table[2]/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr[3]/td[3]/table")

通常要快得多。

答案 1 :(得分:1)

是否有任何机会让开发人员至少根据位置或内容为表,行或单元格指定名称或类?或其在该位置的功能?这会使事情变得更加可测试我应该这样想你可以做一些事情,比如找一个类'originating_city'和文本“纽约”等的单元格,就像它一样,你有一个测试雷区,如果你能没有任何开发人员的合作可以让事情变得可测试,我会认真地开始更新你的简历并在他们陷入火焰之前寻找新的职位。

在您的具体示例中,您可能会尝试使用.parent,因为整个表中只有一个单元格中包含USSR ..但这对于任何其他城市名称(如巴西)来说效果不佳。

然后我再次怀疑你当前的正则表达式驱动方法是否可以与该页面上的任何其他城市组合一起使用,其中该组合的某些部分不是唯一的。

答案 2 :(得分:1)

每当你使用Regexp定位元素时,我们需要在Ruby端进行过滤,而不是在浏览器本身进行过滤。这意味着每次在这里调用.table(:text,reg)时,我们会在包含元素中找到 all 表,并在Ruby中过滤掉它以找到与Regexp匹配的表。这会很慢,特别是对于这样的页面。

答案 3 :(得分:0)

如果要查找文本,您可以从顶部表格中读取整个文本并将其解析为您要查找的内容。这就是我减少表搜索中的大量开销,直到我意识到我无法识别空表格单元格,现在我必须以缓慢的方式做事情,但如果你对这个位置不感兴趣,它可能对你有帮助。显示文字。

否则......不是真的。除非定义了从外表中排除的内部表(或其父/子),否则很难识别它。

答案 4 :(得分:0)

查看是否可以找到可以找到该表的任何属性。

mytable = br.table(:xpath,“/ html / body / table / tbody / tr [3] / td / table / tbody / tr [3] / td / table [2] / tbody / tr / td /表/ tbody的/ TR / TD [2] /表/ tbody的/ TR [3] / TD [3] /表“)

如果你这样写,它会更好地工作并且不那么脆弱 mytable = br.table(:xpath,“// table [@ name ='sometablename']”)

有时UI元素往往具有动态id,它会在每次刷新时发生变化,例如id ='xyz12345'在刷新时更改为id ='abc475843'。在这种情况下,您可以通过使用Nokogiri或Hpricot解析br.html来获得速度(尽管Nokogiri更喜欢Hpricot)。