显式等待自定义条件
显式等待中until 源码
def until(self, method: Callable[[D], Union[Literal[False], T]], message: str = "") -> T:
#其中的method:Callable[[D],Union[Literal[False],T]] 的意思是首先一整个是针对method的类型提示:Callable表示可执行,即函数或方法,而后面的[]则意味着函数的输入和输出,D表示携带driver,为入参。Union[Literal[False],T]则表示输出可以为以下两种,其一为准确输出False,其二为其余值(除False外)
这是可以理解的,因为显式等待的条件方法,本质上就是一个能达成目的就返回所需数据或者单纯返回True,如果失败就返回False,而接收结果。
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``.
:param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None
## 这里是作时间超时的监控
end_time = time.monotonic() + 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.monotonic() > end_time:
break
raise TimeoutException(message, screen, stacktrace)
运行机理:
首先,显式等待由方法,异常无视列表,超时时间,轮询时间组成。
首先是方法参数:method
,要求:入参只有一个driver
,而正常流程的返回值 要么为所需的值value
,要么为false,这样正常的流程中如果是false,则继续跑,如果是正确的value就退出轮询。
如果在执行时报错:通常都会报错,因为一般selenium操作都是非对即异常,所以需要将找不到出现的异常添加到异常免疫列表里,默认的异常免疫为:元素not found,如果需要添加则在wait参数上:ignored_exceptions = (NoSuchElementException, StaleElementReferenceException, TimeoutException)
,WebDriverWait(self.driver, 10, ignored_exceptions=ignored_exceptions)
至于超时时间和轮询时间则是同样在wait初始化时被创建出来。
关键:方法自定义
方法一:编写方法def
编写一个方法def,然后往method
参数里一丢,必须要求入参为driver,存在出参且正确出参不能为False,如果存在正确执行,但是结果并非想要的结果时,则需要输出false
。 如果会出现异常,则需要将异常添加到异常忽略表中。
方法二:直接借助lambda写逻辑
wait.until(lambda driver : driver.execute_script('return document.readyState')=='complete')
lambda 语法:lambda关键字 入参 : 具体逻辑,且默认会return逻辑结果