目的:使用selenium或者appium时,等待下个定位的元素出现,特别是web端加载的过程,为了提高脚本的稳定性,需要在脚本中增加等待时间
常见的三种等待:sleep()【强制等待】;implicitly_wait()【隐性等待】;webDriverWait()【显性等待】
- 【强制等待】sleep():固定休眠时间设置;执行到此时不管什么就固定的等待三秒之后再接着执行后面的操作
- python的time包提供了休眠方法sleep() ,导入time包后就可以使用sleep(),进行脚本的执行过程进行休眠;以秒为单位
- Java的Thread类里提供了休眠方法sleep,导入包后就能使用;以毫秒为单位
- 【隐性等待】implicitly_wait():又叫智能等待,是webdirver提供的一个超时等待。若在规定时间内完成加载加载完成,则执行下一步,否则一直等到时间截止;如超出了设置时间的则抛出异常;隐性等待对整个driver的周期都起作用,是针对执行脚本的所有对象
python:driver.implicitly_wait(10) # 隐性等待,最长等10秒
JAVA :driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS) - 【显性等待】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")); } })
- 下面通过一个实例来加深理解
#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()