Перейти к основному содержимому

Руководство по Selenium с JUnit/TestNG

· 5 мин. чтения

1. Введение

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

2. Интеграция с селеном

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

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

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

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

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

2.2. Конфигурация селена

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

public class SeleniumConfig {

private WebDriver driver;

//...

}

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

Давайте теперь инициализируем 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.foreach.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();
}

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

public void getAboutForEachPage() {
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 ForEach."));
element.click();
}

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

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

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

3. С Юнит

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

public class SeleniumWithJUnitLiveTest {

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

// 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 whenAboutForEachIsLoaded_thenAboutForEachIsMentionedOnPage() {
seleniumExample.getAboutForEachPage();
String actualTitle = seleniumExample.getTitle();

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

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

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

4. С TestNG

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

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

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

public class SeleniumWithTestNGLiveTest {

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

// more code goes here...

}

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

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

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

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

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

@Test
public void whenAboutForEachIsLoaded_thenAboutForEachIsMentionedOnPage() {
seleniumExample.getAboutForEachPage();
String actualTitle = seleniumExample.getTitle();

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

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

5. Вывод

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

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