【发布时间】: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_headless 和chrome_driver_headless 每次都被实例化,这意味着即使我为测试套件指定了Firefox,Chrome 也将无用打开。所以我需要找到一种方法,在创建BasicTest 时不实例化firefox_driver_headless 和chrome_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