一.认识Toast提示框
Toast提示框是一种非模态弹窗,它弹出一个小信息,作为提醒或消息反馈来用,一般用来显示操作结果,或者应用状态的改变。例如你发出了一条短信,App弹出一个Toast提示你消息已发出。
最常见的Toast提示框为一句简短的描述性文字。这种样式的弹窗可以出现在页面的任何位置,可设置成在页面顶部、中部或者在底部出现(但一般都是出现在页面的中轴线上),具体的显示位置根据页面的整体设计进行设置。该种Toast在安卓App上十分常见。
还有一种Toast弹窗由简单的图形和简短的文字组成,显示位置一般位于页面正中央。这种Toast在iOS和安卓上都可以经常见到。
Toast提示框显示的时间较短,一般只有几秒种就会自动消失,因此我们用传统的定位工具是无法定位到该元素的,那么我们该如何获取这些元素文字内容呢?
Appium1.6.3开始支持识别toast,且是基于uiautomator2,因此需要搭建一下相关测试环境。
二.环境搭建
1.安装node js
进入官网下载:https://nodejs.org/en/ 下载node js安装。安装完成配置环境变量后验证:
$ npm -v
2.安装npm包
进行npm包的安装,此时可以将npm换成淘宝的镜像,可以提高程序运行速度,分享一下切换淘宝源的两种方法:
1.通过config命令
npm config set registry https://registry.npm.taobao.org
2.命令行方式(本文以此为例)
npm --registry https://registry.npm.taobao.org info underscore
3.安装uiautomator2
命令如下:
$ cnpm install appium-uiautomator2-driver
安装完成显示如下:
在安装目录下找到这两个文件就说明安装成功,安装目录可以按照上图标记的内容进行查找:
[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.-nimq.cn/LYgo20200303213454621pg8)(htts://img-blog.csdnimg.cn/20200303213454621.png)]
4.安装Selenium
命令如下:
$ pip install selenium
验证安装成功:
$ pip show selenium
PS:测试环境
jdk版本:1.8.0_241
appium版本:1.9.1 (不能低于1.6.3)
selenium:3.6.0
测试设备:Android 6.0.1
Python:3.6.2
测试App:作业帮
三.编辑识别toast元素的脚本
步骤一:初始化
在capability配置内部增加:
desired_caps['automationName']='Uiautomator2'
步骤二:定位toast元素
(1)定义toast文本内容
(2)定义路径
(3)组合文本内容和路径进行定位:用format()连接路径和文本内容
脚本:
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)
说明:
连接不同的类型的变量或内容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是函数的参数,冒号后面是函数的返回值
实例代码如下:
# coding:utf-8
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import os
PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__file__), p))
print(PATH("../zuoyebang_648.apk"))
des={
'platformName':'Android',
'platformVersion':'6.0.1',
'deviceName':'127.0.0.1:21305',
'appPackage': 'com.baidu.homework',
'appActivity':'com.baidu.homework.activity.index.IndexActivity',
'app':PATH("../zuoyebang_648.apk"),
'noReset': False,
# 输入中文参数配置
"unicodeKeyboard": True,
"resetKeyboard": True,
'automationName': 'Uiautomator2' # 捕获toast消息
}
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)
# 点击未登录按钮
driver.find_element_by_id("com.baidu.homework:id/rl_login_guide_layout").click()
# 点击密码登陆
driver.find_element_by_id("com.baidu.homework:id/sll_password").click()
# 设置隐式等待时间10s
driver.find_element_by_id("com.baidu.homework:id/passport_phone_number_input_edit").send_keys("11111111111")
# 输入密码
driver.find_element_by_id("com.baidu.homework:id/passport_password_input_view").send_keys("223duydy7y")
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.baidu.homework:id/tv_phone_enter")').click()
message='手机号未注册或者密码错误'
xx="//*[contains(@text,\'{}\')]".format(message)
ele=WebDriverWait(driver,10,).until(lambda c:c.find_element_by_xpath(xx),message="超时")
print(ele.text)