2014-09-03 20 views
0

所以我遇到了Sikuli的問題。存在多次出現圖像的情況。要抓住它們,你可以簡單地做一個findAll,但它將每個圖像保存爲某種對象,而不是圖像。我知道你可以使用getLastMatches()來獲取圖像,但是我想先對它進行排序。所以這是我得到的代碼,它抓住所有的圖像並對它們進行排序。我發現了一些信息的Sikuli文檔將迭代器對象從findAll轉換爲Sikuli中的圖像後排序

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. 的一種方式,以通過他們的y值圖像進行排序的一種方式,同時保持作爲字符串的圖像

希望這會有所幫助。

+0

我請問你想用圖片做什麼?一個'find'或'findAll'操作使用模式/圖片/屏幕截圖或字符串作爲輸入類型並返回(a)匹配對象,通過它可以完成Sikuli所提供的任何東西... – autoKarma 2014-09-04 17:12:06

+0

there's很多預先存在的方法需要圖像而不是圖案。他們每個人都使用find方法(以及與find相似的自建方法)。我可以提供一些if語句來處理這個問題,但是我不想這樣做會有很多變化。因此,我寧願能夠將它們轉換回圖像並將它們發送到方法 – user2869231 2014-09-05 17:54:03

+0

我不確定我是否清晰 - 圖像和圖案之間有什麼區別?在上面的例子中,'icons = findAll(image)'這裏的「image」是Pattern類型。相反,如果你說'iconNames = findAll(「IconTitle」),那麼IconTitle將是String類型。 findAll()操作接受的唯一兩種類型是Pattern和String。你的意思是圖案和圖像是同一件事嗎? – autoKarma 2014-09-05 19:32:47

回答

0

只是快速的信息。 JePySi不處理圖標/圖像的動態分配。這需要通過Sikuli功能完成。所以autoKarma是正確的self.assets.getImage()在這種情況下是無用的,因爲它只能訪問預先註冊的圖像,只能通過名稱來解決。因此只有字符串操作。

乾杯, 亞歷克斯 - 我寫JePySi :-)

+0

哇,你使用JePySi還是實際寫它?就像Je​​PySi的開發者一樣?大聲笑你知道這樣做的好方法嗎?在技​​術上,我可以放棄在try/except語句中單擊(匹配),命令「assert testcontext.browser.failed(...)」,並且仍然允許它被記錄。如果能找到解決辦法,那就太好了。 – user2869231 2014-10-24 19:27:36

0

我不確定這會回答你的問題,但我認爲有一個更直接的方式來實現你的目的。

exampleMethod()是內置click() function--

一個click()會點擊一個模式,絃樂,地點,地區或(最重要的是這個問題)比賽就好了,所以你不要的重申爲了點擊它,你真的不需要這個圖像。你也不需要self.assets.getimage()來訪問一個圖像點擊。 click()函數隱式地首先執行find()操作,然後單擊它發現的任何內容。由於您將點擊一個匹配對象,它將會直接進入由匹配對象提供的座標並點擊這些座標。

此外,默認.targetOffset是(0,0)(意思是它會點擊找到的圖像的中心)。所以,你可能不需要在你的exampleMethod()中預定義0。

總之,如果有相同的圖像的網頁上幾個相同的副本,並且希望以點擊每一個下去的屏幕,你可以做這樣的事情:

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 

另一種方式來做到這一點,而無需使用Python的列表理解(如果那是你不熟悉的):

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()的複製品ver,在它的方法中,它使用「name.endswith()」方法,它需要一個String。因此,一個字符串必須被髮送,而不是匹配。我想我的例子可能不是最有效的。 – user2869231 2014-09-10 19:26:21

+0

「getimage(image)」方法使用endswith(),它不是我可以刪除的東西,因爲它與特性文件中的資源連接。 – user2869231 2014-09-10 19:28:01

+0

讓我想一想... – autoKarma 2014-09-10 19:32:35

相關問題