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