目录
目录
XPath 语法文章来源地址https://www.toymoban.com/news/detail-466386.html
选取节点
下面列出了最有用的路径表达式:
实例
谓语(Predicates)
实例
选取未知节点
实例
选取若干路径
实例
javascript xpath定位
定位单个元素:
定位多个元素:
验证xpath定位语法是否OK
尽量使用模糊匹配定位元素
模糊匹配contains
使用关联文本值定位 text()
在UI自动化测试中用的最频繁的就是xpath定位了,所以用好xpath定位至关重要,用好xpath基本能解决99%的定位,实在不行只能鼠标键盘模拟了。
XPath 语法
我们将在下面的例子中使用这个 XML 文档。
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
javascript xpath定位
定位单个元素:
function getElementByXpath(xpath){
var element = document.evaluate(xpath,document).iterateNext();
return element;
}
定位多个元素:
function getAllElementByXpath(xpath) {
var xresult = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
var xnodes = [];
var xres;
while (xres = xresult.iterateNext()) {
xnodes.push(xres);
}
return xnodes;
}
示例演示:
单个元素
多个元素
先要在Chrome 控制台定义函数:
可以看到定位到了多个元素
验证xpath定位语法是否OK
有时候我们不需要写出完整的js语法定位就可以验证xpath是否能定位到元素,可以通过在Chrome元素中用xpath搜索,如下图:
可以看到支持字符串、css选择器及xpath搜索
搜索验证:
可以看到有6个匹配。
尽量使用模糊匹配定位元素
web开发中很多元素在dom中的位置都是动态变化的,如果使用绝对路径定位即使当前能够定位到到后面也很容易失效,像以下这种:
//*[@id="hulianwang"]/div[1]/div/h2/a
这种带有数字的路径要特别忌讳,尽量使用元素关联的文字或者dom关联的class name。
这其中就可以使用xpath的模糊匹配,有几个比较有用的方法:
fn:contains(string1,string2) | 如果 string1 包含 string2,则返回 true,否则返回 false。 例子:contains('XML','XM') 结果:true |
fn:starts-with(string1,string2) | 如果 string1 以 string2 开始,则返回 true,否则返回 false。 例子:starts-with('XML','X') 结果:true |
fn:ends-with(string1,string2) | 如果 string1 以 string2 结尾,则返回 true,否则返回 false。 例子:ends-with('XML','X') 结果:false |
主要用在xpath谓语限定中,以下面dom为例:
<span class="s_btn_wr"><input class="btn" id="s_btn_wr" type="button" value="百度一下" onmousedown="this.className='btn s_btn_h'" onmouseout="this.className='btn'"></span>
//input[@class='btn'] 使用class属性定位
//input[@value='百度一下'] 使用value属性定位
模糊匹配contains
//input[contains(@class,'btn')]
可以看到我这有2个匹配,有一个不是我想要的这样容易出问题,要唯一匹配就可以加谓语限制
//input[contains(@class,"btn")][@value="百度一下"]
可以看到现在是唯一定位了 ,nice~
使用关联文本值定位 text()
看以下dom,我们要定位这个音乐盒,看这个写法应该是动态路径,不太好定位,但是用关联的文本就能很轻易的定位到~
复制出来的xpath:
//*[@id="__layout"]/div/div[1]/div/ul/li[5]/span
带数字的都是不稳定元素,稍加改动一下:
//*[@id="__layout"]//div//ul//li//span[text()="音乐盒"]
这样就方便多了~
start-with,end-with和contains用法基本类似。用好xpath相对定位UI自动化事半功倍~
详细的xpath语法可以参考文章来源:https://www.toymoban.com/news/detail-466386.html
XPath 语法
到了这里,关于UI自动化 Xpath定位必知必会的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!