00004、python+selenium 的三种时间等待方式

目的:使用selenium或者appium时,等待下个定位的元素出现,特别是web端加载的过程,为了提高脚本的稳定性,需要在脚本中增加等待时间

常见的三种等待:sleep()【强制等待】;implicitly_wait()【隐性等待】;webDriverWait()【显性等待】

  1. 【强制等待】sleep():固定休眠时间设置;执行到此时不管什么就固定的等待三秒之后再接着执行后面的操作
    • pythontime包提供了休眠方法sleep() ,导入time包后就可以使用sleep(),进行脚本的执行过程进行休眠;以秒为单位
    • JavaThread类里提供了休眠方法sleep,导入包后就能使用;以毫秒为单位
  2. 【隐性等待】implicitly_wait()又叫智能等待,是webdirver提供的一个超时等待。若在规定时间内完成加载加载完成,则执行下一步,否则一直等到时间截止;如超出了设置时间的则抛出异常;隐性等待对整个driver的周期都起作用,是针对执行脚本的所有对象
    python:driver.implicitly_wait(10) # 隐性等待,最长等10秒
    JAVA :driver.manage().timeouts().implicitlyWait(
    10, TimeUnit.SECONDS)
  3. 【显性等待】webDriverWait()在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementExceptionJava的使用方法
    python的使用方式
    from selenium.webdriver.support.ui import WebDriverWait  #导入 WebDriverWait 包
    WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("kw"))
    方式的应用&对应字段的解释:1)、WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(self,method,message=)
    (2)、WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until_not(self,method,message=)
     self:函数本身,在实际使用的时候不需要输入
     driver:webdriver的驱动程序,如(IE、FireFox、chrome、safari等)
     timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)默认以秒为单位
     poll_frequency:休眠时间(步长)的间隔,默认为0.5秒,即检测元素是否存在的频率
     ignored_exceptions: 超时后的异常信息,默认情况下抛 “NoSuchElementException",大家可以定义忽略的异常信息
     method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
    message: 如果超时,抛出TimeoutException,将message传入异常
     until(method,message=")调用该方法提供的驱动程序做为一个参数,是当某元素出现或什么条件成立则继续执行;直到返回值不为False
     until_not(method,message=")与until相反;调用该方法提供的驱动程序做为一个参数,直到返回值为False
    总结:
    WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
    Java的使用方法
    WebDriverWaitwait=new WebDriverWait(driver, 10);
    WebElement wl= wait.until(new ExpectedCondition<WebElement>() {  
                @Override
                publicWebElement apply(WebDriver d) {  
                    returnd.findElement(By.cssSelector(".red_box"));  
                }
            })
  4. 下面通过一个实例来加深理解
    #coding=utf-8
    from selenium import webdriver
    #导入 WebDriverWait 包
    from selenium.webdriver.support.ui import WebDriverWait
    #导入 time 包
    from sleep import  sleep
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    #WebDriverWait()方法使用
    element=WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("kw"))        #
    element.send_keys("selenium")
    #添加智能等待
    driver.implicitly_wait(30)     #implicitly_wait()方法比sleep()更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待
    driver.find_element_by_id("su").click()
    #添加固定休眠时间
    sleep(5)        #sleep()方法以秒为单位,假如休眠时间小时 1 秒,可以用小数表示
    driver.quit()
posted @ 2018-03-20 21:50  夏至未至-夜未央  阅读(270)  评论(0编辑  收藏  举报