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

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

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 了, 目前对 java 用户是福音. 对于 python 和 ruby 和用户可以考虑使用 jvm 的实现. 期待有人搞个 jruby jython 的调用示例.

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

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

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

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

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

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

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

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

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

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

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

同上问

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

把这个 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,这个时候就可以用这个输入法输入中文了

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

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

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

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

21楼 已删除

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

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