在 UiAutomator 测试中检测或抑制键盘

Detect or Suppress Keyboard in UiAutomator Tests

在我的 UI 测试中,我将两个 UiObject 的文本设置在屏幕顶部附近,然后单击位于屏幕底部附近的第三个 UiObject。在某些设备上(例如我的 Nexus 6 运行 5.0)这完美地工作。文字设置完毕,屏幕下方的UiObject依然可见,点击成功

在其他设备上(例如我的 Nexus 4 运行 4.4)调用 UiObjects 上的 setText 会调出软键盘,它会遮挡靠近屏幕底部的第三个 UiObject 并阻止它被点击。

我考虑过使用 UiDevice.pressBack() 关闭键盘,但问题是键盘在某些设备上显示,而在其他设备上不显示。在不显示键盘的设备上按回会导致导致测试失败的其他行为。

我也考虑过使用 UiDevice.pressEnter() 作为解决方案。我认为如果键盘可见,这将关闭键盘,如果不可见,则不执行任何操作(两全其美)。问题是,UiAutomator 在 运行 我的测试中显示的键盘没有 "enter" 按钮,它有一个 "next" 按钮。这与我在代码中设置实际 UI 元素的方式相反。当我手动测试时,键盘会按预期显示 "enter" 按钮。但是,由于 UiAutomator 看到 "next" 按钮,这就是它正在执行的功能。焦点只是传递到下一个 UiObject,键盘仍然可见。

所以我想做的是在键盘可见时将其关闭,如果键盘不可见则不冒险按下后退按钮。有没有办法确定它是否显示?或者更好的是,从一开始就不要展示它?

我想我找到了一种让测试通过的方法,就是将屏幕进一步向下滚动。在我的例子中,UI 是可滚动的,所以这有效。

UiScrollable layout = new UiScrollable(new UiSelector().resourceId(...));
layout.scrollForward(5);

我发布这篇文章是为了帮助处于类似情况的任何人。虽然它实际上并没有回答我的问题,所以我不接受这个。

不同的设备有不同的封装,键盘功能也可能不同。
所以,细节可能不尽相同。

下面列出的步骤在 Android 4.0+ 在我的设备上是成功的:

  1. 禁用与键盘输入法相关的包。

    此处列出了命令:

    adb root
    adb shell pm disable com.google.android.apps.inputmethod.hindi
    adb shell pm disable com.google.android.inputmethod.korean
    adb shell pm disable com.google.android.inputmethod.pinyin
    adb shell pm disable com.google.android.inputmethod.latin
    adb shell pm disable jp.co.omronsoft.iwnnime.ml
    pause
    

    注意:设备中可能不存在某些包名称,如 "com.google.android.inputmethod.pinyin"。 使用此命令检查:

    adb shell pm list packages inputmethod
    
  2. 禁用 "Google voice typing"

    "Google voice typing"还能弹出键盘

    如果您想禁用键盘:

    转到设置 → 应用 → 运行(或全部)→ "Google Keyboard" → 设置 → 禁用 "Google voice typing"。

注意:如果要启用键盘,运行命令如下:

adb shell pm enable com.google.android.inputmethod.latin

我想也许你可以试试这个:在那一步写一个if(),如果在那个视图中找不到UiObject,那么UiDevice.pressBack()