user2841008
user2841008

Reputation: 1

Why my tests failed when do parallel testing with TestNG and Grid 2?

everyone, hope you can me help me, thanks in advance. I create 10 tests with Webdriver and TestNG, run with Grid2. when start 1 node, all tests passed. When start 2 nodes, it can run in parallelling. But Some tests failed. Errors like:

org.openqa.selenium.WebDriverException: unknown error: cannot focus element

MY Steps:

1.Start Hub

D:\Selenium>java -jar selenium-server-standalone-2.35.0.jar -role hub
2.Start Node 1

D:\Selenium>java -jar selenium-server-standalone-2.35.0.jar -role wd -port 5556 -hub ip/grid/register  -Dwebdriver.chrome.driver=D:\Selenium\chromedriver.exe -browser "browserName=chrome,maxInstances=1,platform=WINDOWS"

3.Start Node 2

C:\Selenium>java -jar selenium-server-standalone-2.35.0.jar -role wd -hub ip/grid/register  -Dwebdriver.chrome.driver=C:\Selenium\chromedriver.exe -browser "browserName=chrome,maxInstances=1,platform=WINDOWS"

4.Then run tests testng.xml

   <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

    <suite name="LoginTest" verbose="4" parallel="methods" thread-count="10">

<test name="Login">
    <classes>
        <class name="com.ms.gridDemo.test.LoginTest">
        </class>
    </classes>
</test>
<test name="Login2">
    <classes>
        <class name="com.ms.gridDemo.test.LoginTest2">
        </class>
    </classes>
</test>

Test case base:

package com.ms.gridDemo.test;
import java.net.MalformedURLException;
import java.net.URL;

import junit.framework.Assert;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;

import com.google.common.base.Function;

public class AbstractTest {
private WebDriver driver = null;
private String baseURL;

public void login() throws InterruptedException {
  driver.get(baseURL);
  waitForElementVisible(driver,By.id("email"));
  WebElement emailElem = driver.findElement(By.id("email"));
  WebElement passwordElem = driver.findElement(By.id("password"));
  emailElem.clear();
  emailElem.sendKeys("[email protected]");
  passwordElem.clear();
  passwordElem.sendKeys("!Q@W3e4r");
  WebElement submitEl = driver.findElement(By.id("submit_btn"));
  submitEl.click();
  Thread.sleep(2000);
  Assert.assertFalse("Login failed.",IsTextPresent(driver,"The Email address or password you entered is incorrect."));
  ;
  }

  @BeforeMethod
  public void beforeMethod() {
  DesiredCapabilities dc = DesiredCapabilities.chrome();
  URL url = null;
try {
    url = new URL("http://localhost:4444/wd/hub");
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
  driver =new RemoteWebDriver(url, dc);
  driver.manage().window().maximize();
  baseURL ="https://mercury-uat.morningstar.com";
   }

@AfterMethod
 public void afterMethod() {
  driver.quit();
 }

public static WebElement waitForElementVisible(WebDriver driver, final By locator) {
    Function<WebDriver, WebElement> waitFn = new Function<WebDriver, WebElement>() {
        @Override
        public WebElement apply(WebDriver driver) {
            try {
                WebElement el = driver.findElement(locator);
                if (el.isDisplayed()) {
                    return el;
                }
            } catch (Exception e) {
            }
            return null;
        }
    };

    WebDriverWait wait = new WebDriverWait(driver,120,300);
    return wait.until(waitFn);
}

public boolean IsTextPresent(WebDriver driver, String text) {
    try {
        return driver.getPageSource().contains(text);
    } catch (Exception e) {
        return false;
    }
}

 }

===========================================================================

Test class 1:

  package com.ms.gridDemo.test;

  import org.testng.annotations.Test;

  import com.ms.gridDemo.test.AbstractTest;

 public class LoginTest extends AbstractTest {
  @Test
 public void test1() throws InterruptedException {
  login();
}   

 @Test
 public void test2() throws InterruptedException {
  login();
 }  

 @Test
 public void test3() throws InterruptedException {
  login();
 }  

 @Test
public void test4() throws InterruptedException {
  login();
 }  
 @Test
 public void test5() throws InterruptedException {
  login();
 }  
}

================================================================

Test class 2

     package com.ms.gridDemo.test;

   import org.testng.annotations.Test;

import com.ms.gridDemo.test.AbstractTest;

  public class LoginTest2 extends AbstractTest {
  @Test
  public void test6() throws InterruptedException {
  login();
 }  

  @Test
 public void test7() throws InterruptedException {
  login();
  } 

  @Test
 public void test8() throws InterruptedException {
  login();
 }  

  @Test
  public void test9() throws InterruptedException {
  login();
    }   
  @Test
 public void test10() throws InterruptedException {
  login();
 }  
     }

Upvotes: 0

Views: 3003

Answers (1)

niharika_neo
niharika_neo

Reputation: 8531

Your driver object is in your class. The same object gets initialized when each of your tests run. When you run sequentially, that's alright since at one point of time only one driver is being used. But with parallel methods running, as soon as the second test begins, the first driver reference is lost and your first test also starts looking at your second test's driver reference. Try exploring Threadlocal for parallel runs.

Upvotes: 3

Related Questions