【问题标题】:How to enter the OK key using adb shell input text?如何使用 adb shell 输入文本输入 OK 键?
【发布时间】:2016-06-25 05:55:24
【问题描述】:

我可以将文本输入到带有adb shell input text "blahblah" 的对话框中。文本出现并...坐在那里。

我可以点击 OK 按钮的坐标,让文本在我输入的任何对话框中实际生效 - 如果我猜到屏幕方向正确,则适应当前分辨率,适应当前键盘变体和很快。非常笨重。

是否有一些神奇的字符或键码或其他一些巧妙的方式让 shell 执行相当于按“确定”的操作?

在上面的截图中,是绿色的->| 右下角的图标。它有时会随着所使用的确切字段而变化,但含义始终相同:关闭键盘并继续。

【问题讨论】:

  • 哪个确定按钮?是您编写的应用程序,还是您下载的应用程序?
  • @TDG:操作系统提供的虚拟键盘上的标准确认按钮。每当您面对文本输入时,它都会出现在所有应用程序以及系统配置中。根据上下文,图标可能会改变 - 如果您正在搜索,则为 lens,如果您正在输入一些数据,则为 ->|,如果您正在输入一些数据,请在密码字段中输入 [OK],但含义相同,完成文本输入并继续。
  • (同样,位置相同,键盘右下角)
  • 我在stackoverflow.com/q/39906970/2291928 有一个类似的未回答问题。不幸的是,似乎应用程序开发人员需要为文本字段构建 Enter Key (keycode 66) 侦听器支持,因为 ADB 以及 Appium 或其他任何东西都无法点击 OK、Done、Continue、Search 或任何IME_ACTIONs .
  • 为了解决这个问题,我发送 key_event TAB (61) 然后输入 (66) 查看我的解决方案:stackoverflow.com/a/68170667/2267723

标签: android adb


【解决方案1】:

我相信您正在寻找adb shell input keyevent 66
keyevent 用于按下虚拟键盘键,代码 66 用于ENTER 键。
你可以在这里找到list of codes

编辑 密钥和代码之间的映射可以在/system/usr/keylayout/qwerty.kl 找到。你可以adb shell cat /system/usr/keylayout/qwerty.kl 看看你需要的代码。

【讨论】:

  • 对于单行输入来说这一切都很好,但它不适用于“换行符”是合法输入的输入(例如,SMS 条目)。它们有一个单独的“输入”和“确认”按钮。
  • 那么你必须为每个按钮找到正确的代码。
  • 好的。我该怎么做?
  • 仍然没有这样的密钥。似乎该按钮未映射到任何键码,而是广播 IME_ACTION_DONE 意图。我目前正在使用am 命令来尝试模拟这一点。
【解决方案2】:

您可以使用AndroidViewClient/culebra 并忘记方向、不同的屏幕尺寸等。

例如,假设我们要输入文本并在此对话框中按OK(Api Demos 的一部分)

快跑

culebra -uGo myscript.py

当窗口显示时,点击条目,输入文本,然后点击确定,此脚本将自动生成

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2016  Diego Torres Milano
Created on 2016-06-10 by Culebra v11.5.8
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os


try:
    sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
except:
    pass

from com.dtmilano.android.viewclient import ViewClient

TAG = 'CULEBRA'

_s = 5
_v = '--verbose' in sys.argv


kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': False, 'ignoreuiautomatorkilled': True, 'autodump': False, 'startviewserver': True, 'compresseddump': True}
vc = ViewClient(device, serialno, **kwargs2)
#vc.dump(window='-1') # FIXME: seems not needed

vc.dump(window=-1)
vc.findViewByIdOrRaise("com.example.android.apis:id/username_edit").setText(u"hello culebra!")
vc.sleep(_s)
vc.dump(window=-1)
vc.findViewWithTextOrRaise(u'OK').touch()

运行时将文本设置为hello culebra!,然后点击OK。然后,您可以根据需要调整生成的脚本。

CulebraTester

CulebraTester 是 culebra 的新实现,作为在被测设备上运行的服务。 它现在处于封闭 Beta 测试阶段,但如果您有兴趣参与,您可以在 culebra.dtmilano.com 找到选择加入表格(在支持下查看)。

它的一个特点是能够检测虚拟键盘并将其与其他视图一样对待。

此屏幕截图说明了在触摸 A、b、c 和 Next(这是您要查找的内容)后生成的测试。

生成的测试是这样的

/**
 * @@Test comment here@@
 *
 * @throws Exception
 */
@Test
public void culebraGeneratedTest() throws Exception {
    mDevice.findObject(By.clazz(Pattern.compile(".*")).desc("A").pkg("com.android.inputmethod.latin")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
    mDevice.findObject(By.clazz(Pattern.compile(".*")).desc("b").pkg("com.android.inputmethod.latin")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
    mDevice.findObject(By.clazz(Pattern.compile(".*")).desc("c").pkg("com.android.inputmethod.latin")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
    mDevice.findObject(By.clazz(Pattern.compile(".*")).desc("Next").pkg("com.android.inputmethod.latin")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
}

您可以像任何其他 UiAutomator 测试一样编译、安装和运行。

作为另一个示例,此屏幕截图显示了当您将虚拟键盘视图悬停在树中时,它们如何在设备表示中突出显示

【讨论】:

  • 虚拟键盘上不行。请参阅我的澄清编辑。
  • 我明白。 AndroidViewClient 依赖uiautomator dump 获取屏幕上的Views,它不包括键盘。但是,CulebraTester 提供了不同的方法,并且可以访问键盘。 CulebraTester 现在处于私人测试阶段,需要在设备上安装应用程序。在该页面的末尾有一个选择加入表单以参与该计划。
  • 如果有人提供一些更简单的方法,我会等待。例如,我看到有人在文本中跳过箍来输入空格键(普通的 ' ' 不起作用),然后有人在字符串中只使用了%s,这将被input 替换为空格命令.. 你的脚本当然可以工作,但它是一种非常迂回的方式来做 应该 可以通过单个 shell 命令实现...
  • 也许您的方法是错误的,您根本不应该在虚拟键盘上进行中继。您可以键入、设置文本并触摸任何您需要的 UI 元素。转义空间和其他大量事情由 AndroidViewClient 自动处理。
  • 在我想使用它的特定上下文中,几乎没有回旋余地:解锁屏幕,而不禁用屏幕安全性。有一个简单的“输入滑动”可以在设置为在滑动时解锁的屏幕上工作,但出于所有实际目的,它已解锁,安全性已禁用。没有简单的方法可以执行复杂的滑动来解锁图案锁。我不想使用可行的 PIN,但我真的不想冒险锁定我的 SIM 卡。但是如果我用密码保护屏幕,我可以输入密码,我只需要“确定”完成密码输入。
【解决方案3】:

最好的方法是使用UiAutomator,但是下面的方法很简单,这有帮助吗? 如果您的设备相同,请尝试 - Android Record N Play。这将记录屏幕,您可以稍后播放。还为您的操作保存一个shell脚本。如果您想在没有工具的情况下独立播放(ui操作),请先使用该工具进行录制,然后调用adb shell sh script_name进行播放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2015-02-12
    • 2017-06-04
    相关资源
    最近更新 更多