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监控网站运行异常并发送邮件的方法
Mar 13 Python
Python使用chardet判断字符编码
May 09 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
python八皇后问题的解决方法
Sep 27 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
pytorch实现线性拟合方式
Jan 15 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 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
isset和empty的区别
2007/01/15 PHP
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python中pygame模块用法实例
2014/10/09 Python
python黑魔法之参数传递
2016/02/12 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
竟聘演讲稿范文
2013/12/31 职场文书
给面试官的感谢信
2014/02/01 职场文书
手机被没收检讨书
2014/02/22 职场文书
房贷收入证明范本
2015/06/12 职场文书
技能培训通讯稿
2015/07/18 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python