«1. Введение

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

2. Интеграция с Selenium

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

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

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

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.4.0</version>
</dependency>

Последнюю версию можно найти в центральном репозитории Maven.

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.baeldung.com/";

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

    // ...
}

Здесь мы инициализируем SeleniumConfig и установим нужный URL-адрес для перехода. Точно так же мы реализуем простой API для закрытия браузера и получения заголовка страницы: проверяет и закрывает оверлей при загрузке домашней страницы. После этого мы переходим на страницу About Baeldung с помощью метода getAboutBaeldungPage():

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

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

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

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

private void closeOverlay() {
    List<WebElement> 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() {
    Actions actions = new Actions(config.getDriver());
    WebElement aboutElement = this.config.getDriver()
        .findElement(By.id("menu-item-6138"));
        
    actions.moveToElement(aboutElement).perform();
}

private void clickAboutUsLink() {
    WebElement element = this.config.getDriver()
        .findElement(By.partialLinkText("About Baeldung."));
    element.click();
}

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

public boolean isAuthorInformationAvailable() {
    return this.config.getDriver()
        .getPageSource()
        .contains("Hey ! I'm Eugen");
}

3. С помощью JUnit

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

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

public class SeleniumWithJUnitLiveTest {

    private static SeleniumExample seleniumExample;
    private String expectedTitle = "About Baeldung | Baeldung";

    // more code goes here...

}

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

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

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

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

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

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

@Test
public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutBaeldungPage();
    String actualTitle = seleniumExample.getTitle();
 
    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

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

4. С помощью TestNG

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

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

Во-первых, давайте создадим новый тестовый класс:

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

public class SeleniumWithTestNGLiveTest {

    private SeleniumExample seleniumExample;
    private String expectedTitle = "About Baeldung | Baeldung";

    // more code goes here...

}

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

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

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

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

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

@Test
public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutBaeldungPage();
    String actualTitle = seleniumExample.getTitle();
 
    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

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

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

Как всегда, исходный код статьи доступен на GitHub.

«