Как поддерживать как старую, так и новую версию Firefox одновременно с использованием селена (Java)

У меня есть несколько версий Firefox на нескольких ПК, на некоторых из которых установлена ​​самая новая, то есть 47, а на некоторых - более старая версия.

Я следую this и настроил RemoteWebDriver с Marionette, следующее поколение FirefoxDriver для поддержки Firefox версии 47 для автоматизации, как показано ниже: -

URL server = new URL("http://localhost:4444/wd/hub")
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
WebDriver webDriver = new RemoteWebDriver(server, capabilities);
webDriver.get("https://www.google.co.in");

Он отлично работает с Firefox версии 47, но когда я использую то же самое на других компьютерах, где установлена ​​более старая версия Firefox, он дает exception, как показано ниже: -

Вызвано: org.openqa.selenium.remote.UnreachableBrowserException: не удалось остановить

rt новый сеанс. Возможные причины: неверный адрес удаленного сервера или br

Ошибка запуска owser.

Информация о сборке: версия: '2.53.0', ревизия: '35ae25b', время: '2016-03-15 17:00:58'

Информация о системе: host: 'com-PC', ip: '192.168.3.3', os.name: 'Windows 7', os.arch: '

x86 ', os.version:' 6.1 ', java.version:' 1.8.0_92 '

Информация о драйвере: driver.version: MarionetteDriver

Вызвано: org.openqa.selenium.WebDriverException: org.apache.http.conn.HttpHost

ConnectException: подключение к localhost: 3125 [localhost / 127.0.0.1] не удалось: Connec

ция отказалась: подключиться

Информация о сборке: версия: '2.53.0', ревизия: '35ae25b', время: '2016-03-15 17:00:58'

Информация о системе: host: 'com-PC', ip: '192.168.3.3', os.name: 'Windows 7', os.arch: '

x86 ', os.version:' 6.1 ', java.version:' 1.8.0_92 '

Информация о драйвере: driver.version: MarionetteDriver

Вызвано: java.net.ConnectException: в соединении отказано: соединение

ПРЕДУПРЕЖДЕНИЕ - Исключение: в соединении отказано: соединение

Когда я удаляю строку capabilities.setCapability("marionette", true);, значит удаляет поддержку MarionetteDriver, она хорошо работает с более старой версией Firefox, но повышает exception с Firefox версии 47, т.е. UnreachableBrowserExcetion.

Итак, мой вопрос: -

Есть ли способ узнать Firefox version или какое-либо другое решение, с помощью которого я мог бы работать одновременно с старой и новой версией Firefox ??.

Мне нужно общее решение, в котором мой код мог бы разумно знать, когда он начнется с MarionetteDriver, а когда с FireFoxDriver на основе FireFox Version.

Заранее спасибо...:)


person Saurabh Gaur    schedule 14.06.2016    source источник


Ответы (2)


Установите логический флаг в начале вашего теста в зависимости от того, хотите ли вы запускать его на 43 или 47. Проверьте флаг в коде, в котором вы создаете драйвер, например, так:

boolean useMarionette = true //false

URL server = new URL("http://localhost:4444/wd/hub")
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", useMarionette);
WebDriver webDriver = new RemoteWebDriver(server, capabilities);
webDriver.get("https://www.google.co.in");

Теперь, если у вас для useMarionette установлено значение true, он будет работать с марионеткой, если установлен в false, это не будет.

Если вы действительно хотите проанализировать реестр Windows на наличие доступной версии firefox, вот вам частичный пример:

Как проверить, установлена ​​ли программа в Windows система

Используйте следующим образом:

public class Test {

