python selenium xpath定位操作


Posted in Python onSeptember 01, 2020

xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法,如有不足和错误,敬请指出。

注意:xpath的定位 同一级别的多个标签 索引从1开始 而不是0

1. 绝对定位:

此方法最为简单,具体格式为

xxx.find_element_by_xpath("绝对路径")

具体例子:

xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x个 div标签,注意,索引从1开始而不是0

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

2.相对路径:

相对路径,以‘//'开头,具体格式为

xxx.find_element_by_xpath("//标签")

具体例子:

xxx.find_element_by_xpath("//input[x]") 定位第x个input标签,[x]可以省略,默认为第一个

相对路径的长度和开始位置并不受限制,也可以采取以下方法

xxx.find_element_by_xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的

python selenium xpath定位操作

("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"

3.标签属性定位:

3.1标签属性定位,相对比较简单,也要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认只是第一个,具体格式

xxx.find_element_by_xpath("//标签[@属性==‘属性值']")

属性判断条件:最常见为id,name,class等等,目前属性的类别没有特殊限制,只要能够唯一标识一个元素都是可以的

具体例子

xxx.find_element_by_xpath("//a[@href='/industryMall/hall/industryIndex.ht']") xxx.find_element_by_xpath("//input[@value='确定']") xxx.find_element_by_xpath("//div[@class = 'submit']/input")

当某个属性不足以唯一区别某一个元素时,也可以采取多个条件组合的方式,具体例子

xxx..find_element_by_xpath("//input[@type='name' and @name='kw1']")

3.2 当标签属性很少,不足以唯一区别元素时,但是标签中间中间存在唯一的文本值,也可以定位,其具体格式

xxx.find_element_by_xpath("//标签[contains(text(),'文本值')]")

具体例子:

xxx.find_element_by_xpath("//iunpt[contains(text(),'型号:')]")

注意:尽量在html中复制此段文本,避免因为肉眼无法分辨的字符导致定位失败

3.3 其他的属性值如果太长,也可以采取模糊方法定位,直接上示例

python selenium xpath定位操作

xxx.find_element_by_xpath(“//a[contains(@href, ‘logout')]”)

3.4 XPath 关于网页中的动态属性的定位,例如,ASP.NET应用程序中动态生成id属性值,可以有以下四种方法:

a.starts-with例子: input[starts-with(@id,'ctrl')] 解析:匹配以ctrl开始的属性值

b.ends-with 例子:input[ends-with(@id,'_userName')] 解析:匹配以userName结尾的属性值

c.contains() 例子:Input[contains(@id,'userName')] 解析:匹配含有userName属性值

当然,如果上面的单一方法不能完成定位,也可以采取组合式定位 类似("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

以上是普通的情况,存在可以定位的属性,当某个元素的各个属性及其组合都不足以定位时,我们可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位,先看看xpath中支持的方法:

1、child 选取当前节点的所有子元素

2、parent 选取当前节点的父节点

3、descendant选取当前节点的所有后代元素(子、孙等)

4、ancestor 选取当前节点的所有先辈(父、祖父等)

5、descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身

7、preceding-sibling选取当前节点之前的所有同级节点

8、following-sibling选取当前节点之后的所有同级节点

9、preceding选取文档中当前节点的开始标签之前的所有节点

10、following选取文档中当前节点的结束标签之后的所有节点

11、self 选取当前节点

12、attribute 选取当前节点的所有属性

13、namespace选取当前节点的所有命名空间节点

python selenium xpath定位操作

上图实例,需要点击订单号为17051915200001的发货按钮,这时候不能直接定位到发货按钮,而是先要定位到订单号元素,再定位他的兄弟节点。

参照上图,我们首先定位到td标签中包含订单号的td元素,然后选择其之后的同级节点,following-sibling,我们要找的元素在后面的第8个td标签下,因此定位可以写名为下面的格式

Xxx.find_element_by_xpath("//td[contains(text(),'17051915200001')]/following-sibling::td[8]/a[@class='link']")

preceding-sibling 情况类似,但是所有元素的排列顺序是相反的(和following-sibling相反),如图:

python selenium xpath定位操作

其他方法的使用方式相同, 11-13目前没有使用过,也没有搜索到实际使用的案例,如果有人知道,希望不吝赐教。

补充知识:Python+selenium:用“and”连接属性定位元素

如下所示:

find_element_by_xpath("//input[@id='kw' and @class='su']/span/input") //用and来连接属性定位元素

以上这篇python selenium xpath定位操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python在控制台输出进度条的方法
Jun 20 Python
深入解析Python编程中JSON模块的使用
Oct 15 Python
python线程、进程和协程详解
Jul 19 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 #Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 #Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 #Python
Python2及Python3如何实现兼容切换
Sep 01 #Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 #Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 #Python
Python如何截图保存的三种方法(小结)
Sep 01 #Python
You might like
php中常用编辑器推荐
2007/01/02 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
关于js注册事件的常用方法
2013/04/03 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
2019/05/14 jQuery
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
用Python编写简单的定时器的方法
2015/05/02 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
python如何将图片转换为字符图片
2020/08/19 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
大堂副理的岗位职责范文
2014/02/17 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL