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.htmlhttp://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>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;&lt;bookstore&gt;&lt;book&gt;&lt;titlelang="eng"&gt;HarryPotter&lt;/title&gt;&lt;price&gt;29.99&lt;/price&gt;&lt;/book&gt;&lt;book&gt;&lt;titlelang="eng"&gt;LearningXML&lt;/title&gt;&lt;price&gt;39.95&lt;/price&gt;&lt;/book&gt;&lt;/bookstore&gt;
</span>
</div>

//*[text()="定位下面的"span"标签所代表的节点元素"]//parent::*/pre

猜你喜欢

转载自www.cnblogs.com/kelly11/p/12091021.html
今日推荐