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

shen · 2013年12月03日 · 最后由 Moon 回复于 2016年07月15日 · 4501 次阅读

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

共收到 63 条回复 时间 点赞
Moon [该话题已被删除] 中提及了此贴 07月15日 17:51

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

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

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

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

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

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

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

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

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

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

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

#17 楼 @spikeshen ios 确实支持

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

我用的是 python 的 appium

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

咨询下大家,为什么我输入,提示 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 => '中文'

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

shen #48 · 2013年12月30日 Author

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

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

shen #45 · 2013年12月30日 Author

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

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

shen #44 · 2013年12月30日 Author

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

shen #43 · 2013年12月30日 Author

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

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

shen #40 · 2013年12月30日 Author

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

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

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

shen #38 · 2013年12月30日 Author

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

完整的过程是

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

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

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

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

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

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

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

shen #32 · 2013年12月23日 Author

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

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

shen #33 · 2013年12月23日 Author

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

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

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

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

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

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

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

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

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

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

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

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

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

或者借用黏贴板技术

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

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

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

@lihuazhang uiautomation 支持汉字输入吗

shen #18 · 2013年12月16日 Author

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

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

shen #15 · 2013年12月16日 Author

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

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

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

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

shen #13 · 2013年12月11日 Author

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

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

shen #56 · 2013年12月04日 Author

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

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

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

shen #8 · 2013年12月03日 Author

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

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

shen #5 · 2013年12月03日 Author

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

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

shen #4 · 2013年12月03日 Author

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

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

shen #2 · 2013年12月03日 Author

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

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