当前位置: 代码迷 >> 综合 >> Python + Selenium(2.5)- 使用 Xpath 定位元素
  详细解决方案

Python + Selenium(2.5)- 使用 Xpath 定位元素

热度:95   发布时间:2023-10-12 05:30:57.0

文章目录

      • xpath介绍和基本语法
        • 基本语法
      • 绝对定位和相对定位
      • 谓语条件
        • 1.索引取值
        • 2.有某个属性:[@属性]
        • 3.属性为某个特定值[@属性=值]
        • 4.子元素中属性为某个特定值:[//子元素/@属性=值]
        • 文本 [text()=‘’]
      • 通配符和逻辑运算 and or
      • 函数
      • 轴定位
      • xpath使用的注意点
      • css和xpath比较

xpath介绍和基本语法

基本语法

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取,绝对路径
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点
选取当前节点的父节点。
@ 选取属性。

绝对定位和相对定位

  • 绝对路径:每次从根节点html开始
  • 相对路径:每次只需从第一个已经找到的节点开始
  • 绝对定位的劣势:
    • 前端经常变化,加div之类的,下次就不能用了
    • 表达更加繁琐

谓语条件

谓语被嵌在方括号中,用来查找某个特定的节点或者包含某个指定的值的节点,也就是额外的条件。文本也可以定位。

1.索引取值

注意点:

  • 索引的顺序是从1开始的,不是0

  • 索引的优先顺序比//高,建议使用索引的时候,前面的部分使用括号包起来

(//input[@class='s_ipt'])[1](//input)[1]//input[1]是有区别的

2.有某个属性:[@属性]

driver.find_element_by_xpath("//input[@id]")

3.属性为某个特定值[@属性=值]

driver.find_element_by_xpath("//input[@id=‘kw’]")

4.子元素中属性为某个特定值:[//子元素/@属性=值]

# span标签卡下有一个input子标签,id=kw
driver.find_element_by_xpath("//span[input/@id=‘kw’]")

文本 [text()=‘’]

//a[text()='百度一下']

通配符和逻辑运算 and or

# 逻辑运算 and。要满足所有的条件才可以
driver.find_element_by_xpath("//span[@class='nav-text-content' and text()='xxxx']")# 逻辑运算 or.满足任何一个条件都可以
driver.find_element_by_xpath("//a[text()='新闻' or text()='地图']")

注意点:

  • find_element_by_class_name进行定位,只能取一个且不能有空格
  • xpath通过class属性定位的时候,class属性值可以有空格,且必须将class中的内容全部写上才能够定位到

函数

函数名 说明
text() 获取该标签的文本
contains(str1,str2) str1是否包含str2
starts-with(str1,str2) str1是否以str2开头
driver.find_element_by_xpath("//span[contains(@title,'设置')]")
driver.find_element_by_xpath("//span[starts-with(@title,'设置')]")

轴定位

# /轴名称(元素关系)::节点名称
例://input/ancestor::span
  • 轴定位包含了路径寻找,如果需要多层往上,轴定位更加方便
  • 兄弟姐妹都可以
轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

可参考以下博客:https://www.cnblogs.com/hanmk/p/9015502.html

xpath使用的注意点

  • 什么时候用xpath

没有明显特征的元素,使用其他的方法不好定位

  • 写好的xpath要先到浏览器去验证

css和xpath比较

CSS完全与HTML一起使用,XPATH必须能够使用遍历DOM树。

  • css用途更少,xpath的效率更低

也就是说 ,css是与HTML绑定在一起的,你换成XML其他的标记语言,就不行了。Xpath是和DOM绑定在一起的,DOM是什么?是HTML和JS的中介,所以还需要时间去生成DOM对象,但是只要有DOIM,你就可以用Xpath,也就是说说xpath的用途更广,手机也可以用,其他客户端也可以用。

  • css的效率更快

xpath在找到一个元素是可以上下移动的,而css只能进行横向。xpath在IE中效率会高,其他谷歌和火狐浏览器都会差一些。

  • css选择表达更加简洁,通常非常短,但是与Xpath相比,功能相对较弱。

最后总结一下:
如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:593462778,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:暗潮汹涌
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。