Appium+python自动化(二十六)- Toast提示(超详解)简介

news2024/9/21 6:05:49

开始今天的主题 - 获取toast提示
在日常使用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)
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-driver@1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-server@1.10.0@appium-uiautomator2-server

测试环境

1.我的系统环境是Windows 10版本 64位系统

2.jdk版本:"1.8.0_181"

3.appium版本:1.4.16

经查询appium1.6.3以上才能识别toast,之前安装appium版本是1.4.X,于是重整了测试环境

官方文档是这么说的

Firstly you should install appium server. Appium getting started. The version 1.6.3 or greater is recommended.

Since version 5.x there many features based on Java 8. So we recommend to install JDK SE 8 and provide that source compatibility.

也就是更新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应用,桌面程序,更适合新手,界面设置,更容易上手,但是目前appium已经更新1.6.3+,以上下载地址还没更新最新的上去。如果不使用UIAUTOMATOR2等appium提供的新功能,不需要下载比较新的ppium,

        方法二:

      已安装了node.js,可以使用npm命令安装appium,打开cmd,输入npm install -g appium,回车,即可开始安装目前最新的版本,速度会比较慢,毕竟是国外的,如果不安装最新的使用命令:npm install -g appium@xxx,xxx是版本号,如下载appium1.6.3,命令为npm install -g appium@1.7.0,我是一开始使用方法一,之后发现几个功能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分钟后再试”

代码实现

步骤一:初始化

在capability配置内部增加:desired_caps[‘uiautomationName’]=’ uiautomator2’

步骤二:定位toast元素

(1)定义toast文本内容

(2)定义路径

(3)组合文本内容和路径进行定位:用format()连接路径和文本内容

参考代码

 1 # coding=utf-8
 2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 # 2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-7-31
 7 @author:潇潇说测试
 8 Project:学习和使用appium自动化测试-toast提示
 9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from selenium.common.exceptions import NoSuchElementException
13 from selenium.webdriver.support.ui import WebDriverWait
14 from selenium.webdriver.support import expected_conditions as EC
15 
16 desired_caps = {'platformName': 'Android',
17                 'platforVersion': '5.1.1',
18                 'automationName': 'Uiautomator2',
19                 'deviceName': '127.0.0.1:62001',
20                 'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
21                 'appPackage': 'com.tal.kaoyan',
22                 'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
23                 'noReset': 'True'}
24 
25 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
26 driver.implicitly_wait(9)
27 try:
28     driver.find_element_by_id("android:id/button2").click()
29 except NoSuchElementException:
30     print(1)
31 try:
32     driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
33 except NoSuchElementException:
34     print(2)
35 driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
36 driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')
37 
38 driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
39 driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
40 
41 error_message = "用户名或密码错误,你还可以尝试3次"
42 limit_message = "验证失败次数过多,请15分钟后再试"
43 
44 message = '//*[@text=\'{}\']'.format(error_message)
45 #message='//*[@text=\'{}\']'.format(limit_message)
46 
47 toast_element = WebDriverWait(driver, 15).until(lambda x:x.find_element_by_xpath(message))
48 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是函数的参数,冒号后面是函数的返回值

封装toast判断

1.单独写一个函数来封装判断是否存在toast消息,存在返回True,不存在返回False

 1 def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
 2 
 3    '''is toast exist, return True or False
 4 
 5    :Agrs:
 6 
 7     - driver - 传driver
 8 
 9     - text   - 页面上看到的文本内容
10 
11     - timeout - 最大超时时间,默认30s
12 
13     - poll_frequency  - 间隔查询时间,默认0.5s查询一次
14 
15    :Usage:
16 
17     is_toast_exist(driver, "看到的内容")
18 
19    '''
20 
21    try:
22 
23        toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
24 
25        WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
26 
27        return True
28 
29    except:
30 
31        return False

封装后参考代码

 1 # coding=utf-8
 2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 # 2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-7-31
 7 @author: 潇潇说测试
 8 Project:学习和使用appium自动化测试-toast提示
 9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from selenium.common.exceptions import NoSuchElementException
