Java 如何使用TestNG在两个不同的浏览器中并行运行两个测试方法?

Java 如何使用TestNG在两个不同的浏览器中并行运行两个测试方法?,java,selenium,selenium-webdriver,testng,Java,Selenium,Selenium Webdriver,Testng,我有一个测试用例包含两个方法。在two browser实例中尝试这两种测试方法时,只有一个浏览器实例可以打开网站,但其余步骤无法执行。另一个浏览器实例甚至无法打开网站(空白页) 我在Stackoverflow上尝试了建议的解决方案。这些解决方案在我的情况下不起作用 public class RunSimpleTest{ private String baseUrl = "https://mywebsite"; public WebDriver driver; GlobalFunction

我有一个测试用例包含两个方法。在two browser实例中尝试这两种测试方法时,只有一个浏览器实例可以打开网站,但其余步骤无法执行。另一个浏览器实例甚至无法打开网站(空白页)

我在Stackoverflow上尝试了建议的解决方案。这些解决方案在我的情况下不起作用

public class RunSimpleTest{

private String baseUrl = "https://mywebsite";

public  WebDriver driver;

GlobalFunctions objGlobalFunc;

@BeforeMethod(alwaysRun = true)

public void setup() {

    try{

        // declaration and instantiation of objects/variables
        System.setProperty("webdriver.chrome.driver", "C:/ChromeDriver/chromedriver.exe");

        // Disable Chrome Developer Mode Extension
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--disable-extensions");
        options.addArguments("--start-maximized");

        driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        objGlobalFunc = new GlobalFunctions(driver);

        driver.get(baseUrl);

        objGlobalFunc = new GlobalFunctions(driver);


        objGlobalFunc.selectEnglishLanguage();

    }
    catch (Exception e){
        e.printStackTrace();
    }

}

@Test
public void BTRun1() {
    objGlobalFunc.setUserNameValue("ABC");
    objGlobalFunc.clickOKBtnOnMEXLoginForm();
}
@Test
public void BTRun2() {
    objGlobalFunc.setUserNameValue("ABC");
    objGlobalFunc.clickOKBtnOnMEXLoginForm();
}
}   
BTRun1在chrome浏览器中打开。并且,用户可以登录


BTRun2在另一个chrome浏览器中打开。而且,用户可以登录。

代码的核心问题是全局WebDriver对象的使用

并行运行时,TestNG只创建一个RunSimpleTest实例,因此创建一个WebDriver对象实例。这导致两个测试在与WebDriver对象通信时相互覆盖

一种解决方案是使用ThreadLocalDriver和ThreadLocalGlobalFunction:

protected ThreadLocalDriver threadLocalDriver;
protected ThreadLocalGlobalFunctions threadLocalGlobalFunctions;

public void setup() {

    try{

        // declaration and instantiation of objects/variables
        System.setProperty("webdriver.chrome.driver", "C:/ChromeDriver/chromedriver.exe");

        // Disable Chrome Developer Mode Extension
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--disable-extensions");
        options.addArguments("--start-maximized");

        threadLocalDriver = new ThreadLocalDriver(options);

        threadLocalDriver.getDriver().manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        objGlobalFunc = new ThreadLocalGlobalFunctions(threadLocalDriver.getDriver());

        threadLocalDriver.getDriver().get(baseUrl);

        objGlobalFunc.getGlobalFunc().selectEnglishLanguage();

    }
    catch (Exception e){
        e.printStackTrace();
    }

}


@Test
public void BTRun1() {
    objGlobalFunc.getGlobalFunc().setUserNameValue("ABC");
    objGlobalFunc.getGlobalFunc().clickOKBtnOnMEXLoginForm();
}

@Test
public void BTRun2() {
    objGlobalFunc.getGlobalFunc().setUserNameValue("ABC");
    objGlobalFunc.getGlobalFunc().clickOKBtnOnMEXLoginForm();
}

要了解有关在WebDriver中使用ThreadLocal的更多信息,请选中:

我的意思是创建GlobalFunctions对象的ThreadLocal对象。请参阅我随附的参考资料。