Appium 各位大神,本人刚接触 Appium Python 不久,在实践过程中,遇到本公司 APP,其登录密码只能使用自定义的安全键盘,使用 send_key 无法塞入密码,后我又采用坐标方式 tap 字母与数字,不料数字键盘的排列是随机的,至此,便有些无从下手了,望高人指点!

佑佴 · 2017年03月07日 · 最后由 yajunzheng 回复于 2018年10月17日 · 2426 次阅读


共收到 23 条回复 时间 点赞

1、你们开发是怎么做这种键盘的,找他们要控件的获取方法。
2、如果只是简单的 ui 测试 demo 就用 ATX,或者用 ATX 所用的图片对比技术来做。

0x88 回复

我们这个 APP 是金融交易,为了提高安全才做的这个键盘。
刚刚问了下,做这个键盘的开发已离职😅 ,我不是为了做这个 UI 测试,是想登录成功后进行交易那块的测试。
还有啥法子能解决么?

开发走了代码应该还在呀,哪个开发接手的?如果不行就你就用 ATX 咯。

匿名 #4 · 2017年03月07日
佑佴 回复

一个笨方法,不知道可不可行,像定位某一个元素一样,比如:find_element_by_id('9').click(),这样一个一个取点击?

佑佴 #20 · 2017年03月07日 Author
0x88 回复

尝试使用 atx,安装就直接报错了,不知道这个错误该如何解决???

自己想办法,这里不是伸手党的地方。

0x88 回复

好的,非常感谢

最傻的办法 tap 坐标。等有了好办法再修改

佑佴 #16 · 2017年03月07日 Author
徐旻 回复

我用了 tap 方法了,只是数字键盘每次生成的顺序是不一样的

佑佴 回复

这个软件不是每次都要重新登录吧,手动登录一次,以后自动化不就行了?

你要是写邮件报 bug,标题写那么长,我就服你。

佑佴 #14 · 2017年03月07日 Author

self.driver.find_element_by_id("com.jme.trade:id/et_password").click()
#self.driver.keyevent(12)
#self.driver.press_keycode(11)
os.popen("adb shell input keyevent 12")
该方法也使用过了,仍没有跨过安全键盘这个槛,像招商银行的登录页面,输入密码时的数字键每次也是随机排列的

佑佴 回复

可以用 adb 命令输入密码啊

我试了,填不进去的,text,keyevent 都用过了

17楼 已删除

把密码放到粘贴板, 然后看能不能发送 Ctrl + v 粘贴到文本框

driver.pressKeyCode(50, AndroidKeyMetastate.META_CTRL_ON);

实在不行那就只能用傻瓜式的方法 find_element

这个问题的解决思路如下:
1.针对 iOS 无序键盘:用 Macaca 或者 appium-inspector 是可以获取到每个键的信息的。首先,定义一个数据字典 key_num={},把每个键的 xpath 保存到字典里面去。这样 key_num 里面保存的就是 key_num[0]="第一个按键的 xpath 路径",key_num[1]="第二个按键的 xpath 路径"以此类推,记录完,整个键盘的 xpath 路径。然后,通过 xpath 的值就可以取得该元素的 name 值,这个值就是该键的数字,取 name 值方式:对象.get_attribute("name")。然后,定义另一个字典 keys_num={},来保存每个按键对应的 xpath 和对应的数字。比如:第一个键是 “6”,就写 keys_num[6]="第一个键的 xpath",第二个键是 “4”,keys_num[4]="第二个键的 xpath",以此类推,记录完整个键盘的数字和对应的 xpath。这样在输入密码的时候,只要遍历密码,例如:密码是 “666888”,那么密码的第一值是 6,我们就取 keys_num[6] 的值就可以获取到 “数字 6” 的 xpath,在通过 get_element_by_xpath("数字 6 的 xpath") 方式就可以获取到该元素,再用 元素.click() 进行点击,就可以输入该值了。
2.针对 Android 无序键盘:Android 的密码键盘如果是无序而且不可识别的。那么我们要用到 ocr 这个技术,大家不要紧张,可以去找相关的 ocr 类库,比如用 python 写脚本的人就可以找 python 的 ocr 类库,使用很简单。下面说如何解决密码键盘识别问题。首先,用 adb 截取密码键盘界面,把键盘界面通过 ocr 来识别,获取到键盘数字的顺序,例如:键盘的数字顺序是 “9638527410”,那么我们就可以知道该次弹出的键盘第一排是 “963”,第一个键是 “9”,第二个键是 “6” 以此类推。但是,有的人会问了 “我们既然无法识别键盘,那么如何获取键盘信息呢?”,对,我们只能通过 ocr 获取到键盘数字排序却无法获取到按键信息。那么如何点击呢?接下来,我们打开 andorid 的 “指针位置” 这个功能,计算出每个按键在屏幕的位置(计算方式:按百分比的方式计算,即:该键在屏幕的相对位置)。然后定义数组 key_num_x={},key_num_y={}分别将该键的坐标记录下来,例如第一个键的值是 6 那么就写 key_num_x[6]="第一个键的 x 坐标",key_num_y[6]="第一个键的 y 坐标"。以此类推。记录完所有的按键信息。这样在输入密码的时候,只要遍历密码,例如:密码是 “666888”,那么密码的第一值是 6,我们就取 key_num_x[6] 和 key_num_y[6] 的值,在通过 driver.tap([{x 坐标,y 坐标}]) 这个方法就可以点击了。

baconLiu 回复

我也想到 OCR,但其实没必要获取位置,目前能想到的动态键盘,其实键位都是固定的,坐标可以当常量保存下来。
只要扫描知道每排按键都是什么字符就好了。

当然,要是谁非要做键位坐标也随机的,那也没脾气,要用你的方法扫

佑佴 #19 · 2017年03月09日 Author
baconLiu 回复

非常感谢前辈这么耐心指导,解决思路写的很清晰,我会尝试根据你提供的方式解决我的问题😁

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