XPath攻略:从入门到精通,告别查找困难!

简介

XPath 是一种用于在 XML 文档中检索信息的语言。它通过路径表达式导航 XML 文档,广泛应用于各种场景。XPath 的灵活性和强大功能使其成为在 XML 结构中准确定位和提取数据的重要工具。

XPath 使用场景

Web 自动化测试:

    • XPath 在 Web 自动化测试中广泛应用,XPath 提供了一种强大的定位方式。它能够通过元素的层次结构、属性、文本内容等进行更加灵活和精准的定位,适用于各种复杂的 Web 应用页面。

App 自动化测试:

    • 在移动应用的自动化测试中,XPath 可以在原生应用和混合应用(Hybrid App)中定位和操作元素。在 App 的 UI 中,XPath 可以针对不同平台(如iOS和Android)提供一致的选择能力,使测试脚本更具通用性。

XPath 相对定位的优点

  • 可维护性更强:XPath 相对定位可以相对于其他元素的方式来定位元素。如果页面结构发生变化,只需要更新相对路径中的某些部分,而不必重新创建整个定位表达式。

  • 语法更加简洁:XPath 相对路径是相对于其他元素的路径,更容易理解和编写。与复杂的绝对路径相比,相对路径语法更加简洁。

  • 相比于 css 可以支持更多的方式:XPath 相对定位可以访问 XML 和 HTML 文档的任何部分,而不仅仅是元素和属性。

示例代码如下:

# 复制的绝对定位
$x('//*[@id="ember75"]/td[1]/span/a')
# 编写的相对行为
$x(" //*[text()='技术分享 | SeleniumIDE用例录制']")"SeleniumIDE用例录制']"

XPath 定位的调试方式

浏览器-console:$x("XPath 表达式")。

 浏览器-elements:ctrl+f 输入 XPath 或者 css。

 XPath 基础语法(包含关系)

XPath 基础语法实战

打开测试人社区(https://ceshiren.com/),F12 进入开发者模式,选择 console

整个页面


$x("/")

 

整个页面中的所有元素

$x("/*")

 

 整个页面中的所有元素

$x("//*")

 

查找页面上所有的 div 标签节点

$x("//div")

查找 id 属性为 site-logo 的节点


$x('//*[@id="site-logo"]')

 

 查找节点的父节点


$x('//*[@id="site-logo"]/..')

 

XPath 顺序关系(索引)

XPath 通过索引直接获取对应元素:


# 获取此节点下的所有的li元素
$x("//*[@id='ember21']//li")
# 获取此节点下【所有的节点的】第一个li元素
$x("//*[@id='ember21']//li[1]")

XPath 高级用法

注意:所有的表达式需要和[]结合。

XPath 高级用法实战

打开测试人社区(https://ceshiren.com/),F12 进入开发者模式。

选取最新的元素

选取最后一个 div 标签

$x("(//div)[last()]")

 

多个属性共同定位-交集

选取属性 id 的值为 ember24 并且属性 class 的值为 nav-item_new new ember-view 的 input 标签

 

$x("//*[@class='nav-item_new new ember-view' and @id ='ember24']")

多属性共同定位-交集

选取属性 id 的值为 ember24 或属性 id 的值为 ember23 的 input 标签

$x("//*[@id='ember23' or @id ='ember24']")

 

 

文本信息定位

选取所有文本信息为'所有类别'的元素

$x(' //*[text()="所有类别"]')

 

 

文本信息包含定位

选取所有文本信息包'Python 测试开发'的元素

Xpath 定位-实战

测试步骤

  1. 打开测试人社区(https://ceshiren.com/)

  2. 使用 css 高级定位,进入【类别】的页面。

  3. 获取文本值进行断言。

Python 实现


from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


class Test():
    def setup(self):
        service = Service()
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service=service,options=options)
        self.driver.implicitly_wait(10)

    def teardown(self):
        self.driver.quit()

    def test_xpath(self):
        self.driver.get("https://www.ceshiren.com")
        self.driver.find_element(By.XPATH,"//*[text()='类别']").click()
        text = self.driver.find_element(By.XPATH,"//*[text()='提问区']").text
        assert text == '提问区'

 Java 实现

public class web_auto_lianxiTest {
    static  WebDriver driver;
    @BeforeAll
    static  void setup(){
        driver = new EdgeDriver();

    }

    @AfterAll
    static void teardown(){
        driver.quit();

    }

    @Test
    void test4() throws InterruptedException {
        //打开浏览器页面
        driver.get("https://ceshiren.com/");
        //获取选择按钮的元素
        WebElement search = driver.findElement(By.xpath("//*[@class='search-button']"));
        //点击选择按钮
        search.click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(1));
        //获取高级搜索按钮的元素,并点击
        WebElement super_search = driver.findElement(By.xpath("//*[@class ='show-advanced-search']"));
        super_search.click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(1));
        //点击类型下拉框
        driver.findElement(By.id("search-type-header")).click();
        //选择下拉框第二个元素点击
        driver.findElements(By.className("select-kit-row")).get(1).click();

        //找到搜素输入框,输入web自动化测试并回车
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        // WebElement bar = driver.findElement(By.id("search-bar"));
        WebElement input_serach = driver.findElement(By.xpath("//div[@class='search-bar']//input\n"));
        input_serach.sendKeys("web自动化测试");
        input_serach.sendKeys(Keys.ENTER);
        //断言对比
        String text = driver.findElement(By.className("search-results")).getText();
        assert text.contains("自动化"):"搜索结果里没有包含自动化字眼";
    }
}

 

