问题思考
在日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢?
Toast简介**
Android中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。
Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,一般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast元素的(传说中低调奢华有内涵)。
Appium Toast内容获取
Add ability to verify TOAST messages (these can’t be interacted with, only text retrieval allowed)
Appium 1.6.3开始支持识别Toast内容,主要是基于UiAutomator2,因此需要在Capablity配置如下参数:
desired_caps['automationName']='uiautomator2'
安装appium-uiautomator2-driver: 安装命令如下:
cnpm install appium-uiautomator2-driver
安装成功后可以在 C:\Users\XXXX\node_modules看到对应的文件:
[email protected]@appium-uiautomator2-driver
[email protected]@appium-uiautomator2-server
安装selenium模块
pip install selenium
安装完成后使用如下命令检测是否安装成功
C:\Users\bella>pip show selenium
Name: selenium
Version: 2.48.0
Summary: Python bindings for Sele
Home-page: https://github.com/Sel
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Location: c:\python35\lib\site-pa
Requires:
Required-by: Appium-Python-Client
selenium模块安装****
测试环境
jdk版本:“1.8.0_05”
appium版本:1.7.2 (不能低于1.6.3)
selenium:3.11.0
测试设备:Android 5.1.1
Python:3.5
测试App:交易宝V6.05
测试场景
进入登录界面输入错误的用户名或者密码,获取Toast内容:
“用户名错误”
代码实现
jibaoyibao_get_toast.py
# coding=utf-8
from jiaoyibao.jiaoyibao_capability import driver
from selenium.webdriver.support.ui import WebDriverWait
driver.find_element_by_id('com.konsonsmx.iqdii:id/tvMMDL').click() # 切换密码登录按钮,用密码登录的方式登录交易宝
driver.find_element_by_id('com.konsonsmx.iqdii:id/et_account').clear() # 清空输入框的用户名
driver.find_element_by_id('com.konsonsmx.iqdii:id/et_account').send_keys('55555') # 得到用户名
driver.find_element_by_id('com.konsonsmx.iqdii:id/et_password').send_keys('123456keke') # 得到密码
driver.find_element_by_id('com.konsonsmx.iqdii:id/bt_login').click() # 点击登录按钮
error_message="用户名错误"
message='//*[@text=\'{}\']'.format(error_message)
toast_element=WebDriverWait(driver,5).until(lambda x:x.find_element_by_xpath(message))
print(toast_element.text)
附加代码:
jiaoyibao_capability.py
from appium import webdriver #导入appium包
from selenium.common.exceptions import NoSuchElementException
desired_caps={} #定义一个字典,用来存储capablity的相关信息
desired_caps['platformName']='Android' #设备平台的名称
desired_caps['deviceName']='127.0.0.1:62025' #设备名称
desired_caps['platforVersion']='5.1.1' #设备的版本号
desired_caps['app']=r'C:\Users\bella\Desktop\20180922\jiaoyibao.apk' #获取包路径
desired_caps['appPackage']='com.konsonsmx.iqdii' #获取包名
desired_caps['appActivity']='com.konsonsmx.market.module.base.ui.FlashADActivity' #获取activity启动
desired_caps['noReset']='true' #模拟用户非首次启动
desired_caps['unicodeKeyboard']="true" #登录用了中文,代码要做配置
desired_caps['resetKeyboard']="true" #重置键盘也要设置为true
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) #启动服务
driver.implicitly_wait(2) #启动后等待2秒
def check_skipBtn():
print("check_skipBtn")
try:
skipBtn = driver.find_element_by_id('com.konsonsmx.iqdii:id/tvCountDown')
except NoSuchElementException:
print('no skipBtn') #当没有这个元素就打印出no cancelBtn
else:
skipBtn.click() #存在这个元素就去点击
def check_loginBtn():
print("check_loginBtn")
try:
loginBtn = driver.find_element_by_id('com.konsonsmx.iqdii:id/ib_title_left')
except NoSuchElementException:
print('no loginBtn') #当没有这个元素就打印出no cancelBtn
else:
loginBtn.click() #存在这个元素就去点击
check_skipBtn()
check_loginBtn()
参考资料
Appium appium1.6.3 发布支持 toast 识别