如何在运行时

时间:2018-03-19 17:48:58

标签: java eclipse selenium

我正在尝试学习硒用于自动化测试。 (这是我第一次使用Eclipse IDE)我关注的每个例子都会看到下面的一些内容

public static void main(String[] args) {        
    WebDriver driver;
    System.setProperty("webdriver.chrome.driver", "C:\mylibs\chromedriver.exe");
    driver=new ChromeDriver();
    driver.navigate().to("myurl");      
}

问题

1>如果我在团队环境中工作,如果其他团队成员没有相同的ChromeDriver路径,则上述代码将无效。我如何注入路径?

2 - ;代码需要定位多个浏览器,如Chrome,IE,Edge等。这意味着我无法启动特定的WebDriver(如上例中的ChromeDriver)如何在运行时注入特定的WebDriver?

3>为什么不使用RemoteWebDriver作为类型而不是WebDriver?看起来每个特定的WebDriver都派生自RemoteWebDriver,而RemoteWebDriver有更多方法可供使用?

现在对于前两个问题,一个解决方案是使用args,如下面的

public static void main(String[] args) {        
        RemoteWebDriver driver;
        System.setProperty("webdriver.chrome.driver", args[0]+chromedriver.exe");

        if(args[1] == "chrome")
        {
            driver=new ChromeDriver();
        }

        if(args[1] == "edge")
        {
            driver= new EdgeDriver();
        }

        if(args[1] == "ie")
        {
            driver= new IEDriver();
        }       

        driver.navigate().to("myurl");      
    }

有没有更好的方法呢?

更新1

根据我收到的答案,我想我不清楚我的问题2 当测试人员完成编写所有测试时,我假设在回归测试期间我们不从Eclipse运行这些测试。我猜测一些CI工具,例如jenkins,必须自动为我们需要测试的所有支持的浏览器执行这些测试。这意味着Jenkins需要知道Web驱动程序在构建服务器上的位置。该路径可能与他/她在开发过程中使用的本地计算机上的本地路径不同。 Jenkins还需要为每个浏览器特定的测试注入不同的Web驱动程序。因此,我们不能在代码中硬编码特定的Web驱动程序,它需要在测试开始时提供。 (像依赖注入一样)

2 个答案:

答案 0 :(得分:0)

(问:1)

对于初学者来说,在java中反斜杠字符' \'是一个转义字符,因此要指定一个窗口路径,每个反斜杠都包含2以将1插入字符串。

所以你的路径应该是这样的:" C:\\ Windows \\ Drivers \\ etc ..."

当你说" Inject"路径,你"注入"它与System.setProperty(a,b)

您需要先知道路径值,然后注意"注入"任何进入系统属性的东西。

一个涉及通信的解决方案 是告诉他们在驱动器的根目录下安装驱动程序文件,因此可以通过硬编码访问它路径。

您也可以简单地在jar文件本身中包含所需的文件。

另一种编码解决方案 ,用于搜索可能存储文件的已知或公共目录。这可以通过以下代码中的递归来完成

/** @param searchDirectory - this can be whole system searched,
  * by starting at "C:\\".
  * Otherwise, give it more defined paths of common directories */
public String getPath(String searchDirectory, String fileName) {
    File folder = new File(searchDirectory);
    File[] files = folder.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            return getPath(file.getPath(), fileName);
        } else if (file.getName().equals(fileName)) {
            return file.getPath();
        }
    }
    return null;
}

(问:2)

如果你想实际动态地将代码注入到一个正在运行的jar文件中,这在这里根本不需要,那么你将自己开始一项全新的研究考察,让自己成为一名小黑客。

然而,

在主方法中指定参数时,(查看您如何选择传递参数的示例),您需要指定特定属性在参数中指定了Web驱动程序。

这可以很容易地完成:

public static void main(String[] args) {
    System.setProperty("webdriver." + args[1] + ".driver", args[0] + args[1] + "driver.exe");
    switch (args[1]) {
    case "chrome":
        driver = new ChromeDriver();
        break;
    case "edge":
        driver = new EdgeDriver();
        break;
    case "ie":
        driver = new IEDriver();
        break;
    }        
}

(问:3)

您是否要使用" RemoteWebDriver"由您决定,查看API文档中的selenium并确保它与您尝试执行的内容兼容。

答案 1 :(得分:0)

对于Ques 1,您可以将驱动程序保留在项目文件夹中。这样,所有团队成员都将拥有相同的驱动程序文件夹位置。

对于Ques 2,可以使用属性文件管理多个环境和浏览器。可以使用CI工具

设置回归期间远程计算机上的执行