20

控制台是否可以adb shell使用其 ID 访问 Android 应用程序的特定按钮?还是文字?

我正在尝试自动单击设备上的按钮。这是一个从浏览器访问的网络应用程序。那么,如果我有那个按钮 ID,我可以向那个按钮发送一个动作吗?

4

5 回答 5

31

UI automator 提供资源 ID、文本和 UI 元素的边界。可以使用 XML 查看器或 Chrome 浏览器来更好地查看文件。

adb pull $(adb shell uiautomator dump | grep -oP '[^ ]+.xml') /tmp/view.xml

可以提取 UI 元素的边界并计算中点。替换text=resource-id=content-desc=根据需要。

coords=$(perl -ne 'printf "%d %d\n", ($1+$3)/2, ($2+$4)/2 if /text="MY_BUTTON_TEXT"[^>]*bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/' /tmp/view.xml)

现在我们有了 UI 元素中心的坐标,$coords我们只需要发送一个点击事件。

adb shell input tap $coords
于 2018-04-25T16:43:04.300 回答
11

是的,你可以,虽然它不漂亮。

您可以使用以下命令获取视图层次结构:

adb exec-out uiautomator dump /dev/tty,它将输出作为 XML 文件打印到屏幕上。不幸的是,它不是有效的 XML,因为附加了一些文本。所以让我们过滤掉:

adb exec-out uiautomator dump /dev/tty | awk '{gsub("UI hierchary dumped to: /dev/tty", "");print}'

现在我们有了一个有效的 XML。让我们通过 XPath 运行它:

adb exec-out uiautomator dump /dev/tty | awk '{gsub("UI hierchary dumped to: /dev/tty", "");print}' | xpath '//node[@resource-id="com.example:id/btnDone"]' 2> /dev/null,它将搜索具有特定 ID 的所有节点。现在你得到了节点,你可以在这上面做更多的事情。

如果您只获得视图边界,则必须这样做:

adb exec-out uiautomator dump /dev/tty | awk '{gsub("UI hierchary dumped to: /dev/tty", "");print}' | xpath '//node[@resource-id="com.example:id/btnDone"]/@bounds' 2> /dev/null | awk '{$1=$1};1' | awk '{gsub("bounds=", "");print}' | awk '{gsub("\"", "");print}',然后清理字符串并仅输出[294,1877][785,1981].

具体节点的来源是:

<node index="1" text="Let’s get started!" resource-id="com.example:id/btnDone" class="android.widget.Button" package="com.example" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[294,1877][785,1981]" />

于 2019-01-23T19:15:35.713 回答
9

我认为您能做的最好的事情就是根据坐标注入触摸。

请参阅将触摸事件从 ADB 发送到设备使用 ADB 模拟触摸

您可能会从 dumpsys 窗口或活动中获得按钮的坐标。

您还可以查看Monkeyrunner

于 2013-09-20T22:00:21.143 回答
6

您将无法使用按钮 ID,但您可以获取按钮坐标并模拟点击事件。

Android 带有一个输入命令行工具,可以模拟各种输入事件。要模拟敲击,请使用:

input tap x y

您可以使用 adb shell 远程运行命令:

adb shell input tap x y

其他选项包括:

shell@m0:/ $ input
input
usage: input ...
       input text <string>
       input keyevent <key code number or name>
       input [touchscreen|touchpad|touchnavigation] tap <x> <y>
       input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]
       input trackball press
       input trackball roll <dx> <dy>
于 2014-01-01T14:53:52.040 回答
1

如果我,我使用 python 来做到这一点,将 cmd 命令与 subprocess.Popen 结合起来,脚本将是:

from subprocess import Popen, PIPE

import os

adbpath = r'YOUR ADB DIR'
adbfile = 'adb.exe'
adb = os.path.join(adbpath, adbfile)

def tap(a):
    cor = a
    t = Popen([adb, 'shell', 'input', 'tap', str(a[0]), str(a[1])])

#i give you extra script

def swipe(a, b):
     first = a
     last = b
     sab = Popen([adb, 'shell', 'input', 'swipe', str(first[0]), str(first[1]), str(last[0]), str(last[1]), '200'])

然后,当您有一个按钮坐标可以点击时,请执行以下操作:

ok_coord = 122,137
tap(ok_coord)

当你想刷卡时:

coord1 = 122,373
coord2 = 122,26
swipe(coord1, coord2)

要获取按钮或点的坐标,请使用文件夹“sdk\tools\bin”中的“uiautomatorviewer.bat”

或者您可以使用杏、erm3nda 或 Vinicius Dantas 方法,

于 2019-01-01T08:10:39.230 回答