1

我想在完成所有测试后关闭浏览器。问题是我无法关闭浏览器,因为对象创建的ThreadLocal驱动程序在完成测试后返回的值为空时无法识别驱动程序。TestNG在并行测试执行后关闭浏览器

下面是我工作的代码提前

package demo; 

import java.lang.reflect.Method; 
import org.openqa.selenium.By; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

public class ParallelMethodTest { 
    private static ThreadLocal<dummy> driver; 
    private int input; 
    private int length; 

    @BeforeMethod 
    public void beforeMethod() { 
     System.err.println("Before ID" + Thread.currentThread().getId()); 
     System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); 
     if (driver == null) { 
      driver = new ThreadLocal<dummy>(); 
     } 
     if (driver.get()== null) { 
      driver.set(new dummy()); 
     } 

    } 

    @DataProvider(name = "sessionDataProvider", parallel = true) 
    public static Object[][] sessionDataProvider(Method method) { 
     int len = 12; 

     Object[][] parameters = new Object[len][2]; 
     for (int i = 0; i < len; i++) { 
      parameters[i][0] = i; 
      parameters[i][1]=len; 

     } 
     return parameters; 
    } 

    @Test(dataProvider = "sessionDataProvider") 
    public void executSessionOne(int input,int length) { 
     System.err.println("Test ID---" + Thread.currentThread().getId()); 
     this.input=input; 
     this.length=length; 
     // First session of WebDriver 
     // find user name text box and fill it 
     System.out.println("Parameter size is:"+length); 
     driver.get().getDriver().findElement(By.name("q")).sendKeys(input + ""); 
     System.out.println("Input is:"+input); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

    @AfterMethod 
    public void afterMethod() { 
    System.err.println("After ID" + Thread.currentThread().getId()); 
    driver.get().close(); 

    } 


} 

package demo; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.testng.annotations.AfterClass; 

public class dummy { 

    public WebDriver getDriver() { 
     return newDriver; 
    } 

    public void setNewDriver(WebDriver newDriver) { 
     this.newDriver = newDriver; 
    } 

    private WebDriver newDriver; 

    public dummy() { 
     newDriver = new ChromeDriver(); 
     newDriver.get("https://www.google.co.in/"); 
    } 

    @AfterClass 
    public void close(){ 
     if(newDriver!=null){ 
      System.out.println("In After Class"); 
      newDriver.quit(); 
     } 
    } 
} 

感谢。

回答

0

发生这种情况是因为您在beforeMethod函数中创建驱动程序实例,所以它的作用域在函数结束后结束。

因此,当您的afterMethod启动时它变为空,因为webdriver实例已经销毁为beforeMethod函数已完成。

请参考下面的链接: -

http://www.java-made-easy.com/variable-scope.html

What is the default scope of a method in Java?

+0

请找我更新的代码。我已经在ThreadLocal中初始化驱动程序。我不这么认为有范围问题。 – manish

0

你有一个并发的问题:多个线程可以创建一个ThreadLocal实例,因为在运行时dummy == null可以评估到true在多个线程平行。因此,一些线程可以执行driver.set(new dummy());,但随后另一个线程用新的ThreadLocal实例替换driver

在我的经验,这是更简单,更容易出错始终使用ThreadLocalstatic final以确保多个对象可以访问它(static),它只能被定义一次(final)。

你可以看到我的回答以下堆栈溢出问题相关的详细信息和代码示例:

2

private static ThreadLocal<dummy> driver在类级别添加。发生的事情是你已经在课堂上宣布了变量。即存储器已经分配给它。多个线程只是设置和重置相同的变量的值。

您需要做的是创建一个工厂,该工厂将基于您传递给它的参数返回一个Driver实例。逻辑可以是任何东西,但只需要一个通用用例,工厂将创建一个新对象并仅返回如果一个现有的对象不存在。声明并在工厂的@Test方法

示例代码初始化驱动程序(工厂)将会像

static RemoteWebDriver firefoxDriver; 
static RemoteWebDriver someOtherDriver; 


static synchronized RemoteWebDriver getDriver(String browser, String browserVersion, String platform, String platformVersion) 
{ 
if (browser == 'firefox') 
{ 
    if (firefoxDriver == null) 
    { 
       DesiredCapabilities cloudCaps = new DesiredCapabilities(); 
       cloudCaps.setCapability("browser", browser); 
       cloudCaps.setCapability("browser_version", browserVersion); 
       cloudCaps.setCapability("os", platform); 
       cloudCaps.setCapability("os_version", platformVersion); 
       cloudCaps.setCapability("browserstack.debug", "true"); 
       cloudCaps.setCapability("browserstack.local", "true"); 

       firefoxDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
} 
} 
else 
{ 
if (someOtherDriver == null) 
    { 
       DesiredCapabilities cloudCaps = new DesiredCapabilities(); 
       cloudCaps.setCapability("browser", browser); 
       cloudCaps.setCapability("browser_version", browserVersion); 
       cloudCaps.setCapability("os", platform); 
       cloudCaps.setCapability("os_version", platformVersion); 
       cloudCaps.setCapability("browserstack.debug", "true"); 
       cloudCaps.setCapability("browserstack.local", "true"); 

       someOtherDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
} 
return someOtherDriver; 
} 
相关问题