总结

XPath定位是一种非常便捷的方法,不仅可以通过常规的id、class等属性进行元素定位,还可以通过父子关系和后代关系来实现更灵活的定位。这使得XPath在元素选择和定位方面具有独特的优势。

                                                                  推荐学习

图片

测试开发名企定向培养训练营内容全面升级。4 个月 30+ 项目实战强化训练,资深测试架构师、开源项目作者亲授 BAT 大厂前沿最佳实践,带你一站式掌握测试开发必备核心技能(对标阿里P6+)!新增小班私教、1v1私教服务,让同学们在学技术的同时,软技能也同步得到提升。直推 BAT 名企测试经理,模拟面试+面试复盘跳槽无忧

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/497107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统下C++程序运行时的内存布局及存储内容,生命周期,初始化时机。【C++】

Linux系统下C程序运行时的内存布局及存储内容,生命周期,初始化时机详解。 1.程序代码段存储内容生命周期初始化时机特点代码演示 2.初始化数据段 - 只读初始化数据段存储内容生命周期初始化时机特点代码演示 3.初始化数据段 - 读写初始化数据段存储内容生…

aws使用记录

数据传输(S3) 安装命令行 安装awscli: https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions 直到 aws configure list 可以运行 身份验证: 运行: aws config…

35岁的程序员,该何去何从?

2024 年,是充满未知和挑战的一年。AI 的发展日新月异,已经有人用它来写代码了,啥时候会替代程序员,可真不好说。另一方面,程序员扎堆的 IT 互联网行业却进入了平台期甚至下行期,降本增效成为行业主流&#…

SAP_MMQM模块-采购收货质量控制

采购订单收货如何控制质量检验后再放行使用,针对目前了解到的功能,有以下三种方案; 一、启用QM模块,正常使用MIGO收货-移动类型101,入库后产生检验批,产生质检库存,质检部检验合格后&#xff0…

Vue2(十一):脚手架配置代理、github案例、插槽

一、脚手架配置代理 1.回顾常用的ajax发送方式: (1)xhr 比较麻烦,不常用 (2)jQuery 核心是封装dom操作,所以也不常用 (3)axios 优势:体积小、是promis…

Unbtun-arach64架构安装PySide2(python3.6)

aarch平台是无法通过pip安装PySide2的,同时利用源码下载一直报错 1. 我是python3.6.9,在官网上找到对应的PySide2版本 5.15.2.所以首先在官网下载Qt5.15.2的源码:https://download.qt.io/archive/qt/5.15/5.15.2/single/ 2. 编译qt环境 aar…

C++基础11:模板与命名空间

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏,参考书籍:《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 10.模板与命名空间 10.1 模板简述 模板使函数和类的处理对象…

