Используем Selenium Grid
Заметка, в которой я покажу, как использовать настроенный Selenium grid в тестовом фреймворке. О том, как настроить grid, я писал в предыдущей заметке.
Начнем с самого простого. Создаем Maven проект, подключаем две зависимости TestNG и Selenium-java:
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.46.0</version>
</dependency>
</dependencies>
TestNG приведен не случайно: именно его проще всего использовать для распараллеливания тестов. Почему? Попробуйте - и вы поймете сами =)
В этом примере показан тест для страницы поиска Google. Но это не столь важно, следуя примеру, можно создать инфраструктуру для тестирования любого web-приложения.
Создаем общий класс, от которого будут наследоваться все классы тестов. В него помещаем методы фикстуры и другие методы, общие для всех классов тестов:
import com.grid.shedule.core.WebDriverInstansiator;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
public class BaseTestGrid {
@Parameters({"browserName", "browserVersion"})
@BeforeClass
public void setUp(@Optional String browserName, String browserVersion){
WebDriverInstansiator.setDriver(browserName, browserVersion);
}
@AfterClass
public void tearDown() throws Exception{
WebDriverInstansiator.getDriver().quit();
}
}
Самое важное в коде, приведенном выше - класс WebDriverInstantiator. Этот класс будет служить менеджером веб-драйверов для наших тестов. Самое важное в этом классе - ThreadLocal переменная webdriver. Она вводится для того, чтобы на каждый новый поток создавать свой веб-драйвер.
import org.openqa.selenium.WebDriver;
public class WebDriverInstansiator {
private static InheritableThreadLocal<WebDriver> webDriver = new InheritableThreadLocal<WebDriver>();
private static WebDriverFactory factory;
public static void setDriver(String browserName, String browserVersion){
factory = new WebDriverFactory();
webDriver.set(factory.getWebDriver(browserName, browserVersion));
}
public static WebDriver getDriver(){
return webDriver.get();
}
}
Внутри класса WebDriverInstansiator находится PageFactory, его цель - упростить создание новых инстансов веб-драйверов.
Создаем Page object и класс тестов.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
/**
* Created by Serhii_Pirohov on 23.06.2015.
*/
public class GooglePage extends Page{
private static final String URL = "http://google.com/";
private static final By SEARCH_INPUT = By.name("q");
private static final By SEARCH_BTN = By.name("btnK");
public GooglePage(WebDriver driver) {
super(driver);
}
public void search(String name){
$(SEARCH_INPUT).sendKeys(name);
$(SEARCH_BTN).click();
}
public void open() {
toPage(URL);
}
}
Класс тестов:
import com.grid.shedule.core.WebDriverInstansiator;
import com.grid.shedule.pages.GooglePage;
import org.testng.annotations.*;
/**
* Created by Serhii_Pirohov on 23.06.2015.
*/
public class TestGoogleSearch extends BaseTestGrid {
GooglePage googlePage;
@BeforeMethod
public void setUp() {
googlePage = new GooglePage(WebDriverInstansiator.getDriver());
}
@Test
public void shouldBeBlogTitle() {
googlePage.open();
googlePage.search("automation remarks");
}
}
И самая последняя часть: нужно настроить TestNG xml, в котором указать, какие тесты и в каких браузерах нужно запускать.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="ScheduleBusTest" parallel="tests" thread-count="5">
<test name="ChromeTest" verbose="1" parallel="true">
<parameter name="browserName" value="chrome" />
<parameter name="browserVersion" value="" />
<classes>
<class name="com.grid.shedule.test.TestGoogleSearch" />
</classes>
</test>
<test name="InternetExplorerTest" verbose="1" parallel="true">
<parameter name="browserName" value="internet explorer" />
<parameter name="browserVersion" value="8" />
<classes>
<class name="com.grid.shedule.test.TestGoogleSearch" />
</classes>
</test>
</suite>
Ну вот, на этом настройка закончена. Для того, чтобы запустить тесты, нужно сначала стартовать наш Grid Hub с подключенными Node. Приведу пример скрипта с json файлом конфигурации:
NodeConfig.json
{
"capabilities":
[
{
"browserName": "chrome",
"platform": "WINDOWS",
"maxInstances": 13,
"seleniumProtocol": "WebDriver",
"nodeName": "simpleNode"
},
{
"seleniumProtocol": "WebDriver",
"browserName": "internet explorer",
"version": "8",
"maxInstances": 13,
"platform" : "WINDOWS",
"nodeName": "simpleNode"
},
{
"browserName": "firefox",
"version": "22",
"platform": "WINDOWS",
"firefox_binary":"FirefoxExe/ff22/firefox.exe",
"maxInstances": 25,
"seleniumProtocol": "WebDriver",
"nodeName": "simpleNode"
},
{
"browserName": "firefox",
"version": "24",
"platform": "WINDOWS",
"maxInstances": 25,
"firefox_binary":"FirefoxExe/ff24/firefox.exe",
"seleniumProtocol": "WebDriver",
"nodeName": "simpleNode"
}
],
"configuration":
{
"nodeTimeout":120,
"nodePolling":2000,
"registerCycle":10000,
"register":true,
"cleanUpCycle":2000,
"timeout":30000,
"maxSession":25,
"nodeStatusCheckTimeout":10000,
"downPollingLimit":360000
}
}
Код самого .bat или .sh файла, который я использую для запуска сервера:
StartGrid.bat(.sh)
cmd /C start/MIN java -jar selenium-server-standalone-2.46.0.jar -role hub -port 4445 -timeout 300 -browserTimeout 360
cmd /C start/MIN java -jar selenium-server-standalone-2.46.0.jar -role node -port 5599 -hub http://localhost:4445/grid/register -nodeConfig NodeConfig.json -Dwebdriver.chrome.driver=Drivers\chromedriver.exe -Dwebdriver.ie.driver=Drivers\IEDriverServer.exe
Ну вот, теперь можно запускать тест. Должны открыться два браузера IE и Chrome, в которых параллельно будет выполняться наш единственный тест.
Надеюсь, вам понравилась заметка и вы нашли в ней что-то полезное. Подписывайтесь на мой блог, присылайте идеи, делитесь опытом. До новых встреч!..