我希望在完成所有测试后关闭浏览器。问题是我无法关闭浏览器,因为创建的对象ThreadLocal驱动程序在完成测试值返回后无法识别驱动程序为空。
以下是我的工作代码
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 :(得分:2)
window.print()
。发生的事情是你已经在类级别声明了变量。即内存已经分配给它。多个线程只是设置和重置相同变量的值。
您需要做的是创建一个工厂,它将根据您传递给它的参数返回Driver的实例。逻辑可以是任何东西,但采用一般用例示例工厂将创建一个新对象,并仅在现有对象不存在。在@Test Methods
中声明并初始化驱动程序(来自工厂)工厂的示例代码类似于
private static ThreadLocal<dummy> driver
答案 1 :(得分:1)
您遇到并发问题:多个线程可以创建PUT indexName/object3/_mapping
{
"properties": {
...
}
}
实例,因为ThreadLocal
在并行运行时可以在多个线程上评估为dummy == null
。因此,某些线程可以执行true
,但是另一个线程会用新的driver.set(new dummy());
实例替换driver
。
根据我的经验,总是使用ThreadLocal
作为ThreadLocal
以确保多个对象可以访问它(static final
)并且仅定义一次它更简单且更不容易出错(static
)。
您可以查看我对以下Stack Overflow问题的答案,了解相关详细信息和代码示例:
答案 2 :(得分:0)
这是因为您正在beforeMethod
函数中创建驱动程序实例,因此它的范围在函数结束后结束。
因此,当你的afterMethod开始它变为null因为webdriver实例已经破坏,因为beforeMethod
函数已经完成。
请参阅以下链接: -