2016-06-14 6 views
0

У меня есть несколько версий Firefox в нескольких ПК где некоторые есть новейшего, который 47 и некоторые имеют старую версию.Как поддерживать как старую и новую версию Firefox одновременно с использованием Селена (Java)

У меня после 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: Могли не STA

к.т. новой сессии. Возможными причинами являются неверный адрес удаленного сервера или br

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

Сложение информация: версия: '2.53.0', редакция: '35ae25b', время: '2016-03-15 17:00:58 '

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

x86', os.version: '6,1', java.version: '1.8.0_92'

Driver информация: driver.version: MarionetteDriver

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

ConnectException: Подключение к локальной машине: 3125 [локальный/127.0.0.1] не удалось: Конек

Тион отказался: подключение

Строить информация: версия: ' 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: driver.version: MarionetteDriver

Вызванный: java.net.ConnectException: Соединение отклонено: подключение

WARN - Исключение: Соединение отклонено: подключение

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

Так что мой вопрос: -

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

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

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

ответ

-1

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

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 установлена ​​на тех шт..

Edited ..

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

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

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

Если firefox не установлен в папку по умолчанию, то мы может обеспечить двоичное местоположение Firefox либо по пути, либо по объекту System, потому что селен не работает без обеспечения Firefox bina ry 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 
} 

... :)

+1

Это кажется ненужным длинным и сложным по сравнению с ответом, который Mobrockers предоставил вам раньше. Ответ, который вы назвали слишком долго. – RemcoW

+1

Это также не работает ни на одной другой ОС, ни на компьютерах с установленным firefox в другом месте. – RemcoW

+0

@RemcoW здесь я не сравниваю, какой ответ лучше..другой ОС просто нужно изменить командную строку, которую я предоставил в своем отредактированном ответе ... Вы пытались запустить ff из другого места, используя selenium ??. ... 90% 'Pcs' имеет местоположение по умолчанию ... и FYI, если местоположение не является по умолчанию selenium, запрашивает двоичное расположение firefox ... поэтому этому случаю не нужно выполнять мою первую команду, которая дает местоположение ff binaty. –

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 установлен верно, он будет работать с марионетками, если установлено неверно, это не будет.

Если вы действительно хотите, чтобы разобрать окна реестра для доступной версии FireFox, вот неполный пример для вас:

How to check if a program is installed on Windows system

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

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 
     } 
    } 
} 
+0

я не мог сделать это на основе флага .. Я хочу, чтобы более общее решение, где мой код разумно мог бы знать, когда он будет работать с «MarionetteDriver» и когда с «FireFoxDriver». –

+0

Единственный способ, которым я вижу это в общем виде, - попробовать и запросить веб-браузер и поймать исключение и исключение попросите другого. Это очень плохой дизайн. Вы должны контролировать, где выполняются тесты, это ваша среда, поэтому вы должны решить, как будут проходить тесты. – Mobrockers

+0

Выполняете ли вы тесты в распределенной сетке селена или запускаете их вручную? – Mobrockers