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

Appium常用操作之「Toast提示信息获取」-LMLPHP

作者:清菡

博客: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,版本比较旧的话,应该是没有这种提示信息的。

Appium常用操作之「Toast提示信息获取」-LMLPHP

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

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

Toast 是什么?

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

Appium常用操作之「Toast提示信息获取」-LMLPHP

进行提示作用,且时间出现得非常短。基本上在所有的手机当中都是这种效果(包括验证码、或者注册提示)。验证码提示,你也只能看着它,深灰色的背景,你不能点击确定、取消,没有你可以选项的地方也没有你可以输入的地方。这个才叫做 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:

Appium常用操作之「Toast提示信息获取」-LMLPHP

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 之外,页面上其它元素有没有文本也是手机号码的。

Appium常用操作之「Toast提示信息获取」-LMLPHP

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

3.没有找到匹配的 Toast

Appium常用操作之「Toast提示信息获取」-LMLPHP

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

Appium常用操作之「Toast提示信息获取」-LMLPHP

只能是缩短时间或者不等待,直接去获取一下。图中,已经在执行,但是人家已经消失了。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提示信息获取」-LMLPHP

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

11-21 04:53
查看更多