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中字典和JSON互转操作实例
Jan 19 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
获取Django项目的全部url方法详解
Oct 26 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
Python程序暂停的正常处理方法
Nov 07 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
python3+PyQt5+Qt Designer实现界面可视化
Django使用echarts进行可视化展示的实践
You might like
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP培训要多少钱
2017/06/06 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python读取word文本操作详解
2018/01/22 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
一套Delphi的笔试题二
2013/05/11 面试题
统计系教授推荐信
2014/02/28 职场文书
英语故事演讲稿
2014/04/29 职场文书
春节联欢会策划方案
2014/05/16 职场文书
淘宝客服工作职责
2014/07/11 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
MySQL sql模式设置引起的问题
2022/05/15 MySQL