HTML xpath树转储?使用Ruby Watir

时间:2011-12-19 19:22:03

标签: dom xpath webdriver watir watir-webdriver

帮助!在使用Watir库仔细地通过irb控制浏览器(Firefox和Chrome)时,似乎xpath地址太过于无法依赖。例如。有一刻,一个人的平衡的xpath似乎是一致的,所以我在我的脚本中使用了那个地址。有时候它会起作用,但是经常会因为“找不到元素”而崩溃,尽管每次我手动单步执行时,网页数据都会存在(firebug检查确认)。

是的,使用Ajax依赖的网站,但不是那个改变....银行网站在访问中几乎保持不变。

所以问题....有没有什么方法watir-webdriver可以简单地给我一个长的,详细的转储它在DOM中看到的所有东西,以xpath树的形式?可以帮我排除故障。

2 个答案:

答案 0 :(得分:2)

最大的答案是不使用xpath,而是使用watir,因为打算使用UI。

当涉及到在浏览器自动化中指定元素的方法时,基本上Xpath是邪恶的,它是SLOW,它创建的代码经常(正如你所发现的那样)非常脆弱,并且几乎不可能阅读和理解。只有当其他方法无效时,才能将它作为最后的手段使用。

如果您正在使用Watir API(与Watir或Watir-webdriver一样),那么您希望根据它自己的属性识别元素,例如类,名称,ID,文本等。如果这不起作用,然后根据包裹元素的最近容器进行识别,该容器有一种独特的方法。如果这不起作用,则由兄弟或子元素识别,并使用.parent方法将dom“向上”移动到'父容器元素。

为了易读且难以阅读,请比较以下评论并使用element_by_xpath考虑代码:

/html/body/form/div[6]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/p/table[‌​2]/tbody/tr/td[2]/p/table/tbody/tr[3]/td[2]

然后与此进行比较(整个代码只比xpath短)

browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:index => 1).text

或者通过您想要的文本的单元格的某些属性来更轻易地替换索引

browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:class => "balanceSnapShotCellRight").text

xpath示例很难理解,不知道你所追求的是什么元素或为什么代码可能会选择该元素。由于索引值太多,所以对页面设计的任何更改或者只是你想要的表格中的额外行都会破坏该代码。

第二个更容易理解,我只能通过阅读脚本试图在页面上找到的内容以及它如何定位来告诉我。表中的额外行或页面布局的其他更改不会破坏代码。 (除了重新安排表格中的列,如果我要利用目标单元格的类或其他特征,就可以避免这种情况(如下面评论中的示例所示)

就此而言,如果该类的使用对于页面上的该元素是唯一的那么

browser.cell(:class => 'balanceSnapShotCellRight').text

只要表中只有一个具有该类的单元格,就可以正常工作。

现在公平地说,我知道有更多优雅地使用xpath来做类似于我们在上面的Watir代码中所做的事情的方法,但是这是真的,它仍然不那么容易阅读和使用,并且并不是大多数人通常(误)使用xpath选择对象的方式,特别是如果他们使用的记录器创建了类似于上面示例的脆弱的隐藏xpath代码)

this SO question的答案描述了识别Watir中元素的三种基本方法。每个答案都涵盖一种方法,您将使用哪种方法取决于在特定情况下哪种方法最有效。

如果您在给定页面上发现挑战,请在此处开始提出问题,并在您尝试使用的元素之前/之后/周围添加HTML示例,此处的人员通常可以指向您方式。

如果你还没有这样做,请完成一些tutorials in the Watir wiki,注意很少使用xpath。

最后,你提到了Firewatir。不要使用Firewatir,它已经过时,不再开发,不适用于任何最新版本的FF。而是使用Watir-Webdriver来驱动Firefox或Chrome(或IE)。

答案 1 :(得分:1)

您只需要输出此XPath表达式选择的节点的“innerXml”(我不知道Watir):

/

<强>更新

如果通过“转储”表示不同的东西,例如每个选择节点的一组XPath表达式,那么请查看此问题的答案:

<强> https://stackoverflow.com/a/4747858/36305