Java 从Maven命令行使用TestNG运行多个suiteXmlFile时,为什么Webdriver浏览器窗口不关闭?
我有40个Webdriver测试,分为两组——一组必须串行运行(其中每个测试都有元数据组标记“crm_import”),另一组可以并行运行。以下XML文件引用了这两个组:Java 从Maven命令行使用TestNG运行多个suiteXmlFile时,为什么Webdriver浏览器窗口不关闭?,java,maven,selenium,jenkins,testng,Java,Maven,Selenium,Jenkins,Testng,我有40个Webdriver测试,分为两组——一组必须串行运行(其中每个测试都有元数据组标记“crm_import”),另一组可以并行运行。以下XML文件引用了这两个组: TestNG.xml <suite name = "Suite" thread-count="2" parallel="methods"> <test name = "TestSet"> <groups> <run> <ex
TestNG.xml
<suite name = "Suite" thread-count="2" parallel="methods">
<test name = "TestSet">
<groups>
<run>
<exclude name = "crm_import"/>
</run>
</groups>
<classes>
<class name = "com.dcp.test.suite.TestSuite"/>
</classes>
</test>
</suite>
TestNG_includeOnly.xml
<suite name = "Suite2" verbose="1" >
<test name = "TestSet">
<groups>
<run>
<include name = "crm_import"/>
</run>
</groups>
<classes>
<class name = "com.dcp.test.suite.TestSuite"/>
</classes>
</test>
</suite>
出现了两个问题
mvn clean test site
…然后一切都很好--没有打开的窗口,并行测试并行运行
如果您想知道如何打开和关闭浏览器,下面是TestSuite.java文件扩展的基类的框架
public class TestSuiteBase implements IInvokedMethodListener {
...
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
System.setProperty("webdriver.firefox.marionette", "/opt/geckodriver");
ProfilesIni profile = new ProfilesIni();
String ffProfileName = properties.getProperty("ffProfileName");
FirefoxProfile myprofile = profile.getProfile(ffProfileName);
System.out.println("--> creating WebDriver instance..." + "Thread id = " + Thread.currentThread().getId());
WebDriver driver = new FirefoxDriver(myprofile);
LocalDriverManager.setWebDriver(driver);
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
WebDriver driver = LocalDriverManager.getDriver();
if (driver != null) {
System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
driver.quit();
}
}
}
如果你想知道我是从哪里得到这些建筑的,我是从这里借来的 您共享的博客是我的博客:) 如果您希望通过多个TestNG套件,那么您也许应该看看我的博客文章。这基本上可以解决你的问题 对于您的问题#2,即您打开了多个浏览器窗口,您可能可以在调用后的
方法中执行以下操作:
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
WebDriver driver = LocalDriverManager.getDriver();
if (driver != null) {
System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
driver.quit();
}
LocalDriverManager.setWebDriver(null);
}
}
这里我们显式地取消当前线程的webdriver上下文
我不太确定它是否真的能解决问题,但你可以试试这个,看看是否有帮助。使用@AfterGroup
,@afterest
等东西怎么样?而不是监听器?我以前使用过这样的构造,但为了实现一个套件的并行处理,我切换到了监听器方案。当我运行测试时,我在afterInvocation()方法中看到了debug语句,所以它不像没有被调用,所以我不知道改变会带来什么好处。克里希南——非常感谢你给我额外的博文链接!这正是我修改POM文件所需要的,以便在命令行上接受一个可选的XML文件来指定要使用的XML文件。这基本上解决了这两个问题,但我也添加了LocalDriverManager的null化。实际上,我现在能够做的是在命令行mvn clean test-Dfile={一个XML文件或另一个}站点上指定。这很好,因为我可以将该行的两个版本放在单独的Jenkins作业中。然而,当我列出这两个XML文件(当然是逗号分隔的)时,它们都会运行,但这就是我最后使用剩余的浏览器会话的时候。更奇怪的是,我总共只运行了3个测试(2个并行测试,1个来自普通/串行测试集),但打开了4个浏览器。其中一个确实成功地关闭了。@JoeHennessey-在没有实际看到代码的情况下,很难确定问题所在。那么,您如何创建一个可复制的小项目,执行该项目以复制问题,并将其发布到github上,并与我们共享链接。
public class TestSuiteBase implements IInvokedMethodListener {
...
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
System.setProperty("webdriver.firefox.marionette", "/opt/geckodriver");
ProfilesIni profile = new ProfilesIni();
String ffProfileName = properties.getProperty("ffProfileName");
FirefoxProfile myprofile = profile.getProfile(ffProfileName);
System.out.println("--> creating WebDriver instance..." + "Thread id = " + Thread.currentThread().getId());
WebDriver driver = new FirefoxDriver(myprofile);
LocalDriverManager.setWebDriver(driver);
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
WebDriver driver = LocalDriverManager.getDriver();
if (driver != null) {
System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
driver.quit();
}
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
WebDriver driver = LocalDriverManager.getDriver();
if (driver != null) {
System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
driver.quit();
}
LocalDriverManager.setWebDriver(null);
}
}