    public static void main(String... args) throws Exception {

        RegistryKey firefoxKey;
        RegistryKey.initialize(Test.class.getResource("jRegistryKey.dll").getFile());
        RegistryKey key = new RegistryKey(RootKey.HKCU, "SOFTWARE\\Mozilla\\Mozilla Firefox");
        for (Iterator<RegistryKey> subkeys = key.subkeys(); subkeys.hasNext();) {
            firefoxKey = subkeys.next();

            if(firefoxKey.getName().contains("47") {
                 //marionette
            }
            //start browser with or without     marionette
        }
    } 
}
person Mobrockers    schedule 14.06.2016
comment
Я не мог сделать это на основе флага ... Мне нужно более общее решение, в котором мой код разумно мог бы знать, когда он будет работать с MarionetteDriver, а когда с FireFoxDriver .. - person Saurabh Gaur; 14.06.2016
comment
Единственный способ сделать это обычным способом - это попытаться запросить веб-браузер и перехватить исключение, а при запросе исключения - другое. Крайне плохой дизайн. Вы должны контролировать, где будут выполняться тесты, в конце концов, это ваша среда, поэтому вы должны решить, как будут выполняться тесты. - person Mobrockers; 14.06.2016
comment
Вы запускаете тесты в распределенной сетке селена или запускаете их вручную? - person Mobrockers; 14.06.2016
comment
Я хочу запустить один и тот же код на нескольких машинах, где я не знаю, какая версия firefox работает на всех машинах - person Saurabh Gaur; 14.06.2016
comment
Тогда то, о чем вы спрашиваете, невозможно. Вы можете только попросить сетку предоставить вам браузер, который вы ищете, вы не можете спросить, какие браузеры у него есть. - person Mobrockers; 14.06.2016
comment
Почему это невозможно ??? .. код будет запущен на локальном компьютере, но я не смог изменить код на основе этого компьютера ... но я могу знать, какая версия firefox установлена ​​на этом локальном компьютере, потому что я Я использую java .. - person Saurabh Gaur; 14.06.2016
comment
Я добавил частичное решение, чтобы узнать номер версии установленного firefox ... Но я бы действительно не рекомендовал это делать. - person Mobrockers; 14.06.2016

Теперь я добился этого следующим подходом: -

public static String executeCommand(List<String> commands)
            throws IOException {
        ProcessBuilder builder = new ProcessBuilder(commands);
        builder.redirectErrorStream(true);
        Process p = builder.start();
        BufferedReader r = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        return r.readLine();
    }

//this command gives the current installed path of Firefox in c drive 
String[] getInstalledFirefoxDirectoryCmd = { "cmd.exe", "/c", "dir /s/b \"C:/firefox.exe\""};

String installedFirefoxLocation = executeCommand(Arrays.asList(getInstalledFirefoxDirectoryCmd));

//this command will give version of the installed Firefox
String[] getFirefoxVersionCmd = { "cmd.exe", "/c", "\"" + installedFirefoxLocation + "\" -v | more" };

String version = executeCommand(Arrays.asList(getFirefoxVersionCmd));

int version_int = Integer.parseInt(version.replace("Mozilla Firefox ", "").split("\\.")[0]);

URL server = new URL("http://localhost:4444/wd/hub")
DesiredCapabilities capabilities = DesiredCapabilities.firefox();

//use marionette if ff version equal or greater than 47
if(version_int >= 47) {
     capabilities.setCapability("marionette", true);
}

WebDriver webDriver = new RemoteWebDriver(server, capabilities);
webDriver.get("https://www.google.co.in");

Таким универсальным способом мы можем автоматизировать наш тест на нескольких ПК с одним и тем же кодом. Независимо от того, какая версия Firefox установлена ​​на этих ПК.

Отредактировано…

Для компьютеров Mac мы можем изменить command, чтобы получить версию установленного Firefox, как показано ниже: -

String installedFirefoxLocation = "/Applications/Firefox.app/Contents/MacOS/firefox"
// it's default location

String[] getFirefoxVersionCmd = { installedFirefoxLocation + " -v | more" };

Если firefox не установлен в расположение по умолчанию, мы можем указать расположение двоичного файла Firefox либо по пути, либо по свойству System, потому что селен не работает без предоставления Firefox двоичного файла location, если он установлен в другом месте.

Для проверки OS мы можем использовать следующее: -

String OS = System.getProperty("os.name").toLowerCase();

if(OS.indexOf("win") >= 0) {
//Means it's windows
}

if(OS.indexOf("mac") >= 0) {
//Means it's mac
}

...:)

person Saurabh Gaur    schedule 15.06.2016
comment
Это кажется ненужным длинным и сложным по сравнению с ответом, который вам предоставили Mobrockers ранее. Ответ, который вы назвали слишком длинным. - person RemcoW; 15.06.2016
comment
Это также не работает в других ОС и не работает на машинах, на которых установлен firefox в другом месте. - person RemcoW; 15.06.2016
comment
@RemcoW здесь я не сравниваю, какой ответ лучше ... для разных ОС просто нужно изменить командную строку, которую я предоставил в моем отредактированном ответе ... Вы когда-нибудь пробовали запускать ff из другого места, используя селен ?? .. ..90% Pcs имеет местоположение по умолчанию ... и, к вашему сведению, если местоположение не является значением по умолчанию, селен запрашивает двоичное местоположение firefox ... поэтому в этом случае не нужно выполнять мою первую команду, которая дает местоположение ff binaty ... - person Saurabh Gaur; 16.06.2016
comment
Я мог бы быть студентом, но я знаю, о чем говорю. Все, что я делаю, - это оставляю отзыв на этот ответ, чтобы другие пользователи знали, что не так с этим методом, поскольку вы не упомянули об этом в своем ответе. Таким образом, когда они столкнутся с одной и той же проблемой, они будут знать плюсы и минусы ответа и смогут принять соответствующее решение о реализации. Не нужно делать грубые комментарии и пытаться делать умные замечания. Все, что я делаю, это повышаю качество вашего ответа, чтобы помочь другим в будущем. - person RemcoW; 16.06.2016