坚持原创输出,点击蓝字关注我吧

作者:清菡

博客:Oschina、云+社区、知乎等各大平台都有。

目录

  • 一、什么是 Toast
  • 二、获取 Toast 提示信息的前提

    • 1.针对这种元素,有的时候我们需要做什么呢?
    • 2.要获取 Toast 信息要满足以下四个要求
    • 3.怎么看 Server 版本?
    • 4.如果 Appium Server 版本低于 1.6.3+,代码中必须指定 automationName 为 UIAutomator2
  • 三、4 点需要注意的事情

    • 1.在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。
    • 2.选取部分内容匹配需注意
    • 3.没有找到匹配的 Toast
    • 4.Toast 获取跟 Appium 的版本有关
  • 四、Toast 提示信息获取
  • 五、代码

一、什么是 toast

安卓 4.4 以上的版本都是基于 UiAutomator,现在已经改为 UiAutomator2 了。所以 Toast 在原来的 UiAutomator 基础上没办法识别,没法识别的话就需要利用 UiAutomator2了。

如图是 V1.10.0,之前的 Appium 版本中没有看到过它会自动把自动化测试引擎从 Appium 切换到 UiAutomator2,可以去看下启动日志。如果版本低于 v1.10.0,版本比较旧的话,应该是没有这种提示信息的。

所以在很多版本当中,如果我们要用 Toast,我们就需要指明一个东西:那就是「自动化测试引擎必须指明为 UiAutomator2。」 不然它默认就不用这个,必须自己指明。但是现在已经做了改革了,会自动切换为 UiAutomator2

automationName 是我们的desired_caps当中明确要指明的。如果想要获取到 Toast 也是有要求的。

Toast 是什么?

UiAutomator Viewer 是抓不到它的。即使截屏截到了,用元素定位也是定位不到的。所以用正常套路是搞不定它的。

进行提示作用,且时间出现得非常短。基本上在所有的手机当中都是这种效果(包括验证码、或者注册提示)。验证码提示,你也只能看着它,深灰色的背景,你不能点击确定、取消,没有你可以选项的地方也没有你可以输入的地方。这个才叫做 Toast,因为长得比较别致,UiAutomator Viewer 找不着它。

二、获取 Toast 提示信息的前提

1.针对这种元素,有的时候我们需要做什么呢?

我们想要判断一下这样的 Toast 有没有出现,一般这样的 Toast 是带有文字的。如果弹出的是个空白的 Toast 是没有意义的,那么你就可以提 Bug 了。「所以 Toast 里面都是有内容的。」

那这样的Toast怎么获取呢?

既然不支持 UiAutomator,但是又有文字。就只能用一种方式来获取,那就是 xpath。通过文本匹配来获取(文本的全部匹配和部分匹配都是可以的)。

你要获取这样的 Toast,证明它是存在的,就要有一些前置条件。

2.要获取 Toast 信息要满足以下四个要求:

  1. Appium server 版本 1.6.3+才支持 Toast 获取。(而 Appium Server 1.6.3 没有可视化界面,解决方案:下载 Appium-desktop-Setup-1.4.1-ia32.exe)。
  2. 代码中必须指定 automationName 为:UIAutomator2
  3. UIAutomator2 只支持安卓版本 5.0+

因此,因为他们的最高支持安卓版本为 4.4.2,可以使用 genymotion 模拟器。

  1. 要求安装 jdk1.8 64 位及以上。配置其环境变量 JAVA_HOME 和 path。

3.怎么看 Server 版本?

Server 版本就是这个 v1.18.0:

4.如果 Appium Server 版本低于 1.6.3+,代码中必须指定 automationName 为 UIAutomator2

desired_caps["automationName"]="UiAutomator2"

否则 Toast 是找不到的。

三、4 点需要注意的事情

习惯性的操作是要等到元素可见之后,我们才会去操作它。新的东西出来,我们的习惯都是等到它可见之后再去操作。因为它的时间非常短,所以间隔轮循周期做的非常短。

接下来需要做 Toast 的获取,根据文本匹配,是通过 xpath 匹配。下面是需要注意的事情:

1.在我们等待元素可见的时候,不要用 visibility_of_element_located,因为它对 Toast 的可见处理并不支持,会直接报错命令无法执行。

