软件测试/测试开发|详解selenium xpath定位_html

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

selenium-xpath定位

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中,按如下格式可验证表达式

$x("xpath表达式")   # 表达式中存在引号,则使用单引号,'$'可更换为'$$'


xpath节点

在xpath中,有七种类型的节点(node):元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点) 在开始xpath语法前,我们需要简单了解这几种节点:

节点名称

说明

示例

元素节点

网页中的各个标签

如\...\、\

...\

根节点

网页的第一个元素节点

网页的根节点通常为\...\

属性节点

标签中的各个属性

如\

...\

,id即为div节点的属性

文本节点

标签的文本

如\

啦啦啦\

,'啦啦啦'即为div节点的文本


xpath语法

xpath使用路径表达式描述目标节点与网页头的关系

绝对路径 & 相对路径

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

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

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

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

因此,在项目中几乎都是使用相对路径进行定位

xpath基本表达式

表达式

说明

示例

示例说明

nodename

选取此节点的所有子节点

html

选取\根节点的所有子节点

/

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

/html/body/textarea

选择\中的所有\子节点</td>

</tr><tr><td style="text-align:left">//</td><td style="text-align:left">从匹配节点开始选取,或者选择后代节点</td><td style="text-align:left">/html/body//textarea</td><td style="text-align:left">选择\<body>中的所有\<textarea>后代节点</td></tr><tr><td style="text-align:left">|</td><td style="text-align:left">选择多个节点</td><td style="text-align:left">//div|//a</td><td style="text-align:left">选择所有\<div>节点和\<a>节点</td></tr><tr><td style="text-align:left">..</td><td style="text-align:left">选择当前节点的父节点</td><td style="text-align:left">//p/..</td><td style="text-align:left">选择所有\<paragraph>的父节点</td></tr><tr><td style="text-align:left">\*</td><td style="text-align:left">选择所有节点</td><td style="text-align:left">/html/body/*</td><td style="text-align:left">选择\<body>中的所有节点</td></tr></tbody></table><h3>xpath谓语表达式</h3><paragraph>谓语表达式(predicate):紧跟在节点后面,嵌入在[]中的一段表达式,可用来筛选多个同名节点谓语表达式作用原理:获取节点信息,通过表达式判断节点是否符合要求,为True则返回该节点谓语格式:</paragraph><pre><code>节点名称[谓语]</code></pre><paragraph><br></paragraph><table><thead><tr><th style="text-align:left">常用谓语</th><th style="text-align:left">说明</th><th style="text-align:left">示例</th><th style="text-align:left">示例说明</th></tr></thead><tbody><tr><td style="text-align:left">n</td><td style="text-align:left">节点编号</td><td style="text-align:left">//div[2]</td><td style="text-align:left">选择所有\<div>节点且<font color='red'>该节点是其父级的第二个\<div>节点</font></td></tr><tr><td style="text-align:left">last()</td><td style="text-align:left">最后一个节点</td><td style="text-align:left">//div[last()]</td><td style="text-align:left">选择所有\<div>节点且<font color='red'>该节点是其父级的最后一个子节点</font></td></tr><tr><td style="text-align:left">position()</td><td style="text-align:left">比较节点编号</td><td style="text-align:left">//div[position() < 3]</td><td style="text-align:left">选择所有\<div>节点且<font color='red'>该节点是其父级的前两个\<div>节点</font></td></tr><tr><td style="text-align:left">@属性</td><td style="text-align:left">属性</td><td style="text-align:left">//input[@id]</td><td style="text-align:left">选择所有\<input>节点且该节点带id属性</td></tr><tr><td style="text-align:left">@属性='属性值'</td><td style="text-align:left">比较属性</td><td style="text-align:left">//input[@id='kw']</td><td style="text-align:left">选择所有\<input>节点且该节点id属性为'kw'</td></tr><tr><td style="text-align:left">text()</td><td style="text-align:left">比较节点文本</td><td style="text-align:left">//a[text()='新闻']</td><td style="text-align:left">选择所有\<a>节点且该节点文本为'新闻'</td></tr></tbody></table><paragraph><br></paragraph><table><thead><tr><th style="text-align:left">谓语运算符</th><th style="text-align:left">说明</th><th style="text-align:left">示例</th><th style="text-align:left">示例说明</th></tr></thead><tbody><tr><td style="text-align:left">= != <br> > < <br> >= <=</td><td style="text-align:left">大小比较</td><td style="text-align:left">/html/body/div[position()=2]</td><td style="text-align:left">选择\<body>中的第2个\<div>子节点</td></tr><tr><td style="text-align:left">\+ - \*、<br> div mod</td><td style="text-align:left">加减乘除求余</td><td style="text-align:left">/html/body/div[last()-1]</td><td style="text-align:left">选择\<body>中的倒数第2个\<div>子节点</td></tr><tr><td style="text-align:left">and or not()</td><td style="text-align:left">或、且、非运算</td><td style="text-align:left">//*[@id='kw' and @class='s_ipt']</td><td style="text-align:left">选择所有id='kw'并且class='s_ipt'的节点</td></tr><tr><td style="text-align:left">contains()</td><td style="text-align:left">包含</td><td style="text-align:left">//*[contains(text(), '新闻')]</td><td style="text-align:left">选择所有文本带有'新闻'二字的节点</td></tr><tr><td style="text-align:left">starts-with()</td><td style="text-align:left">头部包含</td><td style="text-align:left">//*[starts-with(@id, 's')]</td><td style="text-align:left">选择所有文本以'新闻'开头的节点</td></tr></tbody></table><paragraph>备注:</paragraph><ol><li>last()、position()、text()、not()这类带有括号的表达式,实质都是xpath提供的函数,本篇文章只列出了常用函数</li><li>根据W3C标准,第一个节点编号应该是[1],但在IE5及更高版本中第一个节点编号是[0]</li></ol><h3>xpath轴(axis)</h3><paragraph>轴:表示所选节点与当前节点之间的树关系,用来筛选对于当前节点有相同关系的一类节点轴格式:</paragraph><pre><code>当前节点/轴名称::节点名称</code></pre><table><thead><tr><th style="text-align:left">轴</th><th style="text-align:left">说明</th><th style="text-align:left">示例</th><th style="text-align:left">示例说明</th></tr></thead><tbody><tr><td style="text-align:left">ancestor</td><td style="text-align:left">先辈节点</td><td style="text-align:left">//input[@id='kw']/ancestor::\ *</td><td style="text-align:left">选择id='kw'的\<input>节点的所有先辈节点</td></tr><tr><td style="text-align:left">ancestor-or-self</td><td style="text-align:left">先辈节点以及当前节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">attribute</td><td style="text-align:left">节点属性</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">child</td><td style="text-align:left">子节点,等同于/</td><td style="text-align:left">/html/body/child::div</td><td style="text-align:left">选择\<body>中的所有\<div>子节点</td></tr><tr><td style="text-align:left">descendant</td><td style="text-align:left">后代节点,等同于//</td><td style="text-align:left">/html/body/descendant::div</td><td style="text-align:left">选择\<body>中的所有\<div>后代节点</td></tr><tr><td style="text-align:left">descendant-or-self</td><td style="text-align:left">后代节点以及当前节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">following</td><td style="text-align:left">结束标签之后的所有节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">namespace</td><td style="text-align:left">命名空间</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">parent</td><td style="text-align:left">父节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">preceding</td><td style="text-align:left">开始标签之前的所有节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">preceding-sibling</td><td style="text-align:left">当前节点之前的所有同级节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr><tr><td style="text-align:left">self</td><td style="text-align:left">当前节点</td><td style="text-align:left">略</td><td style="text-align:left">略</td></tr></tbody></table><h4>总结</h4><paragraph>XPath是一个强大的工具,但也需要谨慎使用,因为Xpath方法查找元素较慢,一般情况下优先选择是其他定位方法,希望本文能够帮到大家!</paragraph><paragraph><a href="https://v.douyin.com/iREqK62b/">更多Python基础语法趣味学习视频,请点击!</a></paragraph><paragraph><img src="https://img-blog.csdnimg.cn/direct/919681a531f24274a3b07cdeeebc794d.jpeg" alt="在这里插入图片描述"></paragraph>