【问题标题】:Watir slow on nested tablesWatir 在嵌套表上慢
【发布时间】:2011-06-17 15:49:09
【问题描述】:

我正在使用 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 时完成),需要大量时间。对于具有基于嵌套表格的布局的复杂网站,这会非常长。

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

【问题讨论】:

  • 您正在访问的网站的服务条款是否允许未经许可自动访问该网站?如果没有,你有权限吗?也许有某种方式可以让网站更容易访问(例如,更易于测试)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    到目前为止,我已经发现 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")
    

    通常要快得多。

    【讨论】:

    • 是的,但最终指向一个静态单元格,而不是基于其内容的单元格,这是一个非常不同的东西,因此速度差异。 (即使表格内容发生轻微变化也会中断)
    【解决方案3】:

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

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

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

    【讨论】:

    • 由于这是一次抓取,而不是测试任务,因此无需开发人员帮助。我想这取决于场景,因为我必须从相同结构的页面中抓取,所以硬编码的 xpath 对我来说是有意义的。我也使用过 .parent,但它比硬编码的 xpath 慢得多。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      看看你是否能找到可以找到表格的任何属性。

      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 更受欢迎)。

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2018-07-06
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多