前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >XPATH定位(基础篇)

XPATH定位(基础篇)

作者头像
冰霜
发布2022-03-15 19:22:38
发布2022-03-15 19:22:38
58300
代码可运行
举报
运行总次数:0
代码可运行

世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到。

selenium定位元素的方法有很多种,像是通过id、name等等,但是这些方法局限性太大

拿id属性来说,首先一定不会每个元素都有id属性,其次元素的id属性也不一定是固定不变的

所以这些方法了解一下即可,我们真正需要熟练掌握的是通过xpath和css定位,一般只要掌握一种就可以应对大部分定位工作了

下面总结一下xpath的定位方法,结合自己练习的实例加深一下了解

xpath的概念和基本语法

网上关于xpath的教程比较少,可以看一下菜鸟教程和w3cschool的相关资料:

http://www.runoob.com/xpath/xpath-tutorial.html

http://www.w3school.com.cn/xpath/index.asp

XPATH中一些常用的路径表达式

· 图片来源 w3cschool

一些路径表达式实例及对应的结果

· 图片来源 w3cschool

一些带有谓语的路径表达式及对应的结果

· 图片来源 w3cschool

选取未知节点

· 图片来源 w3cschool

常用的xpath定位方法

1. 利用标签内的属性进行定位

(1)通过id属性

代码语言:javascript
代码运行次数:0
复制
xpath = "//a[@id='start_handle']"
//a 表示选取所有a元素,加上[@id='start_handle']表示选取id属性为'start_handle'的a元素

(2)通过name属性定位

代码语言:javascript
代码运行次数:0
复制
xpath = "//input[@name='custName']"

概括:利用属性进行定位

代码语言:javascript
代码运行次数:0
复制
xpath = "//标签名[@属性='属性值']"

属性判断条件:最常见为id,name,class等等

属性的类别没有特殊限制,只要能够唯一标识一个元素即可

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

代码语言:javascript
代码运行次数:0
复制
xpath= "//input[@type='XX' and @name='XX']"

2.利用text()方法定位

如上所示,在【上一步】按钮的<a></a>标签之间有一段文本“上一步”,那么可以通过下面这种方式来定位

代码语言:javascript
代码运行次数:0
复制
xpath = "//a[text()='上一步']"

【开始办理】按钮可以使用如下路径:

代码语言:javascript
代码运行次数:0
复制
xpath = "//a[text()='开始办理']"

3.利用contains()方法定位,也叫模糊定位

取href的关键信息'basicinfo',这样也可以定位到【开始办理】按钮

代码语言:javascript
代码运行次数:0
复制
xpath = "//a[contains(@href, 'basicinfo')]"

概括:

代码语言:javascript
代码运行次数:0
复制
xpath = "//标签名[contains(@属性, '属性值')]"

4.如果一个元素无法通过自身属性直接定位到,则可以先定位它的父(或父的父,它爷爷)元素,然后再找下一级即可

例如定位『百度搜索框』,可以按照此种方式试验一下(主要是看一下这个思路)

百度搜索框对应<input>标签,定位<input>标签的话,

可以先定位<form>标签,

再定位<form>标签的子元素<span>标签,

最后找到<input>标签

代码语言:javascript
代码运行次数:0
复制
driver.find_element_by_xpath("//form[@id='form']/span[contains(@class,'s_ipt_wr')]/input").send_keys('python')

注意:

在第二步定位<span>元素时,没有用<span>的id属性,

因为在实际中发现通过webdriver打开的浏览器网页中<span>标签没有id属性了

所以选用<span>标签的class属性,并且通过contains()模糊定位

如下:

定位百度一下按钮

代码语言:javascript
代码运行次数:0
复制
driver.find_element_by_xpath("//form[@id='form']/span[@class='bg s_btn_wr']/input").click()
或者 "//form[@id='form']//input[@id='su']"

tips

总之,XPATH路径表达式需要多写多练,孰能生巧

还有当定位失败时不要慌,找下原因,眼见不一定为实

像上面定位百度搜索框时,通过id属性没有定位到<span>标签,

查看通过webdriver打开的网页元素时,发现<span>标签的id属性没了,只有class属性,

这个时候就需要换一个属性,如class属性(至于为啥会消失,我也不知道,希望有高手不吝赐教)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档