没有计算机的Android UI自动化

问题描述

嗨,我想在我的android手机中自动执行一个简单的任务,该操作涉及选中单个应用程序页面上的所有复选框(应用程序没有选中所有功能)。

有什么方法可以像使用硒的浏览器那样在android中自动执行UI?

我对Android测试自动化工具有所了解,但我不想每次都将手机连接到计算机。我正在寻找一种通过手机进行操作的方法。也许有些库可以执行此操作,以便我可以构建一个简单的android应用程序?

如果没有这样的库或工具,您可以推荐一些替代方法吗?

编辑:(注意:我不是Android开发人员,因此如果我解释错误,我会提前道歉)在“答案”中找到了解决方法。

解决方法

(注意:我不是Android开发人员,因此如果我解释错误,我会提前道歉)

因此,使用Accessibility服务可以实现android自动化。以下是有关如何将此服务用于自动化的一些详细信息。

首先,为您的应用实现辅助功能类

public class SomeAppAccessibilityService extends AccessibilityService {


@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    //if some event occurs this method is called you can implement appropriate action here when you send a custom event from your app code

}


@Override
public void onInterrupt() {

 }
}

之后,像其他任何服务一样在清单中声明它。服务声明示例

<service android:name=".service.SomeAppAccessibilityService"
             android:label="some app Accessibility Service"
             android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/someappservice"/>
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService"/>
        </intent-filter>
    </service>

您可以搜索不同参数的含义以及更多内容。一些基本的解释如下: android:name(在这里您告诉服务SomeAppAccessibilityService类的位置)

用于属性的资源xml文件示例:

<?xml version="1.0" encoding="utf-8"?><accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes = "typeAllMask"
    android:packageNames="com.example.app1,com.example.app2"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    />

完成所有操作后,您可以按如下所示在onAccessibilityEvent方法中查找辅助功能事件

if(accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {} //for example i want to capture announcement event

当某些可访问性事件(可能是诸如单击,长按,公告或自定义触发事件之类的事件)发生时,将调用OnAccessibilityEvent方法,我们可以使用该方法通过可访问性服务使用获取当前屏幕信息

AccessibilityNodeInfo info=getRootInActiveWindow(); //root view node info
AccessibilityNodeInfo childElem = info.getChild(n); //for getting nth child of root node
info.getChildCount(); //to get total size of child nodes
//then you can iterate on those children to get their child nodes
childElem.performAction(AccessibilityNodeInfo.ACTION_CLICK); //to perform some action on child elem like click as shown here
//there are other many useful AccessibilityNodeInfo class method that you can use

要从您的应用或其他服务发送自定义事件。例如,我已经使用自己的应用程序在一些我想自动化的第三方应用程序(比如说App1)上绘制了覆盖图。当我单击叠加层上的某个按钮时,我希望在该第三方应用程序的(App1)当前窗口上执行某些操作。要执行某些操作,可访问性服务需要捕获一些事件。您可以捕获诸如click等的原始事件,也可以发送自定义事件(可能有一种更完善的方法可以在此处执行此操作,但是在发布时,我没有发现任何事件)。这是例子

AccessibilityManager manager = (AccessibilityManager)this.getSystemService(getApplicationContext().ACCESSIBILITY_SERVICE);

    if(manager.isEnabled()){
        AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT);
        //event.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
        event.setEnabled(true);
        event.setClassName(getClass().getName());
        event.setPackageName("com.example.App1"); //package name for that third part app
        event.setContentDescription("checkAll:true"); //i used description to send data to accessibility service as i could not find any other option to do so at the time of writing
        //for example you can send the id of button and state of button etc in content description
        event.getText().add("some text");
        manager.sendAccessibilityEvent(event);
        

    }

在onAccessibilityEvent中,您可以按以下方式捕获此事件

if(accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
accessibilityEvent.getContentDescription()//to get content description and then you can parse data out of this string to perform some specific action based on that data}

这些是我在过去两天中发现的点点滴滴。我使用这些片段来自动执行Steam应用程序上的一些动作。我知道这不是一个正确的指南,也许也不是很准确。我写这篇文章的唯一目的是,如果有人和我在同一条船上,那么他可能会花点时间开始使用它,这花了我很多天。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...