Браузерный робот на Sikuli IDE для игры MusicWars

в 13:39, , рубрики: games, musicwars, python, Sikuli, тестирование

игрушка на прокачку

Предыстория:

Как-то передо мной стала задача -«Хочу прокачать персонажа, но из-за работы не хватает времени..» сразу решил — «Я же инженер, сейчас решим задачу».

Music Wars — это новая браузерная MMORPG где вам предстоит в жесткой борьбе отстаивать свои музыкальные предпочтения. Яркая графика, нестандартная боевая система привлекут не только отъявленых меломанов, но и всех поклонников компьютерных игр.

После изучения игрушки MusicWars выяснилось, что она, как и многие браузере игры сделаны на Flash что не даёт полной возможности манипуляции. Выход есть, использовать скрипты ориентирована на программирование графического интерфейса. Я решил использовать sikuli благодаря статье Подробнее о Sikuli в автоматизации тестирования Gulsom.

Преимуществом такого написание является визуальных объектов без всяких премудростей программирования. С таким написанием может справится любой знающий более-менее представления о программирование. Всё написание с отладкой заняло пару чесов!

Персонажа на прокачку:

Сама логика заключается в поиски противника из 2х окон. Я выбираю меньшего уровнем и меньшей силой и нападаю если такого нет, то выходим и перегружаем заново противников и так по кругу.

Логика выбора противника

Я использовал Region для большей скорости нахождения элементов т.к. игра занимала только половину экрана.

Логика выбора противника

def left_open_doi(): #смотрим слева
    region_left = Region(561,414,386,387)
    if region_left.exists("aIE.png"): #если уровень меньше
        if region_left.exists("HAI1ACIh2g.png"):
            region_left.hover("Cmna.png")
            if region_left.exists("1404561848539.png"):
                right_open_boi()
            else:
                region_left.click("HAI1ACIh2g.png")
                if Region(177,250,779,551).exists("1404562400404.png"):
                    Region(177,250,779,551).click("1404562484299.png")
                    sleep(0.23)
                    new_okno_boi()
                else:
                    if Region(161,175,795,633).exists("Heqocrarouuo.png"):
                        Region(161,175,795,633).click("1404562484299.png")
                        else_none_boi()
                    else:
                        if Region(163,171,797,636).exists("HEAOCTBTOHH0.png"):
                            sleep(100)
                            new_okno_boi()
                        else:
                            sleep(30)
                            close_boi()
        else:
           right_open_boi()
    else:
        right_open_boi()

def right_open_boi():
    region_right = Region(175,418,388,381)
    if region_right.exists("aIE-1.png"):
        if region_right.exists("HAI1ACIh2g.png"):
            region_right.hover("Cmna.png")
            if Region(447,499,96,22).exists("1404561848539.png"):
                new_okno_boi()
            else:
                region_right.click("HAI1ACIh2g.png")
                if Region(177,250,779,551).exists("1404562400404.png"):
                    Region(177,250,779,551).click("1404562484299.png")
                    sleep(0.23)
                    new_okno_boi()
                else:
                    if Region(161,175,795,633).exists("Heqocrarouuo.png"):
                        Region(161,175,795,633).click("1404562484299.png")
                        else_none_boi()
                    else:
                        if Region(163,171,797,636).exists("HEAOCTBTOHH0.png"):
                            sleep(100)
                            new_okno_boi()
                        else:
                            sleep(30)
                            close_boi()
        else:
            new_okno_boi()
    else:
        new_okno_boi()
start()

Закрытия после атаки

def close_boi(): #закрываем окно после боя
    if Region(240,250,652,320).exists("QBuxcn.png"):
        Region(240,250,652,320).click("QBuxcn.png")
        new_okno_boi()
    else:
        click(Location(555,484))
        Region(237,253,652,311).click("1404559699899.png")
        if Region(183,266,767,547).exists("Floanpanrmen.png"):
            Region(183,266,767,547).click("1404562484299.png")
            Region(240,250,652,320).click("QBuxcn.png")
            new_okno_boi()
        else:
            sleep(0)
            Region(183,266,767,547).click("QBuxcn.png")
            sleep(10)
            new_okno_boi() #после закрытия подготавливаем к новым боям   


Смена окна если нету подходящих противников

def new_okno_boi(): 
     Region(411,279,155,100).click("1404557642674.png")
     if Region(177,306,378,486).exists("BUKBAJI.png"):
          Region(195,412,201,102).click("BUKBAJI.png")
          sleep(0.10)
          Region(736,627,220,179).hover("1404582245445.png")
          sleep(2)
          Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
          if Region(181,253,142,41).exists("BVITBA.png"):
              left_open_doi()
          else:
              sleep(0.10)
              Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
              Region(175,306,770,489).click("1404547957758.png")
              left_open_doi()
     else:
         if Region(216,326,149,128).exists("DBOPbI.png"):
             Region(188,310,190,151).click("DBOPbI-1.png")
             Region(736,627,220,179).hover("1404582245445.png")
             sleep(2)
             Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
             if Region(181,253,142,41).exists("BVITBA.png"):
                 left_open_doi()
             else:
                 sleep(0.10)
                 Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
                 Region(175,306,770,489).click("1404547957758.png")
                 left_open_doi()
         else:
             if Region(376,313,125,121).exists("KOCTEFI.png"):
                 Region(373,313,127,108).click("KOCTEFI-1.png")
                 Region(736,627,220,179).hover("1404582245445.png")
                 sleep(2)
                 Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
                 if Region(181,253,142,41).exists("BVITBA.png"):
                     left_open_doi()
                 else:
                     sleep(0.10)
                     Region(192,316,740,474).click(Pattern("1404559393979.png").targetOffset(-55,20))
                     Region(175,306,770,489).click("1404547957758.png")
                     left_open_doi()

Скрипт в редакторе Sikuli IDE будет выгладить так:

Скрипт в редакторе Sikuli IDE

Сслыка на репозиторий

Вдохновили на написание такого скрипта следующие статьи:

Подробнее о Sikuli в автоматизации тестирования Gulsom
Частный случай использования Sikuli для решения проблемы в Facebook Xtragalattico

Автор: D_E_S

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js