2

这是我的类,其中包含我想并行执行的测试方法 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 异常。谁能告诉我要在这个片段中添加什么?

4

2 回答 2

1

包括您的数据提供者的名称,

这应该如下,

@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");

最后来解决你的问题。

如果在您最初找到 webdriver 引用后页面有任何更改,element现在将包含一个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

于 2015-12-03T14:13:33.157 回答
0

这是由于两个独立测试使用一个WebDriver实例造成的。在内部,@BeforeMethod您正在创建一个新实例driver= new FirefoxDriver();,但这会替换该字段

private WebDriver driver;

以此为例。每个线程都会创建一个新实例,但只使用最后一个实例 - 该private WebDriver driver字段当前引用的实例。您需要告诉每个测试方法保留单独的 WebDriver 实例,而不将其用作类字段。

StaleElementReferenceWebdriver 注意到页面上的某些内容发生了变化时,将引发异常。在您的情况下会发生这种情况,因为当时另一个线程正在使用同一个 WebDriver。

于 2020-06-17T09:33:09.823 回答