Python Appium自动化测试 toast提示
Time will tell.
1、Toast简介
Android 中的Toast
是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog
不一样的是,它永远不会获得焦点,无法被点击。
Toast
类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast
显示的时间有限,一般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast
元素的(传说中低调奢华有内涵)。
2、Appium Toast 内容获取
1.Appium 1.6.3 开始支持识别Toast
内容,主要是基于UiAutomator2
,因此需要在Capablity
配置如下参数:
'automationName':'uiautomator2'
或者:
desired_caps['automationName']='uiautomator2'
2.安装appium-uiautomator2-driver
安装命令如下:
cnpm install appium-uiautomator2-driver
安装成功后可以在 C:\Users\Administrator\node_modules
看到对应的文件:
_appium-uiautomator2-aaa@qq.com1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-aaa@qq.com1.10.0@appium-uiautomator2-server
3、测试环境
1.系统环境Windows 10版本 64位系统
2.jdk版本:1.8.0_181
3.appium版本:1.4.16
-
经查询 appium1.6.3 以上才能识别
toast
,之前安装 appium 版本是 1.4.X, 于是重整了测试环境。 -
更新 appium 到 1.6.3 以上,
java-client
版本最好是 5.x ,jdk 要用 1.8 、 selenium 要用 3.x ,其他版本不一定兼容,要自己亲测是否可用。 -
想识别
toast
,官网是这么说,因此为了不必要的麻烦折腾环境最好还是卸载低版本的 appium ,然后安装版本高于 1.6.3 的 appium 。appium 有两种安装方式:方法一:
使用下载地址:https://bitbucket.org/appium/appium.app/downloads/,可以下载 exe 应用,桌面程序,更适合新手,界面设置,更容易上手。如果不使用
UIAUTOMATOR2
等 appium 提供的新功能,不需要下载比较新的appium 。方法二:
已安装了
node.js
,可以使用 npm 命令安装 appium ,打开 cmd ,输入npm install -g appium
、回车,即可开始安装目前最新的版本,速度会比较慢,毕竟是国外的。如果不安装最新的使用命令:npm install -g aaa@qq.com,xxx 是版本号,如下载 appium1.6.3,命令为 npm install -g aaa@qq.com ,我是一开始使用方法一,之后发现几个功能 appium 要更新到 1.6.3 以上才支持,所以我目前版本更新到了 1.6.3+ 以上。
4.selenium:3.141.0
-
安装selenium:
-
输入指令 pip install selenium
-
验证安装成功:pip show selenium
5.测试设备:Android 5.1.1 (不能低于5.0版本)
6.Python:3.7.2
-
命令:python -V ,回车即可。
7.测试App:考研帮Android app V3.1.0
8.测试场景
-
进入登录界面输入错误的用户名或者密码,获取Toast内容:
“用户名或密码错误,你还可以尝试4次”
“验证失败次数过多,请15分钟后再试”
4、代码实现
步骤一:初始化
- 在
capability
配置内部增加:desired_caps[‘uiautomationName’]=’ uiautomator2’
步骤二:定位toast
元素
(1)定义toast
文本内容
(2)定义路径
(3)组合文本内容和路径进行定位:用format()
连接路径和文本内容
代码:
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
desired_caps = {'platformName': 'Android',
'platforVersion': '5.1.1',
'automationName': 'Uiautomator2',
'deviceName': '127.0.0.1:62001',
'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
'appPackage': 'com.tal.kaoyan',
'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
'noReset': 'True'}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(9)
try:
driver.find_element_by_id("android:id/button2").click()
except NoSuchElementException:
print(1)
try:
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
except NoSuchElementException:
print(2)
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
error_message = "用户名或密码错误,你还可以尝试3次"
limit_message = "验证失败次数过多,请15分钟后再试"
message = '//*[@text=\'{}\']'.format(error_message)
#message='//*[@text=\'{}\']'.format(limit_message)
toast_element = WebDriverWait(driver, 15).until(lambda x:x.find_element_by_xpath(message))
print(toast_element.text)
说明:
连接不同的类型的变量或内容format()
显示等待:webdriver(driver,5)
driver 是 webdriver 的驱动程序,5是超时时间,以秒为单位
WebDriverWait()
一般由 until()
或until_not()
方法配合使用,下面是until()
和 until_not()
方法的说明。
until(method, message=’’)
调用该方法提供的驱动程序作为一个参数,直到返回值不为 False
。
until_not(method, message=’’)
调用该方法提供的驱动程序作为一个参数,直到返回值为False
。
动态函数:lambda x:x+5
X是函数的参数,冒号后面是函数的返回值
5、封装 toast 判断
1.单独写一个函数来封装判断是否存在toast
消息,存在返回True
,不存在返回False
。
def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
'''
is toast exist, return True or False
:Agrs:
- driver - 传driver
- text - 页面上看到的文本内容
- timeout - 最大超时时间,默认30s
- poll_frequency - 间隔查询时间,默认0.5s查询一次
:Usage:
is_toast_exist(driver, "看到的内容")
'''
try:
toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
return True
except:
return False
封装后代码参考:
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
# 3.导入模块
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
desired_caps = {'platformName': 'Android',
'platforVersion': '5.1.1',
'automationName': 'Uiautomator2',
'deviceName': '127.0.0.1:62001',
'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
'appPackage': 'com.tal.kaoyan',
'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
'noReset': 'True'}
def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
'''
is toast exist, return True or False
:Agrs:
- driver - 传driver
- text - 页面上看到的文本内容
- timeout - 最大超时时间,默认30s
- poll_frequency - 间隔查询时间,默认0.5s查询一次
:Usage:
is_toast_exist(driver, "看到的内容")
'''
try:
toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
return True
except:
return False
if __name__ == "__main__":
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.implicitly_wait(9)
try:
driver.find_element_by_id("android:id/button2").click()
except NoSuchElementException:
print(1)
try:
driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
except NoSuchElementException:
print(2)
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')
driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
error_message = "用户名或密码错误,你还可以尝试3次"
limit_message = "验证失败次数过多,请15分钟后再试"
print is_toast_exist(driver, error_message)
6、结尾
1.Toast
内容为中文时,顶部必须注释# coding=utf-8
否则会因为编解码导致文字识别失败。
2.用 npm 安装appium-uiautomator2-driver
,会出现错误,卡顿之后安装不成功。
解决办法:
(1)首先执行这个命令:npm install -g cnpm --registry=https://registry.npm.taobao.org 安装 cnpm 完成后如图:
(2)然后通过这个命令: cnpm install appium-uiautomator2-driver 安装uiautomator2的配置文件,如图:
3.cnpm与npm的区别:
(1)npm介绍
说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)
(2)使用npm安装插件:命令提示符执行npm install [-g] [–save-dev]
:node插件名称。
例:npm install gulp-less –save-dev
-
g:全局安装。
将会安装在 C:\Users\Administrator\AppData\Roaming\npm ,并且写入系统环境变量; 非全局安装:将会安装在当前定位目录; 全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules
文件夹下,通过require()
调用; -
save:将保存配置信息至
package.json
(package.json是nodejs项目配置文件); -
dev:保存至
package.json
的devDependencies
节点,不指定-dev
将保存至dependencies
节点;为什么要保存至
package.json
?因为node
插件包相对来说非常庞大,所以不加入版本管理,将配置信息写入package.json
并将其加入版本管理,其他开发者对应下载即可(命令提示符执行npm install
,则会根据package.json
下载所有需要的包)。
(3)使用 npm 卸载插件:npm uninstall [-g] [–save-dev] (不要直接删除本地插件包 )
(4)使用npm更新插件:npm update [-g] [–save-dev]
(5)更新全部插件:npm update [–save-dev]
(6)查看npm帮助:npm help
(7)查看当前目录已安装插件:npm list
解决办法:
选装 cnpm
说明:因为 npm 安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果 npm 的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org
镜像,你可以用此代替官方版本(只读),同步频率目前为10分钟 一次以保证尽量与官方服务同步。”
官方网址:http://npm.taobao.org
安装:命令提示符执行npm install cnpm -g –registry=https://registry.npm.taobao.org
注:安装完后最好查看其版本号 cnpm -v 或关闭命令提示符重新打开,安装完直接使用有可能会出现错误 。
注:cnpm 跟 npm 用法完全一致,只是在执行命令时将 npm 改为 cnpm 。
好了,至此,有关toast
提示,就给分享到这里,如果你对更多内容、Python 自动化软件测试、面试题感兴趣的话可以加入我们175317069一起学习。群里会有各项测试学习资源发放,更有行业深潜多年的技术人分析讲解。
祝你能成为一名优秀的软件测试工程师!
欢迎【点赞】、【评论】、【关注】~
Time will tell.(时间会证明一切)
上一篇: 面对复杂业务,if-else coder 如何升级?
下一篇: Dell笔记本重装Win10系统