【问题标题】:Why is xpath less preferred than id or name locators in Selenium?为什么 xpath 不如 Selenium 中的 id 或 name 定位器首选?
【发布时间】:2019-03-08 00:05:55
【问题描述】:

也可以使用 xpath 来识别具有唯一 id/name 的 Web 元素。那么使用 By.id/By.name 比 By.xpath 有什么优势。考虑以下示例。下面是一个网络元素。

<input id="abc" name="abc" xpath="abc">

这个网页元素可以被识别为:

  1. By.id("abc");
  2. By.name("abc");
  3. By.xpath(".//*[@id='abc']); or By.xpath(".//*[@name='abc']);

我想知道使用 1. 或 2. 比 3. 有什么优势?

【问题讨论】:

  • 不要假设id 是唯一的。这不是 RealLife™
  • “具有唯一 ID/名称的 Web 元素...”。请注意,@id 应该是唯一的(尽管并非总是如此),@name 不应该是唯一的!
  • 世界上有 RFC/w3c 的事情和一些不关心任何事情的人
  • 标记为 dup 的讨论和答案并没有真正为这个问题提供详细的规范答案。重新打开它。

标签: selenium selenium-webdriver xpath


【解决方案1】:

正如 Gilles Quenot 所提到的,您不能假设 ID 属性是唯一的,但它曾经并且应该是唯一的,除非我们谈论的是移动应用程序。在 Web 应用中,ID 是理想的搜索方法,因为它应该是唯一的。

name 属性通常也是唯一的,但不一定是,而且通常不是。

使用 xpath 的一个缺点是元素可能会在文档中移动,或者添加其他项目,并且它可能会破坏您的 xpath,具体取决于它的制作方式。至少从理论上讲,使用 ID 的定位器会“更”不受这种破坏的影响,但正如所暗示的那样,没有任何保证。

作为一项规则,如果唯一 ID 不可用,我将使用 xpath,并且我尝试将其编写为足够通用以抵抗“破坏”。

【讨论】:

  • 如果我编写 xpath 使其不受我上面提到的代码更改的影响怎么办: By.xpath(".//[@id='abc']); 我想知道的是- 使用 id/name 是否比使用 xpath 更快?
  • 我还没有做过基准测试,但是一个痴迷于 ID 优于 xpath 的同事告诉我他做过,而且速度更快。我没有理由怀疑他,但同一个人也有糟糕的编码习惯,导致代码在许多其他方面运行缓慢,所以我持保留态度。我个人倾向于 xpath,因为它是“通用的”。我不知道这是否是一个很好的解释,但我觉得我对 xpath 有更好的控制。但是,在使用带有@FindBy 的页面对象模型时,我确实使用 ID,主要是为了便于阅读。
【解决方案2】:

我不认为 Xpath 不如 ID 和 Name 更受欢迎。

  1. ID 可能并不总是唯一的,在当前的网站 DOM 中,ID 大多是随时间变化的。您不能只使用一个 ID 并再次运行该脚本,如果您需要尝试,您也可以查看亚马逊网站。
  2. 名称可能是唯一的,也可能不是唯一的。您在某些页面中是对的,您可能会发现元素可能具有唯一的名称,但让我们举个例子,如果您有一个包含名字和姓氏的页面,有时开发团队只需将这些名字行复制并粘贴到姓氏。因此,现在您将在单个页面中找到相同的名称属性。所以你也不能依赖名字。
  3. Xpath 是独一无二的,因为您是设计 xpath 的人,并且您总是想要一个具有唯一标识的元素。因此,现在在 Name 示例中,您可以在 xpath 中分别获取名字和姓氏。

我相信 Xpath 比 Name 和 ID 属性更好。

【讨论】:

    【解决方案3】:

    您的问题非常有效,您提到的每个可能的选项都可以使用,但为什么我们更喜欢 ID 和 Name 定位器而不是 XPath?

    我不直接给出答案,让我解释一些其他有助于你理解它的概念。

    • selenium 通过 HTML DOM 与 Web 控件交互的方式是 W3C 标准,每个浏览器都遵循该标准,它是 Java 脚本引擎,例如用于 chrome 的 V8、用于 Edge 的 Chakra 等.

    • HTML DOM 公开 GetElementById() 和 GetElementsByName() 的方法,所有浏览器都支持按照 W3C 标准。因此,当您使用 Id、Name 等定位器时,这些定位器已经实现并且将始终为您工作。

    参考https://www.w3schools.com/jsref/dom_obj_document.asp

    • XPath 实际上用于浏览 XML 文档中的元素和属性。因为 HTML DOM 也是 XML 的形式,所以 Xpath 也可以工作,但 XPath 不是为 HTML DOM 设计的。它还有其他用途。

    • 1234563 .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2021-02-27
      • 2016-01-21
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多