UiAutomator2.0 - Toast信息的验证

目录

问题:在做UI自动化测试时,偶尔会碰到 Toast 这种提示信息(如图),通过Uiautomatorviewer 无法获该类控件的信息。所以无法验证,该条case不能实现。然后就没然后了...

思考:在《UiAutomator2.0 - 与AccessibilityService的关联》实验后,发现Toast提示信息所属事件为 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED,依据《UiAutomator2.0 - 控件实现点击操作原理》中的分析,那也可以模仿源码监听该事件啊!美滋滋~~

实现:准备着手实现时,发现其他类的相关方法并没公开,只有UiAutomation这个类公开了setOnAccessibilityEventListener方法(通过该方法进行监听Toast)。突破口找到了,那么就从这个方法开始实现。

1、创建一个 VerifyToast类,代码如下:

package com.testtoast;

import android.app.Notification;
import android.app.UiAutomation;
import android.os.Parcelable;
import android.support.test.InstrumentationRegistry;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;

/**
 * @author zzw
 * Toast Validation Helper
 */
public class VerifyToast {
    private static final String TAG = TestCase_FM.class.getSimpleName();
    private static VerifyToast verifyToast = new VerifyToast();
    private boolean isPass;

    private VerifyToast(){}

    public static VerifyToast getVerifyToast(){
        return verifyToast;
    }

    public boolean getIsPass(){
        return isPass;
    }

    public VerifyToast setIsPass(boolean isPass){
        this.isPass = isPass;
        return this;
    }

    /**
     * Listen for toast prompts
     * @param pck The package name of toast
     * @param msg Toast info
     */
    public void monitoringToast(final String pck, final String msg){
        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
        uiAutomation.setOnAccessibilityEventListener(new UiAutomation.OnAccessibilityEventListener() {
            @Override
            public void onAccessibilityEvent(AccessibilityEvent event) {
                if(event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED){
                    Log.d(TAG, "onAccessibilityEvent:"+
                         String.format("--pck: %s   --msg: %s",getPackage(event),getMessage(event)));
                    isPass = pck.equals(getPackage(event)) && msg.equals(getMessage(event));
                    Log.d(TAG, "onAccessibilityEvent: isPass = "+ isPass);
                }
            }
        });
    }

    // 获取监听的包名
    private String getPackage(AccessibilityEvent event){
        return (String) event.getPackageName();
    }

    // 获取 Toast 信息
    private String getMessage(AccessibilityEvent event){
        String message = null;
        Parcelable parcelable = event.getParcelableData();
        if (!(parcelable instanceof Notification)) {
            message = (String) event.getText().get(0);
        }
        return message;
    }
}

2、测试用例中的调用

package com.testtoast;

import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector;
import android.util.Log;

import com.zzw.commonutils.UiApps;
import com.zzw.tools.ScreenCap;

import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;

import static junit.framework.Assert.assertTrue;

/**
 * @author zzw
 * Test for Toast
 */

@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestCase_FM {
    private static final String TAG = TestCase_FM.class.getSimpleName();
    private UiDevice device= UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

    private String catchFail = "Catch_Pic";

    @BeforeClass
    public static void before(){
        Log.d(TAG, "before: -----------------------------start-------------");
    }

    @Test
    public void testCase_GetToast() throws Throwable {
        VerifyToast verifyToast = VerifyToast.getVerifyToast();
        String pck = "com.caf.fmradio";
        String msg = "Please plug in a Headset to use FM Radio";

        device.pressHome();
        UiObject app= device.findObject(new UiSelector().text("FM Radio"));
        Log.d(TAG, "testCase_GetToast: result ==  "+verifyToast.getIsPass());
        verifyToast.setIsPass(false).monitoringToast(pck,msg);
        try{
            new UiApps().toOpenApp(app); //自己封装打开app的方法
            assertTrue("Toast prompt error", verifyToast.getIsPass());
        }catch (Throwable e){
            e.printStackTrace();
            // 自己封装的截图方法
            ScreenCap.takeScreenshotToPicturesDirPath(catchFail);
            throw e;
        }
        Log.d(TAG, "testCase_GetToast: result ==  "+verifyToast.getIsPass());
    }
}

