写UI自动化脚本时候,总会出现使用appium的报错,没有找到元素, (An element could not be located on the page using the given search parameters.)
很多原因是,app未加载完成,我们代码就已经执行了该元素的操作指令.
为了搞明白如何规避此类报错,建议大家可以看看我如何解决,或查找下,appium的三种等待方式,
我使用了显性等待方式:
显式等待 WebDriverWait(driver,等待时间,多长时间刷新一次,默认0.5s),该等待中有两个方法
until(元素位置,需要传一个元组,元组中有两个值,一个是定位位置方式,一个是定位的元素),
until_not()用法和until一样
until() 判断,直到返回值为true,执行下一步
nutil_not 判断,直到返回值为false 执行下一步
等待元素加载完成后继续,如果规定时间没有加载完成,继续执行下一步
需要导入的包:
from appium import webdriver
from selenium.webdriver.common.by import By #定位
from selenium.webdriver.support.wait import WebDriverWait #导入显性等待的包
下方展示如何定位:
使用ID去定位查找元素,使用nutil_not 判断,总查找30s,每0.5s检索一次,当元素消失,则返回false, 继续执行下一步,如果一直为True,超过三十秒则会异常.异常可用try去控制
WebDriverWait(driver, 30, 0.5).until_not(lambda el2: driver.find_element(By.ID, "iv_ble_offline")) #until_not 返回结果为false
如果想使用until定位为同理:
使用XPATH去定位查找元素 ,总查找30s,每0.5s检索一次,当元素存在,则返回True,继续执行下一步,此方式适用于很多场景,包括app加载还没有完成,元素还没有出现,当然你也可以使用其他方式定位都是可以,只要lambda表达式写的没错 都行.
WebDriverWait(driver, 30, 0.5).until(lambda el2: driver.find_element(By.XPATH, acc))
以下我展示我使用此方法的完整代码
def JXB(self):
try:
driver = webdriver.Remote('http://localhost:4723/wd/hub', camera_Tuya_app)
# print('开启机械臂app')
time.sleep(6)
WebDriverWait(driver, 30, 0.5).until_not(lambda el2: driver.find_element(By.ID, "iv_ble_offline")) #until_not 返回结果为false
driver.find_element(By.XPATH,"//*[@content-desc='ty_home_device_name']").click()
WebDriverWait(driver, 30, 0.5).until(lambda el2: driver.find_element(By.XPATH, acc))
driver.find_element(By.XPATH,acc).click()
keys_time =time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print('按门铃成功'+keys_time)
keys_time_l.append(keys_time)
# time.sleep(30)
except:
print('可控崩溃,5s重新开启')
time.sleep(5)
return self.JXB()