在 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+ 在我的设备上是成功的:
禁用与键盘输入法相关的包。
此处列出了命令:
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
禁用 "Google voice typing"
"Google voice typing"还能弹出键盘
如果您想禁用键盘:
转到设置 → 应用 → 运行(或全部)→ "Google Keyboard" → 设置 → 禁用 "Google voice typing"。
注意:如果要启用键盘,运行命令如下:
adb shell pm enable com.google.android.inputmethod.latin
我想也许你可以试试这个:在那一步写一个if()
,如果在那个视图中找不到UiObject
,那么UiDevice.pressBack()
。
在我的 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+ 在我的设备上是成功的:
禁用与键盘输入法相关的包。
此处列出了命令:
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
禁用 "Google voice typing"
"Google voice typing"还能弹出键盘
如果您想禁用键盘:
转到设置 → 应用 → 运行(或全部)→ "Google Keyboard" → 设置 → 禁用 "Google voice typing"。
注意:如果要启用键盘,运行命令如下:
adb shell pm enable com.google.android.inputmethod.latin
我想也许你可以试试这个:在那一步写一个if()
,如果在那个视图中找不到UiObject
,那么UiDevice.pressBack()
。