13 from selenium.webdriver.support.ui import WebDriverWait
14 from selenium.webdriver.support import expected_conditions as EC
15 
16 desired_caps = {'platformName': 'Android',
17                 'platforVersion': '5.1.1',
18                 'automationName': 'Uiautomator2',
19                 'deviceName': '127.0.0.1:62001',
20                 'app': r'C:\Users\DELL\Downloads\kaoyanbang.apk',
21                 'appPackage': 'com.tal.kaoyan',
22                 'appActivity': 'com.tal.kaoyan.ui.activity.SplashActivity',
23                 'noReset': 'True'}
24 
25 def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
26 
27    '''is toast exist, return True or False
28 
29    :Agrs:
30 
31     - driver - 传driver
32 
33     - text   - 页面上看到的文本内容
34 
35     - timeout - 最大超时时间,默认30s
36 
37     - poll_frequency  - 间隔查询时间,默认0.5s查询一次
38 
39    :Usage:
40 
41     is_toast_exist(driver, "看到的内容")
42 
43    '''
44 
45    try:
46 
47        toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
48 
49        WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
50 
51        return True
52 
53    except:
54 
55        return False
56 if __name__ == "__main__":
57        
58     driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
59     driver.implicitly_wait(9)
60     try:
61         driver.find_element_by_id("android:id/button2").click()
62     except NoSuchElementException:
63         print(1)
64     try:
65         driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
66     except NoSuchElementException:
67         print(2)
68     driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
69     driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').send_keys('bjhongge')
70 
71     driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('1213213')
72     driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
73 
74     error_message = "用户名或密码错误,你还可以尝试3次"
75     limit_message = "验证失败次数过多,请15分钟后再试"
76 
77     print is_toast_exist(driver, error_message)

 小结

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] 
PS:不要直接删除本地插件包 
(4)使用npm更新插件:npm update [-g] [–save-dev] 
(5)更新全部插件:npm update [–save-dev] 
(6)查看npm帮助:npm help 
(7)查看当前目录已安装插件:npm list

PS:npm安装插件过程:从http://registry.npmjs.org下载对应的插件包(该网站服务器位于国外,所以经常下载缓慢或出现异常),

解决办法:

选装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。

4.好了,至此,有关toast的提示,就给小伙伴们和童鞋们方向到这里,谢谢你耐心的阅读!


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Ail Linux中手动配置IPv6

第一步,登录阿里云服务器控制台,在“概览”页面找到对应实例,然后单击实例ID。 第二步,在“实例详情”页面中的“网络信息”栏目中,可以发现“IPv6 地址”中没有数据,然后单击“专有网络”的专有网络ID。 第…

(学习笔记-系统结构)Linux内核与windows内核

内核 计算机是由各种外部硬件设备组成的,比如内存、CPU、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只关心…

Docker 容器基础操作

Docker容器基础操作 容器(container)是Docker镜像的运行实例,类似于可执行文件与进程的关系,Docker是容器引擎,相当于系统平台。 容器的生命周期 容器的基础操作(以 tomcat8.0 为例) # 拉取tomcat8.0镜像 [root@tudou tudou]# docker pull tomcat:8.0 8.0: Pulling f…

【山河送书第四期】:《Python之光:Python编程入门与实战》参与活动,免费送书五本!!

【山河送书第四期】:《Python之光:Python编程入门与实战》参与活动,免费送书五本!! 书本简介本书亮点配套丰富购买链接参与方式往期赠书回顾: 书本简介 作为一种极其流行的编程语言,Python已经…

评测报告的结论如何写?

背景 最近组内同学开始编写评测报告,报告中的结论中存在以下几种情况: 1.结论是一大段文字,像散文一样 2.评测数据结果中存在多个数据维度,将所有的数据结果都罗列到结论中,主要信息不突出 3.只是将评测数据罗列到…

QT多线程编程基础

文章目录 前言一、线程,进程 介绍二、创建线程三、终止线程总结 前言 一、线程,进程 介绍 线程: 是操作系统中独立运行的最小单位。每个线程都有自己的执行路径、程序计数器、堆栈和一组寄存器。线程共享进程的资源,如内存和文件…

突破AI医疗对话MDS瓶颈,深兰科技·科学院论文被国际顶会SIGIR 2023收录

7月23日~27日,人工智能领域智能信息检索方向最权威的国际会议“第46届国际计算机学会信息检索大会”(SIGIR 2023)在中国台湾省台北市举行。大会公布了投稿论文入选名单,由深兰科技科学院多名科技研发人员合力撰写的论文《MDKG:基于…

【ADS】导入CMOS衬底文件+使用coilsys生成电感

新建工程经常忘记怎么操作,简记防遗忘。 操作步骤 1.unzip file2.原理图仿真3.Layout加载衬底文件4.使用coilsys生成电感 1.unzip file designKits-》unzip,选择对应库的压缩包,我这里是(TSMC_CRN65GP_v2.zip)。 为了…

