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爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
python破解zip加密文件的方法
May 31 Python
对Python 数组的切片操作详解
Jul 02 Python
Python切片操作深入详解
Jul 27 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
浅析python 字典嵌套
Sep 29 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 Python
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
使用python+pygame开发消消乐游戏附完整源码
Python数据可视化之基于pyecharts实现的地理图表的绘制
python使用PySimpleGUI设置进度条及控件使用
python3+PyQt5+Qt Designer实现界面可视化
Django使用echarts进行可视化展示的实践
You might like
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
JS 强制设为首页的代码
2009/01/31 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
帕克纽约:PARKER NY
2018/12/09 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
建龙钢铁面试总结
2014/04/15 面试题
行政经理岗位职责
2013/11/09 职场文书
机电一体化专业推荐信
2013/12/03 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
青安岗事迹材料
2014/05/14 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书