web自动化测试系列-selenium xpath定位方法详解(六)

news2025/5/24 19:10:45

在这里插入图片描述

1.xpath介绍

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。而html中也应用了这种语言 ,所以 ,我们定位html页面元素时也会用到xpath这种方法 。

2.xpath定位方式

xpath主要通过以下四种方法定位 :

  • 路径定位
  • 属性定位
  • 多属性定位
  • 路径与属性结合定位

以上的方法都是xpath本身具有的特性 ,它跟selenium现在还没有关系 。而selenium为了支持xpath这种定位方式 。故实现了一个方法,即 :

find_element_by_xpath(定位方法) .

而括号内的定位方法正是以上四种定位方式 ,所以 ,重点还是要理解如何使用以上的四种定位方式 。

3.路径定位

路径可以分为相对路径和绝对路径

  • 绝对路径 : 是从根节点/html开始定位 ,使用/代表元素的层级,直到定位到想要的元素层级 。比如 :/html/body/div/fieled[2]/input 。但是这种定位只能定位到该层级的标签 ,而这样的标签在html会有很多 ,故它定位不了元素的唯一性 ,只能和其他方法结合使用 。
  • 相当路径 :查找元素时不限制元素的位置 ,在定位元素时前面需要加两个斜杠(//) . 如定位input标签 ,编写格式为: //input , 定位的就是html页面的所有Input标签 . 也可以使用//*代替 ,这样查找的就是所有的标签 。

无论使用相当路径还是绝对路径 ,需结合者属性一起使用 ,这样才能完成元素定位的唯一性 。还需要一点需要说明,就是在定位元素时一般不使用绝对路径 ,绝对路径写的比较死 ,不灵活 ,影响后期维护 。

4.属性定位

这应该是xpath定位的核心 ,多数xpath定位 ,都是选取的这种定位方式 。

所谓的属性定位 ,就是从html页面的节点中找到其中一个属性来完成定位,如果这个属性唯一 ,它就能代表页面的对象 。

它的编写格式为 ://标签[@属性名=‘属性值’] ,对这句代码的解释是 :

包含格式说明
//标签这是相对路径,标明要查找节点的标签,加上标签,能起到缩小定位范围的作用,比如//input,就只查找input标签。
[]查找某个特定节点或某个指定的值的节点 ,这是固定格式 。
@查找的属性

举例 :

  • xpath属性编写格式: //input[@name='username'] ,意思是定位input标签下属性名为name, 属性值为username的元素 。
  • selenium的xpath编写方法 :find_element_by_xpath("//input[@name='username']")
  • 代码编写为 :
driver.find_element_by_xpath("//input[@name='username']").send_keys("13988888888")

xpath的这种方法能定位大多数元素 ,所以很多人都喜欢使用这种方式定位 。

总结如下 ,若使用xpath定位 ,具体步骤 :

  1. 通过浏览器找到要定位对象的属性 ,确定它就是唯一值 。
  2. 使用find_element_by_xpath() 方法 ,括号内编写xpath对应属性的格式 。
  3. 进行调试 ,若能定位到,说明你的方法没有问题 。

5.属性与逻辑定位

在前面我们介绍到使用属性定位 ,但是如若使用一个属性定位不到怎么办 ? 你就可以是用两个属性或者多个属性同时定位 。

这里就不得不说的一个逻辑运算符 ,and(逻辑与) . 它的意思是并且,大白话就是两者都要求满足 。比如 属性1 and 属性2 ,代表这两个属性都要同时都满足 。

所以 ,如果你一个属性定位不到的话 ,再加一个属性就可以进一步缩小范围,从而提高定位准确率 。

而这种写法也正好是xpath语言中所支持的,它的编写格式为 ://标签[@属性1=‘值1’ and @属性2=‘值2’] 。

举例 :

  • xpath两个属性的编写格式 ://input[@class='text_cmu' and @name='username']
  • selenium xpath方法编写格式 :find_element_by_xpath("//input[@class='text_cmu' and @name='username']")

以上的定位虽然使用到了and逻辑运算符 ,但是xpath中,其实并不仅仅支持这一个逻辑运算符 。以下的都可以使用 :

  • 算术运算符 : = ,!= , < , <= , >, >=
  • 逻辑运算符 : or , and

只是以上运算符中,用在定位上的可能只有and比较有用 。

6.路径与属性结合定位

如果你使用了上面的各种方法 ,依然定位不到元素 ,那这个时候 ,你就可以考虑把路径加进来 。

一般原则是先加它的父路径 ,然后再加上当前路径 ,结合使用 。

具体格式为 :

  • //*[@id='um']/input : 父路径属性 + 子标签
  • //bookstore/[@price='30'] : 父路径标签 + 子属性
  • //div[@class='login_bnt']/a[@class='J-login-submit' : 父路径属性 + 子属性

不管咋写 ,只要能确定元素的唯一性 ,就都可以 ,不过这种写法很明显是逼不得已 ,因为你可能使用其它方法都无效的情况下 ,才会使用这种方法 。

7.定位总结

我们将以上所有方法总结为,可以使用以下的几种方法进行定位 。

定位方式xpath
id属性定位//*[@id=‘值’]
class属性定位//*[@class=‘值’]
属性定位//*[@属性名=‘值’]
标签+属性定位//标签[@属性名=‘值’]
逻辑+属性定位//标签[@属性名=‘值’ and @属性名1=‘值1’]
路径定位//标签[@属性名=‘值’]/标签[@属性名=‘值’]

8.项目案例

需求:通过selenium完成对tpshop的登录操作,具体如下 :

  1. 使用xpath属性定位首页登录按钮 ,
  2. 使用逻辑与属性定位用户名输入框,并输入账号,如13988888888
  3. 使用属性定位确认密码输入框,并输入123456 。
  4. 使用属性定位验证码输入框,并输入8888
  5. 使用路径与属性结合定位登录按钮,并点击确定 。
    在这里插入图片描述
# 使用xpath属性进行定位 : //标签[@属性名='属性值']

from selenium import webdriver
import time

# 1. 创建浏览器对象
driver = webdriver.Chrome()
driver.maximize_window()

# 2. 输入地址 :http://localhost
driver.get("http://localhost")

# 3. 点击登录 : 使用xpath属性定位
driver.find_element_by_xpath("//a[@href='/Home/user/login.html']").click()
time.sleep(3)

# 输入用户名,密码,验证码 :使用逻辑与属性集合定位
driver.find_element_by_xpath("//input[@class='text_cmu' and @name='username']").send_keys("13988888888")
driver.find_element_by_xpath("//input[@id='password']").send_keys("123456")
driver.find_element_by_xpath("//input[@name='verify_code']").send_keys("8888")

# 使用层级与属性结合定位
driver.find_element_by_xpath("//div[@class='login_bnt']/a[@class='J-login-submit']").click()
time.sleep(5)
driver.quit()


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/98a1bb4819f346529a9bf85df7fa1193.png#pic_center)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第二十九篇】BurpSuite杂项综合

文章目录 Intruder模块URL编码Grep检索提取logger日志模块Intruder模块URL编码 假设我们需要对GET请求包中的URL目录进行爆破FUZZ: example.com/xxxx(文件名)Intruder模块会自动对我们的文件名字典进行URL编码 例如payload为1.txt时,burp对其进行URL编码并连接到example.c…

VMware安装Red Hat7.9

1、下载Red Hat Enterprise Linux7.9版本 【百度网盘下载】 链接&#xff1a;https://pan.baidu.com/s/1567NfZRF48PBXfUqxumvDA 提取码&#xff1a;bm7u 2、在虚拟机中创建Red Hat7.9 【点击创建虚拟机】 【自定义高级】 【选择光盘映像安装】 全名自定义即可 【虚拟机命…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行&#xff0c;输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录&#xff08;默认在C盘下的Program …

【截至2023年底】语言模型的发展

什么是大语言模型LLM&#xff1f;ChatGPT、LLAMA各自有什么优势&#xff1f; from&#xff1a; https://www.youtube.com/watch?vt6qBKPubEEo github&#xff1a; https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey&#xff0c;但据说还在更新&#xff0c;到…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

etcd相关知识整理归纳 —— 筑梦之路

什么是etcd? Etcd 是 CoreOS 团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法&#xff0c;Etcd基于 Go 语言实现。 名字由来&#xff0c;它源于两个方面&#xff0c;unix的“/etc”文件…

【ARM 裸机】汇编 led 驱动之编译程序

编译程序这一节分为四个步骤&#xff1a; 1、将 .s .c 文件变成 .o 文件&#xff0c;使用 arm-linux-gnueabihf-gcc&#xff1b; arm-linux-gnueabihf-gcc -g -c leds.s -o led.o上述命令就是将 leds.s 编译为 led.o&#xff0c;其中“ -g ”选项是产生调试信息&#xff0c;G…

lua学习笔记19(面相对象学习的一点总结)

print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…

Redis入门(常用命令、spring-boot-starter-data-redis)

Redis redis是一个基于内存的key-value的结构数据库 启动&#xff1a; redis-server.exe redis.windows.conf 客户端链接&#xff1a;redis-cli.exe [-h 目标ip] [-p 端口] [-a 密码] 修改链接密码&#xff1a; 在redis.windows.conf中的requirepass 123456 常用的数据类…

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器)&#xff0c;是一种事务隔离级别的无锁的实现方式&#xff0c;用于提高事务的并发性能&#xff0c;即事务隔离级别的一种底层实现方式。 在了解MVCC之前&#xff0c;我们先来回顾一些简单的知识点&#xff1a;…

