【问题标题】:Detect or Suppress Keyboard in UiAutomator Tests在 UiAutomator 测试中检测或抑制键盘
【发布时间】:2016-06-09 01:42:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android android-uiautomator


    【解决方案1】:

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

    下面列出的步骤在我的设备上的 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. 禁用“谷歌语音输入”

      “谷歌语音输入”仍然可以弹出键盘。

      如果你想禁用键盘:

      转到设置→应用程序→运行(或全部)→“谷歌键盘”→设置→禁用“谷歌语音输入”。

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

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

    【讨论】:

    • 我希望我可以在代码中做一些事情,因为我的测试只是在设备上运行的众多测试中的一小部分。我想我可以将我的放在一个单独的包中并在测试之前运行 adb 命令,然后重新启用键盘包。这不是我所希望的,但它可能是最好的选择。谢谢。
    【解决方案2】:

    我想我找到了一种让测试通过的方法,那就是进一步向下滚动屏幕。在我的情况下,用户界面是可滚动的,所以这很有效。

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

    我发布这个以防它对处于类似情况的任何人有所帮助。但它实际上并没有回答我的问题,所以我不接受这个。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为这是一种解决方法,类似于我发布的答案。感谢您的发帖,希望对遇到类似问题的其他人有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多