个人博客:https://blog.csdn.net/zyooooxie
一)toast消息 获取及断言
什么是Toast?
在屏幕下方浮现出一个窗口,显示一段时间后又消失,这个可视化组件叫做 Toast,它主要用于提示用户某种事件发生了。如图3、图4
图3是 对某车牌操作成功后的提示
图4是 登录成功后的提示
Appium 官方文档:
Supported Platforms
Appium supports app automation across a variety of platforms, like iOS, Android, and Windows. Each platform is supported by one or more “drivers”
其中 Android
(BETA) The Espresso Driver
The UiAutomator2 Driver
(DEPRECATED) The UiAutomator Driver
(DEPRECATED) The Selendroid Driver
对Android 想定位toast元素,这里一定要注意automationName的参数是Uiautomator2才能定位到。
故而需要在最初的配置增加此项:desired_caps[“automationName”] = ‘Uiautomator2’
def get_toast(self, text):
try:
WebDriverWait(self.driver, 10, 0.05).until(
EC.presence_of_element_located((By.XPATH, '//*[contains(@text, "%s")]' % text[1:3])))
print('可以找到这个toast')
except Exception:
print('找不到这个toast')
这是我写的一个方法,只为了 能不能找到toast:
- 因为toast的存在时间还算比较久(2-3秒总有的),所以可以把显式等待的间隔查询时间设置大一点,像0.5秒;我是用这个0.05秒的间隔时间去查找 后面例子的‘正在刷新’和‘刷新完成’的
- 我最初又掉进‘经验主义’的坑:我要定位这toast,那我总得使用uiautomatorviewer或inspector来定位知道它的属性值啊,使用uiautomatorviewer始终没找到,我就无奈了。直到朋友提醒我,才醒悟:元素的text的属性值应该就是它的提示,完全就可以用xpath来完成定位;’//*[@text=“XXXX”)
- ‘//*[contains(@text, “%s”)]’ % text[1:3] 截取传入text的第二三位的值 作为定位toast的依据;我是想做断言的,用我传入的text值去定位 然后再作为断言的依据,感觉有点不太好,所以才会用 部分text 来定位,再用获取的text和传入的做断言。
如果我想做断言呢?
def toast_duanyuan(self, text):
"""这儿对于一闪而过的,就经常在第二次去找元素,想拿来某属性做断言;找不到的 就提示 + 断言失败"""
duanyuan = True
try:
WebDriverWait(self.driver, 10, 0.05).until(EC.presence_of_element_located((By.XPATH, '//*[contains(@text, "%s")]' % text[1:3])))
print('可以找到这个toast')
except Exception:
print('找不到这个toast')
duanyuan = False
if duanyuan is True:
self.assertEqual(self.driver.find_element_by_xpath('//*[contains(@text, "%s")]' % text[1:3]).get_attribute('text'), text, '但是 text断言失败了')
print('text属性值 断言成功')
else:
self.assertTrue(duanyuan, '断言失败')
这方法对于一闪而过的提示(或元素) 不保证能正常断言。
但是第二次去查找元素获取text属性值,可以用driver.find_element_by_android_uiautomator(‘textContains("%s")’ % text[1:3]).get_attribute(‘text’),会比起xpath定位略微更快。
二)刷新提示语 捕获
前面例子说的一闪而过的提示 即 本例:在很多新闻资讯类app或朋友圈等情景中(下方 图1、图2),往往会有下拉刷新的设计
不推荐给这个提示 作断言;太费力不讨好。如果非想确定到底有没有刷新成功,建议是确定 这个‘刷新完成’的提示 存在,就结束。
‘正在刷新’ ‘刷新完成’ 这也就是我为什么将前面写的方法中 text【1:3】 text截取第二三位,确保绝对不同(截取‘刷新’,有可能就判断成另一个)
交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie