selenium的三种等待方式

问题:在自动化测试中,必定会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错。另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到 wait。

selenium总共有三种等待方式:

  • timd.sleep(固定等待)
  • implicitly_wait(隐式等待)
  • WebDriverWait(显示等待)

1.固定等待

timd.sleep(固定等待):可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长。该方式适用于脚本调试过程。代码如下所示:

from selenium import webdriver
from time import sleep

class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        # sleep(2)

    def test_sleep(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        sleep(2) # 线程阻塞 blocking wait
        self.driver.find_element_by_id('su').click()
        sleep(3)
        self.driver.quit()
        
if __name__ == '__main__':
    case = TestCase()
    case.test_sleep()

2.隐式等待

implicitly_wait(隐式等待):隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。 代码如下所示:

隐式等待最大的问题是:JavasScript 一般都是放在我们body的最后进行加载,实际这时页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束

隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。

from selenium import webdriver
from time import sleep

class TestWait02(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        # sleep(2)

    def test_implicitly(self):
        self.driver.implicitly_wait(10)
        self.driver.find_element_by_id('kw').send_keys('selenium')
        # sleep(2) # 线程阻塞 blocking wait
        self.driver.find_element_by_id('su').click()
        # sleep(3)
        self.driver.quit()

if __name__ == '__main__':
    case = TestWait02()
    case.test_implicitly()

3.显示等待

WebDriverWait(显示等待):指的是设定最长等待时间,有一个判断条件,会每隔设定的时间去执行判断条件是否成立。如果成立则往下执行,否则一直检查条件,直到达到最长等待时间。该方法是最常用的。参数有:
selenium的三种等待方式_第1张图片
这个模块中,一共只有两种方法 until 与 until not
在这里插入图片描述

from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait

class TestWait03(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.get('http://www.baidu.com')
        # sleep(2)

    def test_wait(self):
        wait = WebDriverWait(self.driver, 2) #2为timeout,即等待的最长时间
        wait.until(EC.title_is('百度一下,你就知道'))#直到出现的页面的标题为百度一下,你就知道,poll_frequency为默认值
        self.driver.find_element_by_id('kw').send_keys('selenium')
        # sleep(2) # 线程阻塞 blocking wait
        self.driver.find_element_by_id('su').click()
        # sleep(3)
        self.driver.quit()

if __name__ == '__main__':
    case = TestWait03()
    case.test_wait()

你可能感兴趣的:(selenium,等待方式,sleep,隐式等待,显示等待)