Android 自动化交互实践

Android 自动化交互实践,第1张

概述Android自动化交互可以代替人工完成重复性的工作,包括通过自动 *** 作App进行黑盒测试和第三方App的自动运行。常见的自动化交互包含启动App、view的点击、拖拽和文本输入等。随着App安防能力的提升,要想实现完整流程的自动化交互变的越来越困难,本文主要探讨目前常见的自动化交

AndroID 自动化交互可以代替人工完成重复性的工作,包括通过自动 *** 作 App 进行黑盒测试和第三方 App 的自动运行。常见的自动化交互包含启动 App、vIEw 的点击、拖拽和文本输入等。随着 App 安防能力的提升,要想实现完整流程的自动化交互变的越来越困难,本文主要探讨目前常见的自动化交互方案以及不同方案的优劣和应用场景。

1 传统执行脚本方案

ADB 是 Google 提供的能够和 AndroID 设备进行交互的命令行工具,我们可以编写脚本按照事先设计好的顺序,一个一个执行各个事件。ADB 执行 *** 作需要事先获取界面元素的坐标(获取坐标方法可以利用 uiautomator 或者 dump xml 的方法,这里不是讨论的重点),然后把坐标传入作为命令行参数。

adb shell input tap 100 500

上面命令是模拟点击屏幕坐标为(100, 500)处的控件。

adb shell input swipe 100 500 200 600

上面命令是模拟手指在屏幕上向右下方滑动的一个 *** 作。

adb shell input keyevent "KEYCODE_BACK"

上面命令模拟返回按键的点击。

一次完整的自动化交互流程可由上面一系列命令顺序执行。

ADB 脚本方式的优点

实现简单,只需要获取目标元素的坐标等简单信息即可完成相关 *** 作

可以实现对 webvIEw 的自动化交互


ADB 脚本方式的缺点

灵活度不够,依赖于写死的坐标,App 界面变更引起的 vIEw 位置变换会让脚本中相关命令无法执行,需要重新分析页面坐标

需要建立 ADB 链接或套接字链接,交互过程中网络状况的变化会影响自动化交互效果


ADB 脚本方式应用场景

交互简单、迭代频率低,安防级别比较低的 App

webvIEw 页面,Flutter 开发的 App


2 AndroID 原生方法实现自动化交互

我们可以借助各种插件化框架来控制 App 页面的界面元素,其中一种思路就是在插件中借助 ActivitylifecycleCallbacks 来监听各个 activity 的生命周期。

public class MyApplication extends Application {    private static final String TAG = "MyApplication";    //声明一个监听Activity们生命周期的接口    private ActivitylifecycleCallbacks activitylifecycleCallbacks = new ActivitylifecycleCallbacks() {        /**         * application下的每个Activity声明周期改变时,都会触发以下的函数。         */        @OverrIDe        public voID onActivityCreated(Activity activity, Bundle savedInstanceState) {            //如何区别参数中activity代表你写的哪个activity。            if (activity.getClass() == MainActivity.class)                Log.d(TAG, "MainActivityCreated.");            else if(activity.getClass()== SecondActivity.class)                Log.d(TAG, "SecondActivityCreated.");        }
       @OverrIDe        public voID onActivityStarted(Activity activity) {            Log.d(TAG, "onActivityStarted.");        }
       @OverrIDe        public voID onActivityResumed(Activity activity) {            Log.d(TAG, "onActivityResumed.");        }
       @OverrIDe        public voID onActivityPaused(Activity activity) {            Log.d(TAG, "onActivityPaused.");        }
       @OverrIDe        public voID onActivityStopped(Activity activity) {            Log.d(TAG, "onActivityStopped.");        }
       @OverrIDe        public voID onActivitySaveInstanceState(Activity activity, Bundle outState) {        }
       @OverrIDe        public voID onActivityDestroyed(Activity activity) {            Log.d(TAG, "onActivityDestroyed.");        }    };
   @OverrIDe    public voID onCreate() {        super.onCreate();        //注册自己的Activity的生命周期回调接口。![Alt text](./Wechatimg59.png)
       registeractivitylifecycleCallbacks(activitylifecycleCallbacks);    }
   @OverrIDe    public voID onTerminate() {        //注销这个接口。        unregisteractivitylifecycleCallbacks(activitylifecycleCallbacks);        super.onTerminate();    }}

监听到 activity 的活动后,可以借助 uiautomator 分析 activity 界面元素的 vIEwID 以及属性,不同情况的界面 vIEw 可以采用不同的自动化方法。

2.1 简单 vIEw 的处理方式

如下图:

像这类 vIEw,可以直接获取到 resource ID ,并且确认可点击属性为 true, *** 作方式比较简单, 可以在监听到的 activity 生命周期中执行如下 *** 作:

int fl_btn = activity.getResources().getIDentifIEr("dashboard_Title",         "ID", "com.androID.settings");VIEw v =  activity.findVIEwByID(fl_btn);
v.performClick();
2.2 隐藏属性的 vIEw 的处理方式

在一些对 vIEw 的属性进行隐藏,特别是利用 React Native 等混合开发的页面,上面的方法不再生效,如下图所示的 vIEw:

如图,选中的 vIEwgroup 及其子 vIEw 的 clickable 属性均为 false,并且无法获取到 vIEw 的 resource ID,这时候可以利用图中 dump 出的布局信息,借助 Xpath 元素定位工具来获取到界面的 vIEw,由于这些 vIEw 的点击属性为 false,因此通过调用 performClick 来实现点击的方法已经无效,此时考虑在 click 更底层的与触摸事件传递相关的比较重要的类:MotionEvent, MotionEvent 可以仿真几乎所有的交互事件,包括点击,滑动,双指 *** 作等。以单击为例:

    private voID simulateClick(VIEw vIEw, float x, float y) {        long time = SystemClock.uptimeMillis();//必须是 SystemClock.uptimeMillis()。
       MotionEvent downEvent = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, x, y, 0);
       time += 500;
       MotionEvent upEvent = MotionEvent.obtain(time, time, MotionEvent.ACTION_UP, x, y, 0);
       vIEw.ontouchEvent(downEvent);        vIEw.ontouchEvent(upEvent);    }

如果是滑动 *** 作,可以在起始位置中间添加若干 ACTION_MOVE 类型的 MotionEvent. 综上所述,借助系统原生方法时间交互自动化的优缺点大致如下:

借助插件框架实现自动化交互的优点

可维护性强,因为可以直接获取到界面的 vIEw 对象,因此即使页面布局发生变化,只要 vIEw 还存在,就不需要对代码进行修改

仿真效果更好,比脚本方式更接近真人 *** 作

借助插件框架实现自动化交互的不足

对 webvIEw、Flutter 框架 App 支持不好

应用场景

版本迭代频繁的 App

非 Flutter 框架开发的 App

上面分析了两种常用的模拟真实用户进行自动化 *** 作的方法,脚本方式和调用原生方法的方式,这两种方法基本上可以完成简单的交互流程,在此基础上,我们还可以去深究一些更深层次的交互实现,比如自动化过各种验证等,也可以基于这两种方法来完成。

总结

以上是内存溢出为你收集整理的Android 自动化交互实践全部内容,希望文章能够帮你解决Android 自动化交互实践所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)