我正在制作一个使用 Selenium Webdriver 在 Web 应用程序上运行测试的项目。我需要能够在 CI 管道中测试不同的浏览器,因此当我执行测试套件时,我指定应使用什么浏览器。
mvn test -Dwebdriver.gecko.driver="/webdrivers/geckodriver" -Dwebdriver.chrome.driver="/webdrivers/chromedriver" -DbrowserUnderTest="headless-firefox"
测试使用 WebDriver
对象来操作浏览器,因此,为了使代码易于维护,我让每个测试类都继承自一个名为 BasicTest
,其中 WebDriver 驱动程序
对象被实例化。
此外,为了使测试执行速度更快,我让测试重用浏览器的同一实例,因此,当测试结束时,下一个测试将使用已经打开的浏览器。这就是为什么在 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
测试,然后更改头像
...)
最佳答案
将开关逻辑移至static initialization block ,这样它只在加载 BasicTest
类时执行一次
static {
...
}
关于java - 为不同的测试重用相同的网络驱动程序,但不是每次都实例化它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649725/