xpath定位总结

本文介绍了Xpath在Selenium自动化测试中的应用。Xpath是在xml文档中查找信息的语言,可用于html元素定位。详细阐述了绝对路径、相对路径、索引号、属性值等多种定位方法,还提及调试、取文本和属性值等操作。强调其功能强大,能保证版本间稳定,可解决界面定位问题。

1. Xpath简介

Xpath不是selenium专用,只是作为一种定位手段,为selenium所用。Xpath是一门在xml文档中查找信息的语言。Xpath可用来在xml文档中对元素和属性进行遍历。由于html的层次结构与xml的层次结构天然一致,所以使用Xpath也能够进行html元素的定位。

2. Xpath定位方法

浏览器中如何找到元素
Chrome浏览器:按F12,将鼠标点击下图中的图标,再到浏览器页面上选择需要定位的元素,Elements页中就会自动定位高亮显示页面中的元素。
在这里插入图片描述

2.1 绝对路径定位

顾名思义,将Xpath表达式从html的最外层节点,逐层填写,最后定位到操作元素
类似:
/html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[2]/input
这个路径可以定位到百度按钮
在这里插入图片描述

这种方法,一旦路径有变化会导致定位失败,所以不推荐使用该方式。

2.2 相对路径定位

绝对路径与相对路径的差别与文件系统中的绝对和相对路径类似,相对路径是只给出元素路径的部分信息,在html的任意层次中寻找符合条件的元素。
语句以//开始
例如://*[@id=“su”]
在这里插入图片描述
通过相对路径定位元素,提取的是元素的部分特征,只要提取恰当,能够保证版本间稳定,是进行自动化测试的首选,示例中通过相对路径直接定位,实际使用中会结合属性等其他特征,共同定位。

// 也可以作用于xpath 表达式的中间位置,表示中间的多层路径

//div[@class='dataview-floatheader']//th[3]/div[1]

在这里插入图片描述

2.3 索引号定位

  1. /html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[2]/input
    表示body下的第一个div

  2. /html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[last()]/input
    表示form下最后一个span

  3. /html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[last()-1]/input
    表示form下倒数第二个span
    在这里插入图片描述

2.4 属性值定位

//*[@id=“kw” and @name=‘wd’]
表示 id 属性为 kw 且 name 属性为 wd
在这里插入图片描述

2.5 属性值模糊匹配定位

模糊匹配的函数有两种:
在这里插入图片描述
//label[starts-with(@class,‘btn’)]

//label[contains(@class,‘btn’)]

2.6 文本内容定位

文本内容的定位是利用html的text字段进行定位的方法,可以看做是属性值定位的衍生
//button[text()=‘下一步’]

由于“下一步”这几个字是浏览器界面就可以看到的,我们称为“所见即所得”,这种特征改的可能性非常小,所以非常未定,优先推荐使用。
与属性值类似,文本内容也支持starts-with和contains模糊匹配。

2.7 Axis定位

在这里插入图片描述
在这里插入图片描述
例如:
//form/div[last()-1]/ancestor::div[@class=‘modal-content’]

2.8 扩展

① Xpath定位扩展
使用通过子节点定位父节点
…代表父节点;…/…爷爷节点
//span[contains(text(),‘1.jpg’)]/…
② Xpath还支持布尔定位
Xpath = //input[@id=‘kw1’ and @name=‘wd’]
可以and ,当然也可以or :
path = //input[@id=‘kw1’ or @name=‘wd’]

2.9 Xpath调试

如何知道Xpath表达式是否正确,是否可以找到元素呢?
可以在 console控制台进行Xpath的调试
以$x(“Xpath表达式”)进行
在这里插入图片描述

2.10 取文本

  1. /text() 获取的是标签中直系的文本内容
# 获取当前标签文本的内容
//div[@class='tang']/text()
  1. //text() 获取标签中非直系的文本内容(所有的文本内容)
# 获取当前标签下所有标签文本的内容
//div[@class='tang']//text()

