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网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
python多任务及返回值的处理方法
Jan 22 Python
Python3实现的简单三级菜单功能示例
Mar 12 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 Python
Python合并pdf文件的工具
Jul 01 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 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
php数组合并的二种方法
2014/03/21 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
删除重复数据的算法
2006/11/23 Javascript
关于文本限制字数的js代码
2007/04/02 Javascript
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
ionic3 懒加载
2017/08/16 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
获取Django项目的全部url方法详解
2017/10/26 Python
Django中Model的使用方法教程
2018/03/07 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
详解flask表单提交的两种方式
2018/07/21 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
学前教育专业毕业生自荐信
2013/10/03 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
超强台风观后感
2015/06/09 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
PHP新手指南
2021/04/01 PHP
golang判断key是否在map中的代码
2021/04/24 Golang