Selenium中使用xpath的定位分享

4 篇文章 0 订阅
4 篇文章 0 订阅

1、XPATH是什么

XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档。
XPATH语言是基于XML文档的树结构,并提供了浏览树的能力,通过多样的标准来选择节点。
Selenium WebDriver支持使用XPATH表达式来定位元素。
XPATH和CSS选择器最重要的区别是XPATH可以向前和向后查询DOM结构的元素,而CSS选择器只能向前查询,这意味着XPATH可以通过子元素来定位父元素!

2、xpath定位元素的几种方式

1)绝对路径:

从DOM结构树的开始一直写到你需要定位的那个节点
ps:这样的情况基本只有一种情况才会出现,那就是所有的标签都重复,所有的属性都重复,不然打死我也不用这个办法。

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字段为: 5)使用节点谓语引索定位: 的节点属性

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的所有符合条件的节点。
这里拓展一下xpath轴“运算符”:

轴名称对应情况
ancestor选取当前节点的所有先辈(父、祖父等)
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素
descendant选取当前节点的所有后代元素(子、孙等)
descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
following选取文档中当前节点的结束标签之后的所有节点
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点
preceding选取文档中当前节点的开始标签之前的所有节点
preceding-sibling选取当前节点之前的所有同级节点
self选取当前节点

巧用这些xpath语句任何一个节点都是可以直接定位的。
有人说xpath定位慢,不如id,不如name…那是因为你只会给绝对路径而已。
前端哪里有那么多时间去给你添加id,添加name,靠人不如靠自己。

3、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;

eg:

<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;

eg:定位下面的<span>标签所代表的节点元素

<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

个人觉得其实css和xpath精通一种就够了,为啥呢,因为原理都是利用节点的属性和层级关系在构建定位节点元素的表达式;至于到底哪个好,看你个人了。

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SeleniumXPath定位元素是一种基于XML文档结构的定位方式,可以通过元素的标签名、属性、文本内容等信息来定位元素XPath定位元素的语法比较灵活,可以使用绝对路径或相对路径来定位元素,也可以使用逻辑运算符和函数来筛选元素。在Selenium,可以使用find_element_by_xpath()方法来定位元素,例如: driver.find_element_by_xpath("//input[@id='username']") # 使用id属性定位输入框元素 driver.find_element_by_xpath("//button[contains(text(),'登录')]") # 使用文本内容定位登录按钮元素 driver.find_element_by_xpath("//div[@class='container']/ul/li[3]/a") # 使用相对路径定位导航栏第三个链接元素 需要注意的是,XPath定位元素的效率相对较低,如果可以使用其他定位方式,建议优先考虑。 ### 回答2: Selenium是一个常用的自动化测试工具,常用于Web应用的测试自动化,其xpathSelenium经常用到的一种元素定位方式。 XPath是XML Path Language的缩写,用于在XML文档查找信息的一种语言。在Web应用,利用XPath可以轻松定位网页元素,包括文本、链接、按钮等。 在Selenium使用xpath定位元素,需要使用driver.find_element_by_xpath()方法,该方法可以接受一个xpath表达式作为参数,返回符合该表达式的第一个元素。 下面介绍几种常用的xpath表达式: 1.绝对路径定位元素:通过完整的路径定位元素,这种方法非常不建议使用,因为一旦页面结构变化,绝对路径也会随之改变。 例子:/html/body/div[1]/div[2]/ul/li[3]/a 2.相对路径定位元素:通过相对于当前元素的路径定位元素,相对路径是基于当前元素而言的,更加稳定。 例子://div[@class='content']/ul/li[3]/a 3.通过属性值定位元素:通过元素的属性值来定位元素,可以通过元素的id、class、name、value等属性进行定位。 例子://input[@id='kw'] 或 //input[@name='username'] 总之,xpath是在Selenium非常重要的一种元素定位方式,XPath表达式的灵活性使其成为一种非常常用的选择器方式。建议根据实际情况,灵活运用xpath语法来定位元素,以保证脚本的稳定性和可靠性。 ### 回答3: Selenium是一个用于自动化测试的工具,它可以模拟用户行为,自动化地进行一些常见的测试任务。在测试XPath是一种常用的定位元素的方法。 XPath是一种用于在XML文档定位元素的语言,它可以对XML文档进行遍历和查询,返回满足条件的元素或属性。在SeleniumXPath可以用于定位Web页面元素,比如按钮、文本框、下拉菜单等。 在Selenium使用XPath进行元素定位的步骤如下: 1. 打开浏览器并访问目标网站。 2. 在浏览器定位需要被测试的元素。 3. 使用开发者工具或其他工具查看该元素XPath路径。 4. 将XPath路径复制到Selenium测试脚本。 5. 在Selenium使用find_element_by_xpath()函数定位元素。 例如,下面这段代码可以在百度首页定位搜索按钮: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.baidu.com') search_button_xpath = '//input[@class="s_btn"]' search_button = driver.find_element_by_xpath(search_button_xpath) search_button.click() ``` 这段代码,我们使用Chrome驱动程序打开了百度首页,并找到了搜索按钮的XPath路径,然后使用find_element_by_xpath()函数找到了该元素并模拟了点击操作。这样,就可以自动化测试搜索功能了。 需要注意的是,XPath路径可能因为页面结构的变化而发生变化,因此需要时常检查XPath路径是否仍然有效。此外,XPath路径复杂度较高,不易维护,因此常见的元素最好使用id、class等属性进行定位

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值