2014-09-03 1 views
0

Итак, у меня проблема с Сикули. Существует ситуация, когда существует многократное появление изображения. Чтобы захватить все из них, вы можете просто найти findAll, но он сохраняет каждое изображение как нечто вроде объекта, а не изображения. Я знаю, что вы можете получить изображения с помощью getLastMatches(), но я хочу сначала отсортировать их. Итак, вот код, который я получил, который захватывает все изображения и сортирует их. Я нашел некоторую информацию о документации SikuliПреобразование объектов итератора из findAll в изображения в Сикули после сортировки

def by_y(match): 
    return match.y 

icons = findAll(image) 
sorted_icons = sorted(icons, key=by_y) 

Проблема с этим, однако, является то, что sorted_icons содержит кучу итерацию объектов (по крайней мере, это то, что я видел их называют), а не изображения. Есть ли способ вернуться к изображению, сохранив сортировку нового списка? Использование getLastMatches() дает список исходного несортированного списка.

Кроме того, это Sikuli 1.0.1.

Спасибо.

Это должно проиллюстрировать проблему (надеюсь). Чтобы сортировать изображения по их значению y, я должен использовать операцию findAll() (если есть способ сделать это, не используя find, то, пожалуйста, поделитесь). Тем не менее, это преобразует изображение из строки, то есть:

"imagename.png" 

в ... ну все, это (матч):

M[8,1045 37x28]@S(S(0)[0,0 1920x1080]) S:1.00 Center:26,1059 

self.assets.getimage (изображение) функция требует строка (хотя и imagename.png), а не напуганная вещь, которую вы получаете от использования find.

def exampleMethod(image, dx=0, dy=0): 
    click(Pattern(self.assets.getimage(image)).targetOffset(dx, dy)) 

def by_y(match): 
    return match.y 

image = "imagename.png" 
icons = findAll(image) 
sorted_icons = sorted(image, key=by_y) 

exampleMethod(sorted_icons[0]) 

Поэтому мне нужно 1 из 2 вещей:

  1. способ преобразовать объект найти обратно в строку после сортировки
  2. образом сортировать изображения их у значений, сохраняя при этом изображения в виде строк

Надеюсь, это поможет.

+0

Мои спросить, что вы хотите делать с изображениями? Операция 'find' или' findAll' использует шаблон/рисунок/скриншот или строку в качестве типа ввода и возвращает (а) совпадающие объекты (объекты), через которые вы можете выполнить почти все, что может предложить Sikuli ... – autoKarma

+0

есть много ранее существовавших методов, для которых изображение не является образцом. Каждый из них использует методы поиска (наряду с собственными методами, похожими на find). Я бы поставил некоторые операторы if, чтобы справиться с этим, но это было бы много изменений, которые я бы предпочел не делать. Поэтому я бы предпочел, чтобы иметь возможность просто преобразовывать их обратно в изображения и отправлять их методам – user2869231

+0

Я не уверен, что я понятен - в чем разница между изображением и шаблоном? В приведенном выше примере 'icons = findAll (изображение)' the image 'здесь имеет тип Pattern. В отличие от этого, если вы скажете: iconNames = findAll («IconTitle»), тогда IconTitle будет иметь тип String. Только два типа операции findAll() - это шаблон и строка. Вы имеете в виду образ и образ, чтобы быть одним и тем же? – autoKarma

ответ

0

Только быстрая информация. JePySi не занимается динамическим размещением значков/изображений. Это должно быть полностью реализовано с помощью функций Sikuli. Так что autoKarma прав self.assets.getImage() бесполезен в этом контексте, поскольку он только обращается к предварительно зарегистрированным изображениям, которые адресованы только по имени. Следовательно, только строковые операции.

Cheers, Alex - Я написал JePySi :-)

+0

woah, вы использовали JePySi или на самом деле его записывали?Как в разработчике JePySi? lol Знаете ли вы, хороший способ сделать это? Я могу технически уйти, поставив клик (совпадение) в оператор try/except с командой «assert testcontext.browser.failed (...)» в нем, и это все равно позволит регистрировать его. Было бы неплохо найти способ обойти это. – user2869231

0

Я не уверен, что это ответит на ваш вопрос конкретно, но я думаю, что существует более прямой способ достижения вашей цели.

Вашего exampleMethod() является повторением встроенного click() function--

click() нажмет на шаблон, String, Location, области или (что наиболее важно для этого вопроса) матч просто отлично, поэтому вы надеваете «Мне действительно нужно изображение назад, чтобы щелкнуть по нему. Вам также не нужно self.assets.getimage(), чтобы получить доступ к изображению, на которое нужно щелкнуть. Функция click() неявно выполняет операцию find(), затем нажимает на все, что она находит. Поскольку ваш будет нажимать на объект Match, он просто перейдет к координатам, предоставленным объектом совпадения, и нажимает на эти координаты.

Кроме того, по умолчанию .targetOffset есть (0, 0) (это означает, что он щелкнет по центру найденного изображения). Таким образом, вам может не понадобиться предварительно определить, как 0 в вашем примереMethod().

В общем, если есть несколько идентичных копий одного и того же изображения на странице, и вы хотите, чтобы нажать на каждого, чтобы идти вниз по экрану, вы можете сделать что-то вроде этого:

icons = list([x for x in findAll(image)]) #cast matches from the findAll() into a list 
sorted_icons = sorted(icons, key=by_y) #note 'icons' here and not 'image' 
for icon in sorted_icons: 
    click(icon) 
    #anything else you want to do with them 

Другой способ сделать это, не используя Питона список понимание (в случае это вам незнакомы):

findAll(images) 
icons = getLastMatches() 
sorted_icons = sorted(icons, key=by_y) 
listOfSortedIcons = [] 
while sorted_icons.hasNext(): 
    listOfSortedIcons.append(sorted_icons.next()) 
for icon in listOfSortedIcons: 
    click(icon) 
    #whatever else... 
+0

Извините, это были значки, но я использую Jepysi (версия Python Ruby + Cucumber). Я просто не сказал этого, потому что никто похоже, знает об этом в любом случае. Предполагается, что это будет репликация click(). Howe ver, в методе для него он использует метод name.endswith(), для которого требуется String. Поэтому необходимо отправить строку, а не совпадение. Думаю, мой пример, возможно, не был наиболее эффективным. – user2869231

+0

метод «getimage (image)» использует endswith(), и это не то, что я могу удалить из-за его связей с активами в файле функций. – user2869231

+0

Позвольте мне подумать ... – autoKarma