在UI自动化测试中,必然会遇到环境不稳定、网络慢等状况。当你以为定位没有问题,但程序却直接报了元素不可见时,那你就须要思考是否由于程序运行太快或者页面加载太慢而形成了元素不可见,必需要再等待直至元素可见和程序继续运行。而在Selenium中,三种常见的等待方式都有各自的优势或缺点,能够在了解后尝试针对不一样的状况选择最优的等待方式。css
1.强制等待(sleep)git
设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,无论它什么状况,让程序暂停运行必定时间,时间事后继续运行;缺点是不智能,设置的时间过短,元素尚未加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,不少个几秒就会影响总体的运行速度了;因此尽可能少用这个。github
#-- coding:utf-8 -- import time from datetime import datetime print (datetime.now()) #获取当前时间 time.sleep(10) #设置等待时间10s print(datetime.now()) #再次获取当前时间 代码很简单,主要是获取当前时候后设置了一个等待时间,而后在等待时间后面设置一个事物,这个事物来查看等待时间结束后的当前时间。经过执行结果咱们很好地看到只有执行完毕等待之后才会再次执行下一步骤。web
2.隐性等待(implicitly_wait())网络
隐式等待实际是设置了一个最长等待时间,若是在规定时间内网页加载完成,则执行下一步,不然一直等到时间结束,而后执行下一步。这样的隐式等待会有个坑,咱们都知道js通常都是放在咱们的body的最后进行加载,实际这是页面上的元素都已经加载完毕,咱们却还在等待所有页面加载结束。测试
from selenium import webdriver import time driver = webdriver.Chrome()
driver.implicitly_wait(20) # 隐性等待,最长等30秒
driver.get('https://www.baidu.com') time.sleep(3) driver.quit() 隐式等待对整个driver周期都起做用,在最开始设置一次就能够了。不要看成固定等待使用,到哪都来一下隐式等待。ui
3.显示等待方式(WebDriverWait) 就是明确的要等待的元素在规定的时间以内都没找到,那么就抛出Exception.代码示例以下:utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Firefox() driver.get('https://huilansame.github.io')
WebDriverWait(driver,20,0.5).until( EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
print driver.find_element_by_link_text('CSDN').get_attribute('href') driver.close()ci
WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)),selenium中的wait模块的WebDriverWait()方法,配合until或者until_not方法,再辅助以一些判断条件,就能够构成这样一个场景:每通过多少秒就查看一次locator的元素是否可见,若是可见就中止等待,若是不可见就继续等待直到超过规定的时间后,报超时异常;固然也能够判断某元素是否在规定时间内不可见等等的各类场景吧,须要根据你本身实际的场景选择判断条件;element
4.总结 隐式等待会等driver彻底加载完成(如js、css等);显示等待仅仅校验须要加载的元素是否存在;强制等待字面很好理解,就很少说。你们可根据需求自行选择。下期预告:selenium多窗口切换方法。
睿江云官网连接:https://www.eflycloud.com/home?from=RJ0037 ————————————————