Руководство по Селену с JUnit/TestNG

Руководство по селену с JUnit / TestNG

1. Вступление

Эта статья представляет собой быстрое практическое введение в работу сSelenium и написание тестов сJUnit иTestNG.

2. Селен интеграция

В этом разделе мы начнем с простого сценария - открытие окна браузера, переход по заданному URL-адресу и поиск необходимого содержания на странице.

2.1. Maven Зависимости

В файлеpom.xml добавьте следующую зависимость:


    org.seleniumhq.selenium
    selenium-java
    3.4.0

Последнюю версию можно найти в папкеMaven Central Repository.

2.2. Конфигурация Selenium

Сначала создайте новый файл класса Java с именемSeleniumConfig:

public class SeleniumConfig {

    private WebDriver driver;

    //...

}

Поскольку мы используем версию Selenium 3.x, мы должны указать путь к исполняемому файлуGeckoDriver (в зависимости от вашей ОС), используя системное свойство под названиемwebdriver.gecko.driver. Последняя версия GeckoDriver может быть загруженным сGithub Geckodriver Releases.

Давайте теперь инициализируемWebDriver в конструкторе, мы также установим 5 секунд в качестве тайм-аута дляWebDriver, чтобы дождаться появления элемента на странице:

public SeleniumConfig() {
    Capabilities capabilities = DesiredCapabilities.firefox();
    driver = new FirefoxDriver(capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

static {
    System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac"));
}

static private String findFile(String filename) {
   String paths[] = {"", "bin/", "target/classes"};
   for (String path : paths) {
      if (new File(path + filename).exists())
          return path + filename;
   }
   return "";
}

Этот класс конфигурации содержит пару методов, которые мы пока проигнорируем, но мы увидим больше об этом во второй части этой серии.

Далее нам нужно будет реализовать классSeleniumExample:

public class SeleniumExample {

    private SeleniumConfig config;
    private String url = "http://www.example.com/";

    public SeleniumExample() {
        config = new SeleniumConfig();
        config.getDriver().get(url);
    }

    // ...
}

Здесь мы инициализируемSeleniumConfig и установим желаемый URL-адрес для перехода. Точно так же мы реализуем простой API, чтобы закрыть браузер и получить заголовок страницы:

public void closeWindow() {
    this.config.getDriver().close();
}

public String getTitle() {
    return this.config.getDriver().getTitle();
}

Чтобы перейти к разделу «О нас» на example.com, нам нужно создать методcloseOverlay(), который проверяет и закрывает оверлей при загрузке домашней страницы. После этого мы переходим на страницу примера с помощью методаgetAboutexamplePage():

public void getAboutexamplePage() {
    closeOverlay();
    clickAboutLink();
    clickAboutUsLink();
}

private void closeOverlay() {
    List webElementList = this.config.getDriver()
      .findElements(By.tagName("a"));
    if (webElementList != null) {
       webElementList.stream()
         .filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title")))
         .filter(WebElement::isDisplayed)
         .findAny()
         .ifPresent(WebElement::click);
    }
}

private void clickAboutLink() {
    this.config.getDriver().findElement(By.partialLinkText("About")).click();
}

private void clickAboutUsLink() {
    Actions builder = new Actions(config.getDriver());
    WebElement element = this.config.getDriver()
      .findElement(By.partialLinkText("About example."));
    builder.moveToElement(element)
      .build()
      .perform();
}

Мы можем проверить, доступна ли необходимая информация на отображаемой странице:

public boolean isAuthorInformationAvailable() {
    return this.config.getDriver()
      .findElement(By.cssSelector("article > .row > div"))
      .isDisplayed();
}

Далее мы собираемся протестировать этот класс как с JUnit, так и с TestNG.

3. С JUnit

Давайте создадим новый тестовый класс какSeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest {

    private static SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Мы собираемся использовать аннотацию@BeforeClass изorg.junit.BeforeClass, чтобы выполнить начальную настройку. В этом методеsetUp() мы собираемся инициализировать объектSeleniumExample:

@BeforeClass
public static void setUp() {
    seleniumExample = new SeleniumExample();
}

Аналогичным образом, когда наш тестовый пример заканчивается, мы должны закрыть недавно открытый браузер. Мы собираемся сделать это с помощью аннотации@AfterClass - чтобы очистить настройки после завершения выполнения тестового примера:

@AfterClass
public static void tearDown() {
    seleniumExample.closeWindow();
}

Обратите внимание на модификаторstatic в нашей переменной-членеSeleniumExample - потому что нам нужно использовать эту переменную в статических методахsetUp() иtearDown() -@BeforeClass и@AfterClass можно вызывать только для статических методов.

Наконец, мы можем создать наш полный тест:

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

Этот метод тестирования утверждает, что заголовок веб-страницы неnull и задан должным образом. Кроме того, мы проверяем, что страница содержит ожидаемую информацию.

Когда тест запускается, он просто открывает URL в Firefox и впоследствии закрывает его после того, как заголовок веб-страницы и контент были проверены.

4. С TestNG

Теперь давайте воспользуемся TestNG для запуска нашего тестового примера / набора.

Обратите внимание, что если вы используете Eclipse, плагин TestNG можно загрузить и установить сEclipse Marketplace.

Сначала создадим новый тестовый класс:

public class SeleniumWithTestNGLiveTest {

    private SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Мы будем использовать аннотацию@BeforeSuite изorg.testng.annotations.BeforeSuite, чтобы создать экземпляр нашегоSeleniumExample class. МетодsetUp() будет запущен непосредственно перед активацией набора тестов:

@BeforeSuite
public void setUp() {
    seleniumExample = new SeleniumExample();
}

Точно так же мы воспользуемся аннотацией@AfterSuite изorg.testng.annotations.AfterSuite, чтобы закрыть наш открытый браузер после завершения набора тестов:

@AfterSuite
public void tearDown() {
    seleniumExample.closeWindow();
}

Наконец, давайте реализуем наш тест:

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

После успешного завершения набора тестов мы находим отчеты HTML и XML в папкеtest-output проекта. Эти отчеты суммируют результаты теста.

5. Заключение

В этой быстрой статье мы сосредоточились на кратком руководстве по написанию тестов Selenium 3 с использованием как JUnit, так и TestNG.

Как всегда доступен источник статьиover at GitHub.