Android端自动化测试工具源码分享

这篇具有很好参考价值的文章主要介绍了Android端自动化测试工具源码分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hello啊各位老铁,许久不见,也忘了更新了,在上一篇的文章中,针对Android端的自动化测试框架做了一个简单的了解与使用,今天这篇文章呢,咱们就谈一谈具体的实现思路。

实话实说,针对这个1.0.0的版本,还是有着很多的瑕疵之处,奈何自己时间跟不上继续开发的步伐,后续有充足的时间规划了,还是一定要好好搞一搞,这个东西的价值,在Android端自动化测试中,自我感觉还是很高的。

Android端自动化测试工具源码分享

在上篇的效果中,我们可以发现,所有的触发控制,都是通过网页端进行下发的,而网页的展示又是通过手机端进行开启服务的,也就是说,必须要把手机做为一个服务器,进行指令的发送和获取。

以手机做为服务器,这是实现自动化测试的第一步,毕竟在自动化测试的页面,不仅需要获取到手机端安装的所有App,也需要向服务器(手机端)发送测试的指令,那么如何实现这样一个功能呢?

关注我的老铁可能知道,之前分享过一篇电脑端如何访问手机SD卡中的文件的文章,其实在这篇文章中,自己介绍过一个开源的框架,AndServer,它是一个Android 平台的 Web Server 和 Web Framework,通过这个框架,我们可以很方便的把手机做为一个服务器,这个框架确确实实可以解决很多问题,感兴趣的朋友可以多看一看。

相关文档地址:

https://yanzhenjie.com/AndServer/

AndServer这个框架只是给我们提供了一个做为一个服务的平台,但具体的发送指令和App列表的获取等一些功能,需要我们自己具体的完成,其实就是接口的编写,以手机做为“后端”,以网页做为前端。

我们把具体的实现拆解开来,基本上可以分为,前端页面的展示,”后端“接口的编写,自动化逻辑的编写三部分。

前端页面展示

前端页面,也就是上边我们所看到的网页,使用html,css和javascript编写的,大家可以查看源码中的assets目录,这个目录下面,就是上述网页效果的所有源码了,其中index.html文件是我们主要的网页源文件,web语言呢,还是比较简单的,html和css和我们Android中的xml很类似,而数据动态的交互javascript就和我们的java和kotlin类似,学起来呢也是比较简单的,针对这一块,就不做多解释了,看各位老铁如何了解了,我是希望大家,在有时间的前提下,还是多熟悉熟悉比较好。

后端”接口的编写

前端页面写出来之后,需要有数据的渲染,也需要有逻辑的处理,根据AndServer的文档,我们就可以进行简单的书写相关接口了。

根据前端UI,左侧是需要拿到手机安装的所有App的,所以,需要一个获取手机App列表的相关接口。

接口以Get的方式进行提供:

/**
     * AUTHOR:AbnerMing
     * INTRODUCE:获取手机应用信息
     */
    @GetMapping(path = "/appList")
    List<AppInfo> getAppList() {
        return AppUtils.getAppUtils().getAppInfo(1);
}

具体的获取手机列表逻辑:

