Baby!还有定位不到的元素吗?无处安放的 Xpath(下集)
荫荫佳木
2022年09月12日 16:17

Xpath元素定位

直接通过写xpath表达的方式来定位元素,其特点:

Xpath的思想:

通过路径找节点(元素的属性,内容)

01:07 如何写xpath表达式

在浏览器中,打开开发者工具,在element中Ctrl+F,打开搜索框(find by string,selector,or xpath),可以进行xpath表达式的定位实操。理想的定位是通过xpath表达式实现无歧义的定位,即只有一个结果。

xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

节点关系:父、子、兄弟、先辈、后辈。

语法规则回顾:

  • // 任意位置(跨节点寻找)

  • * 任意元素

xpath的一般写法:

//*[ ] 表示任意位置、任意的元素,[ ]内有两大类格式,也即定位有2种常用方式:通过属性类型或者文本内容。

1、使用等号=表示精确查找

(属性值、文本值都是可以直接复制的)

05:22 精确查找-利用属性

  • @ 属性 格式://*[@属性='属性值'] 例如: //*[@class='am-dropdown-toggle')] 其中class是属性名,'am-dropdown-toggle'是属性值

07:45 精确查找-利用文本

  • text() 文本值 格式://*[text()='文本值'] 例如: //*[text()='人才招聘']

2、使用contains进行模糊查询

09:38 模糊查询-contains

属性值或文本值中有一些隐藏的空格

  • 利用属性模糊查询: //*[contains(@href,'baidu')]

  • 利用文本内容模糊查询: //*[contains(text(),'院系专业')]

既支持属性又支持文本

3、使用开头的starts-with()进行模糊查询:

15:38 模糊查询-前缀查询start

例如:当元素id是动态的,但总有一部分类似于前缀不变化,对于属性、文本内容都可以使用,匹配一个开始位置的关键字。

例如://*[start-with(@id,'success')]

//*[start-with(text(),'练习')]

也是既支持属性又支持文本

语法规则回顾:

/ 根节点,节点分隔符(完全匹配)

. 当前节点

.. 父节点

4、上下级查询

21:12 不好定位--上下级定位

有些元素没有任何属性

例如: //*[@type='password']/../..

  • 通过前后的节点---包括同级、父节点来定位--即一级级的往上查找

  • 适用:寻找的元素不稳定,用它的上下级定位

5、多种条件精准查找

29:28 使用多种条件精确查找

//*[@class='mnav' and @type='password']

6、特殊元素:例如图标、按钮等等

svg元素直接复制xpath是不能定位的,直接写xpath的表达式是用到name属性去定位

//*[name()='svg']

以上是up在实战中的部分经验总结与心得分享,可以避免在写自动化脚本中遇到的一些问题。