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处理python编码问题
Mar 13 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
详解python3中的真值测试
Aug 13 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Java文件与类动手动脑实例详解
Nov 10 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
python小白切忌乱用表达式
May 29 Python
MoviePy常用剪辑类及Python视频剪辑自动化
Dec 18 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
一起来学习Python的元组和列表
Mar 13 Python
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
python3+PyQt5+Qt Designer实现界面可视化
Django使用echarts进行可视化展示的实践
You might like
PHP 编程的 5个良好习惯
2009/02/20 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
一个简单的php路由类
2016/05/29 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
js分页之前端代码实现和请求处理
2017/08/04 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
python 如何对logging日志封装
2020/12/02 Python
css3 transform属性详解
2014/09/30 HTML / CSS
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
Delphi工程师笔试题
2013/09/21 面试题
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2014年团支书工作总结
2014/11/14 职场文书
师德标兵事迹材料
2014/12/19 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang