日常使用中我们会发现每一个app都会有大量的toast信息弹窗,比如登录提示、检查更新等。
所以我们在做app自动化的时候也必然会大量遇到
之前appium是不支持toast识别的,只能采用指定截图的方式接入OCR去判断,非常麻烦
自这几个版本的appium升级以来现在可以抛弃上面的做法,已经可以支持了
实现是非常简单的,但是坑也不少,还是可能存在部分的toast无法等待到等情况
因为一般用例设计上 获取toast信息也不是一个必须的过程
建议这部分的用例(特别是流程测试用例)最好使用异常捕获,若万一抛出异常了不要影响剩下的流程进展
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy as MB
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
caps = {}
caps["automationName"] = "uiautomator2" # 若需要进行toast的定位,只能使用uiautomator2的测试引擎框架
caps["platformName"] = "Android"
caps["platformVersion"] = "7.1.2"
caps["deviceName"] = "emulator-5554"
caps["appPackage"] = ""
caps["appActivity"] = ""
caps["noReset"] = True
driver = webdriver.Remote(desired_capabilities=caps)
def get_toastMsg(part_str):
"""
:param part_str: 传入用于识别的部分连续文本
:return:
"""
xpath = '//*[contains(@text,"{}")]'.format(part_str) # 因为toast信息无法从source里面获得,所以只能选择用xpath进行定位
try:
WebDriverWait(driver, 10, 0.01).until(EC.presence_of_element_located((MB.XPATH, xpath))) # toast出现的时间比较短,所以要轮询的频率,而且因为toast的特殊原因,只能使用元素存在进行等待(presence_of_element_located)
toast = driver.find_element(MB.XPATH, xpath)
print("已找到toast:{}".format(toast.text))
return toast # 返回出元素对象,与具体操作解耦
except:
print("无法找到toast")
raise