Selenium元素定位的30种方式(史上最全)


Posted in Python onMay 11, 2020

Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下。

这里将统一使用百度首页(www.baidu.com)进行示例,f12可以查看具体前端代码。

WebDriver8种基本元素定位方式

find_element_by_id()

采用id属性进行定位。例如在百度页面中输入关键字 Selenium 进行搜索。百度部分关键源码如下:

<span class="bg s_ipt_wr quickdelete-wrap">
    <span class="soutu-btn"></span>
    <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
    <a id="quickdelete" class="quickdelete" href="javascript:;" rel="external nofollow" title="清空" style="top: 0px; right: 0px; display: none;"></a>
</span>
<span class="bg s_btn_wr">
    <input id="su" class="bg s_btn" type="submit" value="百度一下">
</span>

可以看到输入框和百度一下的按钮都有id,那么定位代码如下:

#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
 
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
 
driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()
 
time.sleep(2)
driver.quit()

find_element_by_name()

 find_element_by_class_name() 

根据name元素和class的名字进行定位,这两种定位方式和id定位相似,在前端代码中,id、name和class一般都至少会有其中的一种,比如百度的搜索框具有name属性,我们可以用name定位搜索款,class定位百度一下的按钮:

driver.find_element_by_name("wd").send_keys("Python")
driver.find_element_by_class_name("s_btn").click()

find_element_by_xpath() 

xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素的路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。xpath也分几种不同类型的定位方法。

一种是绝对路径定位。这种定位方式是利用html标签名的层级关系来定位元素的绝对路径,一般从<html>标签开始依次往下进行查找。如百度搜索框的绝对路径xpath定位可以是这样的:find_element_by_xpath("/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input")

还有一种是利用元素属性来进行xpath定位,搜索框还可以利用id和name属性去定位:

find_element_by_xpath("//input[@id='kw']")

find_element_by_xpath("//*[@name='wd']")

其中的标签名input也可以用*来代替,而且只要是在该标签内,任意属性都可以,比如搜索框的maxlength属性:

find_element_by_xpath("//input[@maxlength='255']")

有的时候我们会发现绝对路径定位路径太长,而且光凭路径完全不可以猜测到其指向的具体页面元素,如果只有单纯的元素属性不一定可以每次查找的元素都可以又唯一的属性去方便定位,这个时候我们可以将这两种定位方式结合起来使用。

比如查找搜索框的时候发现其上级元素form又唯一的id方便定位,就可以先查找到form元素然后依次往下写路径:

find_element_by_xpath("//form[@id='form']/span/input")

这种定位方式的使用过程中,如果元素的单个属性无法确定其唯一性,可以用and连接多个属性去确定。

find_element_by_css_selector()

CSS属性定位可以比较灵活地选择控件的任意属性,定位方式也会比xpath快。

同样是那个百度搜索的例子,可以试一下:

driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()

如果有css基础的话就应该可以看懂,一般class是用.标记,id是用#标记,标签名直接写具体标签名就好了。

css定位里面也可以通过属性或者组合方式定位:

driver.find_element_by_css_selector("input[autocomplete='off']").send_keys("Python")
driver.find_element_by_css_selector("span.bg.s_btn_wr>input#su").click()

具体说一下百度一下那个按钮的组合定位方式,这样写的定位顺序是这样的,先定位到一个class名为bg s_btn_wr的span标签,在这个标签下面有一个id为su的input标签,这样就定位到了。

值得注意的是,在css里面下级标签元素用>连接,如果class里面有空格,空格用.进行连接。

find_element_by_tag_name ()

通过标签名去定位的方式一般是这样的:find_element_by_tag_name("input")
可见仅仅通过标签名去定位时,一般一种标签在一个页面里面会出现不止一次甚至大量出现,这种定位方式的作用不是很大,所以用的也就比较少。

find_element_by_link_text()

find_element_by_partial_link_text()

这两种定位方式是专门用于定位超链接的,也就是对应html页面中的<a>标签,括号里传的值就是a标签中的超链接文字,两者的区别在于一个是完整的超链接文字,一个是可以只写部分超链接文字。

比如点击百度首页中右上角的新闻超链接,可以这样去定位:

driver.find_element_by_link_text("新闻").click()
driver.find_element_by_partial_link_text("闻").click()

By定位

通过对上面8种基本元素定位方式的学习,在使用过程种可以根据实际的情况去选择对应的的定位方式,我们可以用By来设置定位策略,具体语法如下:

find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")

上面这些使用的前提是需要导入By类:from selenium.webdriver.common.by import By

最简单粗暴却失传已久的8种定位

据说这种定位方式在江湖上都快要失传了,实在想不通为什么,明明写起来最简单粗暴啊~

driver.find_element("name","wd").send_keys("Selenium2")
driver.find_element("id","su").click()

相信通过上面的两只栗子,大家一定会和我一样觉得这种方式的定位实在是太省事了~只要写find_element就好啦,下面我们来总结一下这8种写法与基本定位方法类比过来该怎么写:

by_id -> find_element("id","")

by_xpath -> find_element("xpath","")

