如何使用 Android UiAutomation.injectInputEvent 注入点击事件

2023-11-26

我正在自动测试我安装设备管理员的应用程序中的流程。要在大多数设备上激活设备管理员(假设这里没有一些企业 API 可以让我像三星提供的那样执行此操作),系统会向用户显示一个弹出窗口,然后用户必须单击“激活”按钮。

我在用着Robotium和 Android JUnit 来驱动我的测试。在正常的测试情况下,人们只能与被测应用程序和进程交互,而不能与出现的任何系统活动交互。

The Ui自动化声称允许您通过利用无障碍框架,然后允许一个注入任意输入事件.

所以 - 这就是我想做的:

public class AbcTests extends ActivityInstrumentationTestCase2<AbcActivity> {

    private Solo mSolo

    @Override
    public void setUp() {
        mSolo = new Solo(getInstrumentation(), getActivity());

    }

    ...

    public void testAbc(){
    
        final UiAutomation automation = getInstrumentation().getUiAutomation();         
        
        MotionEvent motionDown = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
                100,  100, 0);

        automation.injectInputEvent(motionDown, true)
        MotionEvent motionUp = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_UP,
                100, 100, 0);

        automation.injectInputEvent(motionUp, true)
        motionUp.recycle();
        motionDown.recycle();
     }
    
 }

运行此测试时,系统弹出窗口“激活”,设备管理员处于活动状态,我只想单击屏幕。出于本问题的目的,我已将 100,100 硬编码为点击位置,但实际上我将点击屏幕的右下角,以便点击按钮。

我没有收到屏幕上发生任何点击事件。有人对此有经验吗?有其他选择可以做我想做的事吗?据我了解,很少有工具可以做到这一点。

Thanks.

Update Added setSource为了正确答案


终于明白了这一点。我将 MotionEvent 与单击按钮时调度的两个事件进行了比较,唯一的区别是源。因此,我在两个motionEvents上设置了源并且它起作用了。

....
motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN);
....
motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN);

这是该方法的完整版本

//=========================================================================
//==                        Utility Methods                             ===
//=========================================================================
/**
 * Helper method injects a click event at a point on the active screen via the UiAutomation object.
 * @param x the x position on the screen to inject the click event
 * @param y the y position on the screen to inject the click event
 * @param automation a UiAutomation object rtreived through the current Instrumentation
 */
static void injectClickEvent(float x, float y, UiAutomation automation){
    //A MotionEvent is a type of InputEvent.  
    //The event time must be the current uptime.
    final long eventTime = SystemClock.uptimeMillis();

    //A typical click event triggered by a user click on the touchscreen creates two MotionEvents,
    //first one with the action KeyEvent.ACTION_DOWN and the 2nd with the action KeyEvent.ACTION_UP
    MotionEvent motionDown = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_DOWN,
            x,  y, 0); 
    //We must set the source of the MotionEvent or the click doesn't work.
    motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN);
    automation.injectInputEvent(motionDown, true);
    MotionEvent motionUp = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_UP,
            x, y, 0);
    motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN);
    automation.injectInputEvent(motionUp, true);
    //Recycle our events back to the system pool.
    motionUp.recycle();
    motionDown.recycle();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Android UiAutomation.injectInputEvent 注入点击事件 的相关文章

  • 如何在 Android 中保存相机的临时照片?

    在尝试从相机拍照并将其保存到应用程序的缓存文件夹中时 我没有得到任何可见的结果 应用程序不会崩溃 但在 LogCat 上 当我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI 时 我收到此消息 09 17 14 03
  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • 针对 Soap Web 服务测试应用程序的建议

    我正在寻找一些测试 SOAP Web 服务的建议 我希望能够从 WSDL 创建请求 查看这些请求并检查响应 我还希望它能够与 WS 兼容的服务一起使用 例如使用 WCF wsHttpBinding 时 有什么建议么 我使用 SoapUI h
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • Android 30+ 中的视频捕获意图 - 只有所有者才能与待处理项目交互

    我正在尝试在我的应用程序上捕获视频 它可以在 android API 30 以下运行 但不能在 30 以上运行 似乎在 sdk 30 之后 android 不允许完全读取外部存储 作用域存储 我目前遇到这个错误 java lang Ille
  • 找不到 com.google.firebase:firebase-core:9.0.0 [重复]

    这个问题在这里已经有答案了 在遵循有些不一致的指示之后here https firebase google com docs admob android quick start name your project and here http
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 原色(有时)变得透明

    我正在使用最新的 SDK 版本 API 21 和支持库 21 0 2 进行开发 并且在尝试实施新的材料设计指南时遇到了麻烦 材料设计说我需要有我的primary color and my accent color并将它们应用到我的应用程序上
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef

