gpt4 book ai didi

dom - HTML xpath 树转储?使用 Ruby Watir

转载 作者:行者123 更新时间:2023-12-03 15:52:23 25 4
gpt4 key购买 nike

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

是的,使用依赖 Ajax 的网站,但变化不大......银行网站在访问期间几乎保持不变。

所以问题....有没有什么方法可以让 watir-webdriver 以 xpath 树的形式简单地向我提供它目前在 DOM 中看到的所有内容的冗长、详细的转储?会帮助我排除故障。

最佳答案

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

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

如果您使用的是 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)。

关于dom - HTML xpath 树转储?使用 Ruby Watir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com