首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML xpath树转储?使用Ruby Watir

HTML xpath树转储?使用Ruby Watir
EN

Stack Overflow用户
提问于 2011-12-20 03:22:03
回答 2查看 1.4K关注 0票数 3

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

是的,使用依赖Ajax的网站,但不是changing....bank网站,这些网站在每次访问时几乎保持不变。

所以question....is可以简单地以xpath树的形式向我提供它在DOM中看到的所有内容的一个冗长的转储文件。会帮我排查故障。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-20 03:37:20

你只需要输出这个XPath表达式选择的节点的"innerXml“(我不知道Watir):

代码语言:javascript
复制
/

更新

如果您所说的“转储”指的是不同的东西,比如一组XPath表达式,每个表达式都选择一个节点,那么看一下这个问题的答案:

票数 1
EN

Stack Overflow用户

发布于 2011-12-20 03:58:40

最好的答案是不使用xpath,而是使用watir,因为要使用的是UI。

当谈到在浏览器自动化中指定元素的方法时,总的来说,Xpath是邪恶的,它很慢,它创建的代码通常非常脆弱(正如您发现的那样),而且几乎不可能阅读和理解它。只有在其他方法都不起作用的情况下,才将其作为最后的手段。

如果您使用的是Watir API (与Watir或Watir-webdriver一样),那么您需要根据元素自身的属性(如class、name、id、text等)来标识元素。如果这样做不起作用,那么可以根据包装元素的最近容器进行标识,该容器可以唯一地找到该元素。如果这不起作用,可以通过兄弟元素或子元素进行标识,并使用.parent方法将dom“向上”遍历到“父容器元素”。

从易碎和难以阅读的角度来看,比较以下从注释中提取的内容,并考虑使用element_by_xpath的代码:

代码语言:javascript
复制
/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更短)

代码语言:javascript
复制
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:index => 1).text

或者使用您想要的文本的单元格的某些属性来替换索引

代码语言:javascript
复制
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:class => "balanceSnapShotCellRight").text

xpath示例很难理解,不知道您想要的是什么元素,也不知道为什么代码会选择该元素。由于有如此多的索引值,对页面设计的任何更改,或者只是在您想要的表的上方增加行,都会破坏该代码。

第二个更容易理解,我可以通过阅读它来判断脚本试图在页面上找到什么,以及它是如何定位它的。表中的额外行或对页面布局的其他更改不会破坏代码。(除了重新排列表中的列之外,如果我使用类或目标单元格的一些其他特征,甚至可以避免这种情况(如下面注释中的示例所示)

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

代码语言:javascript
复制
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)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8566329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档