在日常使用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()连接路径和文本内容

参考代码

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 False4 5    :Agrs:6 7     - driver - 传driver8 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

封装后参考代码

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。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信号与系统三】离散时间傅里叶变换

上一讲我们讲述了连续时间傅里叶变换,这一讲同理来个离散时间傅里叶变换。 和上讲模块类似 5.1离散时间傅里叶变换 这一式子就是离散时间傅里叶变换对 5.2周期信号的傅里叶变换 同理,由于之前第一讲讲到: 可以推出: 举个例子&am…

Python应用石头剪刀布练习初解

大家好!作为 Python 初学者,寻找一个既简单又有趣的项目来练习编程技能是至关重要的。今天,我将向大家介绍一个经典的编程练习——石头剪刀布游戏,它可以帮助你掌握 Python 的基本概念,如条件语句、随机数生成和用户输入处理等。 …

私有规则库:企业合规与安全的终极防线

2.1 为什么企业需要私有规则库?——合规与安全的最后防线 真实案例:2023年某跨境电商因员工泄露内部检测规则,导致黑产绕过风控系统,损失1200万+ 企业规则库的三大刚需: 行业合规: 金融行业需符合《个人金融信息保护技术规范》 医疗行业需满足HIPAA患者数据脱敏要求 业…

长尾关键词优化SEO核心策略

内容概要 本文旨在系统解析长尾关键词在搜索引擎优化中的核心地位,为读者提供从理论到实践的全面指南。文章首先探讨长尾关键词的基础作用,帮助理解其在提升网站流量质量中的价值。接着,深入介绍精准定位低搜索量、高转化率关键词的策略&…

腾讯云事件总线:构建毫秒级响应的下一代事件驱动架构

摘要 事件总线(EventBridge)作为云原生架构的核心枢纽,其性能与可靠性直接影响企业系统弹性。腾讯云事件总线基于TGW云网关底层能力重构,实现单节点吞吐量提升125%、故障恢复时间降至4秒级(行业平均>30秒&#xff0…

PyTorch 中mm和bmm函数的使用详解

torch.mm 是 PyTorch 中用于 二维矩阵乘法(matrix-matrix multiplication) 的函数,等价于数学中的 A B 矩阵乘积。 一、函数定义 torch.mm(input, mat2) → Tensor执行的是两个 2D Tensor(矩阵)的标准矩阵乘法。 in…

Qt 解析复杂对象构成

Qt 解析复杂对象构成 dumpStructure 如 QComboBox / QCalendarWidget / QSpinBox … void Widget::Widget(QWidget* parent){auto c new QCalendarWidget(this);dumpStructure(c,4); }void Widget::dumpStructure(const QObject *obj, int spaces) {qDebug() << QString…

山姆·奥特曼:从YC到OpenAI,硅谷创新之星的崛起

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 山姆奥特曼&#xff1a;从YC到OpenAI&#xff0c;硅谷创新之星的崛起 在人工智能革命…

PHP语法基础篇(五):流程控制

任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句&#xff0c;一个函数调用&#xff0c;一个循环&#xff0c;一个条件语句或者甚至是一个什么也不做的语句&#xff08;空语句&#xff09;。语句通常以分号结束。此外&#xff0c;还可以用花括号将一组语句封装…

怎么隐藏关闭或恢复显示输入法的悬浮窗

以搜狗输入法为例&#xff0c;隐藏输入法悬浮窗 悬浮窗在输入法里的官方叫法为【状态栏】。 假设目前大家的输入法相关显示呈现如下状态&#xff1a; 那我们只需在输入法悬浮窗&#xff08;状态栏&#xff09;的任意位置鼠标右键单击&#xff0c;调出输入法菜单&#xff0c;就…

Electron (02)集成 SpringBoot:服务与桌面程序协同启动方案

本篇是关于把springboot生成的jar打到electron里&#xff0c;在生成的桌面程序启动时springboot服务就会自动启动。 虽然之后并不需要这种方案&#xff0c;更好的是部署[一套服务端&#xff0c;多个客户端]...但是既然搭建成功了&#xff0c;也记录一下。 前端文件 1、main.js…

2025年计算机应用与神经网络国际会议(CANN 2025)

2025 International Conference on Computer Applications and Neural Networks &#xff08;一&#xff09;会议信息 会议简称&#xff1a;CANN 2025 大会地点&#xff1a;中国重庆 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 &#xff08;二&#x…

振动分析中的低频噪声问题:从理论到实践的完整解决方案

前言 在振动监测和结构健康监测领域&#xff0c;我们经常需要从加速度信号计算速度和位移。然而&#xff0c;许多工程师在实际应用中都会遇到一个令人困扰的问题&#xff1a;通过积分计算得到的速度和位移频谱中低频噪声异常放大。 本文将深入分析这个问题的根本原因&#xf…

ncu学习笔记01——合并访存

全局内存通过缓存实现加载和存储过程。其中&#xff0c;L1为一级缓存&#xff0c;每个SM都有自己的L1&#xff1b;L2为二级缓存&#xff0c;L2则被所有SM共有。 数据从全局内存到SM的传输过程中&#xff0c;会去L1和L2中查询是否有缓存。对全局内存的访问将经过L1&#xff1b;…

2012 - 正方形矩阵

​​​​题目描述 晶晶同学非常喜欢方形&#xff0c;她希望打印出来的字符串也是方形的。老师给了晶晶同学一个字符串"ACM"&#xff0c;晶晶同学突发奇想&#xff0c;如果任意给定义一个整数n&#xff0c;能不能打印出由这个字符串组成的正方形字符串呢&#xff1f;…

C++中set的常见用法

在 C 里&#xff0c;std::set属于标准库容器的一种&#xff0c;其特性是按照特定顺序存储唯一的元素。下面为你详细介绍它的常见使用方法&#xff1a; 1. 头文件引入 要使用std::set&#xff0c;需要在代码中包含相应的头文件&#xff1a; #include <set> 2. 集合的定…

stm32移植freemodbus

1、设置串口 开启串口中断 2、设置定时器 已知在freemodbus中默认定义&#xff1a;当波特率大于19200时&#xff0c;判断一帧数据超时时间固定为1750us&#xff0c;当波特率小于19200时&#xff0c;超时时间为3.5个字符时间。这里移植的是115200&#xff0c;所以一帧数据超时…

鸿蒙next 使用canvas实现ecg动态波形绘制

该代码可在Arkts 与 前端使用&#xff0c;基于canvas 仓库地址&#xff1a;https://gitee.com/harmony_os_example/harmony-os-ecg-waveform.git 代码中的list数组为波形数据&#xff0c;该示例需要根据自己业务替换绘制频率&#xff0c;波形数据&#xff0c;ecg原始数据生成…

基于原生能力的键盘控制

基于原生能力的键盘控制 前言一、进入页面TextInput获焦1、方案2、核心代码 二、点击按钮或其他事件触发TextInput获焦1、方案2、核心代码 三、键盘弹出后只上抬特定的输入组件1、方案2、核心代码 四、监听键盘高度1、方案2、核心代码 五、设置窗口在键盘抬起时的页面避让模式为…

大数据治理域——数据存储与成本管理

摘要 本文主要探讨了数据存储与成本管理的多种策略。介绍了数据压缩技术&#xff0c;如MaxCompute的archive压缩方法&#xff0c;通过RAID file形式存储数据&#xff0c;可有效节省空间&#xff0c;但恢复时间较长&#xff0c;适用于冷备与日志数据。还详细阐述了数据生命周期…