编写这边文章之前,据我了解很多小伙伴面试时被问到ui自动化是怎么处理页面之间的等待的,很多都会说直接加秒数去等待,其实这种方法是非常不稳定的,我更推荐的是显性等待和隐性等待的用法,UI自动化的等待方式总共有三种,分别是强制等待、隐性等待、显性等待。以下分别给你们看看他们的区别:
1、强制等待
定义:强制性让代码等待XX时间,等待后继续执行下一步操作。通常都用time.sleep(XX)方法来表示强制等待,是由Python的内置time模块提供的方法,例如:time.sleep(5),意思是强制性等待5秒时间。
import time
#强制等待5s
time.sleep(5)
2、隐性等待
定义:设置最长的等待时间,等待页面元素加载完成,若在最长等待时间内完成加载,则继续下一步操作,若超过最长等待时间,则跳出等待继续下一步。当元素在所设置的最长等待时间内加载完成,就会直接进行下一步操作,此等待方式比强制等待更省时间和更加灵活,适用于每一个页面进行等待,此方法是全局的,只需要设置在开头即可,隐式等待的方法为:implicitly_wait,是调用了 selinium的webdriver.Chorme()里的implicitly_wait()方法。注:但是窗口切换的等待则不能引用隐性等待。
from selenium import webdriver
driver = webdriver.Chrome()
#隐性等待20s
driver.implicitly_wait(20)
driver.maximize_window()
3、显性等待
定义:在某个已设定的特定条件中,等待XX秒,每XX秒监测一次,若已达特定条件,则跳入下一步操作,若超过最大等待时间,则抛异常。此等待方式用到了selenium里的WebDriverWait类,参数timeout表示等待的最长时间,参数poll_frequency表示多少秒监测一次,该用法通常都是跟until()和until_not()一起使用的,until方法里的参数是条件。
from selenium.webdriver.support.wait import WebDriverWait
def wait_eleVisible(self,locator,doc="",timeout=20,poll_frequency=0.5):
log.logger.info("在{0} 等待元素{1}可见".format(doc,locator))
try:
# 开始等待时间
start_time = datetime.datetime.now()
# 等待操作
WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located(locator))
# 结束等待时间
end_time = datetime.datetime.now()
# 求一个差值,写在日志当中,等待了多久
wait_time = (end_time - start_time).microseconds
log.logger.info("等待结束,等待时长为{}ms".format(wait_time))
except Exception as e:
log.logger.exception("等待元素可见失败!!!-在{0} 等待元素{1}可见".format(doc,locator))
# 截图
self.save_screenshot(doc)
raise e