为 HTML 页面在 DOM 中表示为 XHTML 文档。
Xpath 语言是基于 XML 文档的树结构,并提供了浏览树的能力,通过多样的标准来选择结
点。
Selenium WebDriver 支持使用 Xpath 表达式来定位元素。
利用 Xpath 来定位元素非常方便,但是,便捷的定位策略牺牲了系统的性能。
XPath 和 CSS 中最重要的区别在于,Xpath 可以向前和向后查询 DOM 结构的元素,而 CSS
只能向前查询。这意味着使用 XPath 可以通过子元素来定位父元素。
1.通过绝对路径定位元素
和 CSS 绝对路径相似,XPath 绝对路径适用于指定元素的位置。这里的一个例子就是使用
绝对路径来定位用户名的字段。在每一个元素之间需要有一个空格。
WebElement userName=driver.findElement(By.xpath("html/body/div/div/form/input"));
但是,这个策略有局限性,他需要参考整个页面的文档结构。如果改变了,此元素的定位将会
失效。
2.通过相对路径定位元素
用相对路径,我们可以直接找到元素而不管其在 DOM 中的位置。例如,我们可以通过如下
方法来定位用户名字段,假设这个<input>元素处于 DOM 中第一个:
WebElement userName=driver.findElement(By.xpath("//input"));
3.使用索引来定位元素
在前面的示例中,XPath 查询将返回第一个 DOM 中<input>元素。可能会有多个元素都匹
配了 XPath 查询。如果元素不是第一个元素,我们也可以指定他的个数来找到它。例如在我
们的登录表单,我们可以找到密码字段 - 第二个<input>,方法如下:
WebElement password=driver.findElement(By.xpath("//input[2]"));
4.使用 XPath 及属性值定位元素
和 CSS 相似,我们可以在 XPath 中使用元素的属性来定位元素。在下面的例子中,可以使
用 ID 属性来定位用户名字段。
WebElement userName=driver.findElement(By.xpath("//input[@id='userName']"));
另一个使用 alt 属性来定位 image 属性的例子:
WebElement previousButton=driver.findElement(By.xpath("img[@alt='Previous']"));
你可能会遇到一个属性不足以来定位到一个元素的情况,你需要联合使用其他的属性来达到
精确匹配。下面的例子中,使用多个属性来定位<input>元素。
WebElement previousButton = driver.findElement(By.xpath("//input[@type='submit'][@value='login']"));
使用 XPath 和 and 操作符也同样可以达到相同的效果
WebElement previousButton = driver.findElement(By.xpath("//input[@type='submit' and @value='login']"));
下面的例子中,使用 or 操作符任何一个属性满足也将可以对元素进行定位
WebElement previousButton = driver.findElement(By.xpath("//input[@type='submit' or @value='Login']"));
5.使用 XPath 及属性名称定位元素
这个策略和之前的有些不同,我们叧通过指定元素中属性的名称而不是属性的值来定位元素。
例如,我们想要查找所有<img>标签中,含有 alt 属性的元素。
List<WebElement> imagesWithAlt=driver.findElements(By.xpath("img[@alt]"));
6.部分属性值的匹配
类似于CSS 选择器,XPath 还提供了一种一些方法部分匹配属性来定位元素。这对于网页
中的属性在动态发化的时候是非常有用的。例如,ASP.NET 应用程序中动态生成 id 属性
值。下面的表说明了使用这些 XPath 功能:
| 语法 | 例子 | 描述 |
| starts-with() | input[starts-with(@id,'ctrl')] | 例如,如果元素的 ID 为 ctrl_12,将会匹配以 ctrl 开始的属性值。 |
| ends-with() | input[ends-with(@id,'_userName')] | 例如,如果元素的 ID 为 a_1_userName,将会匹配 以 userName 结尾的属性 值。 |
| contains() | input[contains(@id,'userName')] | 例如,如果元素的 ID 为 panel_login_userName _textfield,将会匹配含 有 userName 属性值。 |
7.使用值来匹配任意属性及元素
XPath 可以匹配任意元素属性中指定的值。例如,在下面的 XPath 查询中,“userName”
是指定的。XPath 将会检查所有元素中是否有属性等于”userName”,并将其返回。
WebElement userName =driver.findElement(By.xpath("//input[@*='username']"));
8.使用 XPath 轴来定位元素
XPath 轴是借助于文档中元素不元素之间的关系来定位。下面有一个简单的<table>的
XPath 轴的例子。