by_link_text -> find_element("link text","")

by_partial_text -> find_element("partial link text","")

by_name -> find_element("name","")

by_tag_name -> find_element("tag name","")

by_class_name -> find_element("class name","")

by_css_selector -> find_element("css selector","")

elements复数定位

在上面的例举的八中基本定位方式种,都有对应的复数形式,分别是下面这些:

id复数定位find_elements_by_id()
name复数定位find_elements_by_name()
class复数定位find_elements_by_class_name()
tag复数定位find_elements_by_tag_name()
link复数定位find_elements_by_link_text()
partial_link复数定位find_elements_by_partial_link_text()
xpath复数定位find_elements_by_xpath()
css复数定位find_elements_by_css_selector()

这些复数定位方式每次取到的都是具有相同类型属性的一组元素,所以返回的是一个list队列,我们也可以利用这个去定位单个的元素。比如百度首页种,右上角有新闻、视频、地图、贴吧等一些链接,我们通过f12查看源码可以发现,这些链接都有共同的class, 。

Selenium元素定位的30种方式(史上最全)

举个例子,比如定位排在第六个的学术,可以这样定位:driver.find_elements_by_class_name("mnav")[5].click()

还可以通过css的复数定位写法:driver.find_elements("css selector",".mnav")[6].click()

当然,也可以借助pop()函数,一般pop()或pop(-1)表示获取元素种的最后一个,pop(2)表示第三个:

driver.find_elements("css selector",".mnav").pop().click()

JS的5种定位方式总结

其实看到这里,上面的定位方式应该就基本够用了,但是有的时候就是会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,往往就可以解决那些诡异的事情~

id定位:document.getElementById()
name定位:document.getElementsByName()
tag定位:document.getElementsByTagName()
class定位:document.getElementsByClassName()
css定位:document.querySelectorAll()

其中只有id对象用的是Element返回是单个对象,其他都是Elements返回的是一个list这点千万要注意,具体用法和上面的webdriver基础定位一样。先写好对应的js语句,可以先赋值给一个变量,然后后调用execute_script进行执行一下js就好了,下面还是结合那个百度搜索的栗子,我写的脚本,可以对应学习实验一下:

search_js = "document.getElementsByName('wd')[0].value='selenium';"
search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"
button_js = "document.getElementById('su').click();"
button_js2 = "document.getElementsByClassName('s_btn')[0].click()"
driver.execute_script(search_js2)
driver.execute_script(button_js2)

以上分别结合常用的四种js定位方式写了四条js语句,然后要执行的就execute_script一下就好啦~

超神的jQuery定位

据说会jQuery定位的在定位的路上就是披襟斩棘,所向披靡~如此超神的定位,还是可以了解一下的~

jQuery语法是为HTML元素的选取编制的,可以对元素执行一些具体的操作

基础语法是$(selector).action()

$符号定义jQuery,selector选择器用来查询具体的HTML元素,通过action()来执行对元素的具体操作。

其中我们经常用到的action()在jq中有这么几种:

$(selector).val('input_value') 其中input_value表示要输入的文本的值

$(selector).val('') 如果为空,则执行后是清空的意思

$(selector).click() 行为也是肯定有的

让我们结合百度的栗子看一下,用jQuery的写法和js有一点点的类似,但明显简洁多了:

search_jq = "$('#kw').val('selenium')"
button_jq = "$('.s_btn').click()"
driver.execute_script(search_jq)
driver.execute_script(button_jq)

以上就是对webdriver的一些基本定位方式总结,我们再来回顾一下:

分别是……

8种webdriver的基本地位方式,还有对应的8种复数定位,js有5中定位方式,还有超神的jQuery定位,当然,不要忘了快要失传的那8种定位,一共是30种,在实际应用中,总有一种适合你(●ˇ∀ˇ●)

到此这篇关于Selenium元素定位的30种方式(史上最全)的文章就介绍到这了,更多相关Selenium元素定位内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python基于xml parse实现解析cdatasection数据
Sep 30 Python
Python中表示字符串的三种方法
Sep 06 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
python实现比较文件内容异同
Jun 22 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
python计算auc的方法
Sep 09 Python
Python基于百度API识别并提取图片中文字
Jun 27 Python
Python序列化模块JSON与Pickle
Jun 05 Python
Python基于codecs模块实现文件读写案例解析
May 11 #Python
Python基于pandas爬取网页表格数据
May 11 #Python
Python调用shell命令常用方法(4种)
May 11 #Python
python中sort sorted reverse reversed函数的区别说明
May 11 #Python
python的reverse函数翻转结果为None的问题
May 11 #Python
Pyecharts地图显示不完成问题解决方案
May 11 #Python
将python字符串转化成长表达式的函数eval实例
May 11 #Python
You might like
PHP4实际应用经验篇(2)
2006/10/09 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
基于Python os模块常用命令介绍
2017/11/03 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
用Python配平化学方程式的方法
2019/07/20 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
Python 如何批量更新已安装的库
2020/05/26 Python
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
教师自我反思材料
2014/02/14 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis