Python selenium 父子、兄弟、相邻节点定位方式详解


Posted in Python onSeptember 15, 2016

今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个节点的哥哥节点就一筹莫展了,别急,且看博主一步步讲解。

1. 由父节点定位子节点

最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:

对以下代码:

<html>
<body>
<div id="A">
<!--父节点定位子节点-->
<div id="B">
<div>parent to child</div>
</div>
</div>
</body>
</html>

想要根据 B节点 定位无id的子节点,代码示例如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.串联寻找
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
# 2.xpath父子关系寻找
print driver.find_element_by_xpath("//div[@id='B']/div").text
# 3.css selector父子关系寻找
print driver.find_element_by_css_selector('div#B>div').text
# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
# 6.xpath轴 child
print driver.find_element_by_xpath("//div[@id='B']/child::div").text
driver.quit()

结果:

parent to child
parent to child
parent to child
parent to child
parent to child
parent to child

第1到第3都是我们熟悉的方法,便不再多言。第4种方法用到了css选择器:nth-child(n),该选择器返回第n个节点,该节点为div标签;第5种方法用到了另一个css选择器: nth-of-type(n),该选择器返回第n个div标签,注意与上一个选择器的区别;第6种方法用到了xpath轴 child,这个是xpath默认的轴,可以忽略不写,其实质是跟方法2一样的。

当然,css中还有一些选择器是可以选择父子关系的如last-child、nth-last-child等,感兴趣可以自行百度,有机会博主会讲讲css selector。

2. 由子节点定位父节点

由子节点想要定位到父节点就有点难度了,对以下代码:

<html>
<body>
<div id="A">
<!--子节点定位父节点-->
<div>
<div>child to parent
<div>
<div id="C"></div>
</div>
</div>
</div>
</div>
</body>
</html>

我们想要由 C节点 定位其两层父节点的div,示例代码如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath: `.`代表当前节点; '..'代表父节点
print driver.find_element_by_xpath("//div[@id='C']/../..").text
# 2.xpath轴 parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
driver.quit()

结果:

child to parent
child to parent

这里我们有两种办法,第1种是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2种办法跟上面一样,是xpath轴中的一个:parent,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)

3. 由弟弟节点定位哥哥节点

这是第3、第4种情况,我们这里要定位的是兄弟节点了。如以下源码:

<html>
<body>
<div id="A">
<!--下面两个节点用于兄弟节点定位-->
<div>brother 1</div>
<div id="D"></div>
<div>brother 2</div>
</div>
</body>
</html>

怎么通过 D节点 定位其哥哥节点呢?看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
# 2.xpath轴 preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
driver.quit()

结果

brother 1
brother 1

这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过 xpath轴:preceding-sibling,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,1 代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远,当然,xpath轴:preceding也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)

4. 由哥哥节点定位弟弟节点

源码与 3 一致,要想通过 D节点 定位其弟弟节点,看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text
# 5.css selector ~
print driver.find_element_by_css_selector('div#D ~ div').text
driver.quit()

结果:

brother 2
brother 2
brother 2
brother 2
brother 2

博主分享了五种方法定位其弟弟节点,上面三种是用xpath,第一种很好理解,第二种用到了xpath轴:following-sibling,跟preceding-sibling类似,它的作用是获取当前节点的所有同级弟弟节点,同样,1 代表离当前节点最近的一个弟弟节点,数字越大表示离当前节点越远;第三种用到了xpath轴:following,获取到该节点之后所有节点,除了祖先节点(跟preceding方向相反,但因为往下顺序容易读,不容易出错,所以也是可以用来获取弟弟节点的,但也不建议这么使用);第四、第五种,我们用到了css selector,+ 和 ~ 的区别是: + 表示紧跟在当前节点之后的div节点,~ 表示当前节点之后的div节点,如果用find_elements,则可获取到一组div节点。

以上所述是小编给大家介绍的Python selenium 父子、兄弟、相邻节点定位方式详解的全部叙述,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python三级菜单的实例
Sep 13 Python
Python实现XML文件解析的示例代码
Feb 05 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python基于Selenium的web自动化框架
Jul 14 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
Python pip安装模块提示错误解决方案
May 22 Python
如何更换python默认编辑器的背景色
Aug 10 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python中count函数知识点浅析
Dec 17 Python
Python selenium 三种等待方式详解(必会)
Sep 15 #Python
python使用pymysql实现操作mysql
Sep 13 #Python
python实现可以断点续传和并发的ftp程序
Sep 13 #Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 #Python
Python中操作mysql的pymysql模块详解
Sep 13 #Python
python常用函数详解
Sep 13 #Python
python如何查看系统网络流量的信息
Sep 12 #Python
You might like
一篇不错的PHP基础学习笔记
2007/03/18 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
ajax异步刷新实现更新数据库
2012/12/03 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
vue实现路由切换改变title功能
2019/05/28 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python iter()函数用法实例分析
2018/03/17 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
python程序输出无内容的解决方式
2020/04/09 Python
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
军训拉歌口号
2014/06/13 职场文书
中秋节慰问信
2015/02/15 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python