Appium [已解决]在 Appium 自动化测试时如何输入中文?

shen · December 03, 2013 · Last by Moon replied at July 15, 2016 · 7901 hits

RT,有没有办法能解决中文输入的问题,太让人头疼了。。。

共收到 63 条回复 时间 点赞
shen #1 · December 03, 2013 作者

追加个问题,输入空格貌似也需要特殊处理??

有需要输入中文的代码片段么? 看看?

shen #3 · December 03, 2013 作者

#2楼 @lihuazhang 场景很简单,就是在一个输入框输入中文.比如 we.sendkeys("你好") 在执行的时候就不会输入任何值,而且我发现用系统自带的键盘输入英文也有问题,最后用谷歌拼音输入法的英文输入才解决,我用的是n4 刚升级到4.4。不知道是不是因为这个导致的

#3楼 @spikeshen 哦 这个问题 我一开始也发现了。 特别是在国内的各种机器上,默认输入法不同,会造成各式各样的问题。

shen #5 · December 03, 2013 作者

#4楼 @lihuazhang 但我用的是亲儿子啊。。。用自带的系统输入法也有问题。。。而且空格都输入不了

我用搜狗输入法, 测试过没什么问题. 其实还是发送按键.
如果想省事, 可以直接调用一些特有的命令.
比如android下就有个input命令, 可以直接输入汉字.

shen #7 · December 03, 2013 作者

#6楼 @seveniruby adb shell input text 你好 这样对吧,但是我试验了下,也不行,很怀疑是4.4导致的,明天找台4.2的机器看看

spikeshen 7楼 貌似在4.4支持按键的操作时有一些问题的,但是还有待尝试

self.wd.execute_script('mobile: setValue',{"element":tf.id,"value":" 北京"})

shen #10 · December 04, 2013 作者

#9楼 @vigossjjj 通过sendkeys最终也是帮你把值通过这个方法送出去

#10楼 @spikeshen 中文不可以 send_keys 本质是点击键盘, setValue本质是给控件属性value赋值

shen #12 · December 11, 2013 作者

#11楼 @vigossjjj setValue不支持啊,我用的是0.12.0,难道高版本的支持了?

#12楼 @spikeshen 可以在appium的代码中搜索下这个词语, 看看是在什么版本中引入的

#12楼 @spikeshen 应该是支持的, 我看过代码了. 可能是你的写法不对.

shen #15 · December 16, 2013 作者

#14楼 @seveniruby
HashMap inputObject = new HashMap();
inputObject.put("element", ((RemoteWebElement) bt).getId());
inputObject.put("value", "test clock");
js.executeScript("mobile: setValue", inputObject);

运行后报错说不支持这个方法

#15楼 @spikeshen 我用ruby测试, 也是同样的问题. 我已经在这个地方提问了
https://github.com/appium/appium/issues/152
你也可以看看, 从里面的讨论看, 貌似ios可以

shen #17 · December 16, 2013 作者

#16楼 @seveniruby 恩,回头找个mac装下环境试下,多谢了

@lihuazhang uiautomation支持汉字输入吗

发现了一个比较挫的解决方案
https://github.com/sumio/uiautomator-unicode-input-helper

作者是写了一个输入法, 然后把utf8编码先解码, 再发给输入法, 输入法再编码进去. 这个方法很挫.
期待更hack的方法.

另外一个思路是, 尝试直接调用输入法service
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html#commitTextjava.lang.CharSequence(, int)

或者借用黏贴板技术

我提了一个issue给官方, 看他们是否提供支持
https://github.com/appium/appium/issues/1665

#18楼 @seveniruby 直接 type 不行的。用setValue 是可以的。

#21楼 @lihuazhang 问题是android不行, uiautomator肯定是不信了, instrumentation也许可以

#21楼 @lihuazhang 我提了一个issue给官方, bootstraponline给了我回复 .https://github.com/appium/appium/issues/1665
跟我之前的建议一样.
我今天编译了那个utf7IME, 并安装到手机了. 理论上在wd脚本中直接调用他的一个库方法就可以了.
不过他用java实现的, 我用jruby调用一直出错, 这个只能让其他同学试试java的是否好用了..

另外, 我读了下UTF7IME的代码, 他也只是调用了commitText方法, 这个其实可以集成到appium里面去. 这样就可以做成跟ios输入中文一样的效果了.

