1. Проблема
При запуске теста пользовательского интерфейса с использованием selenium очень часто возникают проблемы с совместимостью драйверов. Например, на локальной машине установлена версия браузера 114, а chromedriver, загруженный с библиотекой, ожидает версию браузера 112.
Ошибка указывает на то, что используемая версия драйвера браузера и установленный браузер несовместимы. Трассировка исключения SessionNotCreatedException выглядит следующим образом:
Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500.Message: session not created: This version of ChromeDriver only supports Chrome version 112Current browser version is 114.0.5735.110 with binary path C:\Program Files\Google\Chrome\Application\chrome.exeHost info: host: 'LAPTOP-7JGBN7BP', ip: '192.168.0.130'Build info: version: '4.8.1', revision: '8ebccac989'System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.1'Driver info: org.openqa.selenium.chrome.ChromeDriver
2. Решение
Существует довольно много решений для исправления этой проблемы совместимости, например, загрузка совместимой версии драйвера с соответствующих страниц загрузки( драйверы Chrome,драйверы Firefox или драйверы Edge ), которые соответствуют установленной версии браузера. Кроме того, мы можем удалить и затем установить совместимые версии браузера.
Но вышеуказанные решения могут не работать долгое время, так как и когда мы обновляем браузеры вручную или через автоматические обновления. В корпоративных машинах мы даже можем не знать, что браузер был обновлен.
Чтобы правильно исправить эту проблему, один из хороших способов — использовать библиотеку WebDriverManager. Это библиотека Java с открытым исходным кодом, которая выполняет управление(т. е. загрузку, настройку и обслуживание) драйверов, необходимых Selenium WebDriver, полностью автоматизированным образом. Ее последняя версия предоставляет другие важные функции, такие как возможность обнаружения браузеров, установленных в локальной системе, бесперебойный запуск браузеров в контейнерах Docker и возможности мониторинга.
2.1.Мавен
Включите последнюю версию io.github.bonigarcia:webdrivermanager из репозитория Maven.
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.3.3</version><scope>test</scope></dependency>
Мы также можем использовать его в проекте Gradle:
dependencies {testImplementation("io.github.bonigarcia:webdrivermanager:5.3.3")}
2.2.Использование
Чтобы автоматизировать управление драйверами, нам необходимо выбрать нужный менеджер в API WebDriverMager(например, chromedriver() для Chrome) и вызвать метод setup().
@BeforeAllstatic void setup() {WebDriverManager.chromedriver().setup();}
При выполнении метод setup() пытается найти версию браузера, установленную на машине. Затем, используя версию браузера, он пытается найти правильную версию драйвера с помощью различных методов. После обнаружения версии драйвера WebDriverManager загружает драйвер в локальный кэш(расположенный в ~/.cache/selenium) и экспортирует путь драйвера с помощью системных свойств Java. Эти драйверы повторно используются в последующих вызовах.
Аналогичным образом мы можем настроить драйверы для Firefox, Edge, Opera, Chromium и Internet Explorer, используя одно из следующих утверждений:
WebDriverManager.firefoxdriver().setup();WebDriverManager.edgedriver().setup();WebDriverManager.operadriver().setup();WebDriverManager.chromiumdriver().setup()WebDriverManager.iedriver().setup();
2.3 Пример
Ниже приведен тест JUnit 5 для запуска браузера, открытия домашней страницы Google и подтверждения ее заголовка.
import io.github.bonigarcia.wdm.WebDriverManager;import org.junit.jupiter.api.Assertions;import org.junit.jupiter.api.BeforeAll;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.chrome.ChromeOptions;public class AppTest {static WebDriver browser;@BeforeAllstatic void setup() {WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();options.setHeadless(false);options.addArguments("start-maximized"); // open Browser in maximized modeoptions.addArguments("disable-infobars"); // disabling infobarsoptions.addArguments("--disable-extensions"); // disabling extensionsoptions.addArguments("--disable-gpu"); // applicable to Windows os onlyoptions.addArguments("--disable-dev-shm-usage"); // overcome limited resource problemsoptions.addArguments("--no-sandbox"); // Bypass OS security modeloptions.addArguments("--disable-in-process-stack-traces");options.addArguments("--disable-logging");options.addArguments("--log-level=3");options.addArguments("--remote-allow-origins=*");browser = new ChromeDriver(options);}@Test@DisplayName("The google.com web site should have the correct title")void testProjectWebSiteShouldHaveCorrectTitle() {browser.get("https://google.com/");Assertions.assertEquals("Google", browser.getTitle());}}
При запуске теста загружается правильный драйвер Chrome, запускается версия Chrome, открывается домашняя страница Google и успешно проверяется заголовок веб-страницы.