为什么Xpath在Selenium中不如id或name定位符那么受青睐?

时间:2018-10-02 19:56:50

标签: selenium selenium-webdriver xpath

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

<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.有什么优势?

3 个答案:

答案 0 :(得分:2)

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

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

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

通常,如果没有唯一的ID,我将使用xpath,并尝试编写它,使其具有足够的通用性以抵抗“损坏”。

答案 1 :(得分:1)

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

  1. ID不一定总是唯一的,在当前的网站DOM中,ID大多是随时间变化的。您不能留下一个ID并再次运行脚本,如果需要尝试的话,也可以通过Amazon Site进行检查。
  2. 名称可以是唯一的,也可以不是唯一的。没错,在某些页面中您可能会发现元素可能具有唯一的名称,但是让我们举一个例子,如果您的页面上有名字和姓氏,有时开发团队只需将这些名字行也复制并粘贴到姓氏中即可。因此,现在您将在单个页面中找到相同的名称属性。所以你也不能依靠名字。
  3. Xpath是唯一的,因为您是设计xpath的人,并且您始终想要具有唯一标识的元素。因此,现在在“名称”示例中,您可以使用xpath分别获取名字和姓氏。

我相信Xpath是比Name和ID属性更好的选择。

答案 2 :(得分:0)

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

代替给出直接答案,让我解释一些其他概念以帮助您理解它。

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

  • GetElementById()和GetElementsByName()的HTML DOM公开方法,所有浏览器均根据W3C标准支持它们。因此,当您使用Id,Name等定位器时,这些定位器已经实现并且将始终为您服务。

HTML DOM Methods

引用https://www.w3schools.com/jsref/dom_obj_document.asp

  • XPath实际上用于在XML文档中的元素和属性之间导航。由于HTML DOM也是XML的形式,因此Xpath也可以使用,但XPath并非为HTML DOM设计。它还有其他目的。

  • 结论是,当您已经有HTML DOM支持的方法时,应优先使用XPath上的方法,这是一种通用的导航方式,并且Internet Explorer浏览器中的某些XPath实例的行为异常