«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.
«