获取陈旧元素引用:元素未附加到页面文档异常

时间:2015-04-29 10:35:40

标签: java selenium

在我的应用程序中,当我打开页面时,左侧显示选项卡列表。

默认情况下,一个选项卡处于打开状态,其他选项卡处于关闭状态,因此我希望找到打开的状态选项卡类名并单击选项卡,它已关闭,然后必须再打开另一个选项卡ID。

执行代码时,我得到"陈旧元素引用:元素未附加到页面文档" 异常。

我也试过了隐式等待选项。

任何人都可以帮助解决这个问题吗?

driver.manage().timeouts().implicitlyWait(1000,TimeUnit.SECONDS);

                  WebElement element5 = driver.findElement(By.className("TopItemActive"));
                  if(element5.isEnabled())
                  {
                  element5.click();
                  }

                  driver.manage().timeouts().implicitlyWait(2000,TimeUnit.SECONDS);
                WebElement element6 = driver.findElement(By.id("id_16_cell"));        
                element6.click();
                System.out.println("Tab opened");

1 个答案:

答案 0 :(得分:2)

我的猜测是您的标签是使用JavaScript创建和删除的。 Webdriver的作用是下载网页并将其存储在实例中。如果由于javascript webdriver不会改变某些东西而不知道它。

这可以作为一个简单的解决方案

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(by)));

我发现的是有很多事要做。我抓住异常抛出并再试一次。所以我为&#34创建了一个新功能;点击"

public String click(By by){

   String text = "";

   driver.manage().timeouts().implicitlyWait( 5, TimeUnit.SECONDS );
   boolean unfound = true;
   int tries = 0;
   while ( unfound && tries < 3 ) {
     tries += 1;
     try {
       wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfElementLocated(by)));
       text = driver.findElement(by).click();
       unfound = false;
       logger.info("Click element "+stripBy(by));
     } catch ( StaleElementReferenceException ser ) {
       logger.error( "ERROR: Stale element exception. " + stripBy(by) );
     } catch ( NoSuchElementException nse ) {
       logger.error( "ERROR: No such element exception. " + stripBy(by)+"\nError: "+nse );
     } catch ( Exception e ) {
       logger.error( e.getMessage() );
     }
   }

   if(unfound)
   Assert.assertTrue(false,"Failed to locate element by locator " + stripBy(by));

   return text;

}