Selenium--WebDriverWait--你知道显示等待(上)?

简介: Selenium--WebDriverWait--你知道显示等待(上)?

前言

这里是清安,本章,我们不说别的,就来说说selenium中的显示等待。

显示等待有什么作用?

1、可以用于作为断言的检验之一

2、显式等待比隐式等待/强制等待更节约执行时间

3、显示等待也能有效的提高代码的稳定性、健壮性

事实上,真的是这样的吗

显示等待,确实可以在一定程度上可以更好、更快的提高代码的稳定性以及健壮性。他可以减少强制等待的使用,提升代码执行时间,使得代码跑起来比使用强制等待更快。

「在很多时候,常常遇见元素未定位到的错误,经过排查,发现元素并未写错,浏览器中查看DOM,使用快捷搜索定位功能也是没问题的,但是在代码中就是定位不到。随后加上了强制等待!发现OK了,没问题了。」

上述所说,是不是你经常遇到的。是什么原因造成的呢?

最常见的就是:代码执行到位了,但是浏览器界面因为网速问题导致前端界面未加载出来(未渲染完成/元素未加载到DOM树中)

那么又想提高执行速度,又想规避这种常见的问题,怎么办?显示等待可以帮助你。「显示等待并非唯一一条途径」

解析显示等待

先看一下显示等待的源码,类中的构造函数。也就是一些必传以及非必传的参数。

def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):

driver:浏览器驱动

timeout:最大等待时间

poll_frequency:调用之前的睡眠间隔,默认0.5

ignored_exceptions:调用期间忽略的异常类的iterable结构。默认情况下,它只包含NoSuchElementException。

基本写法

WebDriverWait().until()

ignored_exceptions到底是什么

前三者可以很好的理解,最后一项ignored_exceptions,到底是怎么回事呢。

可以理解为报错信息,默认情况下呢,也就是不传参数,默认为「找不到元素时引发」当你所需要定位的参数不存在或者错误时,就会触发。

看一个小例子就能明白:

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
fox = webdriver.Firefox()
fox.get('http://shop.aircheng.com/simple/login')
loca = (By.NAME,'login_ino')
WebDriverWait(fox,5,0.5)
fox.find_element(*loca).send_keys('qingan')

这里本来元素因该是login_info的,但是我故意少写一个字母,会怎么样呢?

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [name="login_ino"]

跟上面所说一至,默认抛出NoSuchElementException异常。那么有其他异常怎么办。别担心,作者考虑到了,所以在源码中增加了很多的异常类,例如:NoSuchAttributeException,StaleElementReferenceException,InvalidElementStateException等。

这么多异常记不住怎么办,问题不大,用的不多,先熟练本章的内容, 后续等熟练了可自行回来深究。

此外WebDriverWait中,还提供了两个方法,一个是until一个是not until。显而易见,这两者反过来的。

WebDriverWait + until

直接看代码,更容易理解!

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
fox = webdriver.Firefox()
fox.get('http://shop.aircheng.com/simple/login')
WebDriverWait(fox,5).until(lambda x:x.find_element(By.NAME,'nihao').is_displayed(),message='元素不存在')

上面用了lambda表达式,也叫匿名函数,可作为参数传递给函数。此处暂时记住便可,后续章节会介绍其他常用的一些库中的方法一起结合使用。

message是传递的错误提示信息,可以自行写入。「需要注意的是lambda表达式后面,这里面不可带有实例化驱动的变量,例如上述的fox,否则message无法输出,会提示出其他的错误提示」

此外除了is_displayed(),另外还有两种常用的方法提供,如下:

ele.is_displayed():判断某个元素是否显示页面上

ele.is_selected():判断某个元素是否被选中

ele.is_enables():判断某个元素是否可以操作,如判断input、select等元素的可编辑状态,如按钮是否可以点击

如上述中until里面使用is_displayed是判断某个元素是否显示页面上,那么not until也就是判断某个元素是否不显示页面上。

目录
相关文章
|
负载均衡 前端开发 算法
如何使用Nginx 部署前端项目,什么是反向代理?
Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在我们web服务端真实存在,并且能够直接展示的一些文件,比如常见的html页面
如何使用Nginx 部署前端项目,什么是反向代理?
|
小程序 视频直播 UED
电商直播小程序系统开发:打造“直播+电商+社交”闭环
电商直播小程序成为商家与消费者互动的关键,通过微信提供的实时视频工具,实现流畅购物体验。系统功能包括直播预览、主播管理、红包互动、用户管理及闭环购物。它强化品牌效应,利用私域流量,简化流程并转化会员。开发涉及需求分析、设计规划、功能开发、测试优化及上线维护。企业需关注用户体验,以保持竞争力。寻求开发合作可联系相关人员。
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
1093 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
882 93
|
小程序 Android开发 iOS开发
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
1920 0
|
Ubuntu 关系型数据库 MySQL
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
2845 1
|
前端开发 JavaScript 数据管理
现代Web开发中的前端框架选择指南
选择合适的前端框架是现代Web开发中的关键决策之一。本文探讨了几种流行的前端框架,比较它们的特点和适用场景,帮助开发者在众多选项中做出理性的选择。
|
缓存 JSON 前端开发
探索 HTTP 请求的世界:get 和 post 的奥秘(下)
探索 HTTP 请求的世界:get 和 post 的奥秘(下)
探索 HTTP 请求的世界:get 和 post 的奥秘(下)

热门文章

最新文章