Как нажать на вид андроид программы через MonkeyRunner? - PullRequest
9 голосов
/ 11 августа 2011

Я хочу использовать MonkeyRunner для проверки совместимости моей андроид-программы для списка устройств с разными разрешениями экрана. Мне нужно щелкнуть представление, но оно не находится в одинаковом положении для разных разрешений. Как я могу получить позицию этого или сделать что-то еще, чтобы щелкнуть по нему? НУЖНА ваша помощь!

Ответы [ 3 ]

7 голосов
/ 03 августа 2012

Я знаю, что уже немного поздно, но вы можете использовать иерархический просмотрщик в Android SDK, чтобы получить идентификатор представления.

Затем, в вашем скрипте, используйте это:

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

4 голосов
/ 12 августа 2011

К сожалению, это не возможно с MonkeyRunner. Одним из вариантов является использование device.getProperty("display.width"), device.getProperty("display.height") и device.getProperty("display.density") и попытка использовать их, чтобы каким-то образом выяснить, где находится представление. Другой вариант - использовать такой инструмент, как Sikuli , чтобы попытаться щелкнуть мышью на представлении.

Изменить (через год после того, как этот ответ был первоначально опубликован): теперь можно делать то, что вы изначально хотели с https://github.com/dtmilano/AndroidViewClient

3 голосов
/ 28 марта 2013

Подобно тому, что кто-то сказал человеку выше, я использую две функции, которые преобразуют координаты отвода на основе разницы в разрешении устройства, для которого я изначально написал сценарий, и любого устройства, которым я сейчас пользуюсь.

Сначала я получаю текущие устройства шириной 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')

Обратите внимание, что этот подход далек от совершенства, и он будет работать, только если ваше приложение использует привязку для настройки пользовательского интерфейса в зависимости от размера экрана. Это мой быстрый и грязный подход к созданию сценариев, которые работают на нескольких устройствах, когда идентификаторы пользовательского интерфейса недоступны.

...