我想使用 MonkeyRunner 来测试我的 android 程序对于具有不同屏幕分辨率的设备列表的兼容性。我需要单击一个视图,但是对于不同的分辨率,该视图不在同一位置。我怎样才能获得它的位置或做其他事情来点击它?需要你的帮助!
3 回答
我知道这有点晚了,但是您可以在 android sdk 中使用 hierarchyviewer 来获取视图 ID。
然后,在你的脚本中,使用这个:
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice, By
device = MonkeyRunner.waitForConnection()
easy_device = EasyMonkeyDevice(device)
# Start your android app
# touch the view by id
easy_device.touch(By.id('view_id'), MonkeyDevice.DOWN_AND_UP)
稍后编辑:感谢 dtmilano 和 AndroidViewClient,我能够根据需要点击视图。链接在这里:https ://github.com/dtmilano/AndroidViewClient
不幸的是,这对于 MonkeyRunner 来说是不可能的。一种选择是使用device.getProperty("display.width")
,device.getProperty("display.height")
并device.getProperty("display.density")
尝试使用它们以某种方式找出视图的位置。另一种选择是使用像Sikuli这样的工具来尝试单击视图。
编辑(最初发布此答案一年后):现在可以使用https://github.com/dtmilano/AndroidViewClient执行您最初想要的操作
与上面有人说的类似,我使用两个函数来根据我最初编写脚本的设备和我当前使用的任何设备的分辨率差异来转换点击坐标。
首先我得到当前设备的 x 和 y 像素宽度。
CurrentDeviceX = float(device.getProperty("display.width"))
CurrentDeviceY = float(device.getProperty("display.height"))
然后我定义了一个函数来转换 x 和 y 坐标。您可以看到下面的函数是为 1280 x 800 的设备编写的。
def transX(x):
''' (number) -> intsvd
TransX takes the x value supplied from the original device
and converts it to match the resolution of whatever device
is plugged in
'''
OriginalWidth = 1280;
#Get X dimensions of Current Device
XScale = (CurrentDeviceX)/(OriginalWidth)
x = XScale * x
return int(x)
def transY(y):
''' (number) -> int
TransY takes the y value supplied from the original device
and converts it to match the resolution of whatever device
is plugged in.
'''
OriginalHeight = 800;
#Get Y dimensions of Current Device
YScale = (CurrentDeviceY)/(OriginalHeight)
y = YScale * y
return int(y)
然后我可以在我的脚本中创建点击事件时使用这些函数。
例子
device.touch(transX(737), transY(226), 'DOWN_AND_UP')
请注意,这种方法远非完美,只有当您的应用程序利用锚定来根据屏幕大小调整 UI 时,它才有效。这是我在 UI ID 不可用时制作可在多个设备上运行的脚本的快速而肮脏的方法。