该篇文章主要用于整理的是在执行自动化测试过程中的几种元素等待方法
隐式等待:属于全局的等待,它不是针对某一个元素,而是针对当前session(即当前driver对象的生命周期)的全部元素,所以只需要在构造driver对象时设置一次即可。
如果不发送此命令,则驱动程序应默认为隐式等待0s
appium官方文档的隐式等待
self.driver.implicitly_wait(5) # waits 5 seconds
隐式等待一般与启动app的设置中,存放位置如下图所示:
强制等待:sleep()方法是python的time模块提供,所以需要导入:from time import sleep;当执行了sleep()方法后,会强制休眠,休眠的时间可以在括号中自己设置,括号里面的数字以秒为单位,例如休眠1秒:sleep(1),括号中也能用小数点表示,例如休眠1.5秒:sleep(1.5)
from time import sleep # 强制休眠1秒 sleep(1) # 强制休眠1.5秒 sleep(1.5)
wait_activity():判断需要执行的按钮所在页面的activity出现后,再对页面执行操作
#登录按钮所在的activity:com.tencent.mobileqq//.activity.LoginActivity # 设置等待100S,每隔2S刷新一次,等待登录按钮所在的activity页面出现,current_activity指的是当前的activity页面 driver.wait_activity(".activity.LoginActivity",100,interval=2) # 当前页面的activity AC = driver.current_activity print(AC)
注:如何获取当前页面的activity:cmd命令中输入:adb shell dumpsys activity activities
下图中红色框内的即表示当前页面的activity,下图为微博实例,所以当前页面的activity 为:com.sina.weibo/.SplashActivity
代码中做判断时可以简写为".SplashActivity"
该方法通过判断需要执行的按钮是否已经在页面中存在,若存在,则执行点击操作,若不存在,则输出内容
def check_LoginBtn(): """等待登录按钮出现后做点击操作""" print("check_LoginBtn is running") try: LoginBtn = driver.find_element_by_id("com.tencent.mobileqq:id/btn_login") except NoSuchElementException: print("LoginBtn Element no Exist!") else: LoginBtn.click() check_LoginBtn) #调用函数
显示等待:WebDriverWait是webdriver提供的方法,该类提供的until()和until_not()方法再根据判断条件excepted_conditions进行等待,until()方法在返回为Ture时中断等待,until_not()方法在返回值为False时中断等待。与implicity_wait()不同的是,显示等待是针对单个元素定位进行等待,每隔一段时间检查需要定位的元素是否加载完成,超过参数规定的时间仍未定位到该元素,则定位该元素失败,抛出异常。
1.格式:WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None) driver:webdriver的驱动程序,如(IE,FireFox,chrom) timeout:超时时间,默认以秒为单位 poll_frequency=0.5:休眠时间(步长)的间隔,默认为0.5秒,即检测元素是否存在的频率 ignored_exceptions=None:超时后的异常,默认情况下抛:"NOSuchElementException",可以定义忽略的异常信息
#lambda表达式相当于函数,表示在时长100秒内,直到找到这个id元素,就执行点击操作,WebDriverWait表示驱动 # WebDriverWait(driver,100).until(lambda driver:driver.find_element_by_id("com.tencent.mobileqq:id/btn_login")) # driver.find_element_by_id("com.tencent.mobileqq:id/btn_login").click() WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID,"com.tencent.mobileqq:id/btn_login"))) driver.find_element_by_id("com.tencent.mobileqq:id/btn_login").click()
#QQ演示WebDriverWait()元素等待 from appium import webdriver from time import sleep from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By desired_caps = {"platformName": "Android", "deviceName": "U4AIUKFAL7W4MJLR", "platforVersion": "9", "appPackage": "com.tencent.mobileqq", "appActivity": "com.tencent.mobileqq.activity.SplashActivity", "automationName": "UiAutomator2", "noRest": True } driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_caps) #登录id:com.tencent.mobileqq:id/btn_login #方式四:WebDriverWait #lambda表达式相当于函数,表示在时长100秒内,直到找到这个id元素,就执行点击操作,WebDriverWait表示驱动 # WebDriverWait(driver,100).until(lambda driver:driver.find_element_by_id("com.tencent.mobileqq:id/btn_login")) # driver.find_element_by_id("com.tencent.mobileqq:id/btn_login").click() WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID,"com.tencent.mobileqq:id/btn_login"))) driver.find_element_by_id("com.tencent.mobileqq:id/btn_login").click() #账号元素:class:android.widget.EditText #密码元素:id:com.tencent.mobileqq:id/password def check_LoginText(): """校验账号输入框是否存在""" print("check_LoginText is running") try: LoginText = driver.find_element_by_class_name("android.widget.EditText") except NoSuchElementException: print("LoginText Element no Exist!") else: LoginText.send_keys("111") driver.find_element_by_id("com.tencent.mobileqq:id/password").send_keys("222") def check_PwdText(): """校验密码输入框是否存在""" print("check_PwdText is running") try: PwdText = driver.find_element_by_id("com.tencent.mobileqq:id/password") except NoSuchElementException: print("PwdText Element no Exist!") else: PwdText.send_keys("222") check_LoginText() check_PwdText()