如何使用selenium(Java)同时支持较旧版本和较新版本的Firefox

时间:2016-06-14 11:34:41

标签: java selenium firefox selenium-webdriver remotewebdriver

我在多个 PC 中有多个Firefox版本,其中一些最新47,有些版本旧版本< /强>

我关注this 并设置RemoteWebDriverMarionette,下一代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 可以正常运行,但是当我在其他 PC 上安装 Firefox旧版 ,它给exception如下: -

  

引起:org.openqa.selenium.remote.UnreachableBrowserException:   不能sta

     

rt一个新的会议。可能的原因是遥控器的无效地址   服务器或br

     

owser启动失败。

     

构建信息:版本:&#39; 2.53.0&#39;,修订版:&#39; 35ae25b&#39;,时间:&#39; 2016-03-15   17:00:58&#39;

     

系统信息:主机:&#39; com-PC&#39;,ip:&#39; 192.168.3.3&#39;,os.name:&#39; Windows 7&#39;,   os.arch:&#39;

     

x86&#39;,os.version:&#39; 6.1&#39;,java.version:&#39; 1.8.0_92&#39;

     

驱动程序信息:driver.version:MarionetteDriver

     

引起:org.openqa.selenium.WebDriverException:   org.apache.http.conn.HttpHost

     

ConnectException:连接到localhost:3125 [localhost / 127.0.0.1]   失败:Connec

     

拒绝:连接

     

构建信息:版本:&#39; 2.53.0&#39;,修订版:&#39; 35ae25b&#39;,时间:&#39; 2016-03-15   17:00:58&#39;

     

系统信息:主机:&#39; com-PC&#39;,ip:&#39; 192.168.3.3&#39;,os.name:&#39; Windows 7&#39;,   os.arch:&#39;

     

x86&#39;,os.version:&#39; 6.1&#39;,java.version:&#39; 1.8.0_92&#39;

     

驱动程序信息:driver.version:MarionetteDriver

     

引起:java.net.ConnectException:连接被拒绝:连接

     

警告 - 例外:拒绝连接:连接

当我删除行capabilities.setCapability("marionette", true);表示删除MarionetteDriver支持时,它与 Firefox旧版本配合良好,但使用提升exception Firefox版本47 即。 UnreachableBrowserExcetion

所以我的问题是: -

有没有办法知道Firefox version或任何其他解决方案,我可以同时使用 Firefox < /强> ??。

我想要一个通用解决方案,我的代码可以智能地知道它何时从MarionetteDriver开始,以及何时FireFoxDriver基于FireFox Version }。

提前致谢...:)

2 个答案:

答案 0 :(得分: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,它将与marionette一起运行,如果设置为false,则不会。

如果您真的想要解析可用的firefox版本的Windows注册表,这里有一个部分示例:

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

答案 1 :(得分:-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");

通过这种通用方式,我们可以使用相同的代码在多个 PC 中自动执行测试。无论在 Pcs 上安装了哪种版本的 Firefox

<强>被修改..

对于 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二进制文件,selenium就无法运行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
}

...:)