这是我的包含Test方法f()的类,我想并行执行它。数据提供者为测试方法提供输入。
public class DemoTest {
private WebDriver driver;
@Test(dataProvider = "dp")
public void f(Integer n, String s) {
try {
driver.get("www.google.com");
driver.findElement(By.id("lst-ib")).sendKeys("1234567");
System.out.println("method f id:"+Thread.currentThread().getId()+" n:"+n+" s:"+s);
}
catch(Exception e) {
e.printStackTrace();
}
}
@BeforeSuite
public void beforeMethod() {
try {
driver= new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
System.out.println("Before method id:"+Thread.currentThread().getId());
}
catch (Exception e) {
e.printStackTrace();
}
}
@AfterSuite
public void afterMethod() {
try {
System.out.println("After method id:"+Thread.currentThread().getId());
if(driver != null ) {
driver.quit();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
@DataProvider(parallel=true)
public Object[][] dp() {
return new Object[][] {
new Object[] { 1, "a" },
new Object[] { 2, "b" },
new Object[] { 3, "c" },
new Object[] { 4, "d" },
};
}
}
这是testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite" parallel="methods" data-provider-thread-count="2">
<test name="prelogin">
<classes>
<class name="com.package.DemoTest"></class>
</classes>
</test>
</suite>
我想平行地在2个线程中执行测试f()。 我在findElement方法的一次迭代中获得了Stale Element Reference异常。 有谁能告诉我这个片段会添加什么内容?
答案 0 :(得分:0)
包括您的数据提供商的名称,
这应该如下,
@DataProvider(name = "dp" , parallel=true)
public Object[][] dp() {
return new Object[][] {
new Object[] { 1, "a" },
new Object[] { 2, "b" },
new Object[] { 3, "c" },
new Object[] { 4, "d" },
};
}
并且你的driver.get应该是
driver.get("https://www.google.co.in");
终于解决了你的问题。
如果在您最初找到element
之后页面有任何更改,则webdriver引用现在将包含stale
引用。随着页面的更改,元素将不再是webdriver
期望的位置。
要解决您的问题,请在每次需要使用时尝试查找元素 - 编写一个可以调用的小方法,以及何时使用它。
private void clickAnElementByLinkText(String id) {
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id(id)));
driver.findElement(By.id(id)).sendKeys("1234567");
}
@Test(dataProvider = "dp")
public void f(Integer n, String s) {
try {
driver.get("https://www.google.co.in");
clickAnElementByLinkText("lst-ib");
System.out.println("method f id:"+Thread.currentThread().getId()+" n:"+n+" s:"+s);
}
catch(Exception e) {
e.printStackTrace();
}
}
现在你不会看到Stale Element Reference exception
答案 1 :(得分:0)
这是由两个独立测试使用一个WebDriver
实例引起的。在@BeforeMethod
内部,您正在通过driver= new FirefoxDriver();
创建一个新实例,但这将替换字段
private WebDriver driver;
通过此实例。每个线程都会创建一个新实例,但是仅使用最后一个实例-private WebDriver driver
字段当前引用的实例。您需要告诉每个测试方法保留单独的WebDriver实例,而不要将其用作类字段。
当Webdriver注意到页面上的某些内容已更改时,将引发StaleElementReference
异常。在您的情况下会发生这种情况,因为此时另一个线程正在使用同一WebDriver。