1. 缘 由
为什么要用坐标定位元素呢?原因很简单,uiautomatorviewer无法定位该元素!
2. 场 景
目前我遇到无法定位的两种情况:
- 页面处于动态期间,如IM软件的视频或语音聊天期间,虽然元素可以正常定位,但是用click()无法触发点击事件
- 有些页面弹框上的元素,用uiautomatorviewer工具定位,只能定位某一片区域,具体的元素无法定位
3. 实 现
对于以上两种无法定位元素的情况,可以考虑用坐标定位
- 动态页面可以使用swipe()触发点击事件
# x1/y1和 x2/y2分别为起/止点的坐标,time为时间,单位为ms
driver.swipe(x1, y1, x2, y2, time)
'''
Usage:
driver.swipe(120, 200, 120, 200, 50)
定位坐标为(120, 200)的元素,并点击
'''
- 定位不到的元素可以使用driver.tap()触发点击事件
# 模拟手指点击(最多五个手指),time为时间,单位为ms
driver.tap([(x1, y1), (x2, y2)], time)
'''
Usage:
driver.tap([120, 200], 10)
定位坐标为(120, 200)的元素,并点击
'''
4. 问 题
以上两种坐标定位都使用元素的绝对坐标,如更换模拟器分辨率,元素坐标也会随之改变,此时就需要将当前分辨率下的绝对坐标转换为相对坐标,方法如下:
# 获取当前分辨率
el_x = driver.get_window_size()['width']
el_y = driver.get_window_size()['height']
# 绝对坐标转换为相对坐标,假设当前分辨率为720x1280,绝对坐标为(120, 200)
xd_x = (120/720)*el_x
xd_y = (200/1280)*el_y
>> (xd_x, xd_y) # 相对坐标