移动测试基础 UiAutomator 中文输入实现

xiscoxu · 2014年01月15日 · 最后由 Forwards 回复于 2018年09月05日 · 3093 次阅读
本帖已被设为精华帖!

UiAutomator 不支持中文输入。

通过设置中文输入法为默认,UiObject.setText("pinyin ") 的方式,可以实现中文输入,但是只能输入一些固定的词组。

github 上发现了一个 utf7ime 的好东西,可以实现中文输入,英文输入,中英文混合输入。简单来说,支持输入任何 unicode 编码的字符。
原理是:UiObject.setText( String) 只能接受 ASCII 码,整个过程是输入的 unicode 编码的字符串 decode 成 ASCIl 码,setText 接受这些 ASCll 码再通过 utf7ime 这个输入法 encode 成 unicode 编码的字符串输出。
前置条件:手机装入此输入法并将之设为默认输入法

简单说一说整个过程,

最后生成脚本是这样的:

import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import com.sn.test.testUtil.AppAPI;
import com.sn.test.testUtil.Utf7ImeHelper;

public class TestInput extends UiAutomatorTestCase {
    private String caseName = this.getClass().getSimpleName();
    private String caseDetail = "";
    private String description = "";
    private boolean result = false;

    protected void setUp() throws Exception {
        super.setUp();
        AppAPI.setUp(caseName);
    }

    public void testDemo() throws UiObjectNotFoundException, RemoteException {

        new UiObject(new UiSelector().className("android.widget.TextView")
                .text("信息")).clickAndWaitForNewWindow();
        sleep(1000);

        new UiObject(new UiSelector().className("android.widget.RadioButton")
                .text("新信息")).clickAndWaitForNewWindow();
        sleep(1000);

        new UiObject(new UiSelector().className("android.widget.EditText"))
                .setText(Utf7ImeHelper.e("test test yingwen 中文一起输入"));
        sleep(1000);

下一步考虑如何将这个功能集成到脚本录制工具中去。

共收到 22 条回复 时间 点赞

怎么把 Utf7Ime 设置成默认输入法,设置完之后依然不行

21楼 已删除

请教个问题,切换到这个 utf7ime 输入法时不能手动输入,这个问题如何解决,只能在原来输入法和 utf7ime 之间来回切换么?

测试发现输入中文但是在手机上显示的是英文和数字。有人遇到过这种问题吗?

如果不是测试跨应用也不会选择 uiautomator,既然选了,很多地方都得受着点!

看到这个帖子就去试了一下,没想到 setText 的功能原来这么弱,看起来 uiautomator 要真用起来的话麻烦还不少。

把这个 utf7ime 工程下载了,本地编译成功后会在 bin 目录下生成一个 utf7ime,apk,安装到手机。这个时候手机输入法中就会出现 utf7ime 输入法,把 com.beetstra.jutf7 和 jp.jun_nama.test.utf7ime.helper 两个 package 放到你的工程 src 目录下,引用 import jp.jun_nama.test.utf7ime.helper.Utf7ImeHelper;
切换输入法
adb shell settings put secure default_input_method jp.jun_nama.test.utf7ime/.Utf7ImeService
使用时调用可以把默认输入法换成 utf7ime,这个时候就可以用这个输入法输入中文了

@seveniruby 您好,请问这个项目,最后测试时是什么项目?java?Android?为什么我用 java 使用这个输入法,老报"java.lang.RuntimeException: Stub!"呢?郁闷死了。可以的话,能发个成功使用 utf7ime 输入法的项目吗?实在不明白怎么回事。

同上问

问下怎么生成的 apk,还有第三步没太看明白,导入自己的方法库和最后的那个脚本是什么意思

今天用了一下这个方案,发现有些中文加数字混搭的方式通过不了,比如说:
今天我中了 500 万。

还请大牛能给出解决方案!谢谢!

#9 楼 @xiscoxu 恩, 只是交流技术. 涉及公司机密的可以不用提.

@lihuazhang @seveniruby 一些技术实现可以说说,有时间写文章。就不要公开课了,涉及公司...

#7 楼 @lihuazhang @xiscoxu 恩, 我也对录制工具很感兴趣.求分享

#5 楼 @xiscoxu 可以在公开课上关于录制工具能做些分享么?

#5 楼 @xiscoxu 实现图片对比是不错的, 我也是打算在 appium 上封装 diff 对比相关的测试. 你可以先研究下 appium, 也欢迎你多分享下 uiautomator, 我最近也写了不少 uiautomator 的代码.

@seveniruby 针对 uiautomator 我们做了一些封装,包括了后续测试结果的处理,实现了图片对比,基于 uiautomatorviewer 开发了个 java 脚本录制工具。 但是 uiautomator 不支持 webview,希望后续能和 appium 结合起来。

#3 楼 @xiscoxu appium 已经完整封装了 uiautomator, 所以用的会少些, appium 同时支持 uiautomator 和 instrumentation, 会成为标准的.

@seveniruby 以后请多多指教,搜索 appium 找到这里的,真是个好地方。用 uiautomator 的人好像不多

不错, 我们在论坛上也讨论了很久这个 utf7ime 了, 目前对 java 用户是福音. 对于 python 和 ruby 和用户可以考虑使用 jvm 的实现. 期待有人搞个 jruby jython 的调用示例.

赞,加个头像吧~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册