Тестирование онлайн флеш игр с использованием Sikuli + Serenity

Привет всем! Сегодня я хотел бы поделится опытом как тестировать онлайн флеши игры с использованием такой связке #serenity + #bdd + #sikuli + #webdriver + #junit + #jenkins
На самом деле все уже знают что автоматизация флеш игры , это устаревший вид автоматизации тестирования. Однако недавно я все таки столкнулся с этим видом, по просьбе заказчика. Долго думал что можно выбрать для автоматизации, и остановился на Sikuli. потому как есть небольшой опыт в нем , поэтому и решил использовать его.

Я выбрал тестовую онлайн флеш игру - здесь

Кейсы самые простые

  1. Перейти на главную с флеш играми
  2. Выбрать игры Wrong Block
  3. Кликнуть на Start
  4. Навести на Open game
  5. Кликнуть на Start game
  6. Кликнуть на next level
  7. Кликнуть на play
    Ожидаемый результат: Начало игры

Так вот основная проблема была это создать pom файл со всеми репозиториями и зависимостями, а также с установкой самого Sikuli (т.к. больше года не использовал Sikuli,столкнулся с множеством проблем) а именно для Sikuli нужно следующее

  1. Маст jdk7 - 32/64
  2. Установка самого сикули sikulixsetup.jar
  3. Добавить сикули в переменные окружения
  4. Добавить с установочного сикули - sikulixapi.jar в проект (pom файл)
    Сильно зацикливаться на Serenityя не буду. Думаю по скринам будет все понятно

Показываю иерархию проекта

А теперь более подробней о пекеджах

GamePage - здесь описывается PageObject примерно так

@DefaultUrl("http://www.best-flash-games.net/")
public class LoginPage extends PageObject {

    private static final Integer CATALOG_WAIT_FOR_TIMEOUT = 15000;

    private Pattern wrongBlock;
    private Pattern start;
    private Pattern openMenu;
    private Pattern startGame;
    private Pattern nextLevel;
    private Pattern play;
    private Pattern one;

    public LoginPage (WebDriver driver) {
        super(driver, CATALOG_WAIT_FOR_TIMEOUT);

        wrongBlock = new Pattern(DataProperties.path("wrongBlock.jpg"));
        start = new Pattern(DataProperties.path("start.jpg"));
        openMenu = new Pattern(DataProperties.path("openMenu.jpg"));
        startGame = new Pattern(DataProperties.path("startGame.jpg"));
        nextLevel = new Pattern(DataProperties.path("nextLevel.jpg"));
        play = new Pattern(DataProperties.path("play.jpg"));
        one = new Pattern(DataProperties.path("one.jpg"));
    }
    public void game() throws FindFailed {

        Screen screen = new Screen();
        screen.click(wrongBlock);

    }
    public void startGames() throws FindFailed {
        Screen screen = new Screen();
        screen.wait(start, 10);
        screen.click(start);
    }
    public void clickOpenMenu() throws FindFailed, InterruptedException {

        Screen screen = new Screen();
        screen.wait(openMenu, 20);
        screen.mouseMove(openMenu);
        screen.wait(startGame, 10);
        screen.click(startGame);
    }

Далее по принципу Serenity идем в степы

public class StepsLogin extends ScenarioSteps {
    GamePage gamePage;

    @Step()
    public void homePage() {
        gamePage.open();

    }
    @Step()
    public void startGame() throws FindFailed {
        gamePage.game();
        gamePage.startGames();
    }
    @Step()
    public void clickOpenMenu() throws FindFailed, InterruptedException {

        gamePage.clickOpenMenu();
    }
    @Step()
    public void clickNextLevel() throws FindFailed {
        gamePage.clickNextLevel();
    }

    @Step()
    public void clickPlay() throws FindFailed {
        gamePage.clickPlay();
    }

    @Step()
    public void seeToBeginGame() throws FindFailed {
        gamePage.seeStartGame();
    }
}

Далее степы для отображение Cucumber в отчете

public class GameSteps extends StepsLogin {

    @Steps
    StepsLogin stepsLogin;

    @Given("Go to Game Page and click on the game Wrong Block.")
    public void homePage() {
        stepsLogin.homePage();
    }

    @When("Click on the link Start Game.")
    public void getClickStartGame() throws FindFailed {
        stepsLogin.startGame();
    }
    @When("Move Open menu and click Start Game.")
    public void getClickOpenMenu() throws FindFailed, InterruptedException {
        stepsLogin.clickOpenMenu();
    }

    @When("Click on Next Level.")
    public void getClickNextLevel() throws FindFailed {
        stepsLogin.clickNextLevel();
    }

    @When("Click on Play.")
    public void getClickPlay() throws FindFailed {
        stepsLogin.clickPlay();
    }
    @Then("Should see begin game.")
    public void getSeeToBeginGame() throws FindFailed {
        stepsLogin.seeToBeginGame();
    }
}

Класс Data Properties я взял с проекта @polusok (Sikuli)

В Классе BeforeTest идет соединение с chromedriver.exe

public class BeforeTest {

    @Managed(driver = "chrome")

    public WebDriver driver;
    public String ChromePath = DataProperties.get("chromedriver.exe");

    @Before
    public void myTest() throws Exception {

        System.setProperty("webdriver.chrome.driver", ChromePath);

    }
    
    @After
    public void close() throws IOException {
        driver.close();
    }
}

В SingelTest я подключаю фичу cucumber со сценарием

@RunWith(CucumberWithSerenity.class)
@CucumberOptions(features = "src/test/resources/features/single.feature")
public class SingleTest extends BeforeTest {

    @Steps
    GameSteps game;

    @WithTag("Sikuli")
    @Test
    public void game() throws Throwable {
        game.homePage();
    }
}

Вот сам сценарий Геркина выглядит примерно так

Feature: Check a flash game - Wrong Block
User must be to use webdriver
User must be installed Sikuli for making screens
You have to install java 1.7 (1.8 not supported)
    Scenario: Check menu for game - Wrong Block
        Given Go to Game Page and click on the game Wrong Block.
        When Click on the link Start Game.
        When Move Open menu and click Start Game.
        When Click on Next Level.
        When Click on Play.
        Then Should see begin game.

Самое главное это настроить pom.xml - вот основные зависимости для файла, которые отвечают за Sikuli

        <dependency>
            <groupId>com.sikulix</groupId>
            <artifactId>sikulixapi</artifactId>
            <version>1.1.0</version>
        </dependency>

Вот и все, для запуска я запускаю такой командой

mvn clean integration-test serenity:aggregate

Вот отчет о проделанной работе)

7 лайков

Чем картинки нарезали? Как по вашему мнению, такой же подход будет работать в случае Desktop приложения?

Да будет работать, я проверял Web+Desktop, нарезал joxi, Единственно только без Serenity (т.к. он предназначен для веб приложений)

Использовали похожий подход: Serenity + sikuli. Зарекомендовал себя достаточно неплохо, но в результате всё равно перешли на свой FlashDriver, реализующий интерфейс WebDriver.