美文网首页python 爬虫selenium自动化操作
selenium自动化操作之五:显示等待

selenium自动化操作之五:显示等待

作者: 52d19f475fe5 | 来源:发表于2019-08-21 13:48 被阅读1次

    现在的网页越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来。如果实际页面等待时间过长导致某个元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出异常。

    为了解决这个问题。所以selenium提供了两种等待方式:隐式等待和显示等待。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。


    1 固定休眠:time.sleep()。它将条件设置为等待一个确切的时间段。

    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    time.sleep(10)
    element = driver.find_element_by_id('kw')
    print(element)
    

    10秒后,才开始找元素


    2 隐式等待:driver.implicitly_wait(seconds) 。在获取不可用的元素之前,会先等待10秒的时间,示例代码如下:

    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('https://www.baidu.com')
    element = driver.find_element_by_id('123456')
    print(element)
    

    10秒后,element没有找到,抛出异常NoSuchElementException。如果去掉代码driver.implicitly_wait(10),则马上抛出异常。

    注意:implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。


    3 显示等待:driver.WebDriverWait() 。显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待selenium.webdriver.support.ui.WebDriverWait需要结合selenium.webdriver.support.expected_conditions期望的条件来实现。示例代码如下:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, 'kw'))
        )
    finally:
        driver.quit()
    

    在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。 WebDriverWai()调用unit()方法提供的驱动程序作为一个参数,直到返回值不为 False。


    WebDriverWait() 详细格式如下:

    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
    
    driver - WebDriver 的驱动程序(Firefox, Chrome)
    timeout - 最长超时时间,默认以秒为单位
    poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
    ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
    



    expected_conditions 期望的条件:

    • title_is(object) :检查页面标题是否为预期的标题,必须完全匹配,如果标题匹配,则返回True,否则返回False。

    • title_contains(object):检查页面标题是否包含区分大小写的字符串。当标题匹配时返回True,否则返回False。

    • presence_of_element_located(object):检查某个元素是否存在于页面,不论元素是否可见。当某个元素存在则返回True,否则返回False。

    • presence_of_all_elements_located(object):检查是否至少有一个满足条件的元素存在于页面。存在时返回True,否则返回False。

    • visibility_of_element_located(object):检查某个元素是否存在于页面和可见。可见性意味着不仅显示元素但高度和宽度也大于0。当某个元素存在则返回True,否则返回False。

    • visibility_of_all_elements_located(object):检查所有满足条件的元素是否存在于页面和可见。可见性意味着不仅显示元素但高度和宽度也大于0。当所有元素都存在时则返回True,否则返回False。

    • url_to_be:检查当前的url是否是所需的url,必须完全匹配。如果匹配时则返回True,否则返回False。

    • url_contains(object):检查当前URL是否包含区分大小写的子字符串。如果匹配时则返回True,否则返回False。

    • url_changes(object):检查当前的url是否是所需的url,不能完全匹配。当不能匹配时则返回True,否则返回False。

    • text_to_be_present_in_element(object):检查给指定文本是否存在于指定元素。如果存在指定文本则返回True,否则返回False。

    • text_to_be_present_in_element_value(object):检查给指定文本是否存在于指定元素的属性值。如果存在指定文本则返回True,否则返回False。

    相关文章

      网友评论

        本文标题:selenium自动化操作之五:显示等待

        本文链接:https://www.haomeiwen.com/subject/ycbvsctx.html