【Selenium核心技术篇】selenium三种等待方式:剖析原理/用法和应用场景

前言

一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210414

【Selenium核心技术篇】包含以下内容:

  1. Selenium实现元素定位(8种)
  2. Selenium WebDriver
  3. Selenium WebElement
  4. Selenium操作from表单
  5. Selenium操作checkbox和radiobutton
  6. Selenium操作下拉列表
  7. Selenium处理弹框
  8. Selenium三种等待方式
  9. Selenium等待条件
  10. Selenium鼠标和键盘事件
  11. Selenium执行JavaScript脚本
  12. Selenium屏幕截图
  13. Selenium之frame的切入和切出

 

Selenium三种等待方式

在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这是如果不做任何处理的话,代码会由于没有找到元素而报错。另外,页面使用ajax异步加载机制,为了保证脚本运行的稳定性,需要脚本中添加等待时间,这时我们就要用到wait,而且在selenium中,我们可以用到一共三种等待,每一种等待都有自己的优点。


1、time.sleep(强制/固定等待)
(1)定义:强制等待也是最简单粗暴的一种办法就是强制等待sleep(xx秒),需要引入“time”模块。

(2)优点:脚本调试过程时,还是可以用的,方便快捷。

(3)缺点:不管你浏览器是否加载完了,程序都得等待xx秒,xx秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待。虽然可以自定义等待时间,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。

2、implicitly_wait()(隐式等待)
(1)定义:隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

(2)优点:通过添加 implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait(30) 的用法应该比 time.sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以 在一个时间范围内智能的等待。

(3)缺点:程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。 

(4)需要特别说明的是:隐性等待对整个driver的周期都起作用,所以只要在最开始设置一次即可,不要把隐性等待当成了sleep在用,走到哪儿都来一下隐式等待。


3、WebDriverWait(显式等待)

(1)定义:它主要的意思就是程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。

WebDriverWait有四个参数分别是,driver驱动, timeout超时时间, poll_frequency=POLL_FREQUENCY轮训时间,也就是去判断条件是否满足的时间间隔,默认是0.5秒, ignored_exceptions=None在等待的过程中需要忽略的异常,是一个可迭代的异常类集合,比如我们可以设置一个list,里面是[NoSuchElementException,NoSuchAttributeException,InvalidElementStateException....],默认情况下,是一个元组,只包含一个NoSuchElementException,因为只有元素出现,才能去判断条件是否满足,在不断轮训的过程中,肯定会发生NoSuchElementException,这个时候必须忽略掉这个异常,不然程序就会中断。

其中drivertimeout是必传的位置参数,另外两个是选择传递的关键字参数,如果不传都有指定的默认值。

WebDriverWait参数 参数说明
timeout 超时时间,等待的最长时间(同时要考虑隐性等待时间)
driver 传入WebDriver实例
poll_frequency 调用until或until_not中的方法的间隔时间,默认是0.5秒
 
ignored_exceptions

忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

(2)WebDriverWait配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。

until方法
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

until_not方法
与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。

实操

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

class testcase:
    def __init__(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://www.baidu.com")

    def test_sleep(self):
        # 第一种睡眠方式sleep
        self.driver.find_element_by_id('kw').send_keys('留白')
        sleep(4) #固定等待 就是进程阻塞
        self.driver.find_element_by_id('su').click()
        sleep(2)
        self.driver.quit()

    def test_implicitly(self):
        # 隐式等待
        self.driver.implicitly_wait(10)
        self.driver.find_element_by_id('kw').send_keys('留白')
        self.driver.find_element_by_id('su').click()
        self.driver.quit()

    def test_wait(self):
        # 显示等待 最常用
        wait=WebDriverWait(self.driver,5)
        wait.until(EC.title_is('百度一下,你就知道')) #判断直到出现这个标题时执行下面的语句
        self.driver.find_element_by_id('kw').send_keys('留白')
        self.driver.find_element_by_id('su').click()
        self.driver.quit()


if __name__ == '__main__':
    case=testcase()
    # case.test_sleep()
    # case.test_implicitly()
    case.test_wait()

看了以上内容基本上很清楚了,另补充说明:

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

class testcase:
    def __init__(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://www.baidu.com")
    def test_wait(self):
        # 显示等待 最常用
        wait=WebDriverWait(self.driver,5)
        wait.until(EC.title_is('百度一下,你就知道')) #判断直到出现这个标题时执行下面的语句
        self.driver.find_element_by_id('kw').send_keys('留白')
        self.driver.find_element_by_id('su').click()
        self.driver.quit()


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

上面是我用selenium写的一个测试用例,展示了selenium中显式等待的使用方式,其中会使用到expected_conditions模块WebDriverWait,注意这里expected_conditions是一个py文件的文件名,也就是一个模块名,这个模块下面有很多的条件类,而我们用例中使用的title_is就是一个条件类

WebDriverWait是一个类,这个类的作用就是根据一定的条件,不断的检查这个条件是否被满足了。WebDriverWait类只有两个方法,一个是until直到满足某个条件,另一个是until_not直到不满足某个条件。

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

 

“永不放弃,总有希望在前面等待!”送给自己,也送给正在阅读文章的博友们~

 

你可能感兴趣的:(selenium)