【2024软件测试面试必会技能】Selenium(6):元素定位_xpath定位

XPATH是什么

  XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档。Selenium WebDriver支持使用XPATH表达式来定位元素。

Xpath常用如下6种定位元素的方法:

1、通过绝对路径定位

  绝对路径的开头是一个斜线(/),从网页的根节点html开始,逐层去查找需要定位的元素。

  此方法缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用。

代码如下:

以百度首页的搜索框为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站# 绝对路径定位:/ 开头
# 从网页正文的html节点,一直找到元素所在的位置的一种定位方法(从上往下,同层级下标表示)
# 一般不用,难维护,谷歌浏览器自带了复制 绝对路径xpath的功能
driver.find_element(By.XPATH,'/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys('python')

复制代码

备注:当同一层次有多个相同的元素时,使用下标区分,下标从1开始;并且注意网页登录状态和非登录状态的html的绝对路径是不一样的

2、通过相对路径定位

  相对路径的开头是两个斜线(//),表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。

代码如下:

以百度首页的搜索框为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站# 相对路径定位:// 开头
# 在网页正文中,通过独一无二丶局部路径表示元素信息的一种定位方法(从下往上,一层一层试)
driver.find_element(By.XPATH,'//span[1]/input').send_keys('JAVA')  # 最简相对路径
driver.find_element(By.XPATH,'//form/span[1]/input').send_keys('JAVA')  # 最简相对路径

复制代码

备注:以上都可以定位到百度搜索框,相对路径的长度和开始位置并不受限制,可以采用从后往前逐层定位直到定位到即可的方式去定位。

3、通过元素索引定位

  遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1

代码如下:

以百度首页的hao123链接为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站
# 元素索引定位
# 遇到同层级相同标签元素时,可以使用索引(下标)表示,索引的初始值为1
driver.find_element(By.XPATH,'//div[3]/a[2]').click()  # 百度首页hao123链接

复制代码

4、使用元素属性定位

  元素属性定位要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认定位第一个,具体格式://标签名[@属性="属性值"]

  支持使用and和or关键字,多个属性一起定位元素

代码如下:

以百度首页的搜索框为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站
# 元素属性定位
# 利用元素属性值去定位,但是要保证该属性独一无二,否则可能定位到其他元素
# 语法://标签名[@属性名="属性值"] 
driver.find_element(By.XPATH,'//input[@id="kw"]').send_keys('python')
# 多属性定位 and,or //标签名[@属性名1="属性值1" and @属性名2="属性值2" ..] 、//标签名[@属性名1="属性值1" or @属性名2="属性值2"]
driver.find_element(By.XPATH,'//input[@id="kw" and @maxlength="255"]').send_keys('python')
driver.find_element(By.XPATH,'//input[@id="kw" or @maxlength="255"]').send_keys('python')
# xpath 支持正则
driver.find_element(By.XPATH,'//*[@*="kw"]').send_keys('python')

复制代码

备注:Xpath支持通配符号*号,通过属性定位还可以如下写法:driver.find_element(By.XPATH,'//*[@*="kw"]')

5、使用部分属性值匹配(也称为模糊方法定位)

  属性值如果太长或网页中的元素属性动态变化,可以使用此方法

元素属性值字符串开头对比:starts-with(@属性名,"属性值")

元素属性值字符串结尾对比:ends-with(@属性名,"属性值")

元素属性值字符串包含对比:contains(@属性名,"属性值")或者通过模糊匹配文本contains(text(),"文本值")

备注:ends-with()在selenium中不存在,ends-with()是属于xpath2.0的函数库和语法,而xpath1.0不存在该函数;selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法

代码如下:

以百度首页为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站
# 部分属性值定位:
# 当元素属性动态变化或元素属性值过长,可以使用的一种定位方法
# 元素属性动态变化:第一次打开页面page_1,第二次打开页面page_2  //a[starts-with(@href,"page_")]
# xpath 三个函数 starts-withs(@属性名,"属性值")字符串开头对比  ends-with()字符串结尾对比  contains()字符串包含
# ends-with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数
# selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法
driver.find_element(By.XPATH,'//a[starts-with(@href,"https://haokan.")]').click()
driver.find_element(By.XPATH,'//a[contains(@href,"haokan")]').click()

复制代码

6、使用元素文本定位

 6、使用元素文本定位

元素文本在xpath中可以通过text()函数获取,也可以用其来进行元素定位。

格式:

文本定位://a[text()="文本"]

部分文本定位://a[contains(text(),"文本")]

代码如下:

以百度首页为例

复制代码

import os
from selenium import webdriver
from selenium.webdriver.common.by import Bycurrent_path = os.path.dirname(os.path.abspath(__file__))  # 当前路径
driver_path = os.path.join(current_path,'../webdriver/chromedriver.exe')  # driver路径
driver = webdriver.Chrome(executable_path=driver_path)  # Firefox,Ie等driver.get('https://www.baidu.com/')  # 打开网站# 元素文本定位  text()获取元素的文本值
# by_link_text 与 文本定位区别:文本定位它可用于定位所有包含文本的标签元素,而by_link_text只适合a标签
driver.find_element(By.XPATH,'//a[text()="hao123"]').click()
# 部分文本定位
driver.find_element(By.XPATH,'//a[contains(text(),"hao")]').click()

 总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…

【Linux从青铜到王者】 基础IO

本篇重点&#xff1a;文件描述符&#xff0c;重定向&#xff0c;缓冲区&#xff0c;磁盘结构&#xff0c;文件系统&#xff0c;inode理解文件的增删查改&#xff0c;查找一个文件为什么一定要有路径&#xff0c;动静态库&#xff0c;有的时候为什么找不到库&#xff0c;动态库的…

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10&#xff08;双系统安装的详细图文步骤教程&#xff09; 一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启动转换助理步骤2&#xff1a;启动转换助理步骤3&…

2024022202-查询优化

查询优化 概述 关系系统和关系模型是两个密切相关而有不同的概念。支持关系模型的数据库管理系统称为关系系统。但是关系模型中并非每一部分都是同等重要的&#xff0c;所以我们不苛求完全支持关系模型的系统才能称为关系系统。因此&#xff0c;我们给出一个关系系统的最小要求…

Google play应用上架,账号即将被封?你收到过这种骗子邮件吗?

相信大多数开发者&#xff0c;尤其对于马甲包或矩阵、批量上架的开发者来说&#xff0c;收到账号被封的邮件已经司空见惯了&#xff0c;但需要注意的是&#xff0c;并不是此类所有的邮件都是真的&#xff0c;有可能是骗子不怀好意伪装成谷歌官方发送的诈骗邮件。 例如这样的邮…

《UE5_C++多人TPS完整教程》学习笔记22 ——《P23 记录加入的玩家(Couting Incoming Players)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P23 记录加入的玩家&#xff08;Couting Incoming Players&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff…

SaaS智慧校园管理平台全套源码,支持二次开发,项目使用

什么是电子班牌系统&#xff1f; 电子班牌用来显示班级信息&#xff0c;班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等&#xff0c;为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一…

c++类和对象新手保姆级上手教学(下)

目录 前言&#xff1a; 初始化列表&#xff1a; explicit关键字&#xff1a; static成员&#xff1a; 友元函数&#xff1a; 友元类&#xff1a; 内部类&#xff1a; 匿名对象&#xff1a; 前言&#xff1a; 类和对象下篇中剩余的部分较为简单易理解&#xff0c;认真记住…

从大厂裸辞后成为自由职业者,一年后我怎么样了?

深耕技术领域7年&#xff0c;前前后后也做过不少副业&#xff0c;最近我一直在思考什么副业才是对自己有价值的&#xff0c;可持续的&#xff0c;甚至是可增长的。 22年我所在团队的一个项目解散了&#xff0c;领导问我想拿钱走还是转岗&#xff0c;想想自己也在这个公司干了5…

猫头虎分享已解决Bug || TypeError: unhashable type: ‘slice‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Java毕业设计-基于ssm的校园二手交易管理系统-第67期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的校园二手交易管理系统&#xff1a;前端jsp、jquery&#xff0c;后端 springmvc、spring、mybatis&#xff0c;集成商品管理、订单管理、销售管理、采购管理、购…

【ACW 导入数据库脚本】

版本: 1.2.2-JDK17-SNAPSHOT 项目地址&#xff1a;wu-smart-acw 演示地址&#xff1a;演示地址 admin/admin docker启动 docker run -d -it -p 18080:18080 -e MAIN_DB_HOSTcloud-mysql:3306 -e MAIN_DB_USERNAMEroot -e MAIN_PASSWORDmysql --name wu-smart-acw-server …