zoukankan      html  css  js  c++  java
  • selenium之python源码解读-WebDriverWait

    一、显示等待

    所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常

    PS:注意显示等待和隐身等待的区别,隐身等待是对页面中的所有元素设置加载时间。

    二、WebDriverWait类

    在selenium框架中显示等待是通过WebDriverWait来实现的

    WebDriverWait所在位置:在support包的wait.py文件中,seleniumwebdriversupportwait.py

    构成函数:

    class WebDriverWait(object):
        def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
            pass

    构造函数参数解读:

    driver:webdriver实例,可以是Ie, Firefox, Chrome or Remote
    timeout:查找特定元素时的最大超时时间,单位seconds
    poll_frequency:关键字参数,查找元素的频率,即每隔多少时间回调一次method,默认为 0.5 second
    ignored_exceptions:关键字参数,在回调method过程中忽略哪些异常,默认为NoSuchElementException,如果有需要忽略多个异常,可以以iterable的形式传入参数,如tuple

    实例方法:
    def until(self, method, message=''):
            """Calls the method provided with the driver as an argument until the 
            return value is not False."""
    
    def until_not(self, method, message=''):
            """Calls the method provided with the driver as an argument until the 
            return value is False."""

    方法解读:

    until:循环调用method的方法,直到method返回true()非false,返回结果:method方法返回的结果
    until_not:循环调用method的方法,直到method返回false
    在这两个方法中,参数methon是必传参数,且传入的是一个functhon对象(注意是函数对象,不带括号的),该method对象的参数是driver
    def until(self, method, message=''):
        screen = None
        stacktrace = None
    
        # 设置超时时间
        end_time = time.time() + self._timeout
        while True: # 循环调用method方法
            try:
                # 执行传入的methon方法,且参数为driver
                value = method(self._driver)
                if value: # 如果method方法执行的结果为非false,则停止循环
                    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)

    举个例子:

    from selenium.webdriver.support.ui import WebDriverWait # 导入WebDriverWait
    # method:参数为driver的lambda匿名函数
    # 功能:找到id为someId的元素
    # 返回值:x.find_element_by_id("someId")的WebElement对象
    element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))

    总结:

    until / until_not方法

    参数:method对象(注意是对象,而非调用方法),可以传入lambda匿名函数

    method方法的参数为driver

  • 相关阅读:
    列表去重
    Python中操作SQLAlchemy,SQLAlchemy中文技术文档
    gunicorn部署Flask服务
    Asset Catalog Help (十一)---Removing Images and Sets
    Asset Catalog Help (十)---Specifying a Resizable Area of an Image
    Asset Catalog Help (九)---Changing Image Set Names
    Asset Catalog Help (八)---Customizing Image Sets for Devices
    Asset Catalog Help (七)---Customizing Image Sets for Size Classes
    Asset Catalog Help (六)---Adding OS X Icons
    Asset Catalog Help (五)---Migrating an iOS App Icon Set or Launch Image Set
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/8974901.html
Copyright © 2011-2022 走看看