掌握Selenium中的XPath:如何定位元素

测试工程师在软件开发生命周期中至关重要,他们确保团队交付无错误和可正常运行的应用程序。在应用程序可以发货或宣布为用户准备好之前,这些工程师会对应用程序进行不同的测试。

测试人员应具备技能,能够定位和与网页元素进行交互。selenium是现代开发团队中使用最多的测试自动化工具之一。该工具有四个组件:selenium grid,selenium webdriver,selenium ide和selenium rc。

我们今天的重点将放在selenium webdriver上,因为它包含xpath。本文将定义xpath,讨论基本的xpath语法,并演示如何在selenium中使用xpath。

xpath是什么

xpath(xml path language)是一种查询语言,用于选择和导航xml文档中的属性和元素。xpath定义了一种路径表达式,提供了一种用于定位xml文档特定部分并从中检索信息的方法。

它的语法类似于文件系统路径。它还具有函数和符号,可以根据属性和层次结构轻松选择元素。您可以将xpath与xml、html和xslt等技术一起使用,以提取和操作数据。

为什么使用xpath?

  • 灵活性:与只能使用标签名、id或类来定位元素的css选择器不同,xpath允许您使用其他属性来定位元素。
  • 可重用性:您可以将xpath存储在变量中,并在代码中重复使用。
  • 精确节点选择:xpath提供了一种标准化的方式来针对网页文档中的特定元素。

xpath的基本语法

xpath允许您使用dom在网页上找到任何元素。但是,在检查语法之前,我们需要了解以下xpath表达式:

表达式 描述
nodename/ tagname 选择所有名称为“nodename”/“tagname”的节点
/ 从根节点选择
//  选择当前文档中与选择匹配的当前节点中的节点,而不管它们在哪里
@ 选择属性
.. 选择当前节点的父节点
. 选择当前节点

xpath的标准语法如下:

xpath=//tagname[@attribute='value']

