kkevsekk1 / AutoX

A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具)
Other
7.93k stars 1.88k forks source link

所有基于RootAutomator的操作都无效,以及解决办法 #1207

Open Bob8259 opened 1 month ago

Bob8259 commented 1 month ago

Autox.js 版本:7.0.3 Autox.js 下载渠道:https://github.com/kkevsekk1/AutoX/releases Android 版本:Android 9 Android 机型:Ausu ROG 3(逍遥模拟器) Android 系统类别:逍遥模拟器 VSCODE 扩展版本 Auto.js-Autox.js-VSCodeExt (可选,如果是连接电脑的问题需要填): 问题描述:所有基于RootAutomator的操作都无效。但是反而Tap是有效的。我希望实现多点同时按下并移动的功能,swipe无法实现,只能使用RootAutomator。代码是直接从教程文档复制的,但是无效。 无效代码如下: var ra = new RootAutomator(); ra.press(212,280, 1); ra.touchDown(212,280, 1); ra.touchMove(293, 569, 1); sleep(1000); ra.exit(); 报错日志(可选):无任何报错信息,看起来是正常运行的。但实际上没有点击。 屏幕截图(可选): ——————————————————————————分割线———————————————————————————— 目前已经发现问题原因,问题在于auto js自带的sendevent获取了错误的输入设备。我自己写了封装了几个命令来解决这个问题,代码如下,大家可以直接使用。本人是初学萌新,如有错误还望大佬指点。

注意:首先需需要使用adb shell getevent去获取具体的input event id,然后替换掉所有的event id。在我的设备中,运行这个命令后,再用鼠标去点击模拟器屏幕,就会看到类似以下的提示信息。这就说明我的event id是6,每个设备的event id都不一样。需要获取后修改代码再运行。 /dev/input/event6: 0003 0035 00000127 /dev/input/event6: 0003 0036 00000194 /dev/input/event6: 0003 0030 00000002 /dev/input/event6: 0003 0039 00000000

function touchDown(x, y, id) {
  //判断是否横屏,如果是横屏的话就换算坐标。
  //注意,按键精灵默认截图是竖屏截图,如果是横屏的话,需要使用横屏截图时的坐标
  var result = shell('dumpsys display | grep "mCurrentOrientation"', true);
  if (result.result.includes("mCurrentOrientation=1")) {
    var temp_x = x,
      temp_y = y;
    y = temp_x;
    x = 720 - temp_y;
  }
  shell(`sendevent /dev/input/event6 3 47 ${id}`, true); // Select touch slot (id) 
  shell(`sendevent /dev/input/event6 3 57 ${id}`, true); // Format id
  shell(`sendevent /dev/input/event6 3 53 ${x}`, true); // Format x
  shell(`sendevent /dev/input/event6 3 54 ${y}`, true); // Format y
  shell("sendevent /dev/input/event6 3 48 5", true); // Fixed value
  shell("sendevent /dev/input/event6 3 58 50", true); // Fixed value
  shell("sendevent /dev/input/event6 0 0 0", true); // End of event
}

function touchMove(x, y, id) {
  //判断是否横屏,如果是横屏的话就换算坐标。
  //注意,按键精灵默认截图是竖屏截图,如果是横屏的话,需要使用横屏截图时的坐标
  var result = shell('dumpsys display | grep "mCurrentOrientation"', true);
  if (result.result.includes("mCurrentOrientation=1")) {
    var temp_x = x,
      temp_y = y;
    y = temp_x;
    x = 720 - temp_y;
  }
  shell(`sendevent /dev/input/event6 3 47 ${id}`, true); // Select touch slot (id)
  shell(`sendevent /dev/input/event6 3 57 ${id}`, true); // Format id
  shell(`sendevent /dev/input/event6 3 53 ${x}`, true); // Format x
  shell(`sendevent /dev/input/event6 3 54 ${y}`, true); // Format y
  shell("sendevent /dev/input/event6 0 0 0", true); // End of event
}

function touchUp(id) {
  shell(`sendevent /dev/input/event6 3 47 ${id}`, true); // Select touch slot (id)
  shell(`sendevent /dev/input/event6 3 57 ${id}`, true); // Format id
  shell("sendevent /dev/input/event6 3 57 -1", true);
  shell("sendevent /dev/input/event6 0 0 0", true); // End of event
}
//使用例子
    touchDown(20, 205, 0); // 按下手指0,按下的坐标是x=20,y=205的位置
    touchMove(5, 230, 0);//将手指0移动到x=5,y=230的位置
    sleep(1000);

    touchDown(193, 572, 1); // 按下手指1,按下的坐标是x=193,y=572的位置
    touchMove(351, 572, 1);//移动手指1
    sleep(1000);

    touchUp(0); //松开手指0
    touchUp(1); //松开手指1
//最高支持的多点触控数量和设备有关
aiselp commented 1 month ago

666,不知道adb shell能不能用,可行的话可以封装到RootAutomator中

1061700625 commented 1 month ago

AMD电脑上的安卓模拟器无法使用RootAutomator和adb shell的event,只有Intel的电脑才行。 其他人也提出过同样问题,并且找到了原因:

Bob8259 commented 1 month ago

AMD电脑上的安卓模拟器无法使用RootAutomator和adb shell的event,只有Intel的电脑才行。 其他人也提出过同样问题,并且找到了原因:

我的电脑就是Intel,也无法运行。我搜过历史issue,里有不少人遇到过这个问题,但是没有解决办法。此外我运行的时候没有任何报错,就是单纯没有效果。所以第一个关于houdini failed的帖子也不适用。我经过很久的研究终于找到了解决办法,分享给大家一起用。