Selenium 如何并行运行testng测试方法?

Selenium 如何并行运行testng测试方法?,selenium,testng,Selenium,Testng,我试图通过使用TestNg概念并行运行测试方法,但它没有按预期工作。它启动多个浏览器并为每个浏览器创建每个线程,但它只在一个浏览器中输入所有值。请帮帮我。在这里,浏览器对象和范围报告对象是线程安全的。请找到测试方法 这是需要并行执行的测试类,但它不工作。它只需启动多个浏览器,并将所有线程值提供给一个浏览器本身 package com.sonata.tests; import java.util.Map; import java.util.Properties; import org.te

我试图通过使用TestNg概念并行运行测试方法,但它没有按预期工作。它启动多个浏览器并为每个浏览器创建每个线程,但它只在一个浏览器中输入所有值。请帮帮我。在这里,浏览器对象和范围报告对象是线程安全的。请找到测试方法

这是需要并行执行的测试类,但它不工作。它只需启动多个浏览器,并将所有线程值提供给一个浏览器本身

  package com.sonata.tests;

import java.util.Map;
import java.util.Properties;

import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import com.sonata.utility.DataReader;
import com.sonata.utility.DriverCreation;
import com.sonata.pages.ComplaintPage;
import com.sonata.pages.HomePage;
import com.sonata.pages.LoginPage;

public class ComplainTest extends DriverCreation {

    private String browser;
    private String url;

    HomePage homeObject;
    LoginPage loginObject;
    ComplaintPage compObject;
    DataReader dataReader = new DataReader();

    @Parameters({ "url", "browser" })
    @BeforeMethod
    public void readProperties(String url, String browser) {
        /*
         * Properties prop = PropertiesReader.getProperty(); browser =
         * prop.getProperty("browser.name"); url = prop.getProperty("app.url");
         */
        this.browser = browser;
        this.url = url;
    }

    @Test
    public void createComplaintCaseWithDefault() {

        setTestCaseName("TC-10672");
        initExtent(testCaseName);

        if (!dataReader.isTestCaseExecute(xlsReader, testCaseName)) {
            logger.info("Test Case not executed as its run mode is NO");
            throw new SkipException("");
        }
        Object[][] testData = dataReader.getTestData(xlsReader, testCaseName);
        for (int t = 0; t < testData.length; t++) {
            initDriver(browser);
            homeObject = new HomePage(driver, report, wait, logger);
            homeObject.goToHomepge(url);

            @SuppressWarnings("unchecked")
            Map<String, String> testDataMap = (Map<String, String>) testData[t][0];
            loginObject = new LoginPage(driver, report, wait, logger);
            loginObject.login(testDataMap.get("UserName"),
                    testDataMap.get("Password"));

            compObject = new ComplaintPage(driver, report, wait, logger);
            compObject.createCase(testDataMap.get("ComplaintType"),
                    testDataMap.get("CustomerName"),
                    testDataMap.get("ComplaintCategory"));
            compObject.complaintPageVerification();
        }
    }

    @Test
    public void createComplaintCaseWithSensitive() {

        setTestCaseName("TC-10692");
        initExtent(testCaseName);

        if (!dataReader.isTestCaseExecute(xlsReader, testCaseName)) {
            logger.info("Test Case not executed as its run mode is NO");
            throw new SkipException("");
        }

        Object[][] testData = dataReader.getTestData(xlsReader, testCaseName);
        for (int t = 0; t < testData.length; t++) {
            initDriver(browser);
            homeObject = new HomePage(driver, report, wait, logger);
            homeObject.goToHomepge(url);

            @SuppressWarnings("unchecked")
            Map<String, String> testDataMap = (Map<String, String>) testData[t][0];

            loginObject = new LoginPage(driver, report, wait, logger);
            loginObject.login(testDataMap.get("UserName"),
                    testDataMap.get("Password"));

            compObject = new ComplaintPage(driver, report, wait, logger);
            compObject.createCase(testDataMap.get("ComplaintType"),
                    testDataMap.get("CustomerName"),
                    testDataMap.get("ComplaintCategory"));
            compObject.complaintPageVerification();
        }
    }