:在 adb shell uiautomator --help 中有这么一句


events: prints out accessibility events until terminated

那么在控制台也直观的查看当前的Accessibility事件了,结果如图:

原文地址:https://www.cnblogs.com/zeo-to-one/p/10143370.html

时间: 2024-08-30 15:51:14

UiAutomator2.0 - Toast信息的验证的相关文章

UiAutomator2.0升级填坑记

UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:[email protected] 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com 啰嗦 Google Android Developers 在2015年3月就发布了UiAutomator 2.0版本(下文简称U2),而公司的核心产品中用到还是UiAutomator老版本(下文简称U1),业界用U2的也不是很多,虽然有诸多问题和不便(如高版本OS中不支持Remo

Yii2.0模型层数据验证和thinkPHP3.2框架模型层数据验证对比

Yii2.0模型层数据验证 一般说来,程序猿永远不应该信任从最终用户直接接收到的数据,并且使用它们之前应始终先验证其可靠性.要给model填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们.该方法会返回一个布尔值,指明是否通过验证.若没有通过,你能通过 yii\base\Model::errors 属性获取相应的报错信息.比如 $model = new \app\models\ContactForm; // 用用户输入来填充模型的特性 $mo

UiAutomator2.0 - 与AccessibilityService的关联

目录 一.Android中的 Accessibility 二.UiAutomator2.0 与 AccessibilityService 三.验证与 AccessibilityService的关联 Accessibility:无障碍,又称辅助性功能. AccessibilityService:无障碍服务,继承于 Serveice. 它可以监听操作.检索窗口内容.启用触摸浏览等 一.Android中的 Accessibility 在原生android设备中 Settings 应用程序菜单中有一项

房产信息发布验证!

※☆★◇◆※一键复制测试版状态:1※☆★◇◆※ 房产信息发布验证!

uiautomator2.0框架

1.   Uiautomator1.0 Uiautomator2.0 date 2012 2015 super class UiAutomatorTestCase InstrumentationTestCase language java java executable file jar APK API-level 16(4.1)+ 18(4.3)+ permission - less context no yes extends Junit3 需要继承UiAutomatorTestCase J

Toast信息框

Toast组件的功能和对话框有些相似,但是使用上更简单,使用Toast组件的目的只有一个,就是在屏幕上弹出一个消息窗口告知用户某个信息,而且这个窗口没有任何按钮,经过几秒钟后就会消失.如果使用者不注意,可能会来不及看清楚,所以只有显示的信息不是很重要的情况下采用Toast信息框.要使用Toast信息框时,只需要调用它的makeText()和show()方法即可: <span style="font-size:18px;">Toast t=Toast.makeText(主程序

初探UiAutomator2.0中使用Xpath定位元素

J 今天的主题是讲一下在使用过程中遇到的一个问题,如何在UiAutomator2.0中使用Xpath定位元素? 背景 现在的app在打包成apk的时候都是有加固处理的,各种混淆加固,所以已经破坏了或扰乱了原本的代码变量命名形式,这就给我们要基于界面来做自动化测试带来了灾难性的阻碍,因为那些混淆过的id是不固定的,下一次再出个新版本,这一切都变了,所以这就没办法用id来定位混淆过的app元素,那还有什么好的方法吗?还记得Web自动化测试中神乎其技的xpath吗?不管什么元素都可以用它定位出来,所以

MySQL 8.0 配置mysql_native_password身份验证插件的密码

MySQL 8.0 配置mysql_native_password身份验证插件的密码 mysql8.0的默认密码验证不再是password.所以在创建用户时,create user 'username'@'%' identified by 'password'; 客户端是无法连接服务的. 方法一: 登录MySQL后输入: ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; F

spring4.0整合了validation验证功能

今天翻译博客时 无意中发现的小知识点, 源地址:http://jinnianshilongnian.iteye.com/blog/1990081?page=2#comments Bean Validation 1.1当前实现是Hibernate validator 5,且spring4才支持.接下来我们从以下几个方法讲解Bean Validation 1.1,当然不一定是新特性: 集成Bean Validation 1.1到SpringMVC 分组验证.分组顺序及级联验证 消息中使用EL表达式