Appium appium 中的 send_keys 会少输、多输、错乱的输入文本值

among · 2016年03月08日 · 最后由 kaige201314 回复于 2016年07月20日 · 3850 次阅读

特地搞了一个干净的环境来验证这个问题。

1:环境信息:
osx 10.11.3,appium 版本 1.4.13.
python 3.4 , Appium-Python-Client 0.21, selenium 2.52.0 ,

2:代码部分:

3:效果部分:

4:appium 的日志:
日志正常,未报错,通过 charles 抓包看到的,也是 true 正常。

图中看到的是多一位,实际上也会出现 少一位,错位的情况,少一位出现的情况较多。

不知道大家有没有遇到过这种情况。

很多人还在问怎么解决的。好吧,回帖里面都有,那我在整理一下吧。
总结出来是这样的:
输入数字的时候,特别是长数字,如卡号,在 ui 中会自动分隔的,特别会出现这种问题,不清楚是否和账号这类会自动分割成几段有关。

目前我们的解决方法是这样的:
1:先用 send_keys , 输入完成后,检查下值对不对,不对的话,再来 1 次。
2:如果 2 次还不成功,并且都是纯数字,就换 dr.press_keycode(7) 这种方法,7 就是 0。
3:用 press_keycode 之前,要 click 一下。

具体的 keycode 可以看这里:http://developer.android.com/reference/android/view/KeyEvent.html
还有一种解决方法是,切换到另一个中系统的输入法,不适用 appium 的输入法,也可以解决。

共收到 31 条回复 时间 点赞

这种情况也不是每次都出现,也是奇怪了,而且日志也不报错。

这种情况遇到过,主要是在银联支付页面,输入身份证时出现,用 appium 的方法输入每次都会输入少,后来我用 adb 一个一个的输入解决的

直接 set_value 吧。。。

#3 楼 @neyo 没试过这个

#4 楼 @huanzhijin 纸巾试试,我是在 ios 上试的,直接跳过键盘输入

一个数字一个数字的输入试试?Andorid 其实也有这问题 ,我是用 press_keycode 解决的,但是 IOS 不支持这个方法··

不是 appium 的问题。charles 上应该可以看到传值,如果这个也不对,你看看前端代码吧。

是不是输入法弹出了一些自定义的输入法?

感谢大家。
总结出来是这样的:
输入数字的时候,特别会出现这种问题,不清楚是否和账号这类会自动分割成几段有关。
appium 中的 py 的 api 中,还没实现 set_value 的方法,其他语言没去查。

目前我们的解决方法是这样的:
1:先用 send_keys , 输入完成后,检查下值对不对,不对的话,再来 1 次。
2:如果 2 次还不成功,并且都是纯数字,就换 dr.press_keycode(7) 这种方法,7 就是 0。
3:用 press_keycode 之前,要 click 一下。

具体的 keycode 可以看这里:http://developer.android.com/reference/android/view/KeyEvent.html

10楼 已删除

这是因为这个输入账号的控件会有格式验证,直接用 Appium 自带的 UicodeIME 确实会有问题,这个时候,你可以先把手机输入法切换成别的输入法,如百度输入法之类的,输入完成后,再切换为 Appium 的 UnicodeIME 就可以了。你尝试一下。

among #12 · 2016年03月08日 Author

#11 楼 @duyanguang 有这种可能性,账号是 4 位 4 位自动分割的。我后面实验下。

among #13 · 2016年03月08日 Author

#10 楼 @biyunfei 改成: u‘30 天' 试试。

14楼 已删除
among #15 · 2016年03月08日 Author

#14 楼 @biyunfei 忘了问,你这是 py 的脚本吗,你用 charles 抓包看看。不行,就开新帖,不要再这里讨论了。

16楼 已删除
17楼 已删除
among #18 · 2016年03月09日 Author

#17 楼 @hxhapppppy 没有的。有 set_value 方法,但是使用后会提示还没实现这个方法呢。。。

#18 楼 @among29 https://github.com/appium/python-client/blob/master/appium/webdriver/webelement.py

我查了一下源码,是有 set_text() 这个方法的,你用用看
def set_text(self, keys=''):
"""Sends text to the element. Previous text is removed.
Android only.
:Args:
- keys - the text to be sent to the element.
:Usage:
element.set_text('some text')
"""
data = {
'elementId': self._id,
'value': [keys]
}
self._execute(Command.REPLACE_KEYS, data)
return self

#19 楼 @hxhapppppy 我在 Python 里用 help() 查看 Webdriver 与 driver 没看到你这个方法

among #21 · 2016年03月10日 Author

@hxhapppppy 看到这个方法。

C:\Python34\Lib\site-packages\appium\webdriver\webelement.py
继承于 C:\Python34\Lib\site-packages\selenium\webdriver\remote\webelement.py

初始化的时候,不知道怎么用了。

def __init__(self, parent, id_, w3c=False):
    self._parent = parent
    self._id = id_
    self._w3c = w3c

among #22 · 2016年03月10日 Author

#11 楼 @duyanguang

按照你说的方法,先获取可用的 imes,然后切换到默认的输入法,试了 2 次成功了,暂未发现有出错。多谢。

#20 楼 @hcc3352779 看 webelement

#21 楼 @among29 没懂你的意思

#22 楼 @among29 按照楼主的用 adb、或者切换输入法都试过去了,还是有数字输入多次的情况,就是在银联输入银行卡号这种输入框里,不知道这种输入框里前端到底做了什么事,好烦躁==

使用 send_keys() 方法,在安卓中无法输入数字,可以调起键盘,但无法把内容输入到手机,ios 中这个方法就好使

这种账号自动分割的情况,在输入前把 appium 的那个输入法禁用就可以了。

among [该话题已被删除] 中提及了此贴 07月12日 20:24

@dudubaby 我也遇到这也的问题, 你后来怎么解决的?

我也遇到这个问题了,有人解决了吗?

@among29 看你的回复,貌似解决了,可以分享一下吗?

可以看我的回复贴,已解决,用 python 写了一个类,可以直接用的。
地址:https://testerhome.com/topics/5389

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