软件测试/人工智能|详解selenium xpath定位

2023-12-15 11:54:20 浏览数 (2)

在自动化测试中,使用Selenium定位网页元素是至关重要的。XPath是一种强大的定位方法,允许您通过元素的路径来精确定位,无论其在DOM(文档对象模型)中的位置如何。

selenium-xpath定位

代码语言:python代码运行次数:0复制
element_xpath = driver.find_element(By.XPATH, 'xpath表达式')

xpath定位说明

xpath即为XML路径语言(XML Path Language),是由国际标准化组织W3C指定的,一种用来确定XML文档节点位置的语言

xpath定位优点

1.相较于其他定位方式,可支持更多定位方法,如:布尔逻辑判断、模糊定位等

2.可支持web定位、Android app原生页面定位

xpath定位缺点

1.需要从头到尾解析整个页面,速度较慢

xpath调试方法

方法1:在浏览器开发者模式的elements中,Ctrl F搜索栏输入xpath表达式

方法2:在浏览器开发者模式的console中,按如下格式可验证表达式

代码语言:shell复制
$x("xpath表达式")   # 表达式中存在引号,则使用单引号,'$'可更换为'$$'

xpath节点

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

在开始xpath语法前,我们需要简单了解这几种节点:

节点名称

说明

示例

元素节点

网页中的各个标签

如<textarea>...</textarea>、<p>...</p>

根节点

网页的第一个元素节点

网页的根节点通常为<html>...<html>

属性节点

标签中的各个属性

如<div id='su' >...</div>,id即为div节点的属性

文本节点

标签的文本

如<div>啦啦啦</div>,'啦啦啦'即为div节点的文本

xpath语法

<font color='red'>xpath使用路径表达式描述目标节点与网页头的关系</font>

绝对路径 & 相对路径

路径表达式有两种结构,分别为:

  • 绝对路径:从根节点/html开始往下,一层层的表示出来直到需要的节点为止。以百度输入框为例,表达式为:/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]//input[@id='su']
  • 相对路径:从任意节点开始,根据节点描述信息找到需要的节点。同样以百度输入框为例,表达式为:

对比两种表达式,可以发现:

  • 相对路径更简洁,方便阅读
  • 相对路径更稳定,当前端页面有结构变动就容易引起绝对路径发生变化

<font color='red'>因此,在项目中几乎都是使用相对路径进行定位</font>

xpath基本表达式

表达式

说明

示例

示例说明

nodename

选取此节点的所有子节点

html

选取<html>根节点的所有子节点

/

从根节点选取,或者用来选择子节点

/html/body/textarea

选择<body>中的所有<textarea>子节点

//

从匹配节点开始选取,或者选择后代节点

/html/body//textarea

选择<body>中的所有<textarea>后代节点

|

选择多个节点

//div|//a

选择所有<div>节点和<a>节点

..

选择当前节点的父节点

//p/..

选择所有<p>的父节点

*

选择所有节点

/html/body/*

选择<body>中的所有节点

xpath谓语表达式

谓语表达式(predicate):紧跟在节点后面,嵌入在[]中的一段表达式,可用来筛选多个同名节点

谓语表达式作用原理:获取节点信息,通过表达式判断节点是否符合要求,为True则返回该节点

谓语格式:

代码语言:python代码运行次数:0复制
节点名称[谓语]

常用谓语

说明

示例

示例说明

n

节点编号

//div2

选择所有<div>节点且<font color='red'>该节点是其父级的第二个<div>节点</font>

last()

最后一个节点

//divlast()

选择所有<div>节点且<font color='red'>该节点是其父级的最后一个子节点</font>

position()

比较节点编号

//divposition() < 3

选择所有<div>节点且<font color='red'>该节点是其父级的前两个<div>节点</font>

@属性

属性

//input@id

选择所有<input>节点且该节点带id属性

@属性='属性值'

比较属性

//input@id='kw'

选择所有<input>节点且该节点id属性为'kw'

text()

比较节点文本

//atext()='新闻'

选择所有<a>节点且该节点文本为'新闻'

谓语运算符

说明

示例

示例说明

= != > < >= <=

大小比较

/html/body/divposition()=2

选择<body>中的第2个<div>子节点

- *、 div mod

加减乘除求余

/html/body/divlast()-1

选择<body>中的倒数第2个<div>子节点

and or not()

或、且、非运算

//*@id='kw' and @class='s_ipt'

选择所有id='kw'并且class='s_ipt'的节点

contains()

包含

//*contains(text(), '新闻')

选择所有文本带有'新闻'二字的节点

starts-with()

头部包含

//*starts-with(@id, 's')

选择所有文本以'新闻'开头的节点

备注:

  1. last()、position()、text()、not()这类带有括号的表达式,实质都是xpath提供的函数,本篇文章只列出了常用函数
  2. 根据W3C标准,第一个节点编号应该是1,但在IE5及更高版本中第一个节点编号是0

xpath轴(axis)

轴:表示所选节点与当前节点之间的树关系,用来筛选对于当前节点有相同关系的一类节点

轴格式:

代码语言:python代码运行次数:0复制
当前节点/轴名称::节点名称

说明

示例

示例说明

ancestor

先辈节点

//input@id='kw'/ancestor:: *

选择id='kw'的<input>节点的所有先辈节点

ancestor-or-self

先辈节点以及当前节点

attribute

节点属性

child

子节点,等同于/

/html/body/child::div

选择<body>中的所有<div>子节点

descendant

后代节点,等同于//

/html/body/descendant::div

选择<body>中的所有<div>后代节点

descendant-or-self

后代节点以及当前节点

following

结束标签之后的所有节点

namespace

命名空间

parent

父节点

preceding

开始标签之前的所有节点

preceding-sibling

当前节点之前的所有同级节点

self

当前节点

总结

XPath是一个强大的工具,但也需要谨慎使用,因为Xpath方法查找元素较慢,一般情况下优先选择是其他定位方法,希望本文能够帮到大家!

0 人点赞