『心善渊』Selenium3.0基础 — 23、Selenium元素等待
1、什么是元素等待
WebDriver
定位页面元素时如果未找到,会在指定时间内一直等待的过程。为了保证脚本运行的稳定性,需要脚本中添加等待时间。
2、为什么要设置元素等待
在元素定位的时,可能出现脚本已经运行到定位某个元素的时候,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。换句话说就是代码执行的速度,快于页面元素加载的速度,我们需要等待页面元素全部加载完成之后,再做定位元素。元素等待本质是为了解决元素定位时序上不匹配的问题。
页面加载速度慢的原因:
- 由于网络速度原因。
- 电脑配置原因。
- 服务器处理请求原因。
3、Selenium中常用的等待方式
Selenium中常用的等待时间方式有三种:
- 强制等待:
time.sleep()
- 隐式等待:
implicitly_wait()
- 显式等待:
WebDriverWait()
4、强制等待
设置等待最简单的方法就是强制等待,其实就是time.sleep()
方法。不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际UI自动化脚本开发中,这个方式一般比较少用。
5、隐式等待
(1)隐式等待介绍
WebDriver
提供了mplicitly_wait()
方法来实现隐式等待。隐式等待相当于设置全局等待,在定位元素时,对所有元素设置的超时时间。implicitly_wait()
默认参数的单位为秒,默认设置超时时间为0,设置后这个隐式等待会在WebDriver
对象实例的整个生命周期起作用。
从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,Driver
(浏览器)要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,Driver
(浏览器)也会继续等待页面上其他无关元素,直至整个页面加载完毕。所以与显式等待相比,可能会出现一些无效等待的情况。
如果超出了设置的时长,元素还没有被加载,则抛NoSuchElementException
异常(可自己指定异常或自定义异常)。
(2)示例
"""
1.学习目标:
掌握selenium隐式等待方法使用
2.操作
2.1 隐式等待方法
driver.implicitly_wait(最大等待时间,单位:秒)
2.2 隐式等待作用
在规定的时间内等待页面所有元素加载;
2.3 使用场景:
在有页面跳转的时候,可以使用隐式等待。
3.需求
实现selenium隐式等待方法
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.common.exceptions import NoSuchElementException
# 2.打开浏览器
driver = webdriver.Chrome()
# 3.打开页面
url = "https://www.jd.com/"
driver.get(url)
# 4. 添加隐式等待
print("等待开始时间", time.time())
# 等待5秒钟,最多等待5秒。
# 如果在5秒内加载完成,加载完就继续执行。
driver.implicitly_wait(5)
print("等待结束时间", time.time())
# 5. 定位元素,点击链接
try:
driver.find_element_by_link_text("秒杀").click()
except NoSuchElementException as e:
print(e)
finally:
# 6.关闭浏览器
time.sleep(3)
driver.quit()
"""
输出结果:
等待开始时间 1590511914.654972
等待结束时间 1590511914.6569717
"""
说明:
在上面的案例中
implicitly_wait()
设置等待时长为5秒。这个5秒的设置并不针对页面上的某一个元素进行等待,也不是一个固定的等待时间。如果页面全部元素提前加载完,不用等待全部时间。如果直到超出设置时长(5秒)还没有定位到元素,则抛出异常。
6、显式等待
(1)显式等待介绍
显示等待是一种更智能的等待方式。显示等待比隐式等待更节省测试时间,个人更推荐使用显示等待的方式来判断页面元素是否出现。程序会每隔一段时间(默认为0.5秒,可自定义)执行一下判断条件,等待某个条件成立时继续执行,否则在达到最大时长抛出超时异常TimeoutException
(实际上是until()
抛出的TimeoutException
异常,这里注意一下)。
WebDriverWait()
类是由WebDirver
提供的等待方法。在设置时间内,通过配合until()
、until_not()
、ExpectedCondition
等条件的使用,默认每隔一段时间,轮询检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。这样的等待方式可避免无效等待,在实际应用中推荐使用该方法。
(2)语法
# 导包WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
# 显示等待方法
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
说明:
driver
:WebDriver
的驱动程序(IE
、Firefox
、Chrome
等)。timeout
:最长超时时间,默认以秒为单位。poll_frequency
:休眠时间的间隔(步长)时间,默认为0.5秒(轮询频率)ignored_exceptions
:超时后的异常信息,默认值ignored_exceptions=None
,因为通常配合until()
方法使用,until()
方法默认情况下抛TimeoutException
异常。
(3)until()
和until_not()
方法
WebDriverWait()
方法一般会和until()
或until_not()
方法配合使用。
@1、until(method, message=' ')
method
:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为True;message
:如果超时,抛出TimeoutException
,将message位置传入异常。
@2、until_not(method, message=’ ’)
method
:在等待期间,每隔一段时间调用这个传入的方法,直到返回值为False。message
:如果超时,抛出TimeoutException
,将message位置传入异常。
注:
until_not
是当某元素消失或什么条件不成立则继续执行。
(4)具体调用方式示例
调用方式如下:
WebDriverWait(driver, 超时时长, 调用频率(可选,有默认值), 忽略异常(可选,有默认值)).until(可执行方法, 超时时返回的信息)
示例:
"""
1.学习目标
必须掌握selenium中显式等待使用方法
2.操作步骤(语法)
2.1导入WebDriverWait类
2.2使用方法
WebDriverWait(driver,timeout,pol1_frequency=0.5).until(method)
driver:浏览器
timeout:最大等待时间,单位:秒(和隐式显示是一样的)
po11_frequency:轮询时间
until(method,message)
method:将一个方法作为参数传入
3.需求
在注册A页面中,使用显示等待来定位账号A输入相
"""
# 1.导入selenium
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
# 2.打开浏览器
driver = webdriver.Chrome()
# 3.打开页面
url = "https://www.jd.com/"
driver.get(url)
# 4.使用显示等待,定位元素,点击链接
try:
print("等待开始时间", time.time())
"""
lambda x: x.find_element_by_link_text("秒杀")
是Python的匿名函数,主要记得这里要传入一个方法。
x = driver
不过以后在我们的实际开发中,不这样传入一个方法。
"""
login = WebDriverWait(driver, 5).until(lambda x: x.find_element_by_link_text("秒杀"))
print("等待结束时间", time.time())
login.click()
except NoSuchElementException as e:
print(e)
finally:
# 5.关闭浏览器
time.sleep(3)
driver.quit()
"""
输出结果:
等待开始时间 1590511979.5245922
等待结束时间 1590511979.5725648
"""
『心善渊』Selenium3.0基础 — 23、Selenium元素等待的更多相关文章
- 『心善渊』Selenium3.0基础 — 24、Selenium的expected_conditions模块详细介绍
目录 1.EC模块介绍 2.EC模块常用类 3.EC模块的使用 4.EC模块综合使用 (1)title_is(title)示例 (2)presence_of_element_located(locat ...
- 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作
目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...
- 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件
目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...
- 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍
目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...
- 『心善渊』Selenium3.0基础 — 4、Selenium基础元素定位详解
目录 1.什么是元素定位 2.Selenium元素定位常用API (1)By_id 定位 (2)by_name 定位 (3)by_class_name 定位 (4)by_tag_name 定位 (5) ...
- 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)
目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...
- 『心善渊』Selenium3.0基础 — 3、使用Selenium操作浏览器对象的基础API
目录 1.导入Selenium库 2.创建浏览器对象 3.浏览器窗口大小设置 4.浏览器位置设置 5.请求访问网址 6.浏览器页面前进.后退和刷新 7.关闭浏览器 相比于高大上的各种Selenium进 ...
- 『心善渊』Selenium3.0基础 — 19、使用Selenium操作文件的上传和下载
目录 1.Selenium实现文件上传 (1)页面中的文件上传说明 (2)文件上传示例 (3)总结 2.Selenium实现文件下载 (1)Firefox浏览器文件下载 1)操作步骤: 2)文件下载示 ...
- 『心善渊』Selenium3.0基础 — 20、Selenium对Cookie的操作
目录 1.Cookie介绍 2.Session介绍 3.Cookie工作原理图解 4.Cookie内容参数说明 5.Selenium操作Cookie的API 6.Selenium操作Cookie的示例 ...
随机推荐
- CSS设计模式介绍
一. 常见CSS设计模式分析 oocss Object Oriented CSS,面向对象的CSS,旨在编写高可复用.低耦合和高扩展的CSS代码. OOCSS是以面向对象的思想去定义样式,将抽象(结构 ...
- MyBatisPlus详细总结记录
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com 小 Hub 领读: 一篇写得非常详细的文章,增删改查,各种插件,让你测底熟悉 mybatis plus. 作者:yo ...
- 西门子 S7-300 以太网模块连接 WINCC方案
北京华科远创科技有限研发的远创智控ETH-YC模块,型号有MPI-ETH-YC01和PPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控 ...
- Nginx实战部署常用功能演示(超详细版),绝对给力~~~
前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...
- Zabbix企业分布式监控工具
前言:在工作中常常需要对服务器进行监控,但是要选择一款合适监控软件可不容易,今天介绍下zabbix这款监控软件 一.Zabbix介绍1.Zabbix是一个企业级的.开源的.分布式的监控套件2.Zabb ...
- PaddlePaddle推理部署
PaddlePaddle推理部署 飞桨推理产品简介 作为飞桨生态重要的一部分,飞桨提供了多个推理产品,完整承接深度学习模型应用的最后一公里. 整体上分,推理产品主要包括如下子产品 各产品在推理生态中的 ...
- 开发掉坑(二)前端静态资源 Uncaught SyntaxError: Unexpected token <
某天,有同学反馈后台管理系统出现静态资源无法加载的问题. 复现如下: 进入首页. 点击侧边栏某个子功能,静态资源可正常访问到. 等待10分钟左右,点击侧边栏其他子功能,无法访问到静态资源. 查看控制台 ...
- 虹软人脸识别SDK接入Milvus实现海量人脸快速检索
一.背景 人脸识别是近年来最热门的计算机视觉领域的应用之一,而且现在已经出现了非常多的人脸识别算法,如:DeepID.FaceNet.DeepFace等等.人脸识别被广泛应用于景区.客运.酒店.办公室 ...
- 新增秒杀功能、优惠券、支付宝、Docker,newbee-mall升级版开源啦!
最近是非常非常非常忙,一方面是公司的事情比较多,另外⼀点是最近在准备诉讼材料.⾄于诉讼的是谁,⼤家可以去看我之前写的几篇文章,所以本来这周是不打算更新文章的.不过,昨天慕课网的法务联系我的律师了,终于 ...
- linux命令基础(一课)
一.Linux命令基础 1.shell Linux系统中运行的一种特殊程序 在用户和内核之间充当'翻译官' 用户登录Linux系统时,自动加载一个shell程序 bash是Linux系统中默认使用的s ...