2012-07-13 59 views
0

我正在使用Selenium 2/WebDriver进行自动化。我有一张桌子,并试图在其中选择一行。当测试运行时,我可以看到成为该行强调,如果它被点击,但随即我得到:在表中选择一行并获取“元素不再附加到DOM”WebDriver中的StaleElementReferenceException消息

“org.openqa.selenium.StaleElementReferenceException:元素不再附加到DOM”

错误和测试失败。

的代码如下:

@Test 
public void rowSelection() throws Exception 
{ 
    SeleniumHelper helper = new SeleniumHelper(); 
    action = new SeleniumActionHelper(driver); 

    helper.login(); 

    String testUrl = navigateToUrl("option/listOptions.xhtml"); 
    driver.get(testUrl); 

    WebElement table = findElementById("tableSection:dataTableWrapped_data"); 
    List<WebElement> allRows = table.findElements(By.tagName("tr")); 
    for (WebElement row : allRows) 
     { 
      List<WebElement> cells = row.findElements(By.tagName("td")); 
      for (WebElement cell : cells) 
      { 
       WebElement listName = cell.findElement(By.xpath("./*[text()='body_build']")); 
       listName.click(); 
      } 
     } 
} 

我已经把了Thread.sleep(2000)在正面和listName.click()动作后,但也提供了帮助。任何帮助将不胜感激。

+0

单击元素时,DOM树中的某些内容会发生明显变化,并且记忆元素的某些(或全部 - 取决于DOM更改)会被无效/移动。迭代向后帮助?如果不是,您唯一能做的就是一次找到一个元素 - 为它编写XPath表达式并不难。 – 2012-07-13 20:28:34

+0

这就是我对此非常困惑的地方。在启动.click()的行上,在测试失败之前,会突出显示一秒钟。如果未点击该行,则该行无法突出显示。这也是唯一采取的行动。我正在加载页面,接下来是查找并单击表格中的行。 – squeemish 2012-07-13 21:01:59

+0

是的!它点击第一个元素,没关系。然后它在第二个应该被点击的元素上失败,因为'cells'现在拥有无效的'td'引用。 – 2012-07-13 21:05:29

回答

0

如果你认为这是一个同步问题,您可以使用wait.until

WebElement webElement = wait.until(ExpectedConditions.visibilityOf(listName)); 

webElement.click();

如果在执行点击操作时定位器发生了变化,并且有一个断点并检查您的应用程序。如果是这样,你必须考虑一个更好的定位器。

相关问题