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

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

在这里插入图片描述

在自动化测试中,使用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">选择多个节点</td> <td style="text-align:left">//div\</td> <td>//a</td> <td>选择所有\<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">选择所有\<p>的父节点</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> <h2 id="xpath-">xpath谓语表达式</h2> <p>谓语表达式(predicate):紧跟在节点后面,嵌入在[]中的一段表达式,可用来筛选多个同名节点<br>谓语表达式作用原理:获取节点信息,通过表达式判断节点是否符合要求,为True则返回该节点<br>谓语格式:</p> <pre><code>节点名称[谓语] </code></pre><p><br></p> <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> <p><br></p> <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> <p>备注:</p> <ol> <li>last()、position()、text()、not()这类带有括号的表达式,实质都是xpath提供的函数,本篇文章只列出了常用函数</li> <li>根据W3C标准,第一个节点编号应该是[1],但在IE5及更高版本中第一个节点编号是[0]</li> </ol> <h2 id="xpath-axis-">xpath轴(axis)</h2> <p>轴:表示所选节点与当前节点之间的树关系,用来筛选对于当前节点有相同关系的一类节点<br>轴格式:</p> <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> <h3 id="-">总结</h3> <p>XPath是一个强大的工具,但也需要谨慎使用,因为Xpath方法查找元素较慢,一般情况下优先选择是其他定位方法,希望本文能够帮到大家!</p>
相关文章
|
16天前
|
机器学习/深度学习 人工智能 算法
探索软件测试的未来:自动化与人工智能的融合
在数字时代的浪潮中,软件测试作为保障软件质量的重要环节,正面临前所未有的挑战与机遇。本文深入探讨了自动化测试和人工智能技术如何共同推动软件测试领域的革新,以及这一变革对测试人员技能要求的影响。通过分析当前行业趋势、案例研究和技术发展,文章旨在为读者揭示未来软件测试的可能走向,并激发对持续学习和适应新技术重要性的认识。
32 7
|
5天前
|
Web App开发 数据采集 测试技术
五分钟轻松掌握 Python 自动化测试 Selenium
本文主要介绍了 Selenium 相关内容,主要涉及 Selenium 知识面,从开始的 Python 小案例,到后面的 API 全面了解,以及 Selenium 的常用功能,到最后的 XPATH 以及爬虫的认知。这些内容已经能够全面,且具有实践性。
|
12天前
|
人工智能 搜索推荐 测试技术
软件测试的未来:自动化与人工智能的融合
随着技术的快速发展,软件测试领域也迎来了翻天覆地的变化。传统的手动测试方法正在逐渐被自动化测试所取代,而人工智能(AI)的加入则为软件测试带来了新的革命。本文将探讨自动化测试的现状、挑战以及AI如何改变软件测试的未来。
|
8天前
|
Web App开发 IDE 测试技术
天呐!当揭开 Selenium 自动化测试框架的神秘面纱,设计与实现令人瞠目!
【8月更文挑战第12天】Selenium 是一强大自动化测试框架,用于Web应用测试。它含WebDriver、IDE和Grid等工具,支持Chrome、Firefox等浏览器。可通过编程模拟用户交互验证应用功能。例如使用Python结合Selenium WebDriver编写自动化测试脚本,实现打开网页、操作元素及断言等功能。还可结合测试框架和Selenium Grid提升测试效率和并行执行能力。
20 1
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的未来:自动化与人工智能的融合
在数字化时代,软件测试作为确保产品质量和用户满意度的关键步骤,正经历着前所未有的变革。本文将深入探讨自动化测试的最新趋势,以及人工智能如何重塑测试流程,提升效率并减少人为错误。通过分析当前的挑战和未来的机遇,我们将揭示这一领域即将迎来的创新浪潮。
|
16天前
|
Web App开发 人工智能 测试技术
探索自动化测试的高效之路:以Selenium为例
【8月更文挑战第4天】在软件开发周期中,测试阶段扮演着至关重要的角色。自动化测试作为提高测试效率和准确性的有效手段,已逐渐成为开发流程中的标配。本文将通过介绍Selenium这一流行的自动化测试工具,探讨如何构建高效的自动化测试框架,并通过实际代码示例,揭示其在提升软件质量与开发效率方面的巨大潜力。
|
17天前
|
机器学习/深度学习 人工智能 数据挖掘
重塑软件测试未来:自动化与人工智能的交响乐章,引领高效精准测试新时代
【8月更文挑战第3天】软件测试是确保软件质量的关键环节。随着自动化与AI技术的发展,测试正经历从手动到自动、再到智能的深刻变革。自动化显著提升了测试效率,减少人为错误;AI则通过数据分析和学习能力,实现了测试用例的自动生成与优化,提高了测试的智能水平。两者的融合不仅增强了测试的全面性和准确性,还预示着一个更加高效智能的测试新时代的到来。
19 1
|
18天前
|
Web App开发 Java 测试技术
自动化测试中的神器:Selenium WebDriver
【8月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘航船,而Selenium WebDriver则是这艘航船上的强力引擎。本文将带你领略Selenium WebDriver的魅力,从安装到实战应用,一步步揭开其神秘的面纱,让你在自动化测试的旅程上乘风破浪。
18 1
|
8天前
|
机器学习/深度学习 人工智能 算法
软件测试的未来:探索自动化与人工智能的融合
在数字化时代的浪潮中,软件测试领域正经历着一场革命性的变革。本文将带领读者一探究竟,从传统的手工测试方法,到自动化测试的崛起,再到人工智能技术的融入,我们一同见证这场技术演进如何重塑软件测试的未来。文章不仅阐述了自动化和AI技术在提高测试效率、准确性方面的优势,还深入探讨了这些技术带来的挑战和机遇,为读者呈现一个全面而深刻的软件测试新世界。
20 0
|
19天前
|
Web App开发 JavaScript 前端开发
探索自动化测试:以Selenium为例
【8月更文挑战第1天】在软件开发的海洋中,自动化测试如同一艘航船,它能够带领我们高效地穿梭于代码的波涛之中。本文将揭开自动化测试的神秘面纱,通过一个具体的例子—使用Selenium进行Web应用测试—来展示其魅力所在。我们将从搭建环境开始,逐步深入到编写测试用例,最后实现测试的自动化执行。这不仅是一次技术的探险,更是对效率和质量双重追求的体现。那么,让我们一起启航,去发现自动化测试的力量吧!

热门文章

最新文章