Python selenium的这三种等待方式一定要会!


Posted in Python onJune 10, 2021

一、为什么要使用等待?

在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时

时间,大致在1-3秒

如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行

我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败

Python selenium的这三种等待方式一定要会!

二、常用的三种等待方式

  • 强制等待
  • 隐式等待
  • 显示等待

三、强制等待

利用time模块的sleep方法来实现,最简单粗暴的等待方法

强制等待,不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码

# -*- coding: utf-8 -*-
# @Author : 程序员一凡
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 强制等待3秒
time.sleep(3)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
# 退出
driver.quit()

弊端

不建议用这种等待方法,严重影响代码的执行速度

四、隐式等待

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完)网页加载

完成则执行下一步

隐式等待只需要声明一次,一般在打开浏览器后进行声明

声明之后对整个drvier的生命周期都有效,后面不用重复声明

# -*- coding: utf-8 -*-
# @Author : 程序员一凡
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 隐性等待5秒
driver.implicitly_wait(5)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
# 退出
driver.quit()

弊端

程序会一直等待整个页面加载完成,直到超时

有时候我需要的那个元素早就加载完成了,只是页面上有个别其他元素加载特别慢,我仍要等待页

面全部加载完成才能执行下一步

五、显示等待

WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了

它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步

否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException

显示等待必须在每个需要等待的元素前面进行声明

# 导入模块
from selenium.webdriver.support.wait import WebDriverWait

四个参数

driver:浏览器驱动

timeout:等待时间

poll_frequency:检测的间隔时间,默认0.5s

ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException

expected_conditions

expected_conditions是selenium的一个模块

包含一系列可用于判断的条件

可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用

from selenium.webdriver.support import expected_conditions as EC
# -*- coding: utf-8 -*-
# @Author : 程序员一凡
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 等待10s,等待过程中如果定位到元素,就直接执行后续的代码,反之等待10s后报错误信息
# 验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID,
"kw"))).send_keys("好好学习")

六、模块用法汇总

#判断当前页面的title是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.title_is("百度一下,你就知道"))
#判断当前页面的title是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.title_contains('new'))
#判断当前页面的url是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('https://www.baidu.com'))
#判断当前页面的url是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('baidu'))
#判断当前页面的url是否满足字符串正则表达式匹配,返回布尔值
WebDriverWait(driver,10).until(EC.url_matches('.+baidu.+'))
#判断元素是否出现,只要有一个元素出现,返回元素对象
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
#判断元素是否可见,返回元素对象
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw'))
)
#判断元素是否包含指定文本,返回布尔值
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.NAME,'tj_trn
ews'),'新闻'))
#判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去
WebDriverWait(driver,10,).until(EC.frame_to_be_available_and_switch_to_it(By.xpa
th,'//iframe'))
#判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,'tj_trnews'))
)
#判断某个元素是否被选中,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.
xpath,'//input[@type="checkbox"]')))
#判断页面上是否存在alert,如果有就切换到alert并返回alert的内容
WebDriverWait(driver,10).until(EC.alert_is_present())

到此这篇关于Python selenium的这三种等待方式一定要会!的文章就介绍到这了,更多相关selenium等待方式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现的Excel文件读写类
Jul 30 Python
Python ftp上传文件
Feb 13 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
python scipy求解非线性方程的方法(fsolve/root)
Nov 12 Python
用python3 返回鼠标位置的实现方法(带界面)
Jul 05 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python PIL图片添加字体的例子
Aug 22 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
python+OpenCV实现图像拼接
Mar 05 Python
Python实现8种常用抽样方法
Jun 27 Python
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
python3+PyQt5+Qt Designer实现界面可视化
Django使用echarts进行可视化展示的实践
You might like
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
JQuery jsonp 使用示例代码
2009/08/12 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
javascript中如何处理引号编码"
2013/08/15 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
微信小程序实现图片压缩功能
2018/01/26 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
在vue中安装使用vux的教程详解
2018/09/16 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
python文件特定行插入和替换实例详解
2017/07/12 Python
Python探索之自定义实现线程池
2017/10/27 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python之列表的插入&替换修改方法
2018/06/28 Python
python操作yaml说明
2020/04/08 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
Java面试笔试题大全
2016/11/23 面试题
财务总监管理岗位职责
2014/03/08 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
导游词之韩国济州岛
2019/10/28 职场文书