从最近的appium改动来看, 他们还是重ios, android上貌似没多少很好的贡献者.

#23楼 @seveniruby 估计他们把 Android 寄托在 google 身上了。

#23楼 @seveniruby 现在这个状态真不适合新人折腾。 期待 1.0 版本。

#24楼 @lihuazhang 他们是蛮期待espresso的, 我看calabash-android是基于robotium的, 使用robotium的rc模式, 我觉得他们封装robotium比封装selendroid更好些. robotium还是很强大的

#25楼 @lihuazhang 现在封装的还不彻底, bug也比较多, 文档也不是特别的齐全(相对于其他框架来说, 已经是最全的了)

#26楼 @seveniruby 如果 espresso 这块好的话, 估计 Appium Android 这块会重构, 想当初 selenium 变 webdriver 一样。

#28楼 @lihuazhang espresso只是比instrumentation好些, 但本质上还是和instrumentation的架构一样, 替代不了验收测试. 还是要靠uiautomator这种框架. 我觉得是指望不上了. robotium还有点黑盒测试的功能. 我觉得robotium挺适合封装为webdriver的, 有希望可以集成到appium或者selenium3

shen #30 · December 23, 2013 作者

#23楼 @seveniruby 看来解决方案只能是,写一个特殊的ime,然后启动这个ime来输入了?

#30楼 @spikeshen 不是的, 可以直接调用内置输入法的commitText也可以. 只是没人去封装.
输入法也是写好的了, 可以直接编译出来使用.

shen #32 · December 23, 2013 作者

#31楼 @seveniruby 那得改比较底层的代码了。。

@spikeshen @seveniruby 我这边实践了下下appium在android,ios上都没法输入中文,appium server log中看到已经正确接收了中文,可能调用的selendroid,uiautomation不支持中文吗? 可以帮忙解答下吗,有什么方法吗?

@spikeshen @seveniruby 不好意思IOS下是可以输入中文的,那估计就是selendroid不支持中文...唉换成robotium多好...

#34楼 @luis 是uiautomator不支持中文, 这个跟实现有关. 也不是uiautomator的错.
uiautomator是基于用户使用场景来模拟用户操作, 他的基于模拟事件的. 工作的架构不同.
selendroid应该支持, 因为他可以访问内部方法, 但是selendroid到底有没有支持, 需要看他的实现了, 我还没验证过.

目前uiautomator+utf7ime也算是支持中文了

这个问题已经解决. 请参考 http://testerhome.com/topics/320#
可以通过先把中文放入粘贴板, 然后在输入中粘贴即可. 我明天的公开课中会演示如何输入中文

完整的过程是

  1. 首先长按某个输入框
  2. 发送ctrl+v操作

搜狗输入法也支持. 这是通用的.

shen #38 · December 30, 2013 作者

#37楼 @seveniruby 很多人还是对android不熟悉,包括我。。。。最好能更详细的给大家介绍下,比如如何把中文放入粘贴板。不过,为啥要长按输入框?是因为必须要让粘贴那个按钮显现出来?

#38楼 @spikeshen 需要调用系统的clipboard类, 我之前测试是先用手工, 然后用java写了一个自动复制到粘贴板的代码。等封装好我就贴出来。

长按输入框是为了不触发搜狗输入法,因为一旦点击了输入框, 搜狗输入法会自动弹出来, 他会结果ctrl+v, 如果长按, 就没事。 这是个细节。 并不是为了显示粘贴按钮。那个粘贴按钮其实也不是个button, 是个textview

shen #40 · December 30, 2013 作者

#39楼 @seveniruby 试试触宝输入法吧。。。之前我用它输入英文和特殊符号比搜狗好用多了

#40楼 @spikeshen 不能依赖输入法,所以我才选择了长按和粘贴。这种方式是最通用的。跟输入法无关

shen #42 · December 30, 2013 作者

#41楼 @seveniruby 主要是我之前用搜狗,输入空格和特殊字符都有问题。

shen #43 · December 30, 2013 作者

