【问题标题】:Is using absolute XPath to locate elements a good practice? If no, is there any other efficient way to locate elements? [closed]使用绝对 XPath 定位元素是一种好习惯吗?如果没有,还有其他有效的方法来定位元素吗? [关闭]
【发布时间】:2016-08-05 20:34:34
【问题描述】:

我正在使用 Selenium Webdriver 和 Java 进行自动化。对于定位元素,我使用 XPath。这是一个好习惯吗?

【问题讨论】:

  • 是的,每个人都是这样做的。
  • @DavidWallace 不,不是。并且将xpath 与绝对路径一起使用是您能做的最糟糕的事情。
  • @Guy 那么也许你应该发布一个答案来解释你做了什么。当然,与我合作过的所有专业测试人员都做过这个,或者类似的事情。
  • Locating an element by id的可能重复
  • @DavidWallace 这个问题已经被问过很多次了 (example)。 xpath 是定位元素最慢的方法(已知事实)。使用绝对路径会使它变得更糟,更不用说它使它变得非常脆弱。

标签: java selenium selenium-webdriver


【解决方案1】:

绝对 XPath

绝对 XPath 以根节点或正斜杠 (/) 开头。 使用 absolute 的优点是,它可以非常快速地识别元素。 这里的缺点是,如果出现任何问题或在两者之间添加了一些其他标签,那么这条路径将不再有效。

示例: 如果我们定义的路径为

html/head/body/table/tbody/tr/th

相对 Xpath

相对 xpath 是路径从您选择的节点开始的路径 - 它不需要从根节点开始。

以双斜杠(//)开头

语法:

//table/tbody/tr/th

使用相对xpath的好处是,不用提很长的xpath,可以从中间或中间开始。

这里的缺点是,识别元素需要更多时间,因为我们指定的不是部分路径(确切路径)。

【讨论】:

    【解决方案2】:

    没有一般规则。它始终取决于被测站点。

    查找元素的最佳方式是通过Id。这并不总是可行的,尤其是当被测站点不受您的控制并且您无法自己将 id 添加到 html 时。按名称定位也不错,但根据您测试的网站,它可能不会在每个页面/框架上都是唯一的。 (注意,“名称”是指 HTML 中的name 属性,而不是标签名称!)

    对于<a><button> 元素,通过LinkTextPartialLinkText 搜索可能是一个不错的选择,但前提是您的被测站点无法切换到另一个站点语言,因为这通常也会更改所有链接文本。

    CSS 选择器 定位几乎与 XPath 一样强大,但通常更短更紧凑,尤其是在处理类名时。

    示例(CSS 与 XPath 表达完全相同的内容):

    driver.findElement(By.cssSelector(".ecp-cartItemText"));
    driver.findElement(By.xpath("//*[@class='ecp-cartItemText' or contains(@class,' ecp-cartItemText ') or substring(@class,1,17)='ecp-cartItemText ' or substring(@class,string-length(@class)-16)=' ecp-cartItemText']"));
    

    只有当您搜索文本作为 HTML 元素的内容时,CSS 才能做到这一点(Selenium 中没有 XQuery 可用!)并且您必须使用 XPath。

    例子:

    //button[@type='button']//span[text()='Close']
    

    对于沿 XPath 轴相对于已定位的 Web 元素进行搜索,有时使用 XPath 可能很有用。

    例子:

    element.findElement(By.xpath("following-sibling::p[1]/strong"));
    

    可能还有其他无法避免 XPath 的情况,但我没有遇到任何情况。因此,仅在必要时才使用 XPath!通常有更好的方法。

    【讨论】:

    • 也许还有一点关于可读性/可维护性/稳定性的重要性?
    【解决方案3】:

    您是否使用 XPath 选择器取决于您需要文档结构的具体程度。

    例如,如果您想单击表单上的“提交”按钮,但并不真正关心提交按钮的位置,那么通过其 id 或名称引用元素是一个好主意和常见做法。另一方面,如果您正在测试页面中需要成为其他元素的子元素的元素,那么使用 Xpath 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2016-02-10
      • 2010-10-15
      相关资源
      最近更新 更多