有没有办法用UIAutomator输入西里尔字母?

时间:2017-02-01 18:50:23

标签: android uiautomator cyrillic android-uiautomator

我正试图用UIAutomator测试我公司浏览器的俄语自动推荐功能,并且遇到了障碍:

俄语字母没有KeyEvent.KeyCode_ *代码,UiDevice.pressKeyCode(KeyEvent.KEYCODE_LANGUAGE_SWITCH)似乎没有帮助。我在KeyEvent类中找到的文档似乎表明我只需要使用与英文字母相同的KeyCodes,但奇怪的是它们将被映射到其他语言的字母。然而,这似乎并没有真正发生,因为当我尝试时,我仍然看到英文字母出现。

通常使用俄语我只使用UiObject2.setText(...)但该方法不会触发自动建议。

我已经尝试深入研究UiDevice.pressKeyCode正在做什么,并尝试了几个解决方法,例如:

KeyEvent eventsб2 = new KeyEvent(SystemClock.currentThreadTimeMillis(), "б", KeyCharacterMap.VIRTUAL_KEYBOARD, 0);
Instrumentation.sendKeySync(eventsб2);

KeyEvent[] eventsа = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD).getEvents(new char[] {'a'});
Instrumentation.sendKeySync(eventsа[0]);

但他们要么不输入信件,要么就需要INJECT_EVENTS权限抛出许可例外。总的来说,我觉得我在黑暗中磕磕绊绊,并且会喜欢一些关于如何继续的建议。

1 个答案:

答案 0 :(得分:0)

我试过这个并且工作了。

/**
 * @@Test comment here@@
 *
 * @throws Exception
 */
@Test
public void culebraGeneratedTest_CyrillicKeyBoardAndSelectSuggestion() throws Exception {
    mDevice.pressHome();
    mDevice.findObject(By.res("com.android.quicksearchbox:id/search_widget_text").clazz("android.widget.TextView").text(Pattern.compile("")).pkg("com.android.quicksearchbox")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
    mDevice.findObject(By.desc("й").clazz("com.android.inputmethod.keyboard.Key").text(Pattern.compile("")).pkg("com.android.inputmethod.latin")).clickAndWait(Until.newWindow(), DEFAULT_TIMEOUT);
    (new UiScrollable(new UiSelector().resourceId("com.android.quicksearchbox:id/suggestions").index(1).packageName("com.android.quicksearchbox"))).getChildByText(new UiSelector().className("android.widget.RelativeLayout").packageName("com.android.quicksearchbox"), "йемен", true).click();
}

我必须承认我不懂俄语或者我在西里尔语键盘上选择的内容,所以请耐心等待。

为了生成此测试,我使用了CulebraTester,因为它似乎是该工具的一个有趣的用例。

culebratester screenshot cyrillic

步骤是:

  1. 开始录制测试(生成Java UiAutomator,也可以生成python和其他语言)
  2. 按主页
  3. 选择快速搜索框
  4. 按键
  5. 选择其中一项建议
  6. 您可以在python中使用AndroidViewClient/culebra创建类似的测试,但因为此工具基于从uiautomator dump获得的信息,所以它无法检测到键盘,但您也可以使用DIP触摸它们

    vc.dump(window=-1)
    vc.findViewByIdOrRaise("com.android.quicksearchbox:id/search_widget_text").touch()
    vc.sleep(_s)
    vc.dump(window=-1)
    device.touchDip(15.33, 393.33, 0)
    

    但这并不像第一个解决方案那样独立于设备。

    希望这会对你有所帮助。