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

Всем привет,

Интересует кто как решал проблему с запуском 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’ов. Тогда возможно и не стоит прописывать логику в коде.

Спасибо.

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

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

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

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

Глянте тут :

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

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

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

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

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

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

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

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

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

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

1 лайк

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

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

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

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

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

2 лайка

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);
    }

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

1 лайк

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