Reputation: 1
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
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