leetCode刷题 27. 移除元素

目录 1.思路&#xff1a; 2.解题方法&#xff1a; 3.复杂度&#xff1a; 4.Code 题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须…

商城系统必备营销功能——分销裂变

电商流量红利已经过去&#xff0c;现在的电商营销&#xff0c;重点在于私域用户&#xff0c;在于客户资源裂变。人们通过分销裂变挖掘客户资源&#xff0c;能降低获客成本&#xff0c;对于需要解决成本困扰的企业来说&#xff0c;确实是个不错的选择。今天&#xff0c;我们就来…

FFmpeg: 自实现ijkplayer播放器--09音频重采样输出

文章目录 流程图音视设备输出回调函数重采样写入音频流因SDL输出音频采样格式为S16(一个采样点2个字节),而音频解码后采样格式通常为float planar(一个采样点4个字节),故需要重采样 重采样的条件:音频解码后的任意一个参数和需要的参数不同时,进行重采样,参数为: 采样格…

Nginx健康检查

Nginx健康检查nginx_upstream_check_module nginx健康检查介绍: ​ 主动健康检查&#xff0c;nignx定时主动地去ping后端的服务列表&#xff0c;当发现某服务出现异常时&#xff0c;把该服务从健康列表中移除&#xff0c;当发现某服务恢复时&#xff0c;又能够将该服务加回健…

Java并发--内存结构图及线程安全

内存结构图 内存-> (开辟的数组) -> (方法区&#xff0c;堆&#xff0c;栈&#xff0c;程序计数器&#xff0c;本地方法栈) 堆&#xff1a;几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。 方法区它用于存储已被虚拟机加载的类型信息…

牛客_左右最值最大差_C++题解

原题链接&#xff1a;牛客 题目缩写&#xff1a;给你一个数组&#xff0c;由你来进行一个切分&#xff0c;分为两份&#xff0c;每份至少有1个元素&#xff1b;你分出来的这两个区间中各自有一个最大值&#xff0c;两者之差再求绝对值就是答案&#xff0c;这个答案越大越好&am…

认识异常(2)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

【Linux系统】操作备忘录

Linux命令 打开终端的快捷键&#xff1a;Ctrl Alt t 退出终端的命令&#xff1a;exit 终端命令行复制/粘贴的快捷键 &#xff1a;Ctrl Shift c / v 对于所有不太熟悉的命令&#xff0c;都可以在终端输入 命令名称 --help 来查看具体用法。例如&#xff1a; 文件和目录…

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址&#xff1a;电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…