Sikuli: сортировка нескольких значков

Цель: щелкнуть все "звездочки" на странице, перемещаясь сначала по строке, а затем по столбцам в Sikuli.

Пример. Звезды расположены в сетке следующим образом:

* * * * *
* * * * *
* * * * *
* * * * *

EDIT: Это порядок, в котором нужно щелкнуть:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
21  22  23  24  25 

Сначала нажмите на значок в верхнем левом углу, затем на звезду справа и так далее. Затем перейдите к верхней левой звезде во втором ряду и повторите.

Мой текущий код:

def by_x(match):
    return match.x
def by_y(match):
    return match.y
stars = findAll("imgOfStar")
sorted_stars_x = sorted(stars, key=by_x)
sorted_stars_y = sorted(stars, key=by_y)
for icon in sorted_stars_x:
    for icon2 in sorted_stars_y:
        click("imgOfStar")

person adb16x    schedule 14.01.2015    source источник


Ответы (2)


Вы можете дать определение, в котором вы четко указываете, как вам нравится перемещаться по звездам. Сам экран имеет положение xy. Чтобы начать в левом верхнем углу и закончить в правом нижнем углу, вам нужно match.y, match.x.

Затем вам нужно найти все ("stars.png") звезды. Эти звезды вы сортируете в порядке, который вы определили.

Затем вы используете цикл for, чтобы что-то сделать со звездами.

Пример кода:

class Stars():
     def order(match):
          return match.y, match.x
     # Find all icons 
     icons = findAll("stars.png")
     # Sort all the stars. 
     sorted_icons = sorted(icons, key=order)
     # Click on every star. 
     for icon in sorted_icons:
          click(icon)
person Tenzin    schedule 15.01.2015

Это может быть не самый элегантный способ, но это первое, о чем я мог подумать:

def by_y(match):
    return match.y
stars = findAll(imageOfStars)
sorted_stars_y = sorted(stars, key=by_y)
finalStars = []
count = 0
for x in range(5): #if you know your grid is 5x5
    finalStars.append(sorted(sorted_stars_y[count:count + 5])) #see explanation, if needed
    count += 5
for x in finalStars:
    click(x)

объяснение: первые пять звезд из вашего примера должны иметь совпадающие значения y, то есть все они должны быть в верхней строке. Итак, теперь вы просто сортируете их значение x и добавляете их в список, затем переходите к следующим пяти и так далее.

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

 import math #or import sqrt from math, if the square root is the only math function you need.
 def by_y(match):
    return match.y
stars = findAll(imageOfStars)
sorted_stars_y = sorted(stars, key=by_y)
finalStars = []
count = 0
rows = math.sqrt(len(stars))
for x in range(rows):
    finalStars.append(sorted(sorted_stars_y[count:count + rows]))
    count += rows 

Если ваша сетка не идеально квадратная, вы можете сделать кое-что еще, но если это не то, что вы ищете, этот ответ стал немного длинным, поэтому мы оставим это обсуждение на потом :)

РЕДАКТИРОВАТЬ: Поскольку вы знаете, что количество столбцов всегда равно 5, вы можете найти количество строк следующим образом:

 rows = (len(stars) / 5)
 rowCount = 0
 count = 0

Затем вы можете использовать цикл while для перебора ваших звезд:

while rowCount < rows:
    finalStars.append(sorted(sorted_Stars_y[count:count+ 5]))
    count += 5
    rowCount += 1

После того, как все сказано и сделано, это сделает работу за вас, но ответ от @Tenzin более элегантный :)

person autoKarma    schedule 15.01.2015
comment
Спасибо за ответ. Но я не знаю количество строк. Я знаю только количество столбцов, которое равно 5. - person adb16x; 15.01.2015