UiAutomator2.0 - 与AccessibilityService的关联

目录

  • 一、Android中的 Accessibility
  • 二、UiAutomator2.0 与 AccessibilityService
  • 三、验证与 AccessibilityService的关联

Accessibility:无障碍,又称辅助性功能.
AccessibilityService:无障碍服务,继承于 Serveice. 它可以监听操作、检索窗口内容、启用触摸浏览等

一、Android中的 Accessibility

在原生android设备中 Settings 应用程序菜单中有一项 Accessibility(无障碍). 该项菜单下有项 TallBack功能:它能读取屏幕上的内容,对于盲人和视力低弱人士而言,这项功能非常实用. 还有不知道大家是否会注意,使用三方app store批量自动安装app时,此时Accessibility中会出现 "xx自动安装"功能. 那么这些功能是怎实现的呢?是如何实现的呢?—— AccessibilityService

二、UiAutomator2.0 与 AccessibilityService

??在《UiAutomator2.0 - 控件实现点击操作原理》中已经分析了UiAutomator自动测试点击操作的具体实现过程,最终的操作是由 UiAutomation 这个类实现的.从这个类注释可以看出:可以将UiAutomation看作特殊AccessibilityService 类型,它不为服务生命周期提供挂钩,并且公开了对UI测试自动化有用的其他API.也就是说UiAutomator2.0是通过 AccessibilityService来实现的.

三、验证与 AccessibilityService的关联

a.为了验证上面的猜想是否正确,在Android studio中新建app工程->建一个服务类MyAccessibility继承 AccessibilityService

package com.zzw.barrierfree;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;

public class MyAccessibility extends AccessibilityService {
    private static final String TAG = MyAccessibility.class.getSimpleName();

    // 初始化服务操作
    @Override
    protected void onServiceConnected() {
        Log.d(TAG, "onServiceConnected: ------- config accessibility ");
        AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
        // 响应某个应用的事件,包名为应用的包名。设置为null等同于所有包名
        accessibilityServiceInfo.packageNames = new String[]{ "com.android.settings"};
        // 响应时间的类型,事件分很多种:单击、长按、滑动。 这里设置为所有事件
        accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
        // 设置回馈给用户的方式,语音播出还是振动
        accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
        // 响应时间的设置
        accessibilityServiceInfo.notificationTimeout = 1000;
        setServiceInfo(accessibilityServiceInfo);
    }

    // 响应AccessibilityEvent的事件
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int eventTypeId = event.getEventType();
        String eventText = "";
        Log.d(TAG, "onAccessibilityEvent: ----------------Start--------------");
        switch (eventTypeId) {
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                eventText = "TYPE_VIEW_CLICKED";
                break;
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                eventText = "TYPE_VIEW_FOCUSED";
                break;
            case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
                eventText = "TYPE_VIEW_LONG_CLICKED";
                break;
            case AccessibilityEvent.TYPE_VIEW_SELECTED:
                eventText = "TYPE_VIEW_SELECTED";
                break;
            case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
                eventText = "TYPE_VIEW_TEXT_CHANGED";
                break;
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                eventText = "TYPE_WINDOW_STATE_CHANGED";
                break;
            case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                eventText = "TYPE_NOTIFICATION_STATE_CHANGED";
                break;
            case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END:
                eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_END";
                break;
            case AccessibilityEvent.TYPE_ANNOUNCEMENT:
                eventText = "TYPE_ANNOUNCEMENT";
                break;
            case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:
                eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_START";
                break;
            case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:
                eventText = "TYPE_VIEW_HOVER_ENTER";
                break;
            case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT:
                eventText = "TYPE_VIEW_HOVER_EXIT";
                break;
            case AccessibilityEvent.TYPE_VIEW_SCROLLED:
                eventText = "TYPE_VIEW_SCROLLED";
                break;
            case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:
                eventText = "TYPE_VIEW_TEXT_SELECTION_CHANGED";
                break;
            case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
                eventText = "TYPE_WINDOW_CONTENT_CHANGED";
                break;
        }
        eventText = eventText + ":" + eventTypeId;
        Log.e(TAG, "onAccessibilityEvent:"+ eventText);
        Log.d(TAG, "onAccessibilityEvent: -------------------End----------------");
    }

    // 打断获取事件的过程
    @Override
    public void onInterrupt() {

    }
}

b.在AndroidManifest.xml中配置服务

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zzw.barrierfree">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@style/AppTheme.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!--服务配置-->
        <service
            android:name=".MyAccessibility"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>
        </service>
    </application>
</manifest>

c.运行该app,此时在设置->无障碍中会出现配置的服务, 但是该服务处于关闭状态

d.手动开启该服务,打开android studio中的logcat. 操作(点击/滑动等)设置应用程序,会出现相应的响应事件

e.结合上篇的点击时监听的相应事件,与log中打印的事件是一致的. 那就说明:点击/滑动等操作是通过 AccessibilityService 监听对应的视图或窗口状态来判断操作是否成功执行.

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

时间: 2024-08-30 18:12:05

UiAutomator2.0 - 与AccessibilityService的关联的相关文章

UiAutomator2.0 - Toast信息的验证

目录 问题:在做UI自动化测试时,偶尔会碰到 Toast 这种提示信息(如图),通过Uiautomatorviewer 无法获该类控件的信息.所以无法验证,该条case不能实现.然后就没然后了... 思考:在<UiAutomator2.0 - 与AccessibilityService的关联>实验后,发现Toast提示信息所属事件为 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHAN

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

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

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

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

Android UiAutomator2.0

一.环境搭建 JDK(java环境).SDK(adb appt环境),这两个已经不想再叙述了直接看详见--> android studio 安装,下载地址:https://developer.android.google.cn/studio/index.html 安装完成,打开后大概是这个样子的: 二.新建测试工程 1.开始新建一个工程:点击上图的"Start a new Android Studio project " 2.进入创建工程界面,设置app的名称.包名,及工程路径,

21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用

控制器里 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj $category = Category::findOne(1); //查分类表里的数据 abj // $categoryarr = $category->attributes; //获取某一行的分类结果里的对象属性,array //查文章里的cid等于2的 拿上面的结果 $categoryarr['cid']=2 作为本次查询的条件

[moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)

关联字段增加搜索 post表关联adminuser表,通过post.author_id  adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜索,这不符合我们的要求,我们要求输入作者名就可以搜索出来,该作者对应的post.

VB.net 2010下关联与程序图标设置

'*************************************************************************'**模 块 名:VB.net 2010下关联与程序图标设置 '**说 明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept'**创 建 人:浴火凤凰-郭卫'**日 期:2015年10月15日 22:12:59'**修 改 人:浴火凤凰-郭卫'**日 期:'**描 述:QQ:493405998 | 微信\旺旺:icecept

CH11 关联容器

关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-value对:关键字是用来索引值关联的数据.set:每个关键字值包含一个关键字. 关联容器类型: map 保存key-value  map<key,value> set 保存关键字key set<key> multimap 关键字可以重复出现的map multiset 关键字可以重复出现的