title: Why my tests failed when do parallel testing with TestNG and Grid 2?
body: <p>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:</p>
  
  <p><code>org.openqa.selenium.WebDriverException: unknown error: cannot focus element</code></p>
  
  <p>MY Steps:</p>
  
  <p>1.Start Hub</p>
  
  <pre><code>D:\Selenium&gt;java -jar selenium-server-standalone-2.35.0.jar -role hub
  2.Start Node 1
  
  D:\Selenium&gt;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"
  </code></pre>
  
  <p>3.Start Node 2</p>
  
  <pre><code>C:\Selenium&gt;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"
  </code></pre>
  
  <p>4.Then run tests
  testng.xml
        </p>
  
  <pre><code>   &lt;!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"&gt;
  
      &lt;suite name="LoginTest" verbose="4" parallel="methods" thread-count="10"&gt;
  
  &lt;test name="Login"&gt;
      &lt;classes&gt;
          &lt;class name="com.ms.gridDemo.test.LoginTest"&gt;
          &lt;/class&gt;
      &lt;/classes&gt;
  &lt;/test&gt;
  &lt;test name="Login2"&gt;
      &lt;classes&gt;
          &lt;class name="com.ms.gridDemo.test.LoginTest2"&gt;
          &lt;/class&gt;
      &lt;/classes&gt;
  &lt;/test&gt;
  </code></pre>
  
  <h1></h1>
  
  <p>Test case base:</p>
  
  <pre><code>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("jeff.liang@ms.com");
    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&lt;WebDriver, WebElement&gt; waitFn = new Function&lt;WebDriver, WebElement&gt;() {
          @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;
      }
  }
  
   }
  </code></pre>
  
  <p>===========================================================================</p>
  
  <p>Test class 1:</p>
  
  <pre><code>  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();
   }  
  }
  </code></pre>
  
  <p>================================================================</p>
  
  <p>Test class 2</p>
  
  <pre><code>     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();
   }  
       }
  </code></pre>