随机推荐

  • 迁移到 AndroidX 后 AppBarLayout 膨胀错误

    当迁移到AndroidX我遇到了这个问题 Java lang RuntimeException Unable to start activity ComponentInfo com mandarine android com mandari
  • Google Cloud Functions 包含私有库

    我正在寻找在节点中编写一个自定义库 并且希望将其包含在我的云函数中 由于这是共享代码 我希望能够在我的所有云功能中使用它 编写共享代码库并让多个云函数访问该库的最佳方式是什么 例如 假设我有两个云函数 functionS 和 functio
  • ReferenceError:PF 未定义

    我尝试过通知栏PrimeFaces 的示例 但是它不起作用 我收到以下 JS 错误 ReferenceError PF 未定义 我想我需要在使用之前包含一个库PF 函数 但我不知道哪个库以及在哪里可以找到它 JS 函数PF 仅从 4 0 开
  • Python3 - 使用 Socks5 代理的请求

    有没有办法使用socks5代理来使用TOR处理请求 我知道请求只使用http代理 import requests r requests get http www google com proxies my proxy 您可以使用socks
  • 通过反射获取Java中类的公共静态最终字段/属性的值

    假设我有一堂课 public class R public static final int 1st 0x334455 我怎样才能得到的值 1st 通过反射 首先检索类的字段属性 然后您可以检索值 如果您知道类型 则可以使用带有 null
  • 通过单击弹出窗口外部来关闭弹出窗口 javascript

    我使用本教程将弹出窗口添加到我的网页 有没有一种方法可以使当您单击弹出窗口外部 单击另一个弹出窗口时关闭弹出窗口 我尝试按照这篇文章添加一个invisibleDiv通过单击外部来关闭弹出的 div但弹出窗口仍然仅在单击按钮本身时才会移动 h
  • 有没有办法在 Visual Studio Code 中设置环境变量?

    如何在 Visual Studio Code 中设置环境变量 假设您的意思是调试会话 那么您可以包括env您的财产启动配置 如果您在工作区中打开 vscode launch json 文件或选择 调试 gt 打开配置 那么您应该会看到一组用
  • 如何在 html-webpack-plugin 中注入自定义元标记?

    我将 Webpack 与插件一起使用html webpack plugin 基于环境变量 我想注入一个标记进入决赛index html file 我该怎么做呢 您可以定义自己的模板 中简要提到了编写您自己的模板您可以将任何您想要的选项传递给
  • TypeScript 中元组的通用类型包装

    我需要向映射元组元素的函数添加类型声明 Foo a Foo b 到一个函数 gt A B 我怎样才能在 TypeScript 中实现这一目标 此示例在结构上与应用程序的相关部分类似 interface SomethingWithAValue
  • 使用内连接更新?

    我有两个数据库 DB1 and DB2 如何做类似的事情 update myServer DB1 dbo hotels Name myServer DB2 dbo hotels Name join myServer DB2 dbo hote
  • 删除变量(如果存在)的正确方法

    我尝试这样做 def create l if l in globals l destroy l Listbox root 这工作正常 但它返回语法警告 Warning from warnings module File C Users Us
  • 如何在 django 中对文件上传进行单元测试

    在我的 django 应用程序中 我有一个完成文件上传的视图 核心代码片段是这样的 if request method POST if request FILES has key file file request FILES file w
  • 如何将具有外键的表更新到 ADO.Net 实体模型中的另一个表?

    我有 2 个表 Table1 有一个主键 CustomizationId Table2 有一个与此匹配的 FK Customizationid Table2 没有主键 我正在尝试从基于网络的表单添加新记录 我尝试将其保存到数据库中 但收到错
  • Android openRawResource() 不适用于可绘制对象

    我正在尝试通过这样做来创建输入流 InputStream is InputStream getResources openRawResource R drawable image1 但我遇到了关于我的可绘制文件 R drawable ima
  • R Blogdown Hugo 学术主题未渲染站点

    我正在尝试使用 R Blogdown Hugo Academic 主题创建一个网站 通常 我会通过运行以下命令来创建一个网站 blogdown new site theme gcushen hugo academic blogdown se
  • 类型错误:需要类似字节的对象,而不是 subprocess.check_output 中的“str”

    我收到 TypeError a bytes like object is required not str 在 python3 5 的以下代码行中 path os getcwd strip n Null userprof subproces
  • TypeScript 需要进行类型检查

    我正在使用 TypeScript v1 4 1 并且希望需要一个外部模块 在本例中为 chai 并对其进行类型检查 但是 我遇到了与此代码的某种命名冲突
  • 字符串替换转义字符

    今天我发现将字符串放入资源文件中会导致它们被视为文字 即放置 第一行文本 n第二行文本 将导致转义字符本身被转义 因此存储的内容是 第一行的文本 n 第二行的文本 然后这些出现在显示屏中 而不是我的回车符和制表符 所以我想做的是使用 str
  • 无法在 VBA 中创建新枚举

    我正在 VBA 中创建一个不可变链接列表类 它提供ToArray and ToCollection方法 我已经验证这两种方法都有效 但是 那Get NewEnum As IUnknown财产不工作 我不知道为什么 Public Proper
  • 如何使用 Android UiAutomation.injectInputEvent 注入点击事件

    我正在自动测试我安装设备管理员的应用程序中的流程 要在大多数设备上激活设备管理员 假设这里没有一些企业 API 可以让我像三星提供的那样执行此操作 系统会向用户显示一个弹出窗口 然后用户必须单击 激活 按钮 我在用着Robotium和 An