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 相关文章推荐
web.py在模板中输出美元符号的方法
Aug 26 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
Python生成不重复随机值的方法
May 11 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python自定义简单图轴简单实例
Jan 08 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
详解python中的json和字典dict
Jun 22 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
django实现后台显示媒体文件
Apr 07 Python
Python字符串的15个基本操作(小结)
Feb 03 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入门小知识
2008/03/24 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
IE8 原生JSON支持
2009/04/13 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
python中二维阵列的变换实例
2014/10/09 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python numpy 常用函数总结
2017/12/07 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
毕业生机械建模求职信
2013/10/14 职场文书
医院总经理岗位职责
2014/02/04 职场文书
县级文明单位申报材料
2014/05/23 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
初中家长评语大全
2014/12/26 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android