元素定位---使用 XPath 定位元素

XPath 是 XML 路径语言,用来查询 XML 文档里中的节点。主流的浏览器都支持 Xpath,因
为 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 中的位置。例如,我们可以通过如下
方法来定位用户名字段,假设这个元素处于 DOM 中第一个:

WebElement userName=driver.findElement(By.xpath("//input"));


3.使用索引来定位元素
在前面的示例中,XPath 查询将返回第一个 DOM 中元素。可能会有多个元素都匹
配了 XPath 查询。如果元素不是第一个元素,我们也可以指定他的个数来找到它。例如在我
们的登录表单,我们可以找到密码字段 - 第二个,方法如下:

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']"));

你可能会遇到一个属性不足以来定位到一个元素的情况,你需要联合使用其他的属性来达到
精确匹配。下面的例子中,使用多个属性来定位元素。

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 及属性名称定位元素
这个策略和之前的有些不同,我们叧通过指定元素中属性的名称而不是属性的值来定位元素。
例如,我们想要查找所有标签中,含有 alt 属性的元素。

List 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 轴是借助于文档中元素不元素之间的关系来定位。下面有一个简单的


XPath 轴的例子。

元素定位---使用 XPath 定位元素_第1张图片

元素定位---使用 XPath 定位元素_第2张图片


你可能感兴趣的:(元素定位---使用 XPath 定位元素)