「也就是等待的时候,要用元素存在的条件。不能用元素可见的条件。」

driverWait 方法中,请用presence_of_element_located。它存在了就行了,存在了之后再去处理它。

2.选取部分内容匹配需注意

点击 click 后出来文本要是「手机号码或者密码不为空」。有时候觉得文本太长了,不想全部匹配。只想通过「手机号码」这个文本匹配来找到它。

可以,但是选取部分内容的时候要注意下:除了 xpath 之外,页面上其它元素有没有文本也是「手机号码」的。

用这种 xpath 匹配「手机号码」的话,优先匹配的是别人。不一定是你想匹配的「手机号码或密码不能为空」了。

3.没有找到匹配的 Toast

等到这执行的时候,人家早就消失了。等待的时候,人家早就消失了,那怎么办呢?

只能是缩短时间或者不等待,直接去获取一下。图中,已经在执行,但是人家已经消失了。「Toast 这个问题有些尴尬,如果特别需要 Toast 上面的消息怎么办?可以求助开发,帮你稍微延长一点时间。」

有时能找到 Toast,有时找不到,这里是概率性的问题。目前对于 Toast 只有这一种获取方式。

4.Toast 获取跟 Appium 的版本有关

还有一个问题,Toast 获取的时候提示你"应用的一些页签啊没有通过",这个也是跟 Appium 的版本有关。Toast 这块的问题是比较多的。

如果没有 UIAutomator2 是绝对会失败,即便你看到它出现了也一定会失败。Server1.9 的时候获取 Toast 是没有问题的。

四、Toast 提示信息获取

xpath 表达式是固定的,现在主要用的方式是文本匹配(部分、全部都可以)。那这个表达式就是双斜杠(相对定位)。

xpath = '//*[contains(@text,"部分文本内容")]'

这个表达式是固定的。只要把 toast 对应的文本信息替换下就可以了。

#获取toast内容是否出现
def toast_exist(self, toastmessage):
    toast_loc = ("xpath", "//*[contains(@text,'%s')]" % toastmessage)
    try:
    WebDriverWait(self.driver,5,0.2).until(EC.presence_of_element_located(toast_loc))
      #获取文本内容
      driver.find_element_by_xpath(toast_loc).text
      return True
    except:
      return False

五、代码


from appium import webdriver
# from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

desired_caps={}

# 自动化测试引擎
# desired_caps["automationName"]="UiAutomator2"

# 平台类型
desired_caps["platformName"]="Android"
# 平台版本号
desired_caps["platformVersion"]="10"
# 设备名称
desired_caps["deviceName"]="2NSDU20410017297"
# app 包名
desired_caps["appPackage"]="输入appPackage"
# app 入口 acitivity
desired_caps["appActivity"]="输入activity"

# 连接Appium server。前提:appium desktop要启动。有监听端口。
# 将desired_caps发送给appium server。打开app
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

# 运行代码之前:
#1.appium server启动成功。处于监听状态
#2.模拟器/真机必须能够被电脑识别。即adb devices能够识别到要操作的设备。

# 点击“我的”
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,"com.lemon.lemonban:id/navigation_my")))
driver.find_element_by_id('com.lemon.lemonban:id/navigation_my').click()

# # 点击“我的头像”
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,"com.lemon.lemonban:id/fragment_my_lemon_avatar_layout")))
driver.find_element_by_id("com.lemon.lemonban:id/fragment_my_lemon_avatar_layout").click()

#点击手机密码登录
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.lemon.lemonban:id/btn_login')))
driver.find_element_by_id('com.lemon.lemonban:id/btn_login').click()

# 1.xpath表达式、文本匹配
loc='//*[contains(@text,"{}")]'.format("手机号码或密码")

# 等待的时候,要用元素存在的条件。不能用元素可见的条件。
try:
    WebDriverWait(driver,10,0.01).until(EC.presence_of_elements_located((MobileBy.XPATH,loc)))
    # 上限10秒就够了,确认toast在页面上存在的时候大概是多久,它都没有0.5秒,你去间隔0.5,可能消失了,你还只留在这。
    print(driver.find_element_by_xpath(loc).text)
except:
    print("没有找到匹配的toast!!!!")


公众号「清菡软件测试」首发,更多原创文章:清菡软件测试 95+原创文章,欢迎关注、交流,禁止第三方擅自转载。

