Python selenium根据class定位页面元素的方法


Posted in Python onFebruary 26, 2019

在日常的网页源码中,我们基于元素的id去定位是最万无一失的,id在单个页面中是不会重复的。但是实际工作中,很多前端开发人员并未给每个元素都编写id属性。通常一段html代码如下:

<div class="sui-tips s-isindex-wrap sui-tips-exceedtipnews" style="display: none; width: auto;">
<div class="sui-tips-arrow" style="left: 15px;"><em></em></div>
<div class="sui-tips-body">今天召唤我太多次啦,<br>明天再来调教小度吧!`(*∩_∩*)′</div>
</div>

这个例子中,最外层的div就没有id属性,此时,可以基于class属性来定位元素。常见的基于class定位元素的selenium写法如下:

一、driver.find_element_by_class_name("classname")

但是好多时候,很多并列的元素如list表单,class都是共用同一个,如:

Python selenium根据class定位页面元素的方法

此时driver.find_elements_by_class_name("classname") 就可以派上用场了,该方法可以返回的是一个list列表,那么所有针对list的方法在它上面都同样适用。比如,如果我们知道想要定位的元素在页面中是第n个,则可以这样定位:

二、driver.find_elements_by_class_name("classname")[n] (注意:是elements,不是element)

需要注明的是,使用上述方法,即使这网页中样的元素只有一个,得到的依旧是一个list对象,只不过长度为1.

当然如果你对css方法比较熟悉,还可以通过css来定位,selenium同样是支持的,css中,"."后面跟class名即可,一个常规的写法如下:

三、driver.find_element_by_css_selector('.dtb-style-1').click()

如果你的例子足够特殊,这个元素的classname有多个,上面的方法还可以用多个"."进行并行连接。如:

driver.find_element_by_css_selector('.dtb-style-1.table-dragColumns').click()

还有一种方法同样可以支持多个类的情况,还是css属性方法:

driver.find_element_by_css_selector("[class='dtb-style-1 table-dragColumns']") 用空格分隔即可。

如果你对css属性不熟悉的话,也不打紧,强大的Chrome浏览器能自动帮你生成元素的xpath、css等多种属性。拿百度首页的源码举例,在页面源码文件,定位到元素后,右键,效果如下:

Python selenium根据class定位页面元素的方法

生成的代码复制后,针对此场景可以直接拿来用,但是鉴于现在的网页更新非常频繁,建议还是要在w3c下简单学习下xpath、css selector等重要方法,那样我们可以写出非常灵活的代码,对页面的细微调整会有更强的适应性。

最后,我们还可以通过强大的xpath来定位元素,如果元素有多个class,我们只用选择其中一个放入xpath中即可,否则程序会出错。示例如下:

四、driver.find_element_by_xpath('//div[@class="u_sp"]/a[1]').click()

这么多方法中,xpath是最最灵活的,因为xpath内置了很多函数,在某些场合中你可能就需要依靠这种灵活性,"灵活"就不可避免的会带来复杂性。尽管如此,笔者还是鼓励你们,在实际工作中,每种定位元素的方法都要学会,很多时候,你会发现你精心写的方法一不小心就不灵了,这个时候掌握多种定位方法,就显得尤为重要了。

有了这些技能,从此在python selenium的世界里,基于class属性定位元素将显得so easy。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分析Python的Django框架的运行方式及处理流程
Apr 08 Python
python之PyMongo使用总结
May 26 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
Mar 05 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
python map比for循环快在哪
Sep 21 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
python 实现表情识别
Nov 21 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
numpy数据类型dtype转换实现
Apr 24 Python
python实现诗歌游戏(类继承)
Feb 26 #Python
Python实现简单查找最长子串功能示例
Feb 26 #Python
基于Python实现用户管理系统
Feb 26 #Python
python selenium firefox使用详解
Feb 26 #Python
Django实现学员管理系统
Feb 26 #Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 #Python
Django实现学生管理系统
Feb 26 #Python
You might like
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
php中数组最简单的使用方法
2020/12/27 PHP
js常见表单应用技巧
2008/01/09 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
python2 与python3的print区别小结
2018/01/16 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Python列表切片常用操作实例解析
2020/03/10 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
python如何使用代码运行助手
2020/07/03 Python
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
设计师求职信
2014/07/01 职场文书
抢劫罪辩护词
2015/05/21 职场文书
执行力心得体会范文
2016/01/11 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书