selenium-Xpath使用方法
01:什么是Xpath
Xpath是一门xml文档中查找信息的语言,Xpath可用来在xml文档中对元素和属性进行遍历,主流的浏览器都支持xpath,因为HTML页面在DOM中表示xhtml文档
xpath和css选择器最重要的区别是Xpath可以向前和向后查询DOM结构的元素,而css选择器只能向前查询,这意味着Xpath可以通过子元素来定位父元素
02:网上关于Xpath的教程比较少,可以看一下菜鸟教程和w3cshool的相关资料:
http://www.runoob.com/xpath/xpath-tutorial.html、http://www.w3school.com.cn/xpath/index.asp
03:下列列出了最有用的路径表达式
| 表达式 描述 | |
| nodename | 选取此节点所有子节点 |
| / | 从根节点选取 |
| // | 从匹配选择当前节点选择文档的节点,而不考虑它们的位置 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |
| 路径表达式 | 结果 |
| /bookstor/book[1] | 选取属于bookstore子元素的第一个book元素 |
| /bookstore/book[last()] |
选取属于bookstore子元素的最后一个book元素 |
| /bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
| /bookstore/book[position()<3] | 选取最前面的两个bookstore元素的子元素的book元素 |
| //title[@lang] | 选取所有拥有名为lang的属性为title元素 |
| //title[@lang='eng'] | 选取所有title元素,且这些元素有值为eng的lang属性 |
| /bookstore/book[price>35] | 选取bookstore元素所有book元素,且其中的price元素的值须大于35 |
| /bookstore/book[price>35]/title | 选取bookstore元素的book元素所有的title,且其中的price元素的值须大于35 |
xpath未知节点
* 匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点
04:xpath定位元素的几种方式
1)绝对路径
从DOM结构树的开始一直写到你需要定位的那个节点
2)相对路径
eg:‘//span’
其中‘//’标识忽略前面的所有节点,直接定位当前节点(例子中的当前节点为:span)
3)切片引索定位:
eg:‘//span[0]’==or=='//span[-1]'
相对路径获取的节点往往不仅仅只存在一个,可能返回的是多个节点,使用下标【0】进行切片引索可以过滤部分节点或直接定位所需节点;
这里为什么用过滤这个词,请自己实践”://div[12]和//div
4)使用节点属性索引定位
eg:‘//*[@name='name]’
*标识匹配任何元素节点,@标识选取属性;name=‘name’表示选取节点属性name的值为name的节点属性
5)使用节点谓语引索定位
eg://*[text()=5使用节点谓语引索定位:]
text()是Xpath谓语之一,也是应用场景多的谓语之一,其表示选取节点text字段为:使用节点谓语引索定位的节点属性
6)利用Xpath逻辑运算符进行定位节点
eg1://*div[@name='name' **and** @size='4' **and** @multiple='multiple']
and运算符组合节点属性进行索引匹配,定位节点
eg2://*div[@type='displayed'** or ** @type='hidden']
or 运算符组合刷选多变节点进行匹配索引
(例子1利用三个节点属性并存的条件进行精确定位节点,在xpath运算符中,会以Hash计算方式分成三次进行定位节点,可以说非常快的;
例子2中通常的应用场景是对某一按钮的定位,通过选中和非选中两种状态定位同一节点,这样可以省一些事)
7)运用xpath轴的节点集进行反向定位
eg:.//*[class='define']//ancestor::div
这个就是css做不到的地方;反向定位:定位class属性value为define的节点他的所有长辈节点通过: ancestor::控制;并筛选出节点标签为div所有的符合条件的节点
轴名称 对应情况
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素
descendant 选取当前节点的所有后代元素(子、孙等)
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
following 选取文档中当前节点的结束标签之后的所有节点
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点
preceding 选取文档中当前节点的开始标签之前的所有节点
preceding-sibling 选取当前节点之前的所有同级节点
self 选取当前节点
05:xpath使用思路
1)节点元素无Id,无唯一的name;请使用xpath
eg:
<link rel="preload" href="https://addasdasdator.js?domain=www.wqwrqqe1231l.com.cn" as="script">//link[@rel='preload' and @as='script'] 请注意这里不要使用//*开头;请使用.//或//
*是匹配任何节点元素的属性/谓语的意思,这么说吧,其实//*是==//[@*]==一种简写
2)节点元素需要集合或者包含多种可能性,请使用xpath
eg:需求-请定位一次性定位含字段的节点元素
<div class="show-pollution">
<span class="show-airParm polution-level-0">
<em class="show-polution-name">优</em>
<em class="show-polution-num">28</em>
</span><span class="show-vertical">|</span>
</div>
<div class="unknown-city">
<span class="unknown-icon"></span>
<span class="unknown-text">查看天气信息,</span>
<span class="unknown-setting">设置城市</span>
</div> </div>
//*[@class='show-pollution' or class='unknown-city']//descendant::text()
3)节点元素是表格内部元素,使用xpath
<table class="dataintable">
<tbody>
<tr>
<th style="width:25%;">表达式</th>
<th>描述</th>
</tr>
<tr>
<td>nodename</td>
<td>选取此节点的所有子节点。</td>
</tr>
<tr>
<td>/</td>
<td>从根节点选取。</td>
</tr>
<tr>
<td>//</td>
<td>从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。</td>
</tr>
<tr>
<td>.</td>
<td>选取当前节点。</td>
</tr>
<tr>
<td>..</td>
<td>选取当前节点的父节点。</td>
</tr>
<tr>
<td>@</td>
<td>选取属性。</td>
</tr>
</tbody>
</table>
当节点元素谓语表单结构之内,使用xpath可以一次性定位所有节点,通过语句设置筛选条件达到获取表格中的任意节点元素,方便后期维护;此处有遇到表单结构过于大的那种可以考虑使用迭代器和生成器结合使用,从而减小内存消耗
4)节点元素是非常规属性,请使用xpath
<div>
<h2>定位下面的"span"标签所代表的节点元素</h2>
<p>定位下面的"span"标签所代表的节点元素</p>
<span><?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book><titlelang="eng">HarryPotter</title><price>29.99</price></book><book><titlelang="eng">LearningXML</title><price>39.95</price></book></bookstore>
</span>
</div>
//*[text()="定位下面的"span"标签所代表的节点元素"]//parent::*/pre
selenium-Xpath使用方法的更多相关文章
- Selenium - Xpath 使用方法
由于最新版火狐不在支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/下载49版本以下的火狐就可以增加Firebug等扩展了 ...
- selenium定位方式-Xpath使用方法
什么是Xpath? XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素. 一. 在火狐浏览器上安装Xpath 方法如下: 1.使用 Firefox 访问 https://a ...
- 元素定位-XPATH定位方法总结
1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...
- 【转载】Xpath定位方法深入探讨及元素定位失败常见情况
一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...
- Xpath定位方法深入探讨及元素定位失败常见情况
一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...
- selenium 之定位方法
1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...
- selenium 定位元素方法
1.通过id定位元素 写法1: element = driver.find_element_by_id("kw") 写法2: from selenium.webdriver.com ...
- Java&Selenium智能等待方法封装
Java&Selenium智能等待方法封装 ExpectedConditions方法还有很多,自然也可以继续扩展很多 package util; import org.openqa.selen ...
- Java&Selenium 模拟鼠标方法封装
Java&Selenium 模拟鼠标方法封装 package util; import org.openqa.selenium.By; import org.openqa.selenium.W ...
- selenium的定位方法-多元素定位
在实际工作中,有些时候定位元素使用ID.NAME.CLASS_NMAE.XPATH等方法无法定位到具体元素,会发现元素属性有很多一致的,这个时候使用单元素定位方法无法准确定位到具体元素,例如,百度首页 ...
随机推荐
- //C#中的访问数据符
[在命名空间里面直接定义类型只能用internal 或 public ] [要被同个解决方案内 其他项目访问 ,加引用 导命名空间]. [类的默认修饰符是internal] 1.Private ...
- tween.js的API实践
看了网上多篇关于tween的使用教程,基本上千篇一律,大多数的写法都是像下面这样: function initTween(geometry) { }; tween = }, ); tween.easi ...
- 【HANA系列】【第四篇】SAP HANA XS使用服务器JavaScript Libraries详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第四篇]SAP HANA XS ...
- open_basedir restriction in effect,解决php引入文件权限问题 解决方法
如下: 出现问题的原因: 查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件: 一般情况下是不会出现这种问题的,之所以出现这个问题绝大 ...
- C#编程 JSON操作
JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析.JSON跟XML一样是一种是数据格式. JSON 使用 JavaScript 语法来描述数据对象,但是 ...
- Misc题目
@freebuff教程https://www.freebuf.com/column/196815.html @巅峰极客wp https://www.anquanke.com/post/id/18914 ...
- 统计学习方法 | 第1章 统计学习方法概论 | numpy.linspace()
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 在指定的间隔内返回均匀间隔的数字. 返回nu ...
- 修改state(react)中的某一个对象中的单个参数
react项目中我们经常会涉及到修改state中参数的问题,如果参数为常用的基本类型变量,我们可以直接通过this.setState({...})方法来进行修改,但是如果变量为一个对象我们要如何修改呢 ...
- 第四周课程总结&实验报告(二)
Java实验报告(二) 实验二 Java简单类与对象 一. 实验目的 (1) 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: (2) 理解类和对象的区别,掌握构造 ...
- 洛谷P1192台阶问题
题目描述 有NN级的台阶,你一开始在底部,每次可以向上迈最多KK级台阶(最少11级),问到达第NN级台阶有多少种不同方式. 输入格式 两个正整数N,K. 输出格式 一个正整数,为不同方式数,由于答案可 ...