Для запуска тестов в Google Chrome, помимо библиотеки Selenium WebDriver, необходимы наличие и запуск специального исполняемого файла, который выступает в качестве моста между браузером и драйвером. Сам исполняемый файл называется «chromedriver», его можно скачать здесь. Чтобы избежать путаницы со схожим названием org.openqa.selenium.chrome.ChromeDriver
, в этой статье исполняемый файл я буду называть ChromeDriver сервером.
После того как Вы скачали исполняемый файл, нужно задать его местоположение. Без этого при инициализации драйвера
WebDriver driver = new ChromeDriver();
возникнет IllegalStateException: "The path to the driver executable must be set by the webdriver.chrome.driver system property;"
.
Задать местоположение ChromeDriver сервера можно несколькими способами:
- установив
System.setProperty("webdriver.chrome.driver", PATH_TO_CHROMEDRIVER_EXE);
; - добавив путь к исполняемому файлу в переменную среды PATH (скорее всего после изменения переменной понадобится перезапуск IDE разработки).
Класс ChromeDriver запускает исполняемый файл во время своего создания и останавливает его при вызове метода quit(). Несмотря на то, что ChromeDriver сервер достаточно легковесный, его повторные запуск и остановка добавляют заметную задержку для тестов, в которых драйвер инициализируется для каждого тестового метода. Чтобы избежать этой проблемы, Вы можете использовать один из следующих способов:
- напрямую управлять запуском и остановкой ChromeDriver сервера с помощью ChromeDriverService:
- Запустить ChromeDriver сервер сам по себе перед запуском тестов, и подключиться к нему с помощью Remote WebDriver
import java.io.File; import java.io.IOException; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriverService; public class ChromeDriverTest { private static ChromeDriverService service; public static WebDriver driver; @BeforeClass public static void createAndStartService() throws IOException { service = new ChromeDriverService.Builder() .usingDriverExecutable(new File(PATH_TO_CHROMEDRIVER_EXE)) .usingAnyFreePort() .build(); service.start(); } @Before public void setUp(){ driver = new ChromeDriver(service); } @Test public void simpleTest() { driver.get("http://internetka.in.ua"); } @After public void tearDown(){ driver.quit(); } @AfterClass public static void createAndStopService() { service.stop(); } }
WebDriver driver = new RemoteWebDriver("http://localhost:9515", DesiredCapabilities.chrome());
Запуск браузера с параметрами
ChromeDriver может запускать браузер с конкретными флагами командной строки, которые будут переданы в браузер при запуске.
ChromeOptions option = new ChromeOptions(); option.addArguments("--window-size=1500,1000"); driver = new ChromeDriver(option);
Полный список возможный флагов можно посмотреть здесь.
Есть еще третий способ задания местоположение ChromeDriver сервера
ChromeDriverService driverService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(driverPath))
.build();
WebDriver driver = new ChromeDriver(driverService);
Работает только если браузер нужно открывать на этом же PC.
Если брайзер нужно открывать на ремоутной машине, то на ней нужно запускать так:
java -jar selenium-server-standalone-2.31.0.jar -Dwebdriver.chrome.driver=/chromedriver.exe
или в режиме грида (это уже отдельная тема)
Добрый день.
Подскажите, пожалуйста, возможно уже сталкивались с такой ошибкой:
При запуске одного и того же кода (например, тот что описан выше), который выполняет автотест на хроме, система на одной машине хром запускает без проблем, берет URL и спокойно переходит по нему и дальше по логике теста. А на другой машине, тупо стопорится, в данном случае на строке:
driver.get(«http://internetka.in.ua»);
Буду очень благодарен за подсказку, что необходимо сделать (например, настройки брандмауэра или непосредственно самого хрома…).
Спасибо.
Добрый день, совпадают ли версии браузеров, путь к ним на машинах?
Татьяна, ваш способ запуска хрома с использованием сервиса usingAnyFreePort() запускает у меня несколько окон с браузерами на разных портах. Одновременно открываются 3 окна. Можно ли этого избежать? Нужно только одно окно для последовательного запуска тестов