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.