MySQL碎片清理

为什么产生? 经过大量增删改的表,都可能存在碎片 MySQL数据结构是B树, 删除某一记录,只会标记为删除,后续插入一条该区间的记录,就会复用这个位置。 删除整个数据页的记录,则整个页标记为“可…

C语言getchar函数和putchar函数

getchar()是输入字符的函数 putchar是输出字符的函数 需要包含头文件&#xff1a;<stdio.h>

关于avs和avs2编码stuffing bit的一点理解

avs和avs2编码标准关于结尾有一点和h264的不同。 比如一段视频通过avsx编码后&#xff0c;如果最后1位是字节对齐的&#xff08;也就是说编码后的流刚好是8*n bit&#xff09;&#xff0c;那么就要在最后1bit后面再增加一字节0x80(1000 0000). 如果最后1bit没有对齐&#xff0c…

封装 vue3 入场动画 插件 并发布到 npm

准备 vue create entry-animate 只需要简单的项目框架即可&#xff0c;router\vuex 都不用&#xff1b; 封装过程 src 目录下新建 package&#xff0c;package文件夹是存放我们封装的组件的&#xff1b;还需要加一个入口文件&#xff0c;在 package 中加一个 index.js 文件&a…

BHQ-2 Maleimide,BHQ2 马来酰亚胺,用于检测生物分子的存在和浓度变化

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ BHQ-2 Mal&#xff0c;BHQ2 Maleimide&#xff0c;BHQ-2 马来酰亚胺 PART1----​Product structure&#xff1a; PART2----​Product specifications&#xff1a; 1.CAS No&#xff1a;N/A 2.Molecular formula&#xff1…

linux跑代码,程序终止了,但资源没有释放。

linux跑代码&#xff0c;程序终止了&#xff0c;但资源没有释放。 程序终止&#xff0c;但是资源没有释放. kill -9 5062完成。 linux终止进程

Aspose.cell excel转pdf日期格式不正确yyyy/MM/dd变成MM/dd/yyyy

最近使用Aspose.cell将excel转pdf过程中excel中时间格式列的显示和excel表里的值显示不一样。 excel里日期格式 yyyy/MM/dd pdf里日期格式MM/dd/yyyy 主要原因&#xff1a;linux和windows里内置的时间格式不一致&#xff0c;当代码部署到linux服务器的时候转换格式就会发生不一…

独立站不能忽略的小细节

一个产品最重要的地方就是细节&#xff0c;正所谓细节决定成败&#xff0c;做好细节消费者才感到自己被重视而不是被敷衍&#xff0c;才愿意下单买商家的产品。做独立站的时候&#xff0c;我们也应该去思考以下四个小细节&#xff0c;自己是否有好好注意呢&#xff1f; 1、网站…

龙芯3A5000板卡在高性能工作站的应用方案-迅为电子

将龙芯3A5000应用于高性能工作站时&#xff0c;可以考虑以下方案&#xff1a; 多核计算能力&#xff1a;龙芯3A5000拥有多核心处理器&#xff0c;具备强大的计算能力。在高性能工作站中&#xff0c;可以利用多核心的处理能力来支持复杂的工程设计、科学计算和数据处理任务。…

springboot配置自定义数据源(Druid德鲁伊)的步骤。

今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤。 方法一&#xff1a; 1.在pom.xml配置依赖(注释里面的内容) 2.配置自己的数据源设置&#xff0c;我是在yaml文件中配置的&#xff0c;顺便提醒一下&#xff0c;在配置yaml文件的时候缩进问题一定要注意…

河南省委网信办副主任赵小平一行莅临麒麟信安调研

7月5日下午&#xff0c;河南省委网信办副主任赵小平、河南省委网信办网络安全协调处处长刘宝献、河南省委网信办网络安全协调处副处长马芊培、河南省委网信办网络安全协调处干部李阳、河南省委网信办综合处干部韩飞等领导一行莅临麒麟信安调研网络安全产业相关情况。湖南省委网…

危险的指针---字符指针和字符数组指针所导致的段错误

前言 &#xff08;1&#xff09;今天在编写采用平台总线模型的LED点灯程序时候&#xff0c;发现每次装载驱动&#xff0c;都会报如下错误&#xff0c;最后一行报错说段错误。 &#xff08;2&#xff09;我一开始以为是因为自己的平台总线模型写错了&#xff0c;花了很长时间进行…