2.11 取属性值

  1. /@属性值
# 获取当前标签的src属性
//div[@class='tang']/img/@src

3. Xpath总结

Xpath的功能非常强大,不仅能够完成界面定位的任务,而且能保证稳定性,实际自动化测试中,能够识别界面元素是重要的,更重要的是要保证版本间的稳定性,减少脚本的维护工作。
如下规则请参考:
特征越少越好
特征越是界面可见的越好
不能使用绝对路径
避免使用索引号
擅用console调试
相对路径,属性值,文本内容,Axis可以任意组合,当然属性值和文本内容的模糊匹配也支持和上述方式任意组合,Axis可以嵌套使用。
通过Xpath的各种方式组合,能够解决selenium自动化测试中界面定位的全部问题,可以说:有了Xpath,再也不用担心元素定位了。

### Xpath 定位方式 `parent::div` 的用法详解 #### 1. **XPath 中的父轴定位** 在 XPath 中,`parent::` 是一种用于访问当前节点父节点的轴定位方式。然而,直接使用 `parent::div` 并不符合 XPath 的语法规则,因为 `parent::` 后面不需要指定具体的标签名称。实际上,`parent::node()` 才是合法的形式,它返回当前节点的父节点[^1]。 如果需要筛选特定类型的父节点(例如 `<div>`),可以通过结合谓词 `[self::div]` 来实现: ```xpath ..[self::div] ``` 这条表达式的含义是从当前节点跳转到其父节点,并验证该父节点是否为 `<div>` 类型。如果是,则匹配成功;否则失败。 --- #### 2. **示例:查找某个元素的 `<div>` 父节点** 假设有一个简单的 HTML 结构如下: ```html <div class="container"> <ul> <li>Item 1</li> <li>Item 2</li> </ul> </div> ``` 如果我们想从 `<li>` 出发,找到它的 `<div>` 父节点,可以使用以下 XPath 表达式: ```xpath //li/../self::div ``` 解释: - `//li`:选择所有的 `<li>` 元素。 - `..`:回到 `<li>` 的父节点(这里是 `<ul>`)。 - `/self::div`:判断这个父节点是否为 `<div>`。如果不是,则不会被选中。 注意:由于这里的 `<ul>` 不是 `<div>`,所以此表达式不会返回任何结果。但如果我们将结构稍作修改,使 `<ul>` 成为 `<div>` 的直接子节点,则会正常工作。 --- #### 3. **另一种实现方式:通过祖先轴过滤** 除了使用 `parent::` 外,还可以利用 `ancestor::` 轴来寻找最近的 `<div>` 祖先节点。这种方式更加通用,尤其适用于复杂的嵌套层次结构。 继续以上述 HTML 为例,以下是对应的 XPath 表达式: ```xpath //li/ancestor::div[1] ``` 解释: - `//li`:选择所有的 `<li>` 元素。 - `/ancestor::div`:沿着祖先链向上遍历,直到遇到第一个 `<div>`。 - `[1]`:确保只取距离最近的那个 `<div>`。 这种方法的优点在于即使 `<div>` 不是直接父节点也能正确匹配。 --- #### 4. **JavaScript 实现对比** 尽管 XPath 提供了强大的路径表达能力,但在实际开发中有时也会借助 JavaScript 动态操作 DOM。例如,要找到某个元素的最近 `<div>` 父容器,可以用以下代码实现: ```javascript const liElement = document.querySelector('li'); const closestDiv = liElement.closest('div'); console.log(closestDiv); // 输出最近的 <div> 父节点 ``` 这段代码的作用与 XPath 的 `ancestor::div[1]` 类似,但它更适合运行时环境下的动态交互需求[^5]。 --- ### 总结 虽然 `parent::div` 并不是有效的 XPath 语法,但可以通过组合其他技术手段(如 `..[self::div]` 或 `ancestor::div[1]`)实现类似的定位效果。具体选择哪种方式取决于应用场景以及目标节点的具体位置关系。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西门一刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值