Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Запуск ChromeDriver в зависимости от ОС

maven
webdriver
testng
java
chrome
Теги: #<Tag:0x00007f7b61c25a40> #<Tag:0x00007f7b61c25450> #<Tag:0x00007f7b61c25018> #<Tag:0x00007f7b61c24b40> #<Tag:0x00007f7b61c244b0>

(Myroslav Oleinykov) #1

Всем привет,

Интересует кто как решал проблему с запуском ChromeDriver в зависимости от ОС. В моем случае это Windows и Mac. Мое окружение: Maven + Java + TestNG. На данный момент вижу 2 решения:

  1. Создать отдельные профайлы в POM. Таким образом, можно создать 2 следующих профайла:
    <profiles>
        <profile>
            <id>chrome-win</id>
            <properties>
                <browser.name>chrome</browser.name>
                <webdriver.chrome>path/to/win/chromedriver.exe</webdriver.chrome>
            </properties>
        </profile>

        <profile>
            <id>chrome-mac</id>
            <properties>
                <browser.name>chrome</browser.name>
                <webdriver.chrome>/path/to/mac/chromedriver</webdriver.chrome>
            </properties>
        </profile>
    </profiles>
  1. Добавить в, например, DriverFactory класс проверку на текущую ОС:
public static WebDriver initDriver(String browserName) {
        WebDriver driver = null;
        if (browserName.equals(CHROME)) {
            if ((System.getProperty("os.name")).contains("mac")) {
                System.setProperty("webdriver.chrome.driver", "/path/to/mac/chromedriver";
                } else {
                System.setProperty("webdriver.chrome.driver", "/path/to/win/chromedriver";
                }
        return driver;
}

Возможно есть более интересные варианты?

Или решение зависит от того, как планируется запускать тесты? Ведь в том же Jenkins переменные можно переопределять прямо в настройках job’ов. Тогда возможно и не стоит прописывать логику в коде.

Спасибо.


(sidelnikovmike) #2

Можно хранить файл в ресурсах и оттуда его читать


(Александр Таранков) #3

В коде путь точно не надо хардкодить.
Я использую отдельный конфиг-файл для хранения настроек: путей до драйверов, до скриншотов, настройки таймаута и т.д.

Я использую .ini-файл (properties), но можно и другие форматы, как удобнее (xml, yaml, json, etc.)


(Jane Tymoschuk) #4

Я делала раньше профилями, но когда это дело разрослось, поняла, что компактностью такой вариант не страдает. Теперь использую только переменную в помнике с дефолтным значением для окружения, на котором запускается чаще всего. А если требуется изменить, то кастомизирую уже в параметрах билда


(sidelnikovmike) #5

Глянте тут :

Я там как раз описывал, как искать файл в ресурсах.


(Myroslav Oleinykov) #6

На самом деле цель вопроса была поинтересоваться кто и как на разных проектах решает подобные проблемы. Я сам сейчас храню пути и другие настройки в *.properties файле. И, пожалуй, пока на этом варианте остановлюсь, добавив логику передачи пути на ChromeDriver в зависимости от платформы на которой проходят тесты.

Всем спасибо за ответы.


(Funker) #7

У меня тоже зависает но у меня

  • win 7 x32
  • ChromeDriver v2.11 -> новый Chrome v38

(heartwilltell) #8

А почему нельзя просто установить хромдрайвер на каждую ось и не прописать в PATH путь к исполняемому файлу?
У меня есть 4 машины на которых бегают тесты и это Mac Win7 Ubuntu Win8 везде просто установлен хромдрайвер и прописан в PATH, и везде запускается ок все.
Чем обусловлено написание штуки для автоматического разворачивания хромдрайвера на любой системе?


(sidelnikovmike) #9

А если вы хотите тесты запустить не на одной из своих машин? на условно любой?


(Funker) #10

Не пробовал через grid запускать,
я запускаю через Jenkins и локально запускаю на этой же машине тесты,

на старте chromeDriver зависает и все!
Пришлось сделать downgrade to chromeDriver 2.10 и Chrome Browser v37


(Sergey Korol) #11

А какой смысл поднимать дженкинс для локального прогона тестов на той же тачке?


(Funker) #12

на какой той же?
есть Jenkins на Win 7 и локально стоит 3 браузера IE, FF and Chrome на них все и ранется


(Sergey Korol) #13


(heartwilltell) #14

Я на своей рабочей тачке и не запускаю, у меня сервер на котором дженкинс, и еще 4 виртуалки где бегают тесты. Развернуть новую тачку с необходимым мне конфигом это пару минут c Chef.

А зачем запускать на условно любой? Не сочтите за придирку, просто приведите пример когда вдруг вам нужно запустить ваши тесты на абсолютно рандомной машине?


(Myroslav Oleinykov) #15

Например когда нужна абсолютная транспортабельность проекта. То есть склонировав репозиторий, грубо говоря, все что нужно сделать для прогона тестов — это нажать на старт. Кнечно, проекты с серьезным окружением и инфраструктурой вот так из коробки не развернешь, потому это скорее чаще встречается не в командной работе (на проекте), а в личных случаях.


(sidelnikovmike) #16

вот @meeroslaph об этом и говорит.
Хороший проект с автотестами(это мое мнение) - это проект, которому нужен минимум для настройки. он сам по себе самодостаточнен. Если нужны какие-то настройки - это делается максимум каким-то скриптом.
То есть человек, впервые получивший проект может спокойно его настроить на любой своей машине.
А если нужно прописать пару переменных окружения или еще что-то - то это уже получается только усложнение


(Silveren Ua) #17

String chromeBinary = System.getProperty(" ");

    if (chromeBinary == null || chromeBinary.equals("")) {

        String os = System.getProperty("os.name").toLowerCase().substring(0, 3);

        chromeBinary = getCfgValue("webdriver_place") + (os.equals("win") ? ".exe" : os.equals("mac") ? "_mac" : "");

        System.setProperty("webdriver.chrome.driver", chromeBinary);
    }

(Lev Yarushin) #18

Вот прекрасная библиотека для такого ) Подключаем и забываем.


(Алексей Берлин) #19

Рекоммендую, если тесты запускаются локально, использовать webdriver manager -> который автоматом хендлит такие проблемы и качает актуальную версию драйвера в зависимости от ОС.