RecyclerView notifyItemChanged 之后的源码分析

注意:本文是基于 androidx.RecyclerView 1.3.2 版本的源码分析。默认使用 DefaultItemAnimator,如果使用了其他的 ItemAnimator,可能会有不同的表现。 效果图: 示例代码如下: binding.btnNotifyItemChanged.setOnCli…

openstack 不能调度到某主机上分析

dashboard显示有足够资源创建虚拟机 创建一个1c2g20g配置的虚拟机,在过滤时把10-197-0-2这个主机过滤掉了,日志如下: 2024-03-25 17:52:14.087 26 DEBUG nova.scheduler.filters.disk_filter [req-8f2f32fb-1efe-4e5d-81fc-618210c7c76d 773…

TorchAcc:基于 TorchXLA 的分布式训练框架

演讲人:林伟,阿里云研究员,阿里云人工智能平台 PAI 技术负责人 本文旨在探讨阿里云 TorchAcc,这是一个基于 PyTorch/XLA 的大模型分布式训练框架。 过去十年 AI 领域的显著进步,关键在于训练技术的革新和模型规模的快…

【XXL-JOB】执行器架构设计和源码解析

简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 XXL-JOB分为B/S架构,调用中心是XXL-JOB服务端,执行器是客户端。 调度中心核…

【1】网络协议基础概念

【1】网络协议基础知识 1、互联网2、为什么要学习网络协议3、学习中需要搭建的环境4、客户端-服务器5、Java 的跨平台原理6、C/C的跨平台原理7、一个简单的SpringBoot项目(1) pom.xml(2) application.yml(3) NetworkStudyApp.java(4) SwaggerConfig.java(5) HelloWorldControll…

CXL系统架构

CXL系统架构 CXL支持三种设备类型,如下图。Type 1支持CXL.cache和CXL.io;Type 2支持CXL.cache,CXL.mem和CXL.io;Type 3支持CXL.mem和CXL.io。无论哪种类型,CXL.io都是不可缺少的,因为设备的发现&#xff0…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning解读(超详细)

论文题目:Deconstructing Denoising Diffusion Models for Self-Supervised Learning 原文链接:https://arxiv.org/html/2401.14404v1 本文是对何凯明老师的新作进行的详细解读,其中穿插了一些思考,将从以下四个方面对这篇工作进…

3723. 字符串查询:做题笔记

目录 思路 代码 注意点 3723. 字符串查询 思路 这道题感觉和常见的前缀和问题不太一样,前缀和的另一种应用:可以统计次数。 这道题我们想判断一个单词的其中一段子序列A是否可以通过重新排列得到另一段子序列B。 我看到这道题的时候想着可能要判…

Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签

1 方案一&#xff1a;命令 cd <项目目录> git fetch --all git fetch --tags git remote rename origin old-origin #可以不保留 git remote add origin http://***(项目的新仓库地址) #git remote set-url origin <项目的新仓库地址> git push origin --all git…

Qt 多线程QThread的四种形式

重点&#xff1a; 1.互斥量&#xff1a;QMutex配套使用&#xff0c;lock(),unlock(),如果一个线程准备读取另一个线程数据时候采用tryLock()去锁定互斥量&#xff0c;保证数据完整性。 QMutexLocker简化版的QMutex,在范围区域内使用。 QMutex mutex QMutexLocker locker(&…

达梦数据库新手上路排坑

数据库安装 这个没啥说的&#xff0c;按照官网教程操作&#xff0c;我使用的是docker进行安装 下载文件docker文件 官方下载地址- load -i dm8****.tar (注意修改为当前下载的文件)达梦官方文档注意修改为当前版本 docker run -d -p 5236:5236 --name dm8 --privilegedtrue -…

程序员口才提升技巧:从技术到沟通的进阶之路

程序员口才提升技巧&#xff1a;从技术到沟通的进阶之路 在数字化时代&#xff0c;程序员作为推动技术发展的关键角色&#xff0c;其专业能力的重要性不言而喻。然而&#xff0c;除了编程技能外&#xff0c;良好的口才同样是程序员职业生涯中不可或缺的一部分。本文将探讨程序…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…