/**
* Before method is executed before any test case
*
* @throws Exception
*/
@BeforeMethod(alwaysRun = true)
public void openBrowser() throws Exception {
driver = browserService.openBrowser(globalProperties);
driver.get(getAUTurl("salesforce.app.url"));
}
/**
* After method is executed before any test case
*
* @throws Exception
*/
@AfterMethod(alwaysRun = true)
public void closeBrowser() throws Exception {
driver.quit();
}
//Above shown is my baseTestcase which has 2 methods beforemethod and after
//method.
public class SanityTest extends BaseTestcase {
public static String downloadedFilePath;
@Test public void test1() { }
@Test public void test2() { }
然后我创建以下测试套件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Selenium TestNG Suite" parallel="methods" thread-count="2" >
<test name="Sanity test">
<classes>
<class name="com.prahs.tests.PAWS.SanityTest "/>
</classes>
</test>
</suite>
但是一个浏览器在执行后没有关闭?
答案 0 :(得分:0)
只是一个有根据的猜测:您正在使用方法级并行执行方法,而您调用quit()的驱动程序并不是WebDriver的唯一实例。
尝试使用threadCount 1或无并行执行来检查这一点,并确保在使用并行执行时将驱动程序实例与当前线程联系起来。
答案 1 :(得分:0)
我们在测试工作中遇到了类似情况。我们还希望利用TestNG并行化和Selenium Web驱动程序。不幸的是,在启用任何TestNG并行模式时,管理每个测试类中的Web驱动程序生命周期或尝试使用保存Web驱动程序的静态类都不是有效的。使用活动的TestNG线程和实例化的Web驱动程序匹配测试的类和方法在它工作时很难实现。我们花了更多时间来计算网络驱动程序生命周期,而不是参加真正的Web应用程序测试。
在您的情况下,因为您在TestNG执行时定义了<suite parallel="methods">
,所以在一个线程上实例化类,并且正在处理所有相应的@注释。但是,使用&#39;方法&#39;在并行模式下,TestNG在不同的线程上实例化每个测试类方法。这些线程不知道并且无法使用任何可能已启动Web驱动程序的静态或其他方式的已处理注释。另外,我也相信,sschuth的答案是正确的。你的@BeforeMethod被调用两次。一旦TestNG第一次实例化该类,然后当TestNG实例化测试类时再次实例化该类。另一个单独的线程上的方法。
我们有一个开源项目,它抽象了TestNG / Selenium测试的Web驱动程序生命周期管理。它适当地支持每个TestNG并行模式,为每个测试的测试类方法提供正确和活动的Web驱动程序。它在我们的测试工作中给了我们很大的帮助。也许它也适用于您的情况。或者,如果没有别的东西让你知道如何以不同的方式解决它。该项目在GitHub上以Concurrent Selenium TestNG (COSENG)结束。亲切的问候。