自动化之显示等待
显式等待是appium中webdriver用于同步测试的另外一种等待机制。显式等待比隐式等待具备更好的操控性。 ,与隐式等待不同,我们可以为脚本设置一些预置或者定制化的条件,等待条件满足后再近些下一步测试。
在使用场景上,隐式等待用来做一个全局的控制,例如设置全局隐式等待6秒;显式等待可以只作用于仅有同步需求的测试用例,它可以只针对某一个元素进行等待。
webdriver提供了WebDriverWait类来实现显式等待,配合该类的until()和until_not()方法,在设置的时间内,默认每隔一段时间去检测一次当前页面下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔一段时间去判断,指定时间截止,如果超时就会抛出异常(TimeoutException)。具体格式如下:
WebDriverWait(driver,timeout=10,poll_frequency=0.5,ignored_exceptions=None)
- driver:webdriver实例
- timeout:最长超时时间,默认以秒为单位
- poll_frequency:检测的时间间隔,默认为0.5秒
- ignored_exceptions:超时后的异常信息,默认情况下抛出TimeoutException异常
#调用该方法提供的驱动程序作为一个参数,直到返回值为True until(method,message='') #调用该方法提供的驱动程序作为一个参数,直到返回Fasle until_not(method,message="")
如下所示:
WebDriverWait(driver,timeout=10,poll_frequency=0.5,\ ignored_exceptions=None).until(lambda x :x.find_element_by_id("resource_id"))
实例:
from appium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException import time from selenium.webdriver.support.wait import WebDriverWait desired_caps = { 'platformName': 'Android', 'platformVersion': '6.0.1', 'deviceName': '127.0.0.1:21305', 'appPackage': 'com.baidu.homework', 'appActivity': 'com.baidu.homework.activity.index.IndexActivity', 'automationName': 'Appium', 'noReset': False, # 输入中文参数配置 "unicodeKeyboard": True, "resetKeyboard": True, } driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) def zuoyebang_login(un="zuoyebang", pw="zuoyebang!test"): # 点击未登录按钮 driver.find_element_by_id("com.baidu.homework:id/rl_login_guide_layout").click() # 点击密码登陆 driver.find_element_by_id("com.baidu.homework:id/sll_password").click() #设置隐式等待时间10s try: # 输入用户名 print(time.strftime('%H:%M:%S', time.localtime(time.time()))) us=WebDriverWait(driver, timeout=10, poll_frequency=0.5).until(lambda x: x.find_element_by_id("com.baidu.homework:id/passport_phone_number_input_edit0"),message='用户名输入框定位超时') us.send_keys("un") # 输入密码 driver.find_element_by_id("com.baidu.homework:id/passport_password_input_view").send_keys(pw) except TimeoutException as e: print(e) print(time.strftime('%H:%M:%S', time.localtime(time.time()))) if __name__ == '__main__': # 调用登陆方法 zuoyebang_login()