    @Test
    public void reopenComplaintFieldVerfication() {

        setTestCaseName("TC-10958");
        initExtent(testCaseName);

        if (!dataReader.isTestCaseExecute(xlsReader, testCaseName)) {
            logger.info("Test Case not executed as its run mode is NO");
            throw new SkipException("");
        }
        Object[][] testData = dataReader.getTestData(xlsReader, testCaseName);
        for (int t = 0; t < testData.length; t++) {
            initDriver(browser);
            homeObject = new HomePage(driver, report, wait, logger);
            homeObject.goToHomepge(url);

            @SuppressWarnings("unchecked")
            Map<String, String> testDataMap = (Map<String, String>) testData[t][0];
            loginObject = new LoginPage(driver, report, wait, logger);
            loginObject.login(testDataMap.get("UserName"),
                    testDataMap.get("Password"));

            compObject = new ComplaintPage(driver, report, wait, logger);
            compObject.reopenReasonFieldVerification(testDataMap
                    .get("ComplaintID"));
        }
    }

    @AfterMethod
    public void closeBrowser() {
        if (driver != null) {
            homeObject.tearDownTest();
        }
        if (report != null) {
            report.endTest();
        }
    }
}
包com.sonata.tests;
导入java.util.Map;
导入java.util.Properties;
导入org.testng.SkipException;
导入org.testng.annotations.AfterMethod;
导入org.testng.annotations.BeforeMethod;
导入org.testng.annotations.BeforeTest;
导入org.testng.annotations.Parameters;
导入org.testng.annotations.Test;
导入com.sonata.utility.DataReader;
导入com.sonata.utility.DriverCreation;
导入com.sonata.pages.ComplaintPage;
导入com.sonata.pages.HomePage;
导入com.sonata.pages.LoginPage;
公共类投诉人扩展了DriverCreation{
私有字符串浏览器;
私有字符串url;
主页同源对象;
LoginPage loginObject;
投诉页面组件对象;
DataReader DataReader=新DataReader();
@参数({“url”,“浏览器”})
@预处理法
公共void readProperties(字符串url、字符串浏览器){
/*
*Properties prop=PropertiesReader.getProperty();浏览器=
*prop.getProperty(“browser.name”);url=prop.getProperty(“app.url”);
*/
this.browser=浏览器;
this.url=url;
}
@试验
public void createComplaintCaseWithDefault(){
setTestCaseName(“TC-10672”);
initExtent(testCaseName);
if(!dataReader.isTestCaseExecute(xlsReader,testCaseName)){
info(“测试用例没有执行,因为它的运行模式是NO”);
抛出新SkipException(“”);
}
对象[][]testData=dataReader.getTestData(xlsReader,testCaseName);
for(int t=0;t
这是将为每个测试方法创建驱动程序实例的驱动程序类

package com.sonata.utility;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;

import com.relevantcodes.extentreports.ExtentReports;
import com.relevantcodes.extentreports.LogStatus;
import com.sonata.constants.Constants;

public class DriverCreation {

    public ExtentReports report;
    public WebDriver driver;
    public DesiredCapabilities cap1;
    public WebDriverWait wait;
    protected String testCaseName;

    ExtentReport extent;
    public Logger logger = Logger.getLogger(this.getClass().toString());
    public ExcelReader xlsReader = new ExcelReader(getProjectPath()
            + Constants.XLS_FILE_PATH);

    /*
     * public DriverCreation(String browser,ExtentReports report,Logger logger){
     * this.browser = browser; this.report = report; this.logger = logger; }
     */

    public void initExtent(String reportName) {
        extent = new ExtentReport();
        report = extent.getExtentReportInstance(reportName);
    }

    public void setTestCaseName(String testCaseName){
        this.testCaseName = testCaseName;
    }

    public WebDriver initDriver(String browser) {
        try {
            cap1 = new DesiredCapabilities();
            if (!Constants.CONSTANTS_GRIDEXECUTION) {
                if (browser.equalsIgnoreCase("Firefox")) {
                    System.setProperty("webdriver.gecko.driver",
                            Constants.CONSTANTS_GECKO_DRIVER_PATH);
                    cap1.setCapability("marionette", true);
                /*  ThreadLocal<WebDriver> driver1 = new ThreadLocal<WebDriver>(){
                        @Override
                        protected WebDriver initialValue(){
                            return new FirefoxDriver(cap1);
                        }
                    };*/
                    //driver = driver1.get();*/
                    driver= new FirefoxDriver(cap1);
                    driver.manage().timeouts()
                            .implicitlyWait(2, TimeUnit.SECONDS);
                    wait = new WebDriverWait(driver, 50);
                    report.log(LogStatus.INFO, "Firefox driver has started");
                    logger.info("Firefox driver has started");

                } else if (browser.equalsIgnoreCase("Chrome")) {
                    System.setProperty(Constants.CONSTANTS_CHROME_PROPERTY,
                            Constants.CONSTANTS_CHROME_DRIVER_PATH);
                    /*driver1 = new ThreadLocal<WebDriver>(){
                        @Override
                        protected WebDriver initialValue(){
                            return new ChromeDriver();
                        }
                    };
                    driver = driver1.get();*/
                    driver = new ChromeDriver();
                    driver.manage().timeouts()
                            .implicitlyWait(2, TimeUnit.SECONDS);
                    wait = new WebDriverWait(driver, 50);
                    report.log(LogStatus.INFO, "Chrome driver has started");
                    logger.info("Chrome driver has started");
                } else if (browser.equalsIgnoreCase("PhantomJS")) {
                    System.setProperty(Constants.CONSTANTS_PHANTOM_PROPERTY,
                            Constants.CONSTANTS_PHANTOM_DRIVER_PATH);
                    cap1.setJavascriptEnabled(true);
                    cap1.setCapability("takesScreenshot", true);
                    cap1.setCapability(
                            PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
                            Constants.CONSTANTS_PHANTOM_DRIVER_PATH);
                    /*ThreadLocal<WebDriver> driver1 = new ThreadLocal<WebDriver>(){
                        @Override
                        protected WebDriver initialValue(){
                            return new PhantomJSDriver(cap1);
                        }
                    };
                    driver = driver1.get();*/
                    driver = new PhantomJSDriver(cap1);
                    driver.manage().window().setSize(new Dimension(1920, 1200));
                    wait = new WebDriverWait(driver, 50);
                    report.log(LogStatus.INFO,
                            "PhantomJS/Ghost driver has started");
                    logger.info("PhantomJS/Ghost driver has started");
                } else if (browser.equalsIgnoreCase("IE")) {
                    System.setProperty(Constants.CONSTANTS_IE_PROPERTY,
                            Constants.CONSTANTS_IE_DRIVER_PATH);
                    // cap1.internetExplorer();
                    cap1.setCapability(
                            InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION,
                            true);
                    /*ThreadLocal<WebDriver> driver1 = new ThreadLocal<WebDriver>(){
                        @Override
                        protected WebDriver initialValue(){
                            return new InternetExplorerDriver(cap1);
                        }
                    };
                    driver = driver1.get();*/
                    driver = new InternetExplorerDriver(cap1);
                    driver.manage().timeouts()
                            .implicitlyWait(2, TimeUnit.SECONDS);
                    wait = new WebDriverWait(driver, 50);
                    report.log(LogStatus.INFO,
                            "Internet Explorer driver has started");
                    logger.info("Internet Explorer driver has started");
                }
            } else {
                String nodeUrl = Constants.CONSTANTS_IPDETAILS;
                if (browser.equalsIgnoreCase("Firefox")) {
                    System.setProperty("webdriver.gecko.driver",
                            Constants.CONSTANTS_GECKO_DRIVER_PATH);
                    cap1.setCapability("marionette", true);
                    cap1 = DesiredCapabilities.firefox();
                    cap1.setBrowserName("firefox");
                    cap1.setPlatform(Platform.WINDOWS);
                } else if (browser.equalsIgnoreCase("Chrome")) {
                    System.setProperty(Constants.CONSTANTS_CHROME_PROPERTY,
                            Constants.CONSTANTS_CHROME_DRIVER_PATH);
                    cap1 = DesiredCapabilities.chrome();
                    cap1.setBrowserName("chrome");
                    cap1.setPlatform(Platform.WINDOWS);
                } else if (browser.equalsIgnoreCase("IE")) {
                    System.setProperty(Constants.CONSTANTS_IE_PROPERTY,
                            Constants.CONSTANTS_IE_DRIVER_PATH);
                    // cap1.internetExplorer();
                    cap1 = DesiredCapabilities.internetExplorer();
                    cap1.setBrowserName("internet explorer");
                    cap1.setPlatform(Platform.WINDOWS);
                    cap1.setCapability(
                            InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,
                            true);
                    cap1.setCapability(
                            InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION,
                            true);
                }
                ThreadLocal<WebDriver> driver1 = new ThreadLocal<WebDriver>(){
                    @Override
                    protected WebDriver initialValue(){
                            try {
                                return new RemoteWebDriver(new URL(nodeUrl), cap1);
                            } catch (MalformedURLException e) {
                                e.printStackTrace();
                            }
                            return null;
                    }
                };
                driver = driver1.get();
                driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
                wait = new WebDriverWait(driver, 50);
                report.log(LogStatus.INFO, browser + " driver has started");
                logger.info(browser + " driver has started");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                Assert.assertTrue(true, "Set up Test");
            } catch (Exception e) {
                logger.error("Try and catch block while assert " + e);
            }
        }
        return driver;
    }

    private String getProjectPath() {
        File currentDirFile = new File("");
        String path = currentDirFile.getAbsolutePath();
        return path;
    }

}




TESTNG SUITE XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="C4C" thread-count="3" parallel="methods">
        <parameter name="url" value="https://abc.xyz.ondemand.com/"/>
        <parameter name="browser" value="Chrome"/>
        <test name="Case" allow-return-values="true" group-by-instances="true">
            <classes>
                <class name="com.sonata.tests.ComplainTest" >
                </class>
            </classes>
        </test>
    </suite>
package com.sonata.utility;
导入java.io.File;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.concurrent.TimeUnit;
导入org.apache.log4j.Logger;
导入org.openqa.selenium.Dimension;
导入org.openqa.selenium.Platform;
导入org.openqa.selenium.WebDriver;
导入org.openqa.selenium.chrome.ChromeDriver;
导入org.openqa.selenium.firefox.FirefoxDriver;
导入org.openqa.selenium.ie.InternetExplorerDriver;
导入org.openqa.selenium.phantomjs.PhantomJSDriver;
导入org.openqa.selenium.phantomj
        Webdriver driver = initDriver(browser);
        homeObject = new HomePage(driver, report, wait, logger);
        homeObject.goToHomepge(url);
 public class DriverCreation {
    private static ThreadLocal<WebDriver> WEBDRIVER = new ThreadLocal<WebDriver>();

   public WebDriver getWebDriver(String browser){
      WebDriver driver= WEBDRIVER.get();
      if (driver== null) {
        driver = initDriver(browser);
        WEBDRIVER.set(driver);
      }
      return driver;
   }

}
        Webdriver driver = getWebDriver(browser);
        homeObject = new HomePage(driver, report, wait, logger);
        homeObject.goToHomepge(url);