Dinesh Cooray
Dinesh Cooray

Reputation: 1

Parellel testing with TestNG - Tests only run on one browser

I have created a test suite using DataProvider DataFactory and my TestNG file is sending browser details as parameters. In testNG XML I'm calling my data factory class. I'm also using browsestack for testing (although I doubt this has anything to do with the problem I"m having)

Tests run without any issues when I don't add parrellel="true" to testng file.

I have a feeling it has something to do with same driver being used by each browser, but I'm out of depth to solve this at the moment.

Any guidance is appreciated.

Here's the code.

TestNG.XML

<suite name="Suite" verbose="1" parallel="tests">
  <!-- Test with Chrome -->
  <test name="ChromeTest" group-by-instances="true"> 
    <parameter name="browser" value="Chrome"></parameter>
    <parameter name="browserVersion" value="47"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

  <!-- Test with Firefox -->
  <test name="FirefoxTest" group-by-instances="true"> 
    <parameter name="browser" value="Firefox"></parameter>
    <parameter name="browserVersion" value="43"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

</suite> 

Data Factory Class

public class TestFactory {
     @Factory(dataProvider = "LoginCredentials", dataProviderClass=TestData.class)
     public Object[] createInstances(int testNo, String userName, String password) {
         Object[] result = new Object[1];
         int i=0;
         System.out.println("Inside LoginCredentials Factory - " + userName + "---" + password);

         if(testNo==1){
             result[i] = new Test_BookingEngine_Login(userName, password);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         else if(testNo==2){
             result[i] = new Test_BookingManagement_OpenBooking(userName);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         System.out.println("outside for");
         return result;
     }
}

Suite - Driver Initialization

@BeforeTest
    @Parameters(value ={"browser", "browserVersion", "platform", "platformVersion"}) 
    public void initBrowser(String browser, String browserVersion, String platform, String platformVersion) throws Exception{

//Initializing browser in cloud
                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");

                driver = new RemoteWebDriver(new URL(URL), cloudCaps);

}

Sample Test

 public Test_BookingEngine_Login(String userName, String password) {  
        this.userName = userName;  
        this.password = password;  
    }  

    @Test (groups = {"Login"})
    public void testHomePageAppearCorrect() throws InterruptedException{

        //Starting test and assigning test category
        test = logger.startTest("Login to Temptation", "<b>Successful user login or Pop up advising incorrect login details</b><br/><br/>" + browserInfo)
        .assignCategory("Regression", "Booking Engine")
        .assignAuthor("Dinesh Cooray");

        System.out.println("Inside login test");
        System.out.println("Browser inside login test : ");

        driver.get("http://dev-thor2.tempoholidays.com/");
        test.log(LogStatus.INFO, "HTML", "Navigated to http://dev-thor2.tempoholidays.com/");

        //create Login Page object
        objLogin = new BookingEngine_Login(driver);

        //login to application
        objLogin.loginToTemptationBookingEngine(userName, password, test);

        //check if alert advising username or password is is incorrect
        try {
                //incorrect login details, user should not allow login
                if(driver.switchTo().alert().getText().toLowerCase().contains("user name or password is wrong")){
                    test.log(LogStatus.INFO, "HTML", "<b>Popup - </b>" + driver.switchTo().alert().getText());
                    driver.switchTo().alert().accept();
                    Assert.assertTrue(true);
            }
        }

Upvotes: 0

Views: 558

Answers (1)

Surbhi Sharma
Surbhi Sharma

Reputation: 119

I am guessing RemoteWebDriver driver; would be a line you added at the class level. What is happening is that you have already declared the variable at class level. i.e. memory is already allocated to it.When you do something like this driver = new RemoteWebDriver(new URL(URL), cloudCaps); you are just setting and resetting the values of the same variable in every @BeforeTest

What you need to do is create a factory that will return an instance of RemoteWebDriver based on a parameter you pass to it.Essentially the factory will create a new object and return only if an existing object doesn't exist. Declare and initialise the driver (from factory) in your @Test Methods

Sample code for the factory would be something like

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;
}
}
}

Upvotes: 1

Related Questions