正如您所看到的,语法以双斜杠(//)开头,该斜杠从标签/节点名称定义的当前节点开始。

绝对xpath与相对xpath

在处理xpath时,我们有两个路径:绝对xpath和相对xpath。

绝对xpath

绝对xpath是从根节点到目标元素的直接路径。您从根节点开始,以目标节点结束。

您可以有以下内容的html文档:




    yaoweibin


    
        

welcome to yaoweibin

如果我们要定位内容为“welcome to yaoweibin”的元素,则会按照以下路径进行:

/html/body/div/h1

在上述文档中,我们有:

  • html作为根节点:/html
  • body作为父节点:/html/body
  • div作为body节点的子节点:/html/body/div
  • h1作为div节点的子节点:/html/body/div/h1

要获取最内层的元素,您必须按照该路径进行操作。

何时使用绝对xpath

绝对xpath遵循“具体”的路径。因此,当页面上有多个具有相似属性的元素时,它将是一个完美的选择,确保您针对文档中的确切元素进行定位。

然而,xpath对html文档结构的变化非常敏感。因此,简单的更改可能会破坏您的绝对xpath。

相对xpath

相对xpath从任何节点开始,以目标节点结束。此路径不受文档中的更改影响,在大多数情况下更可取。使用相对xpath,您可以从文档的任何部分定位元素。相对xpath表达式以双斜杠“//”开头。

如果我们使用html文档,我们可以定位到标有“welcome to yaoweibin”的h1;




    yaoweibin


    
        

welcome to yaoweibin

我们的相对xpath到h1将是;

//body/div/h1

何时使用相对xpath

当需要在灵活性和特定性之间取得平衡时,应使用相对xpath。在html文档中的更改不会影响此路径,前提是元素之间的关系保持特定。

在selenium中使用xpath定位元素

selenium是一个开源框架,允许用户自动化web浏览器。该框架具有一组库和工具,可帮助测试人员自动和系统地与web元素进行交互。

假设我们有一个包含以下歌曲列表的web文档;




    song library


    

song library

  • song 1 - artist 1
  • song 2 - artist 2
  • song 3 - artist 1
  • song 4 - artist 3
  • 我们的根节点是。
  • 我们有作为父节点。
  • 我们有

    作为的子节点。

  • 我们有
      作为的子节点。
    • 我们有
    • 作为
        的子节点。

      我们可以在上述html文档中使用不同的xpath定位器。例如,我们可以通过id、名称、类名、包含、文本、以及以…开始或以…结束等定位器来定位元素。您可以使用不同的编程语言使用selenium。我们将使用python进行演示。

      按索引定位

      假设我们要定位第3首歌曲,我们可以使用以下代码;

      third_song = driver.find_element_by_xpath("//li[@class='song'][3]")
      print("third song:", third_song.text)
      

      我们使用了相对xpath并以'li'节点开头。当selenium定位到我们列表上的第三首歌时,它会打印其文本。

      按属性定位 

      我们可以使用xpath查找所有来自'artist 1'的歌曲并打印它们的标题。我们的代码可以如下所示;

      songs_by_artist1 = driver.find_elements_by_xpath("//li[contains(@class, 'song') and contains(text(), 'artist 1')]")
      print("songs by artist 1:")
      for song in songs_by_artist1:
          print(song.text)
      

      按文本定位

      此定位器可以帮助您找到具有特定文本的元素。我们可以查找具有”song 4″文本的歌曲并打印其文本。我们可以使用以下代码表示此定位器;

      song_with_text = driver.find_element_by_xpath("//li[contains(text(), 'song 4')]")
      print("song with text:", song_with_text.text)
      

      xpath轴

      到目前为止,我们讨论过的方法在简单的网页中运行得很好。但是,有些情况下,xpath元素搜索方法,如按文本、id、类名和名称,将无法正常工作。

      xpath轴用于处理常规定位器无法使用的动态内容。在这里,您根据元素与其他元素的关系来定位元素。这些是一些常见的xpath轴定位器;

      祖先

      祖先轴方法非常适用于具有高度嵌套元素的xml文档。您可以选择从当前节点最近到最远的所有祖先元素,例如祖父和父元素。

      我们可以使用以下代码;

      
        
          the great gatsby
          f. scott fitzgerald
          fiction
        
        
          the biggest dilemma
          george orwell
          dystopian
        
      
      

      如果我们想选择元素”title”的所有祖先,以获取书籍”the biggest dilemma”,可以使用此祖先轴方法;

      //title[text() = '1984']/ancestor::*

      后续 

      后续轴方法定位当前节点关闭标签后的所有节点。此方法不考虑目标节点的层次结构或位置。例如,如果您有一个具有多个部分的xml文档或网页,您可以识别出在特定部分之后出现的元素,而无需导航整个树结构。

      父节点

      xpath中的父节点轴方法选择当前节点的父节点。您可以使用以下路径来定位父节点;

      //tag[@attribute='value']/parent::tagname

      此方法适用于当前节点中的子元素具有您可以轻松定位的唯一属性,并且您想要检查父元素的情况。

      child

      child axis方法在xpath中选择当前节点的所有子节点。它仍然是最常用的xpath轴方法之一,因为它可以帮助选择特定元素的子节点。

      考虑下面的代码片段:

      第一段

      第二段

      第三段

      第四段

      我们可以使用这个轴定位我们代码中的所有 ‘p' 元素:

      //section[@id='text']/child::p

      常见问题

      为什么要使用xpath而不是css选择器?

      css选择器只能根据id、标签名和类名查找元素。另一方面,您可以使用xpath根据元素的位置、文本内容和html结构中的其他属性来定位元素。您还可以将xpath表达式存储在变量中,并在应用程序中重用它们。

      selenium支持哪些语言的xpath?

      您可以在支持selenium的任何语言中使用xpath。您可以使用javascript、java、python、ruby、c#和php编写脚本。

      xpath有哪些替代方法?

      您可以使用css选择器、图像识别或selenium的内置定位器作为xpath的替代方法。css选择器是最常用的方法,您可以根据标签名、id或类名查找元素。图像识别允许您根据图像来定位元素。selenium的内置定位器设计为易于使用。

      结论

      您现在可以在selenium中定义xpath,区分绝对xpath和相对xpath,并使用不同的xpath定位器来定位元素。定位器的选择将取决于内容的性质和您的目标。

      如果您想在下次面试中脱颖而出,请查看我们的文章:《selenium面试问题》

类似文章