Использование Sikuli Finder () для поиска скриншота со значком, обеспечивающего кешированный ответ при использовании в цикле - PullRequest
0 голосов
/ 01 июня 2019

(Использование Sikuli IDE -288 20/04/19 в Windows 10)

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

Вызывается функция с именем selectRewards(), и требуется несколько скриншотов области вознаграждения за несколько секунд, чтобы собрать полезный кадр анимации, имя файла увеличивается численно. Затем функция создает Finder, используя скриншоты, начиная со скриншота 1. Finder и изображение, с которым я хочу проверить, передаются в функцию search(), где для поиска совпадений следует использовать переданный искатель и изображение. Он проверяет все определенные изображения в screenshot1, screenshot2 и т. Д., Пока не будут найдены совпадения. И совпадения выбираются на экране с использованием координат из снимка экрана.

Все это хорошо работает на первой итерации selectRewards(), циклически просматривает снимки экрана и находит изображения на стабильном снимке экрана, но при повторном вызове функции возвращаются те же точные "найденные" результаты, и щелчки точно такие же, даже когда изображения на скриншотах не существуют (я даже удалил скриншоты в конце первого цикла, чтобы попытаться очистить любую неверную информацию, отправляемую искателю.

Я попытался вытащить раздел, чтобы поделиться им более понятным способом, и он все еще создает ту же проблему. Буду очень признателен за любую помощь и совет.

(Хотя в настоящее время возникают еще более странные проблемы с кодом, поскольку основной сценарий открыт на вкладке в IDE, а новый сценарий - в другом - ни один из них не запущен - если я запускаю сценарий сниппета, он будет использовать координаты / находки изображений из предыдущего запуска сценариев). Может ли быть какая-то проблема с памятью или кэширование в Windows? ALT + SHIFT + R для перезапуска IDE обычно помогает устранить проблему.

Settings.MoveMouseDelay = 0.5
#Define Regions
rewardRegion = Region(536,429,832,207)
#Define Images
searchCoupons = Pattern("coupons.png").similar(0.85)
searchAdvanced = Pattern("2011.png").similar(0.85)
searchAdvancedFrag = Pattern("2012.png").similar(0.85)

matchesFound = False

def search(image,rewardGlimpse, descr = ""):    
    print ("##### searching for: (%s) %s" % (image, descr))
    rewardGlimpse.findAll(image) # find all matches (using passed finder variable & image variable)
    matches = [] # an empty list to store the matches
    while rewardGlimpse.hasNext(): # loop as long there is a first and more matches
        matches.append(rewardGlimpse.next())        # access next match and add to matches
        # now we have our matches saved in the list matches
    print("   Does FindAll have next? (should be false):" + str(rewardGlimpse.hasNext()))
    print("   Found matches:" + str(len(matches)))

    if len(matches) > 0:
        global matchesFound
        matchesFound = True
        obtainedReward = str(descr)
        print("   Match found should be true " + str(matchesFound) + ". Found: "+obtainedReward)

        # we want to use our matches
    for m in matches:
        #Find x & y location of rewards in screenshot
        matchx = m.x
        matchy = m.y
        #Append them to the reward region to line it up.
        newx = rewardRegion.getX()+matchx
        newy = rewardRegion.getY()+matchy
        rewardHover = Location(newx, newy)
        #click the found reward location
        click(rewardHover)
        wait(1)

def selectRewards():
    #---- Save Incremental Screenshots
    wait(1)
    capture(rewardRegion,"screenshot1.png")
    wait(0.5)
    capture(rewardRegion,"screenshot2.png")
    wait(0.5)
    capture(rewardRegion,"screenshot3.png")
    wait(0.5)
    capture(rewardRegion,"screenshot4.png")
    wait(0.5)
    capture(rewardRegion,"screenshot5.png")
    wait(0.5)
    capture(rewardRegion,"screenshot6.png")
    wait(0.5)
    #----- Test the screenshots
    snum = 1 #screenshot file number

    while True:
        global matchesFound
        if matchesFound == True:
            print("Rewards Found - breaking search loop")
            matchesFound = False
            break
        else:
            pass

        #Start with _screenshot1.png, increment snum.
        screenshotURL = "_screenshot"+str(snum)+".png"
        rewardGlimpse = Finder(screenshotURL) #Setup the Finder

        print("Currently searching in: " + str(screenshotURL))

        #Pass along the image to search, the screenshots Finder, and description.
        search(searchCoupons,rewardGlimpse, "Coupons")
        search(searchAdvanced,rewardGlimpse, "Advanced Recruit Proof")
        search(searchAdvancedFrag,rewardGlimpse, "Advanced Recruit Fragments")
        snum = snum + 1
        if snum>6:
            break

    while True: #All rewards available this round are collected     
        if exists("1558962266403.png"):
            click("1558962266403.png") 
            #confirm
            break
        else:
            pass
        print("No reward found at this point.")
        print("Matches Found at No Reward Debug: " +str(matchesFound))
        #Needed matches not found, selecting random reward.
        hover("1558979979033.png")
        click("1558980645042.png")
        #matchesFound = False #Toggle back to False

        #print("Matches found: Variable Value(Should be false)" + str(matchesFound))

def main():
    i = 0
    SSLoops = 2
    while i < 2:
        print("Loop #" + str(i+1) + "/"+ str(SSLoops))
        print("--------------")
        if i == 1: #remove this if statement for live
            click("1559251066942.png") #switches spoofed html pages to show diff rewards

        selectRewards()
        i = i + 1

if __name__ == '__main__':
    main()

Первый цикл вызова selectRewards() правильный, в области вознаграждения было 3 изображения, которые соответствовали поисковым запросам. Но второй цикл неверен, только одно из подходящих изображений было там и не было в той же точной позиции. Во второй раз сценарий щелкнул в 3 местах предыдущего цикла.

Журнал сообщений: ====

Loop #1/2
--------------

Currently searching in: _screenshot1.png
##### searching for: (P(coupons.png) S: 0.85) Coupons

Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Coupons

[log] CLICK on L[603,556]@S(0) (586 msec)

##### searching for: (P(2011.png) S: 0.85) Advanced Recruit Proof

Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Advanced Recruit Proof

[log] CLICK on L[653,556]@S(0) (867 msec)

##### searching for: (P(2012.png) S: 0.85) Advanced Recruit Fragments

Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Advanced Recruit Fragments

[log] CLICK on L[703,556]@S(0) (539 msec)

Rewards Found - breaking search loop

[log] CLICK on L[90,163]@S(0) (541 msec)

Loop #2/2

--------------

[log] CLICK on L[311,17]@S(0) (593 msec)

Currently searching in: _screenshot1.png
##### searching for: (P(coupons.png) S: 0.85) Coupons

Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Coupons

[log] CLICK on L[603,556]@S(0) (617 msec)

##### searching for: (P(2011.png) S: 0.85) Advanced Recruit Proof
Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Advanced Recruit Proof

[log] CLICK on L[653,556]@S(0) (535 msec)

##### searching for: (P(2012.png) S: 0.85) Advanced Recruit Fragments
Does FindAll have next? (should be false):False
Found matches:1
Match found should be true True. Found: Advanced Recruit Fragments

[log] CLICK on L[703,556]@S(0) (539 msec)

Rewards Found - breaking search loop

[log] CLICK on L[304,289]@S(0) (687 msec)

====

1 Ответ

1 голос
/ 01 июня 2019

RaiMan от SikuliX:

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

Так что вы можете отключить кэширование глобально: Settings.setImageCache (0)

или добавить: Image.reset ()

в начале selectRewards ()

или добавьте число циклов к имени файла захваченных изображений (будьте осторожны: память постоянно увеличивается!)

Кстати: при выборе другой вкладки в среде IDE изображения с ранее выбранной вкладки автоматически кэшируются.

...