显示等待自定义写法:固有显式等待条件不合适

显式等待自定义条件

显式等待中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逻辑结果