> 文档中心 > selenium--显示等待(上)

selenium--显示等待(上)


前言

这里是清安,本章,我们不说别的,就来说说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也就是判断某个元素是否不显示页面上。