WebDriverWait显示等待源码剖析
Posted 测试充电宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebDriverWait显示等待源码剖析相关的知识,希望对你有一定的参考价值。
我们在使用selenium 查找元素的时候,为了避免网页加载慢,会加一个sleep(x秒)
这样能解决加载慢的问题,但也存在2个问题
1.如果你设置的等待时间过了,还没加载出来,就会报“NoSuchElementException”
2.如果设置等待5秒,2秒就加载出来了,也还是会再等3秒,这样影响执行效率
有什么好的方法呢?
当然是有的,selenium.webdriver.support.wait下有一个 WebDriverWait类,就能很好的解决上面的问题
具体用法如下
from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver driver = webdriver.Chrome() elem = WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_id(‘su’)) elem.click()
初始化WebDriverWait,传入driver,最长等待时间5秒
调用util方法,utile接收一个方法
我们来看下源码
import time from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import TimeoutException POLL_FREQUENCY = 0.5 # 没0.5秒调用一下util接收到的方法 IGNORED_EXCEPTIONS = (NoSuchElementException,) # 忽略遇到异常 class WebDriverWait(object): def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None): """
此处省略注释
""" self._driver = driver self._timeout = timeout self._poll = poll_frequency # avoid the divide by zero if self._poll == 0: self._poll = POLL_FREQUENCY exceptions = list(IGNORED_EXCEPTIONS) if ignored_exceptions is not None: try: exceptions.extend(iter(ignored_exceptions)) except TypeError: # ignored_exceptions is not iterable exceptions.append(ignored_exceptions) self._ignored_exceptions = tuple(exceptions) def __repr__(self): return ‘<{0.__module__}.{0.__name__} (session="{1}")>‘.format( type(self), self._driver.session_id) def until(self, method, message=‘‘): """Calls the method provided with the driver as an argument until the return value is not False.""" screen = None stacktrace = None end_time = time.time() + self._timeout while True: try: value = method(self._driver) if value: return value except self._ignored_exceptions as exc: screen = getattr(exc, ‘screen‘, None) stacktrace = getattr(exc, ‘stacktrace‘, None) time.sleep(self._poll) if time.time() > end_time: break raise TimeoutException(message, screen, stacktrace)
WebDriverWait构造方法需要接收driver和timeout(超时时间),默认调用频率poll_frequency(0.5秒)
until方法中主要是这一段
value = method(self._driver) if value: return value
执行接收的方法,如果接收方法执行OK,则直接返回入参方法的返回值
即我们传入的driver.find_element_by_id(‘su’),会返回元素
以上是关于WebDriverWait显示等待源码剖析的主要内容,如果未能解决你的问题,请参考以下文章
selenium中的三种等待方式(显示等待WebDriverWait()隐式等待implicitly()强制等待sleep())---基于python
七Appium-python-UI自动化之强制等待:sleep,隐式等待:implicitly_wait,显示等待:WebDriverWait()