该篇文章主要用于整理的是在执行自动化测试过程中的几种元素等待方法
隐式等待:属于全局的等待,它不是针对某一个元素,而是针对当前 session(即当前 driver 对象的生命周期)的全部元素,所以只需要在构造 driver 对象时设置一次即可。
如果不发送此命令,则驱动程序应默认为隐式等待 0s
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()