Java 如何使用不同的登录在多个浏览器中并行执行TestNG.xml

Java 如何使用不同的登录在多个浏览器中并行执行TestNG.xml,java,selenium,selenium-webdriver,parallel-processing,testng,Java,Selenium,Selenium Webdriver,Parallel Processing,Testng,我想在多个浏览器中使用不同的登录并行执行testng.xml。现在我使用的是ThreadLocal概念,使用它我可以用一个浏览器(比如说5个chrome驱动程序实例)并行执行testng.xml 我想在IE、firefox、chrome和EDGE等不同浏览器上也这么做。这是我的示例代码 BaseSetup.class: public ThreadLocal<WebDriver> driver = new ThreadLocal<WebDriver>() { @Ov

我想在多个浏览器中使用不同的登录并行执行testng.xml。现在我使用的是
ThreadLocal
概念,使用它我可以用一个浏览器(比如说5个chrome驱动程序实例)并行执行testng.xml

我想在IE、firefox、chrome和EDGE等不同浏览器上也这么做。这是我的示例代码

BaseSetup.class:

public ThreadLocal<WebDriver> driver = new ThreadLocal<WebDriver>()
{
    @Override
      protected WebDriver initialValue()
      {
        if (browser.equalsIgnoreCase("Firefox")) {
            System.setProperty("webdriver.gecko.driver", "D:/Softwares/Selenium/Drivers/Firefox driver/geckodriver.exe");
            return new FirefoxDriver(getFirefoxOptions());
        } else if (browser.equalsIgnoreCase("Chrome")) {
            return new ChromeDriver(getChromeOptions());
        } else if (browser.equalsIgnoreCase("InternetExplorer")) {
            return new InternetExplorerDriver(getInternetExplorerOptions());
        } else if(browser.equalsIgnoreCase("EDGE")){
            return new EdgeDriver(getEdgeOptions());
        }
    }
};
public-ThreadLocal-driver=new-ThreadLocal()
{
@凌驾
受保护的WebDriver initialValue()
{
if(browser.equalsIgnoreCase(“Firefox”)){
System.setProperty(“webdriver.gecko.driver”,“D:/Softwares/Selenium/Drivers/Firefox driver/geckodriver.exe”);
返回新的FirefoxDriver(getFirefoxOptions());
}else if(browser.equalsIgnoreCase(“Chrome”)){
返回新的ChromeDriver(getChromeOptions());
}else if(browser.equalsIgnoreCase(“InternetExplorer”)){
返回新的InternetExplorerDriver(getInternetExplorerProptions());
}else if(browser.equalsIgnoreCase(“边缘”)){
返回新的EdgeDriver(getEdgeOptions());
}
}
};
TestNGSuiteRunner.class:

public static void main(String[] args) throws Exception
{
    ArrayList<Thread> trarrls = new ArrayList<Thread>();
    Thread object1 = null;
    try
    {
        inputFiles = args[0];
        xmlFile = inputFiles.split(",");

        for(String file : xmlFile)
        {
             object1 = new Thread(new 
             TestNGParallelConfig(System.getProperty("user.dir")+"/"+file));
             object1.start();
             trarrls.add(object1);
             Thread.sleep(3000);
        }

        for(Thread indi_thread:trarrls){
            indi_thread.join();
        }
    }

    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally{
        System.exit(0);
    }
}
publicstaticvoidmain(字符串[]args)引发异常
{
ArrayList trarrls=新的ArrayList();
线程object1=null;
尝试
{
inputFiles=args[0];
xmlFile=inputFiles.split(“,”);
for(字符串文件:xmlFile)
{
object1=新线程(新线程)
TestNGParallelConfig(System.getProperty(“user.dir”)+“/”+文件);
object1.start();
trarrls.add(object1);
睡眠(3000);
}
用于(线程独立线程:trarrls){
独立线程连接();
}
}
捕获(例外e)
{
e、 printStackTrace();
}
最后{
系统出口(0);
}
}
TestNGParallelConfig.class:

public TestNGParallelConfig(String suitXMLUrl,int portNo) throws InterruptedException
{
    xmlString = suitXMLUrl;
    xmlIndex = xmlString.lastIndexOf("/");
    locationName = xmlString.substring(xmlIndex+1);
    folderName = locationName.replace(".xml", "").toUpperCase();
    Thread.sleep(5000);
    //BaseSetup.getInstance().proxyPortNo = portAvailability(portNo);
}

@Override
public void run(){
    List<String> testSuites = Lists.newArrayList();
    testSuites.add(xmlString);
    TestNG testng = new TestNG();
    testng.setTestSuites(testSuites);
    testng.run();
}
public TestNGParallelConfig(字符串suitXMLUrl,int-portNo)抛出InterruptedException
{
xmlString=suitXMLUrl;
xmlIndex=xmlString.lastIndexOf(“/”);
locationName=xmlString.substring(xmlIndex+1);
folderName=locationName.replace(“.xml”,”).toUpperCase();
睡眠(5000);
//BaseSetup.getInstance().proxyPortNo=portAvailability(portNo);
}
@凌驾
公开募捐{
List testSuites=Lists.newArrayList();
添加(xmlString);
TestNG TestNG=新的TestNG();
testng.setTestSuites(testSuites);
testng.run();
}
主要的是,如果一个xml要在5个不同的浏览器中运行,那么需要5个不同的用户。因为应用程序完全基于登录和注销


请帮助我实现这一点。

试试Selenium Grid,Testng.xml一次只能在一种浏览器类型上运行。多个浏览器需要多个执行或浏览器的类级声明,这将限制单个浏览器类型中的一组特定测试用例。如果您想在所有浏览器类型中执行所有测试用例,那么Selenium Grid是最佳选择。

1。尝试创建登录用户池,并使用
addAll
方法将其添加到名为
LinkedBlockingDeque
的数据结构中。2.每次启动线程时,从
LinkedBlockingDeque
中获取值并从中删除,以便下一个线程不会拾取该值。谢谢。但我应该如何运行不同的浏览器呢?上面的代码实现了单个浏览器和多个实例。