感谢支持清菡原创,欢迎点击在看和转发!

Appium常用操作之「Toast提示信息获取」的更多相关文章

  1. Appium常用操作之「元素定位、swipe 滑屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.打开 uiautomatorviewer 二.Appium 常用操作 1.用 layui 做 ...

  2. Appium常用操作之「微信滑屏、触屏操作」

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.滑屏操作 1.访问之后,马上就滑屏可以吗? 2.连续实现 2 次滑屏 3.代码 二.模拟触屏 ...

  3. toast提示信息获取和Monkey笔记

    获取toast toast提示信息出现场景:用户输入用户名和密码后,提示的'登录成功', 用之前的定位方法获取不了,需要Uiautomator2来获取 安装node.js (使用 npm 或 node ...

  4. toast提示信息获取

    toast获取的前提条件 1.desired_caps["automationName"]="UiAutomator2"2.要求安装jdk1.8 64位及以上. ...

  5. Linux 终端操作之「I/O Redirection」

    I/O 重定向是在终端运行程序时很常用的技巧,但是我对它所知甚少.今天我在 DigitalOcean 上发现了一篇很好的 tutorial.这篇随笔记录一下我的心得体会和发现的一个问题. I/O re ...

  6. Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

     下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...

  7. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

  8. Toast提示信息

    用Toast来作为操作成功以及用户误操作等等的提示,非常的简单.直接上代码: 创建方式一: ps: 此处没有设置toast的其他属性,均使用默认的风格(个人觉得默认的风格除了字体比较小之外 还是挺好看 ...

  9. 移动端自动化测试(二)之 Appium常用的API(python)函数介绍

    上一章节已经介绍了Appium的环境搭建,其实只要掌握了Appium的工作原理,前期的准备工作和安装过程是比较简单的.那么当我们搭建好Appium环境后接下来做些什么呢?通常思路是开始appium的第 ...

随机推荐

  1. spring boot:使用log4j2做异步日志打印(spring boot 2.3.1)

    一,为什么要使用log4j2?     log4j2是log4j的升级版,     升级后更有优势:     性能更强/吞吐量大/支持异步     功能扩展/支持插件/支持自定义级别等     这些优 ...

  2. gin框架使用orm操作数据库(转)

      简介:orm俗称关系对象模型,用来映射数据库SQL和对象的工具 ,相当于mongodb里面的mongoose库,Java里面的mybatis ibatis Golang GORM使用 https: ...

  3. 第二十五章 ansible基础

    一.Ansible概述 1.什么是Ansible Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复 ...

  4. Spark RDD详解 | RDD特性、lineage、缓存、checkpoint、依赖关系

    RDD(Resilient Distributed Datasets)弹性的分布式数据集,又称Spark core,它代表一个只读的.不可变.可分区,里面的元素可分布式并行计算的数据集. RDD是一个 ...

  5. ssh免密登陆 2

    应用场景之一:java 程序调用shell脚本,通过ssh 免密登陆数据库服务器,进行数据的抽取打包工作. 免密设置步骤: 1.客户端生成公私钥,在任意目录下执行命令ssh-keygen(一路回车默认 ...

  6. C语言之 判断语句基础与if语句反汇编

    0x01.判断语句介绍以及用法 判断语句有哪些? 1.If 用法1: if (条件) { //代码块 } 当条件成立,也就是为True时,执行{}中的代码 用法2: if(条件) { //代码块 } ...

  7. Redis---06主从复制(薪火相传)

    一.什么是薪火相传模式 上一个slave(从机)是下一个slave(从机)的Master(主机) 二.为什么要这样 优点:从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机, ...

  8. python 作业 用python实现 mysql查询结果导出带列名

    1 import pandas as pd 2 import numpy as np 3 import matplotlib as mpl 4 import matplotlib.pyplot as ...

  9. TypeScript魔法堂:函数类型声明其实很复杂

    前言 江湖有传"动态类型一时爽,代码重构火葬场",由于动态类型语言在开发时不受数据类型的约束,因此非常适合在项目原型阶段和初期进行快速迭代开发使用,这意味着项目未来将通过重写而非重 ...

  10. 如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错

    如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错 Student::find() ->select("id,name,from_unixtime(create_tim ...