#39楼 @seveniruby 其实对于大多数人来说,最大的问题就是,不知道如何调用android的类,或者说,你的那套环境怎么搭都不知道。很多人的用法是单纯的使用appium。android相关的知识几乎没有,这也是大部分测试人员所面临的问题。像我是因为老板想把自动化搞起来,从研发拉出来专门研究下这些,公司的测试人员几乎对技术和代码懂的很少。我现在就是把能封的封,能包好的东西就包好,以后好让他们能简单的写点代码就可以实现自动化操作。

#43楼 @spikeshen 是的, 还是需要封装类, 对外提供appium的命令或者某个具体的命令。大部分的功能其实其他框架都有了, 目前appium已经可以很好的扩展了, 我建议你把功能封装起来后, 发给appium, 以后通过appium来操作。

shen #45 · December 30, 2013 作者

#44楼 @seveniruby 恩,是这么搞的,基本上把对一些功能的操作都对象化了,用的人只需要写几行代码,然后调用我写好的action类就可以了。

#45楼 @spikeshen 我建议使用appium的机制来做, 我想维护一个appium的分支, 把一些功能封装后放进去, 稳定后再提交给appium官方。建议咱们一起维护这个分支。 大家可以先使用我们的分支去做测试, 里面包含的功能会很全。

shen #47 · December 30, 2013 作者

#46楼 @seveniruby 因为我封装的东西是跟产品功能操作密切相关的,所以很底层的封装比较少。也就那些swip,flick这种算比较底层的封装了 :)

#43楼 @spikeshen 其实对于大多数人来说,最大的问题就是,不知道如何调用android的类,或者说,你的那套环境怎么搭都不知道。很多人的用法是单纯的使用appium。android相关的知识几乎没有,这也是大部分测试人员所面临的问题。像我是因为老板想把自动化搞起来,从研发拉出来专门研究下这些,公司的测试人员几乎对技术和代码懂的很少。我现在就是把能封的封,能包好的东西就包好,以后好让他们能简单的写点代码就可以实现自动化操作。 这个很有道理啊。。
我现在就不知道怎么去调用android的类,怎么去做代码的插桩 调用底层的android方法。
能告诉我怎么样用appium 去调用 android底层的类吗?

咨询下大家,为什么我输入,提示Not yet implemented. Please help us: http://appium.io/get-involved.html (Selenium::WebDriver::Error::UnknownError)
我的脚本如下:
text_field = @driver.find_element :tag_name, 'EditText'
driver.execute_script 'mobile: setValue', :element => text_field, :value => '中文'

可以参考一下robotium solo.enterText()

#39楼 @seveniruby 请问下如何调用系统的需要调用系统的clipboard类?我也是能打开粘贴但是没法点击

我用的是python的appium

#17楼 @spikeshen ios确实支持

请问已经解决了appium 自动化测试输入中文,那目前的解决方案是什么呀?

针对iOS的中文输入可以考虑以下方案:
先把键盘调整为非英文输入模式,然后传入的时候按照拼音传入,然后会打印出该拼音的候选词,根据ID选择想要的候选词就可以了。目前输入法对拼音支持很好,因此前几个的候选词即是所需输入的中文

#6楼 @seveniruby 麻烦问一下appium里面如何把一个文本放到剪切板clipboard里面啊?

#27楼 @seveniruby 麻烦问一下appium里面如何把一个文本放到剪切板clipboard里面啊? 现在粘贴可以实现了,但是不知道如何将一个内容发送到系统剪贴板。utf7ime等试了都没有成功。Appium 1.3.7,Android 4.2

#56楼 @xing 你看的帖子过期了 目前可以直接输入中文了

#57楼 @seveniruby 能详细一点说明么?是通过set_text方法么? 我现在通过webdriver调用控件set_text方法,还是不行。

#59楼 @xing 我们的论坛上也有.

@xing ,能简单写代码看下吗?我看了你提供的网页还是不行啊,我是用的真机,默认是搜狗输入法

#36楼 @seveniruby 我三星手机 android版本4.4.2

capabilities.setCapability("unicodeKeyboard", "True");
capabilities.setCapability("resetKeyboard", "True");
输入中文还是乱码。
使用Utf7Ime 也是乱码。

#62楼 @chenjerome你的好了吗? 输入中文之后,你试试中文后面加上一个.decode(encoding="utf-8"),我今天就是这样成功输入中文的

Moon [Topic was deleted] 中提及了此贴 15 Jul 17:51
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up