Ahmed Yaslem
Ahmed Yaslem

Reputation: 113

How to run test suites parallel or serially in multiple browser using selenium grid

How to run test suites parallel or serially in multiple browser using selenium grid. I have 3 xml files, one chrome.xml(contains all my test to be run in chrome), and one firefox.xml(contains all my test to be run in firefox) and testng.xml contains the both as suites.

Chrome.xml

 <suite name="Chrome">
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
<test name="v5">
  <parameter name="browser" value="chrome"/>
  <classes>
        <class name="ww5.testcases.version.version" ></class> 
        <class name="ww5.testcases.loginSuite.LoginTest" ></class> 
        <class name="ww5.testcases.loginSuite.LogoutTest" ></class>
   </classes>
</test>
</suite>

firefox.xml

<suite name="Firefox">
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
<test name="v5">
  <parameter name="browser" value="firefox"/>
  <classes>
        <class name="ww5.testcases.version.version" ></class> 
        <class name="ww5.testcases.loginSuite.LoginTest" ></class> 
        <class name="ww5.testcases.loginSuite.LogoutTest" ></class>
   </classes>
</test>
</suite>

testng.xml

<suite name="My Project" parallel="tests">   
<listeners>
    <listener class-name="ww5.listener.Listener" />
</listeners>
  <suite-files>
     <suite-file path="./Chrome.xml" />
     <suite-file path="./firefox.xml" />
 </suite-files>
</suite>

Thanks in advanced, i am using page object model hence the reason for suite file for each browser.

Upvotes: 0

Views: 2097

Answers (1)

peetya
peetya

Reputation: 3628

  1. Make your WebDriver thread safe.
  2. Init your WebDriver in @BeforeTest and use the quit() in the @AfterTest.

You can find an example under one of my question: Parameterized Selenium Tests in Parallel with TestNG

Update:

How to make your WebDriver thread safe:

  private List<WebDriver> webDriverPool = Collections.synchronizedList(new ArrayList<WebDriver>());
  private ThreadLocal<WebDriver> driverThread;

  @BeforeTest()
  public void beforeTest() {
      //...
      this.driverThread   = new ThreadLocal<WebDriver>() {
        @Override
        protected WebDriver initialValue() {
          WebDriver webDriver = new RemoteWebDriver(...);
          webDriverPool.add(webDriver);
          return webDriver;
        }
      };
  }

  @AfterTest(alwaysRun = true)
  public void afterTest() {
    for (WebDriver driver : this.webDriverPool) {
      driver.quit();
    }
  }

  // Use this method instead of driver.get()
  public WebDriver getDriver() {
    return this.driverThread.get();
  }

}

Upvotes: 1

Related Questions