selenium UI自动化测试之xpath元素定位方法详解
前言1
①菜鸟教程中对于 xpath 的介绍是一门在 XML 文档中查找信息的语言。
②xpath 可用来在 XML 文档中对元素和属性进行遍历。
③xpath是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。
表达式 | 介绍 | 备注 |
---|---|---|
/ | 根节点 | 绝对路径 |
// | 当前节点的所有子节点 | 相对路径 |
* | 所有节点元素的 | |
@ | 属性名的前缀 | @class @id |
*[1] | [] 下标运算符 | |
[] | [ ]谓词表达式 | //input[@id='kw'] |
Following-sibling | 当前节点之后的同级 | |
preceding-sibling | 当前节点之前的同级 | |
parent | 当前节点的父级节点 |
前言2
绝对定位:以/单斜杠开头,从根节点,严格按照顺序和位置来表达,父/子,不建议使用。
相对定位:已//双斜杠开头,不管元素的位置和顺序,在html页面当中,有没有匹配表达式的元素。
①//标签名[@属性名称=属性值]
ele=driver.find_element_by_xpath(//input[@id='kw'])
举例:如下,在element使用ctrl+f查找,输入xpath定位。则可以找到对应的元素。
②逻辑运算 and or
//标签名[@属性名称-属性值 and @属性名称=属性值]
//标签名[@属性名称-属性值 or @属性名称=属性值]
ele=driver.find_element_by_xpath(//input[@id='kw' and name='wd' ])
③层级定位,元素本身的属性不能唯一定位找到自己,借助其他比较相近的祖先节点来缩小查找范围。
如果唯一定位无法找到,有多个值时,就采用层级定位。先找到某一个祖先的节点,再在祖先的子孙后代当中查找元素。
driver.find_element_by_xpath('//span[text()="小美"]/parent::div/following-sibling::div[@class="attend_date_state "]//img')
一、xpath基本定位用法
1、使用id定位 -- driver.find_element_by_xpath('//input[@id="kw"]')
2、使用class定位 -- driver.find_element_by_xpath('//input[@class="s_ipt"]')
二、xpath相对路径/绝对路径定位
1、相对定位 -- 以// 开头 如: //form//input[@name="phone"]
2、 绝对定位 -- 以/ 开头,但是要从根目录开始,比较繁琐,一般不建议使用绝对定位,如: /html/body/div/a
三、xpath文本、模糊、逻辑定位
1、【文本定位】使用text()元素的text内容 如: //button[text()="登录"]
2.、【模糊定位】使用contains()包含函数 如://button[contains(text(),"登录")] 、//button[contains(@class,"btn")]
3.、【模糊定位】使用 starts-with -- 匹配以xx开头的属性值; ends-with-- 匹配以xx结尾的属性值;
如: //button[starts-with(@class,"btn")] 、 //input[ends-with(@class,"-special")]
4.、使用逻辑运算符 -- and 、 or (适用于元素具有多个属性值);
如: //button[@class='ant-table-scroll' and @title='content'] 、 //button[@class='ant-table-scroll' or @id='pwd']
四、xpath轴定位
1、child 选取当前节点的所有子元素 2、parent 选取当前节点的父节点 3、descendant 选取当前节点的所有后代元素(子、孙等) 4、ancestor 选取当前节点的所有先辈(父、祖父等) 5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 7、preceding-sibling 选取当前节点之前的所有同级节点 8、following-sibling 选取当前节点之后的所有同级节点 9、preceding 选取文档中当前节点的开始标签之前的所有节点 10、following 选取文档中当前节点的结束标签之后的所有节点 11、self 选取当前节点 12、attribute 选取当前节点的所有属性 13、namespace 选取当前节点的所有命名空间节点
1、轴运算①
①ancestor:祖先节点,包括父节点(通过某一具有唯一定位的元素获取其所有的祖先节点,根据索引下标取父节点、爷爷节点、、、祖先节点(以此类推:索引下标值越大,越远离该元素;索引下标值越小,越靠近该元素)) ②parent:父节点(取最近的一个节点) ③preceding-sibling:当前元素节点标签之前的所有兄弟节点(平级) ④preceding:当前元素节点标签之前的所有节点 ⑤following-sibling:当前元素节点标签之后的所有兄弟节点(平级即同属于同一个父节点的元素的兄弟节点) ⑥following:当前元素节点标签之后的所有节点
使用语法:轴名称 :: 节点名称
使用较多场景:页面显示为一个表格样式的数据列
注意:
# 定位 找到元素 -- 做到唯一识别
# 优先使用id
# 舍弃:有下标的出现、有绝对定位的出现、id动态变化时舍弃
2、轴运算②
① /.. : 定位当前相对定位元素的父级元素 ② /../.. :定位当前相对定位元素的爷爷级元素 ③ /../../.. :i定位当前相对定位元素的父级的父级的父级元素
。。。。以此类推
实例:
五、xpath元素定位方式的模糊匹配问题
①用 contains 关键字,寻找页面中style属性值包含有sp.gif这个关键字的所有div元素,其中@后面可以跟该元素任意的属性名。
driver.find_element_by_xpath('//div[contains(@style,"sp.gif")]').click()
②用 start-with 关键字,寻找style属性以position开头的div元素,其中@后面可以跟该元素任意的属性名。
driver.find_element_by_xpath('//div[start-with(@style,"position")]').click()
③用 text 关键字,直接查找页面当中所有的退出二字,经常用于纯文字的查找。【*号表示不指定标签名,在页面中的所有元素对象范围内查找】
driver.find_element_by_xpath('//*[text()="退出"]').click()
④ contains 关键字与 text 关键字结合使用;一般用于知道超链接上显示的部分或全部文本信息。【包括部分文本或者全部文本内容为‘退出’的a标签】
driver.find_element_by_xpath('//a[contains(text(), "退出")]').click()
六、xpath元素定位方式中使用逻辑运算符辅助定位元素
① xpath元素定位方式中可使用 and;or 辅助定位元素
driver.find_element_by_xpath('//li[@class="ant-dropdown-menu-item" and @role="menuitem"]/a[contains(text(),"修改")]').click()
七、xpath元素定位方式中利用不等于、不包含等关系辅助定位元素
① @属性值!=xxx;text()!=xxx 等,例如:
//div[@class='el-tab-pane' and @style!='display: none;']//button[[text()='确定']]
② not(contains(@属性值, 'xxx'));not(contains(text(), 'xxx')) 等,例如:
//div[@class='el-tab-pane' and not(contains(@style,'none'))]//button[[text()='确定']]
③ not (@属性值='xxx');not(text()='xxx') 等,例如:
//div[@class='el-tab-pane' and not(@style='display: none;')]//button[[text()='确定']]
④某标签不包含xxx属性, not(@属性值) ,例如:
//div[not(@id)] # 该div标签不包含id属性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!