Selenium 简明教程

Selenium - XPath

我们可以使用 xpath 定位器识别网页上的元素。它基本上是通过 DOM 中的 HTML 节点来查找元素的 XML 路径。一旦在浏览器中打开应用程序,用户便会与页面上的元素进行通信,以设计自动化测试用例。主要目的是借助其属性来找到元素。可以使用 id、xpath 等定位器来检测元素。

在 Java 中,findElement(By.xpath("<value of xpath>")) 方法用于检测值为 xpath 的元素。使用此方法,将返回与 xpath 的匹配值匹配的第一个元素。如果不存在具有相同 xpath 值的元素,则会引发 NoSuchElementException。

Syntax

Webdriver driver = new ChromeDriver();
driver.findElement(By.xpath("xpath value"));

Rules to Create Xpath Expression

要使用 xpath 定位元素,表达式为 //tagname[@attribute='value']。// 表示当前节点,tagname 指当前节点的标签名,@ 用于属性选择,attribute 指属性名,value 指属性值。

xpath relativeabsolute 可能有两种变体。绝对 xpath 以 / 符号开头,从根结点开始,直到我们想要定位的元素。但是,如果任何元素路径(从根节点到当前节点之间的中间)的路径发生改变,则现有的绝对 xpath 将无法对元素起作用。

让我们从根节点开始识别下面高亮的元素。

selenium xpath 1
Xpath used: /html/body/main/div/div/div[2]/div/ul/li[1]/input

请注意,我们可以通过在 $x("<value of xpath>") 内插入 xpath 值,在控制台中验证 xpath。如果存在匹配项,我们将获得长度值超过 0,否则,它将表示没有与我们使用的 xpath 值匹配的元素。例如,在上面的示例中,我们使用了表达式 $x("/html/body/main/div/div/div[2]/div/ul/li[1]/input"),得到了 length: 1。此外,在悬停在结果上方时,我们会在页面上看到高亮的元素。

相对 xpath 以 // 符号开头,不从根节点开始。对于上面示例中讨论的同一元素,相对 xpath 值将为 //*[@id='c_bs_1']”。

selenium xpath 2

另外,请注意我们刚刚用相对和绝对 xpath 识别的元素的 HTML 代码。

selenium xpath 3
<input type="checkbox" id="c_bs_1">

还提供了有助于构建相对 xpath 表达式的函数,如 text()。它用于识别页面上可见文本的元素。

让我们借助页面上的可见文本识别高亮的文本 Check Box

selenium xpath 4
Xpath used: //h1[text()='Check Box'].

还提供了有助于构建相对 xpath 表达式的函数,如 starts-with()。它用于识别属性值以特定文本开头的元素。此函数通常用于在每次页面加载时都会更改其值的属性。让我们识别 Main Level 1Main Level 2 标签旁边的两个复选框。

selenium xpath 5
Xpath used: //input[starts-with(@id, 'c_bs')].

在上述示例中,我们看到所使用的 xpath 提供了两个带有 xpath 值的匹配元素,输入 #c_bs_1 和输入 #c_bs_2。

还有可帮助构建相对 xpath 表达式(例如 contains())的函数。它标识元素,其属性值包含实际属性值的一部分文本。此函数通常用于在每次页面加载时都会更改其值的属性。

让我们使用 contains() 标识 Main Level 2 标签旁的高亮显示复选框。

selenium xpath 6
Xpath used://input[contains(@id, 'bs_2')].

我们可以使用 AND 和 OR 条件创建 xpath,以使属性值为真。

让我们使用 OR 条件标识 Main Level 2 标签旁的高亮显示复选框。

selenium xpath 7
Xpath used: //input[@type='submit' or @id='c_bs_2'].

在上述示例中,我们看到所使用的 xpath 具有 OR 条件,其中 @type='submit' 条件不匹配,但 @id='c_bs_2' 条件匹配。

让我们使用 AND 条件标识 Main Level 2 标签旁的高亮显示复选框。

selenium xpath 8
Xpath used: //input[@type='checkbox' and @id='c_bs_2'].

在上述示例中,我们看到所使用的 xpath 具有 AND 条件,其中两个属性条件都匹配。

此外,请注意 Main Level 2 旁边的复选框的 HTML 代码,我们刚刚标识了 xpath。

selenium xpath 9
<input type="checkbox" id="c_bs_2">

我们可以使用以下轴创建 xpath。它表示当前节点后面的所有节点。

selenium xpath 10
Xpath used: //span[@class='plus']//following::input[1]

我们可以使用 following-sibling 轴创建 xpath。它表示上下文节点的后代。兄弟节点与当前节点处于同一级别,并共享其父节点。

selenium xpath 11
Xpath used: //span[@class='plus']//following-sibling::input[1].

我们可以使用父轴创建 xpath。它表示当前节点的父节点。

让我们使用父轴标识 Sub Level 1 标签旁的高亮显示复选框。

selenium xpath 12
Xpath used: //*[@id='c_bf_1']//parent::li

此外,请注意 Sub Level 1 旁边的复选框的 HTML 代码,我们刚刚标识了 xpath。

selenium xpath 13
<input type="checkbox" id="c_bf_1">

我们可以使用子轴创建 xpath。它表示当前节点的子节点。

//*[@id='bf_1']//child::input[1].
  1. 我们可以使用 preceding 轴创建 xpath。它表示当前节点前面的所有节点。

  2. 我们可以使用 self 轴创建 xpath。它表示当前节点的所有节点。

  3. 我们可以使用 descendant 轴创建 xpath。它表示当前节点的所有后代。

Conclusion

这结束了我们对 Selenium XPath 教程的全面讲解。我们首先描述了什么是 xpath,以及如何使用 Selenium 创建 Xpath 表达式的规则。这使你具备了 Selenium XPath 的深入知识。明智的做法是不断实践你所学的内容,并探索与 Selenium 相关的内容,以加深你的理解,扩大你的视野。