【问题标题】:Reusing the same webdriver for different tests, but not instantiating it every time为不同的测试重用相同的 webdriver,但不是每次都实例化它
【发布时间】:2020-01-08 16:07:51
【问题描述】:

我正在制作一个使用 Selenium Webdriver 在 Web 应用程序上运行测试的项目。我需要能够在我的 CI 管道中测试不同的浏览器,所以当我执行一个测试套件时,我会指定应该使用什么浏览器。

 mvn test -Dwebdriver.gecko.driver="/webdrivers/geckodriver" -Dwebdriver.chrome.driver="/webdrivers/chromedriver" -DbrowserUnderTest="headless-firefox"

测试使用WebDriver 对象来操作浏览器,因此,为了使代码易于维护,我使每个测试类都继承自一个名为BasicTest 的类,其中WebDriver driver 对象被实例化.

另外,为了让测试执行更快,我做了它让测试重复使用浏览器的相同实例,所以,当测试结束时,下一个测试使用已经打开的浏览器。这就是为什么在BasicTest的代码中,我的WebDriver对象被定义为public static

    public static FirefoxOptions ff_opt_headless = new FirefoxOptions().setHeadless(true);
    public static ChromeOptions chrome_opt_headless = new ChromeOptions().addArguments("--headless");

    public static WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
    public static WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);

    public static WebDriver driver; 

    public BasicTest() throws Exception {
        String browserUnderTest = System.getProperty("browserUnderTest");
        switch (browserUnderTest) {
        case "headless-firefox":
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            driver = chrome_driver_headless;
            break;
        }
    }

我在这里遇到的问题是firefox_driver_headlesschrome_driver_headless 每次都被实例化,这意味着即使我为测试套件指定了Firefox,Chrome 也将无用打开。所以我需要找到一种方法,在创建BasicTest 时不实例化firefox_driver_headlesschrome_driver_headless 对象。

如果我保持这种方式,当我为浏览器添加驱动程序时,这些驱动程序可能并非在我的测试可以运行的每个平台上都可用,我会遇到问题。 (例如:如果我的测试在 Linux 上运行,并且我尝试实例化一个 internet_explorer_webdriver 对象,它将失败。)

我已经尝试在 switch case 中实例化它们,如下所示:

public static WebDriver driver;
switch (browserUnderTest) {
        case "headless-firefox":
            WebDriver firefox_driver_headless = new FirefoxDriver(ff_opt_headless);
            driver = firefox_driver_headless;
            break;
        case "headless-chrome":
            WebDriver chrome_driver_headless = new ChromeDriver(chrome_opt_headless);
            driver = chrome_driver_headless;
            break;
        }

虽然这不会在我启动测试时打开 Chrome,但它也会为每个测试重新打开 Firefox,这不是我想要的:我希望每次测试都重复使用相同的浏览器实例.

那么这里的解决方案是什么?我是否应该放弃尝试,以便为每个测试重用相同的浏览器实例?我打算让TestSuite 遵循逻辑顺序,就像正常人导航一样。 (即,要测试“更改​​头像”功能,将执行 Login 测试,然后执行 AccessProfile 测试,然后再执行 ChangeAvatar...

【问题讨论】:

    标签: java selenium selenium-webdriver junit


    【解决方案1】:

    将你的 switch 逻辑移动到 static initialization block 中,以便在加载 BasicTest 类时只执行一次

    static {
        ...
    }
    

    【讨论】:

    • 简洁高效的结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2011-09-27
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多