// 获取已安装的应用信息队列
    public ArrayList<AppInfo> getAppInfo(int type) {
        ArrayList<AppInfo> appList = new ArrayList<>();
        SparseIntArray siArray = new SparseIntArray();
        // 获得应用包管理器
        PackageManager pm = mContext.getPackageManager();
        // 获取系统中已经安装的应用列表
        @SuppressLint("WrongConstant")
        List<ApplicationInfo> installList = pm.getInstalledApplications(
                PackageManager.PERMISSION_GRANTED);
        for (int i = 0; i < installList.size(); i++) {
            ApplicationInfo item = installList.get(i);

            // 去掉重复的应用信息
            if (siArray.indexOfKey(item.uid) >= 0) {
                continue;
            }
            // 往siArray中添加一个应用编号,以便后续的去重校验
            siArray.put(item.uid, 1);
            try {
                // 获取该应用的权限列表
                String[] permissions = pm.getPackageInfo(item.packageName,
                        PackageManager.GET_PERMISSIONS).requestedPermissions;
                if (permissions == null) {
                    continue;
                }

                boolean isQueryNetwork = false;
                for (String permission : permissions) {
                    // 过滤那些具备上网权限的应用
                    if (permission.equals("android.permission.INTERNET")) {
                        isQueryNetwork = true;
                        break;
                    }
                }
                // 类型为0表示所有应用,为1表示只要联网应用
                if (type == 0 || (type == 1 && isQueryNetwork)) {
                    AppInfo app = new AppInfo();
                    app.uid = item.uid; // 获取应用的编号
                    app.label = item.loadLabel(pm).toString(); // 获取应用的名称
                    app.package_name = item.packageName; // 获取应用的包名
                    //Drawable drawable = item.loadIcon(pm); // 获取应用的图标

                    if (!app.label.contains(".") && !app.label.contains(" ")) {
                        appList.add(app);
                    }
                }


            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
        return appList;  // 返回去重后的应用包队列
    }

前端UI中间的部分则是应用的脚本展示和编写的区域,而脚本的存储和获取也是依赖于手机端,存储的方式有很多种,可以通过内存,文件或者数据库都是可以的,这里我简单的通过SharedPreferences来进行存储的。

存储的时候需要注意,因为应用的不同所存储的脚本也是不一样的,需要根据应用的标识来进行区分,这里是采用的是应用的编号uid,在上述获取应用列表里,通过ApplicationInfo可以拿到。在前端的执行效果就是,点击左侧不同的应用,来切换不同的uid,通过中间的脚本编辑,然后调用保存接口。

/**
     * AUTHOR:AbnerMing
     * INTRODUCE:存储脚本信息
     */
    @PostMapping(path = "/save")
    void saveAppScript(
            @RequestParam(name = "appScript") String appScript,
            @RequestParam(name = "appKey") String appKey
    ) {
        SharedPreUtils.put(App.getInstance(), "script_" + appKey, appScript);
}

有的老铁可能会有疑虑,你用SharedPreferences进行保存,每个应用的脚本列表如何实现呢,这个也简单,通过json保存呗,具体的数组和对象转化成string后进行存储就可以了。

获取脚本信息:

/**
     * AUTHOR:AbnerMing
     * INTRODUCE:获取脚本信息
     */
    @GetMapping(path = "/appScript")
    String getAppScript(@RequestParam(name = "appKey") String appKey) {
        String json = SharedPreUtils.getString(App.getInstance(), "script_" + appKey);
        if (!TextUtils.isEmpty(json)) {
            return json;
        } else {
            return JsonUtils.failedJson(400, "没有找到对应的脚本数据");
        }
    }

接收启动消息与当前进度消息

前端点击脚本运行之后,需要把当前的应用信息以及脚本信息,发送到后端,也就是手机端,那么手机端如何接收这个通知呢?这里在手机端做了一个定时操作,也就是不断的来轮询是否有指令过来,有的话,赋值一个变量为true,就直接执行程序,程序执行完或者点击了终止操作,把这个变量赋值为false,也就是说,轮询一直都在,但程序的执行是通过变量来控制的。

开启程序接口,包含开启的指令,调用的脚本信息,应用的包名字。

 /**
     * AUTHOR:AbnerMing
     * INTRODUCE:开启程序
     */
    @PostMapping(path = "/startApp")
    void startScript(
            @RequestParam(name = "startApp") String startApp,
            @RequestParam(name = "appScript") String appScript,
            @RequestParam(name = "appPack") String appPack
    ) {
        App.Companion.setMAppToastMessage("");
        App.Companion.setMAppScriptMessage("");
        App.Companion.setMStartApp(startApp);
        App.Companion.setMAppPack(appPack);
        App.Companion.setMAppScript(appScript);

    }

当然了还有一些其他的接口信息,大家主要看源码中PhoneAppController这个类即可,里面也有着详细的注释。

自动化逻辑

有了前端UI的展示,还有接口的提供,基本上,就可以实现上篇文章的效果,但触发运行指令之后,如何进行该脚本的正常执行呢?举个例子,我给京东写了一个脚本,搜索茅台,点击进详情,然后执行抢购操作,当程序下发后,怎么在手机上正常运行呢?

这里呢,我使用的是AccessibilityService,也就是Android端的无障碍服务,通过AccessibilityService我们可以监听到当前的可见的应用,以及捕获到页面的控件相关信息,进而执行我们的点击,输入,滑动等操作。

相关的源码大家可以看AutomaticService这个类,目前仅仅是初版,很多代码写的很随便,大家先凑合着看哈。

这个服务实现的相关逻辑就是开启服务后,直接启动一个定时,这个定时器是一直存在的,目的就是用来接收,是否有新的指令过来,一旦有指令过来,就去执行程序,并把开关关闭。

Android端自动化测试工具源码分享

 不为空,证明有新的脚本信息过来,就去执行,然后赋值为空,确保一个指令只执行一次。

Android端自动化测试工具源码分享

执行脚本的时候,大家可以看到都是通过中文或简写进行编辑的,其实这些都是我们自己所定义的,也就说,我们可以随意定义,比如点击登录,最重要的是登录两个字,你点击也好,click也好,根据定义的这个,回到我们的程序中,进行截取,触发相关的逻辑即可,下面的图是我自己定义的。

Android端自动化测试工具源码分享

在代码中是这样做截取的,可以看下面代码,非常的简单,拿到你的执行脚本,判断是否包含所定义的关键字,然后,截取,执行点击操作。

if (s.contains("点击") || s.contains("ck")) {
            try {

                String click = "";
                if (s.contains("点击")) {
                    click = s.replace("点击", "");
                } else {
                    click = s.replace("ck", "");
                }
                //判断是否存在
                WUtils.findTextAndClick(this, click, new CallBackListener() {
                    @Override
                    public void success() {
                        try {
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        App.Companion.setMAppScriptMessage(indexPosition + "==" + s);
                        Log.e(TAG, indexPosition + "==" + s);
                        containsContent();

                    }

                    @Override
                    public void fail() {
                        App.Companion.setMAppScriptMessage("-c==【" + s + "】未找到当前程序");
                        Log.e(TAG, "-c==【" + s + "】未找到当前程序");
                        //执行发生,错误之后,继续执行下一个逻辑
                        containsContent();

                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
                App.Companion.setMAppScriptMessage("-c==【" + s + "】语法错误啊老铁");
                Log.e(TAG, "-c==【" + s + "】语法错误啊老铁");
            }

        }

以上呢,是点击的操作,滑动,输入等等都是通过这种方式,大家可以直接看AutomaticService这个类。

关于点击,滑动,输入等等操作,我都封装好了,大家可以看WUtils或者BaseAccessibilityService即可,里面基本上也有注释。

这版的功能实现比较着急,没有好好的进行梳理,按照既定的规划,使用AccessibilityService是完全可以进行流畅的自动化的,目前只实现了一个大概,后续还得跟进啊,好了,各位老铁,就到这里吧,下面是源码,大家可以随意更改。

Github地址:

https://github.com/AbnerMing888/AndroidAutomatic文章来源地址https://www.toymoban.com/news/detail-449728.html

到了这里,关于Android端自动化测试工具源码分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【测试开发】第五节.测试——自动化测试(Selenium工具)

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句: 人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、自动化测试的概念以及分类 二、Selenium—web自动化测试工具 2.1 自动化测试的一些前置工作 2.2 第一个自动化实例

    2024年02月04日
    浏览(64)
  • 自动化测试工具之 Jmeter性能测试

    1.性能测试概念: 通过自动化测试工具模拟多种正常,峰值以及异常负载条件来对系统的各项性能指标进行测试 2.性能测试条件 系统基础功能测试验证完成 系统趋于稳定 3.性能测试基本流程 需求分析 (1)系统信息调研 (2)业务信息调研 (3)性能需求评估   判断是否进行

    2023年04月09日
    浏览(69)
  • TOSCA自动化测试工具

    TOSCA由德国公司Tricentis研发,提供英文和德语两种版本。 目前他们的网上培训课程大约是2000一套,从初级到高级,从工程师到BA,有技术,也有测试管理。 TOSCA的思想是,不用会编程的测试人员可以直接上手自动化。 文档和下载路径: https://support.tricentis.com/community/home.do T

    2024年02月07日
    浏览(48)
  • Airtest自动化测试工具

    一开始知道Airtest大概是在年初的时候,当时,看了一下官方的文档,大概是类似Sikuli的一个工具,主要用来做游戏自动化的,通过截图的方式用来解决游戏自动化测试的难题。最近,移动端测试的同事尝试用它的poco库来做自动化,看样子还不错,所以,这里推荐给各位同学

    2024年02月14日
    浏览(47)
  • 自动化测试工具比传统测试工具的优势体现在哪里?

    随着软件行业的快速发展和扩张,自动化测试工具在提高测试效率和质量方面起到了不可或缺的作用,那你知道自动化测试工具比传统测试工具的优势体现在哪里吗?   首先,自动化测试工具能够大大缩短测试周期。相比于传统手动测试,自动化测试工具能够在短时间内执行

    2024年02月16日
    浏览(50)
  • MATLAB/ SIMULINK模型在环MIL测试工具,自动化模型测试工具,自动生成测试报告

    MATLAB/ SIMULINK模型在环MIL测试工具,自动化模型测试工具,自动生成测试报告。 软件纯自己编写,经过长时间测试,包教会。 使用简单,可以参考如下截图。 ID:972000 677200256038 悦潮风尚

    2024年02月16日
    浏览(54)
  • 自动化测试工具——Selenium详解

    Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,支持的浏览器包括IE(7, 8,

    2024年01月20日
    浏览(62)
  • UI自动化测试工具详解

    1、QTP:商业化的功能测试工具,收费,可用于web自动化测试 2、Robot Framework:基于Python可扩展的驱动的测试自动化框架 3、Selenium :开源的web自动化测试工具,免费,主要用于功能测试 ,特点:1)开源软件 2)跨平台 3)支持多种语言 3)支持多种浏览器 3)功能强大、

    2024年02月09日
    浏览(49)
  • 初识自动化测试工具——katalon

    Katalon Studio 是一款免费的自动化测试工具,可以安装在windows、macOS、linux操作系统上,基于selenium 和 Appium 测试框架,并集成了这些框架的优点。工具使用简单方便,对于编码经验少,能力弱的测试人员也可以很快上手。 2.1、下载 Katalon 官网下载地址:https://www.katalon.com/down

    2023年04月08日
    浏览(41)
  • 如何使用Python自动化测试工具Selenium进行网页自动化?

    Selenium 是一个流行的Web自动化测试框架, 它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为 。 Selenium可以通过代码驱动浏览器自动化测试流程,包括页面导航、元素查找、数据填充、点击操作等。 与PyAutoGUI和AutoIt相比, Selenium更适合于处

    2023年04月09日
    浏览(126)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包