Android monkeyrunner - проверьте, содержит ли экран изображение или определенный цвет

У меня есть приложение для Android, которое я хотел автоматизировать/стресс-тестировать. Я создал скрипт автоматизации на основе изображений в SCAR Divi и запустил его в моем приложении, установленном на Bluestacks. Я хочу изменить его на Genymotion, потому что Bluestacks слишком медленный.

У меня уже настроена среда (genymotion+image с установленным и работающим моим приложением +adb). Я переписал свой скрипт на питоне и использовал его в MonkeyRunner, но...

Помимо отправки жестов, кликов и ожиданий, мне не хватает функции распознавания изображений. Я обнаружил, что могу сравнить 2 снимка экрана с ImageMagic, но это не то, что мне нужно.

Мне нужно проверить, есть ли на экране определенная кнопка или хотя бы определенный цвет. Кто-нибудь может указать мне правильное направление с этим?

Буду очень признателен за примеры :(


person skazichris    schedule 24.03.2014    source источник


Ответы (2)


MonkeyRunner действительно предлагает довольно приличные методы тестирования на основе изображений. Ниже я покажу вам, как взять частичное изображение с отображаемого в данный момент экрана вашего устройства. Затем вы можете сохранить это фрагмент изображения и/или сравнить его с эталонным изображением.

Для начала вам нужно сделать скриншот текущего экрана вашего устройства

# Take a screenshot
image = device.takeSnapshot()

Затем вы можете взять суб-изображение. Например, это дополнительное изображение может быть кнопкой на определенном экране, чтобы убедиться, что кнопка существует на этом экране. Чтобы сделать это, вы можете использовать метод ниже. Кортеж (0, 0, 50, 100) ниже является только примером. Вы должны предоставить свои собственные. В основном это (x, y, w, h) желаемого фрагмента изображения.

# Take the sub-image
sub_image = image.getSubImage((0, 0, 50, 100))

После этого шага вы можете сохранить изображение и/или сравнить его с эталонным изображением. Чтобы сравнить с эталонным изображением, вы можете сделать, как показано ниже:

# Load the reference image for comparison
reference = MonkeyImage.loadFromFile(PATH_TO_REFERENCE_IMAGE)

if not sub_image.sameAs(reference, 0.9):
       print "Images do not match!"
       # do something

0,9 — уровень приемлемости. Если два изображения совпадают на 90% или выше, оно будет считаться ПРОШЕДШИМ.

Надеюсь это поможет. Дайте мне знать, если у вас возникнут какие-либо проблемы!

person gbudan    schedule 02.04.2014
comment
Привет Гбудан. Огромное спасибо за ваш ответ. Это хорошо, но только если вы хотите проверить, совпадает ли конкретный квадрат с указанными координатами с эталонным изображением. Я обязательно буду использовать его для проверки статических элементов (например, кнопок). Однако мне также нужно проверить, является ли определенное растровое изображение (или, по крайней мере, определенный цвет) частью этого снимка экрана и может ли оно быть расположено в любом месте на нем. - person skazichris; 03.04.2014
comment
Хорошо @ user2192002, в этом случае вы можете использовать метод getRawPixelInt(x, y). Допустим, вы ищете линию желтого цвета, которая может находиться в любом месте экрана. Для упрощения предположим, что эта линия горизонтальна и ее ширина равна ширине вашего экрана. Итак, что вы можете сделать, так это сначала сделать снимок экрана, а затем брать один пиксель за раз с этого снимка экрана от верхней части экрана до нижней в цикле while. Когда метод getRawPixelInt(x, y) находит желтый пиксель, это означает, что вы нашли, где находится линия. Вы можете реализовать ту же логику и для других ситуаций. - person gbudan; 04.04.2014
comment
Большое спасибо за ваш ответ gbudan. Я постараюсь реализовать и протестировать это в понедельник! - person skazichris; 04.04.2014
comment
Это только у меня или у MonkeyImage больше нет возможности загрузить изображение из файла? - person Micro; 29.05.2014
comment
Метод, описанный в вопросе, по-прежнему действителен. Какая у вас проблема? - person gbudan; 29.05.2014
comment
Похоже, он был перемещен в MonkeyRunner.loadImageFromFile(PATH) . Судя по всему, тоже без документов. - person James DeRagon; 28.05.2015

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

View.writeImageToFile(self, filename, format="PNG")

Однако, если вы заинтересованы в получении примитивного объекта изображения, который является PIL Image (см. http://www.pythonware.com/products/pil/), вы можете сделать

image = device.takeSnapshot()

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

person Diego Torres Milano    schedule 25.03.2014
comment
Итак... В псевдокоде... 1. сохранить изображение в файл 2. использовать im.getcolors(maxcolors), чтобы получить список всех цветов в изображении 3. выполнить итерацию по списку, чтобы найти определенный цвет. Это обходной путь, и я уверен, что он будет медленным. Я все еще ищу способ проверить, состоит ли определенное большее изображение из меньшего предопределенного изображения (как кнопка). - person skazichris; 25.03.2014
comment
Как я уже упоминал, вам не нужно сохранять файл, так как вы можете получить объект Image и получить этот Image за один View (то есть Button). - person Diego Torres Milano; 25.03.2014