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

xiscoxu · January 15, 2014 · Last by Forwards replied at September 05, 2018 · 4881 hits
本帖已被设为精华帖!

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之间来回切换么?

你好,appium 点击时一直提示元素not clickable,用uiaot...view 看有的控件属性clickable为false,是这个影响的吗,怎么去实现点击操作?有没有类似qtp/selenium可以改变某个属性值的方法?

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up