在我们日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这样的提示框称之为Toast提示框,这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢?
Toast简介
- Android中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和弹出框不一样的是,它永远不会获得焦点,无法被点击。
- Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,一般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast元素的。
实例
测试环境
- JDK:1.8.0_171
- appium版本:1.7.2(不能低于1.6.3)
- selenium版本:3.141.0
- 测试设备:Android 7.0
- Python:3.5
- 测试App:鼠贷金融 Android app V4.2.9
Appium Toast内容获取
Appium 1.6.3开始支持识别Toast内容,主要是基于UiAutomator2,
因此需要在Capablity配置如下参数:
desired_caps['automationName']='uiautomator2'
安装appium-uiautomator2-driver: 安装命令如下:
cnpm install appium-uiautomator2-driver
安装成功后可以在 C:\Users\XXXX\node_modules看到对应的文件:
- _appium-uiautomator2-driver@1.23.0@appium-uiautomator2-driver
- _appium-uiautomator2-server@2.6.0@appium-uiautomator2-server
测试场景
进入登录界面输入错误的用户名或者密码,获取Toast内容:
- 没有找到用户名或密码
代码实现
# coding=utf-8
from appium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
# 真机
desired_caps = {
"platformName": "Android",
"platformVersion": "7.0",
"deviceName": "Honor NOTE 8",
"udid": "8DF6R16728706566",
"appPackage": "com.jinding.shuqian",
"appActivity": "com.jinding.shuqian.WelcomeActivity",
"noReset": 'true',
# appium高版本已经会自动切换UiAutomator2。所以可以不用指定
'automationName': 'uiautomator2'
}
# 连接
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(2)
print('元素检测')
# 用于检测是否是第一次打开APP(第一次打开APP会有引导页)
try:
# 定位我的
my = driver.find_element_by_id('com.jinding.shuqian:id/rb_center')
except Exception as e:
print('未找到元素')
else:
# 点击我的
my.click()
# 输入用户名
driver.find_element_by_id('com.jinding.shuqian:id/et_login_username').send_keys('123')
# 输入密码
driver.find_element_by_id('com.jinding.shuqian:id/et_login_password').send_keys('aaaaaa')
# 点击登录
driver.find_element_by_id('com.jinding.shuqian:id/button_login').click()
# 用于生成xpath定位 相当于 "//*[@text='没有找到用户名或密码']"
toast_message = "没有找到用户名或密码"
message ='//*[@text=\'{}\']'.format(toast_message)
# 获取toast提示框内容
toast_element = WebDriverWait(driver,5).until(lambda x:x.find_element_by_xpath(message))
print(toast_element.text)
assert toast_element.text == "没有找到用户名或密码"
注意:Toast内容为中文时,顶部必须注释# coding=utf-8 否则会因为编解码导致文字识别失败。