掌握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面试问题》。