如何消除Xpath的使用?

时间:2019-04-01 06:31:07

标签: selenium selenium-webdriver xpath protractor

我是量角器的新手,在查阅官方文档时,在样式指南部分中找到了这个。


从不使用xpath 为什么?

-这是所有方法中最慢,最脆弱的定位器策略 -标记很容易更改,因此xpath定位器需要大量维护 -xpath表达式不可读并且很难调试

完全有道理。但是,我正在考虑一种情况,在这种情况下,我正在访问一个元素,该元素是重复的元素(例如,动态更改的表的一行)。因为它是动态创建的,所以我没有访问该行的列的特定ID或名称。但是,我们可以使用xpath表达式访问相同的内容。 我可以想到的一种方法是使用'element.all(locator).get(index)'帮助函数,但是由于我首先访问的是整个元素列表,所以对我来说这似乎是一个较慢的过程(例如可能几百行)。 问题是,由于出于量角器状态的官方文档的所有原因,由于我想消除XPATH的使用,因此在上述给定情况下,我还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

文档状态如下:

  

从不使用xpath
  为什么?

     
      
  • 这是最慢,最脆弱的定位器策略
  •   
  • 标记很容易更改,因此xpath定位器需要大量维护
  •   
  • xpath表达式不可读并且很难调试
  •   

正如迈克尔·凯(Michael Kay)在评论中说的那样,这些言论是高度自以为是的。我认为大多数都容易证明是错误的。

  

这是最慢的

自从该声明可能被编写以来,发生了很多变化。如果您现在在顶级浏览器中测试XPath vs ID vs CSS选择器,那么即使性能有所不同,您也不会发现太多。前几天,我只是在Chrome浏览器中做到了这一点,而在进行1000次查找后,这三者几乎无法区分。

  

最脆

任何写得不好的定位器都可能很脆弱。 XPaths CAN 编写起来不那么脆弱,而CSS选择器 CAN 编写起来也不那么脆弱。我认为XPath可能会更脆弱,因为新的自动化程序会在他们喜欢的浏览器中使用复制XPath功能,这通常会导致错误/脆弱的定位器。学习时很好,但是您确实需要学习如何编写自己的语言。您可能已经注意到,某些浏览器现在具有复制CSS选择器选项...很多时候这也使定位器非常脆弱。

如果要避免使用脆弱的定位器,则需要学习手工制作定位器。做到这一点需要大量的阅读和练习。

  1. 如果您的XPath以/html开头,那么它很脆弱。不要这样做。
  2. 如果它具有3-4个以上的级别(例如//div/span/table/tr/td具有5个级别),则它可能比所需的更易碎。您指定的越多,它就越僵硬,这意味着它更容易断裂。
  3. 如果您进行字符串匹配(例如//div[@class='alert']),它会比较脆弱。 CSS选择器在这里可以更好地用于在元素上指定某些类,但不能指定其他类。
  4. 在定位器中使用索引可以使定位器变脆,例如//table/tr[3]/td[2]。如果您的数据在表中移动怎么办?您仍在查看第3行第2单元,而数据现在在第4行第2单元。您的测试将失败。
  

需要大量维护

Kinda与上面的评论相同,编写错误的CSS选择器也需要大量维护。无论您选择哪种类型,都要编写一个好的定位器,这样可以最大程度地减少维护工作。过于脆弱的定位器经常制动并且需要维护,因此请不要编写脆弱的定位器。 :)

  

xpath表达式不可读并且很难调试

如果您对XPaths怀有强烈的恨意,告诉每个人都避免使用它们,并且永远不要自己使用它们,您可能会认为它们不可读并且很难调试。 :)它们具有必须阅读和调试它们的语法,就像CSS选择器或您使用的任何编程语言一样。话虽这么说,但XPath比CSS选择器更为冗长和复杂,但是额外的复杂性带来了更多的功能。

这是我根据我在Selenium的年限使用的,按优先顺序排列:

  1. ID
  2. CSS选择器
    ...
  3. XPath

我仅在元素没有ID且不能使用CSS选择器时才使用XPath。基本上有两种情况发生:1.当我需要根据所包含的文本查找元素时,或者2.我需要进行DOM遍历时(例如,一些容易找到的元素的父级)。

我遵循上述规则,除非页面发生重大变化,否则我很少需要更新定位器。