Multithreading TestNG在并行测试执行后关闭浏览器
我想在完成所有测试后关闭浏览器。问题是我无法关闭浏览器,因为创建的对象ThreadLocal驱动程序在测试完成后无法识别驱动程序,返回的值为null 下面是我的工作代码Multithreading TestNG在并行测试执行后关闭浏览器,multithreading,selenium,testng,testng-dataprovider,testng-eclipse,Multithreading,Selenium,Testng,Testng Dataprovider,Testng Eclipse,我想在完成所有测试后关闭浏览器。问题是我无法关闭浏览器,因为创建的对象ThreadLocal驱动程序在测试完成后无法识别驱动程序,返回的值为null 下面是我的工作代码 package demo; import java.lang.reflect.Method; import org.openqa.selenium.By; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod;
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();
}
}
}
软件包演示;
导入java.lang.reflect.Method;
导入org.openqa.selenium.By;
导入org.testng.annotations.AfterMethod;
导入org.testng.annotations.BeforeMethod;
导入org.testng.annotations.DataProvider;
导入org.testng.annotations.Test;
公共类并行方法测试{
私有静态线程本地驱动程序;
私有int输入;
私有整数长度;
@预处理法
方法()之前的公共无效{
System.err.println(“在ID之前”+Thread.currentThread().getId());
System.setProperty(“webdriver.chrome.driver”、“chromedriver.exe”);
if(驱动程序==null){
driver=new ThreadLocal();
}
if(driver.get()==null){
driver.set(新的dummy());
}
}
@数据提供者(name=“sessionDataProvider”,parallel=true)
公共静态对象[][]sessionDataProvider(方法){
int len=12;
对象[][]参数=新对象[len][2];
对于(int i=0;i
提前感谢。之所以会发生这种情况,是因为您正在
beforeMethod
函数中创建驱动程序实例,所以它的作用域在函数结束后结束
因此,当您的afterMethod启动时,它将变为null,因为webdriver实例已被销毁,因为函数已完成
请参阅以下连结:-
您有一个并发问题:多个线程可以创建一个
ThreadLocal
实例,因为当并行运行时,dummy==null
可以在多个线程上计算为true
。因此,一些线程可以执行driver.set(newdummy())
但是另一个线程用一个新的ThreadLocal
实例替换driver
根据我的经验,总是将ThreadLocal
用作static final
,以确保多个对象可以访问它(static
),并且只定义一次(final
)
有关详细信息和代码示例,请参见我对以下堆栈溢出问题的回答:
在类级别添加了专用静态线程本地驱动程序。现在的情况是,您已经在类级别声明了变量。i、 e.内存已分配给它。多个线程只是设置和重置同一个变量的值
您需要做的是创建一个工厂,该工厂将根据您传递给它的参数返回驱动程序实例。逻辑可以是任何东西,但以一般用例为例,工厂将创建一个新对象,并仅在现有对象不存在时返回。在@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;
}
请找到我的更新代码。我已经用ThreadLocal初始化了驱动程序。我认为没有范围问题。