0

我正在使用 watir-webdriver 从具有基于嵌套表的布局的页面中抓取。例如,我在http://veryslow.staticloud.com/上构建了一个非常小的玩具站点。要搜索包含元素 USSR 和巴西的最里面的表,我使用以下代码:

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),需要花费大量时间。对于具有基于嵌套表的布局的复杂网站,这非常长。

我知道嵌套表设计是一个坏主意,但如果你必须从中读取,有没有更快的方法来做到这一点?

4

5 回答 5

1

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

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

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

于 2011-06-18T05:31:37.180 回答
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")

通常要快得多。

于 2011-06-18T00:49:28.527 回答
1

每当您使用正则表达式来定位元素时,我们需要在 Ruby 端而不是在浏览器本身进行过滤。这意味着每次您在这里调用 .table(:text, reg) 时,我们都会找到包含元素内的所有表,并在 Ruby 中对其进行过滤以找到与正则表达式匹配的表。这会很慢,尤其是像这样的页面。

于 2011-07-02T23:59:14.010 回答
0

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

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

于 2011-06-20T08:57:23.133 回答
0

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

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")

如果你像 mytable = br.table(:xpath,"//table[@name='sometablename']")

有时 UI 元素往往具有在每次页面刷新时更改的动态 id,例如刷新时 id='xyz12345' 更改为 id='abc475843'。在这种情况下,您可以通过使用 Nokogiri 或 Hpricot 解析 br.html 来提高速度(不过,Nokogiri 比 Hpricot 更受欢迎)。

于 2011-07-08T23:27:21.760 回答