Xpath 语法
1. XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点,XPath语言可以用在整棵树中寻找指定的节点
2. XPath 定位和CSS定位相比有更大的灵活性。XPath 在文档树中某个节点既可以向前搜索,也可以向后搜索,CSS定位只能在文档树中向前搜索,但XPath的定位速度比CSS 慢
3. 绝对定位方式: XPath表达式表示从html代码的最外层逐层查找,最后定位到按钮节点,举例:By.xpath(“/html/body/div/input[@value=‘查询’]”)
4. 绝对定位方式好处在于可以验证页面是否发生变化,如果页面发生变化,一般会造成原有定位成功的xpath表达式定位失败,绝对定位十分脆弱,即时页面代码发生了微小的变化也会造成原来的xpath定位失败,自动化测试中推荐使用相对路径定位
5. 相对路径定位:xpath 表达式://input[@value=”查询”]
Java定位语句:By.xpath(“//input[@value=“查询”]”)
//表示在html文档的全部层级进行查找
//input[@value=“查询”] 表示定位value为查询”的按钮
6. 使用索引号进行定位By.xpath(“//input[2]”) 定位第二个div中的查询按钮。页面元素出现新增或者减少的情况,不建议使用索引号定位
XPath表达式同事定位多个页面元素,冰晶定位到的多个元素存储到List对象中 举例:
List<WebElement> inputs=driver.findElements(By.xpath(“//input[1]”))
7. 页面元素的属性值 定位元素实例
定位测试网页中第一个图片元素
//img[@alt=”div1-img1”]
Java 定位语句
driver.findElement(By.xpath(“//img[@alt=”div1-img1”]”))
8. 1>定位页面中第一张图片://img[@href=’http://www.sogou.com’]
(使用img标签的href属性值)
2>定位第二个div中的第一个input输入框
//div[@name=’div2’]/input[@name=’div2input’]
(使用div 和 input 的name属性)
3>定位第一个div中第一个链接
//div[@id=’div1’]/a[@href=’http://www.sogou.com’]
(使用div 的id属性,a标签的href 属性)
4>定位页面的查询按钮
//input[@type=’buttton’]
(使用type属性值)
9. 模糊的属性值定位元素
适用情况:页面元素的属性值被动态的生成,即每次看到的页面元素的属性值不一样。
1>Starts-with()---//img[starts-with(@alt,’div1’)]
(查找图片alt属性开始位置包含“div1”关键字的页面元素)
2> Contains()------- //img[contains(@alt,’gl’)]
(查找图片alt属性包含gl关键字的页面元素)
即使页面元素的属性值发生一定程度的变化,只用具有固定不变的几个关键字,依旧可以使用Contains()函数进行定位
10. 使用页面元素的文本来定位元素
Xpath表达式
//a[text()=‘百度搜索’]
表示要查找包含百度搜索的链接页面元素,使用的精确匹配方式
//a[contains(text(),’百度’)]
搜索包含百度两个字的链接页面元素,实现根据部分文字内容进行匹配
//a[contains(text(),’百度’)]/preceding::div
表示包含“百度”两个字的链接页面元素的前面查找div页面元素
使用xpath的轴(Axis)方式可依据在文档树中的元素相对诶之关系定位,先找到一个相对比较好定位的元素,依据它和要定位元素的相对位置进行定位
parent
选取当前节点的父节点
//img[@alt='div2-img2']/parent::div
查找到alt属性为div2-img2的img元素,并基于图片找到其上一级的div元素
child
选取当前节点的子节点
//div[@id='div1']/child::img
查找id为div1的div标签,基于当前div查找标签为img的子节点
· Ancestor[['ænsestə]
选取当前节点的所有上层节点
//img[@alt='div2-img2']/ancestor::div
查找alt属性为div2-img2的图片,基于当前图片找到其上级的div页面元素
· Descendant [dɪ'send(ə)nt]
选取当前节点所有下层节点
//div[@id='div2']/descendant::img
查找id属性为div2的div元素,在查找其下级所有节点中的img元素
following
选取当前节点之后显示的所有节点
//div[@id='div1']/following::img
查找到ID属性为div1的div元素,并基于div的位置找到它后面节点中的img元素
following-sibling['sɪblɪŋ]
选取当前节点之后显示的所有的平级节点
//img[@alt='div1-img1']/following-sibling::input
查找到alt属性为div1-img1的img页面元素,并基于img的位置找到后续节点中的input元素
Preceding [prɪ'siːdɪŋ]
选取当前节点前面所有的节点
//img[@alt='div2-img2']/preceding::div
查找到alt属性为div2-img2的图片页面元素,并基于图片的位置找到它前面节点中的div元素
preceding-sibling
选取当前节点前面所有平级的节点
//img[@alt='div2-img2']/preceding-sibling::a[1]
查找到alt属性值为div2-img2的图片元素,基于图片位置找到它前面同级节点的第二个链接页面元素
Html
Body
Div1 div2
Input img button input a img