我想使用MonkeyRunner测试我的android程序与具有不同屏幕分辨率的设备列表的兼容性。我需要单击一个视图,但视图对于不同的分辨率不在同一位置。我怎样才能获得它的位置或做点什么来点击它? 需要你的帮助!
答案 0 :(得分:7)
我知道它有点晚了,但您可以在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
答案 1 :(得分:4)
不幸的是,使用MonkeyRunner并不是这样。一种选择是使用device.getProperty("display.width")
,device.getProperty("display.height")
和device.getProperty("display.density")
并尝试使用它们以某种方式确定视图的位置。另一种选择是使用像Sikuli这样的工具来尝试点击视图。
编辑(此答案最初发布一年后):现在可以使用https://github.com/dtmilano/AndroidViewClient
执行您最初想要的操作答案 2 :(得分:3)
类似于某人胡曼上面所说的,我使用两个函数根据我最初编写脚本的设备的分辨率和我当前正在使用的设备的分辨率来转换抽头坐标。
首先,我得到当前设备的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不可用时,这是制作可在多个设备上运行的脚本的快速而肮脏的方法。