Руководство по селену с JUnit / TestNG
1. Вступление
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.