Android monkeyrunner - проверете дали екранът съдържа изображение или определен цвят

Имам приложение за Android, което исках да автоматизирам/стрес тествам. Направих базиран на изображение скрипт за автоматизация в SCAR Divi и го стартирах срещу моето приложение, инсталирано на Bluestacks. Искам да го сменя на Genymotion, защото Bluestacks е твърде бавен.

Вече имам настроена среда (genymotion+image с моето приложение +adb инсталирано и работещо). Пренаписах скрипта си на python и го използвах в 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
Здравей gbudan. Огромни благодарности за вашия отговор. Това е добре, но само ако искате да проверите дали определен квадрат с определени координати е същият като референтното изображение. Определено ще го използвам за проверка на статични елементи (като бутони). Трябва обаче също така да проверя дали определено растерно изображение (или поне определен цвят) е част от тази екранна снимка и може да бъде позиционирано навсякъде върху нея. - 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