1、背景
记录下安卓自动化测试的问题及解决过程,首先感谢开发同事(GH哥)的协助
在登录页面中输入密码时遇到了问题,常规u2的send_keys方法无效,表面上看脚本是成功输入了文本值,但实际点击登录却为空。
最后与开发同事确认了为空的原因是点击该输入框会弹出自定义的键盘,且不支持脚本输入,而且该键盘的每个键位元素也无法定位。
2、方法
既然无法定位键位,选择通过坐标定点点击即可。
但此时会存在另一个问题,由于不同设备的长度宽度不一,分辨率也不一样,所以坐标也不相同。但好在u2的点击方法支持坐标比例点击,所以输入键位对应的坐标比例就可以了。
方法如下:
先获取初始键位的坐标比例,这里我将“1”设为初始键位,方便其他键位遍历获取
因为大部分键位大小都是一样的,所以其他键位只需要遍历获取:上一个点击坐标比例+键位宽度/高度就可以了
如果键位大小不一,那么就要另加判断去设置比例了
3、实现
经过测试,设备成功模拟点击输入了密码......但当我更换成其他设备又出现问题了,设置初始键位的坐标比例并不是适配所有设备,原因是不同设备通过比例确实能点到相同位置,但各自元素的布局并非一样。
所以先定位键盘元素再获取其距离上下的高度,最后除以屏幕高度就可以拿到键盘的坐标比例了。
最后补上全部代码
#!/usr/bin/python3
# --*-- coding: utf-8 --*--
# @Author: chenlin
# @File: u2_keyBoard.py
import uiautomator2 as device
class KeyBoard:
def __init__(self, target_str):
self.keyMap = {}
self.preX = 0.055
self.d = device.connect()
self.preY = self.precentIni()
self.target_str = target_str
self.key = ['1234567890', 'qwertyuiop', '#asdfghjkl', '@zxcvbnm!'] # 这里特殊字符分别代表:大写切换、空格、退格
def keyIni(self):
"""键盘映射"""
for row in self.key:
for k in row:
if k == '@': # 最底层特殊处理
self.preX = 0.1
self.keyMap[k] = [self.preX, self.preY]
self.preX += 0.1
self.preX = 0.055
self.preY += 0.089
def pressKeyBoard(self):
"""执行点击"""
self.keyIni()
for i in self.target_str:
self.d.click(*self.keyMap[i])
def precentIni(self):
"""初始纵坐标比例"""
device = self.d.info['displayHeight']
keyboard = self.d(resourceId="键盘元素定位").info['bounds']
return keyboard['top'] / device
if __name__ == '__main__':
KB = KeyBoard('密码')
KB.pressKeyBoard()