2

これは、並行して実行したい 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> 

テスト f() を 2 つのスレッドで並列に実行したい。findElement メソッドの 1 回の繰り返しで古い要素参照の例外が発生します。このスニペットに何を追加するのか誰か教えてもらえますか?

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

そして最後にあなたの問題に来ます。

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

于 2015-12-03T14:13:33.157 に答える