如何解决“过时的元素参考:导航到上一页时元素未附加到页面文档”

时间:2018-10-17 12:26:39

标签: java selenium selenium-webdriver

我的页面上有图标,该图标可能在该页面上多次出现。我想单击该图标,截图,然后返回上一页并单击其他图标,然后执行相同的操作:我正在

  

过时的元素参考:元素未附加到页面文档

导航到上一页时”。 下面是我的代码:

List<WebElement> List = driver.findElements(Loc_AttachmentIcon);

for (WebElement e : List) {             
    if(e.getText().contains(".JPG")) {
        e.click();  
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        // Now you can do whatever you need to do with it, for example copy somewhere
        FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
        driver.navigate().back();
    }

    else if(e.getText().contains(".jpg")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".png")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".PNG")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".gif")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".GIF")) {
        System.out.println("Contains Jpg file");
    }
    else {
        e.click();
    }
}

2 个答案:

答案 0 :(得分:1)

您需要在每次迭代中重新定位元素。您可以使用索引来跟踪进度

int size = driver.findElements(Loc_AttachmentIcon).size();

for (int i = 0 ; i < size ; i++) {
    List<WebElement> list = driver.findElements(Loc_AttachmentIcon);
    WebElement e = list.get(i);

    if(e.getText().contains(".JPG")) {
        //...
    }
} 

答案 1 :(得分:0)

在findelements中找到的

元素引用并绑定到特定的已加载页面。如果我们导航到另一页面或刷新同一页面。为元素存储的引用无效。这些元素由于重新加载页面而失效。因此,您最终遇到了StaleElementException。 请阅读this有关StaleElement的更多详细信息。

在这种情况下,当页面导航发生时,我们必须使用定位符而不是元素进行迭代。

我假设您的图标具有以下html DOM,并使用xpath进行定位。

<a href="link to the icon.png" > Some Icon <a> 

您的代码可以重写为

int iconCount = driver.findElements(By.xpath("//a[href]")).size();
for (int i = 1; i < iconCount; i++) {
    WebElement e = driver.findElement(By.xpath("(//a[href])["+i+"]"));
    if(e.getText().contains(".JPG")) {
        e.click();
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        // Now you can do whatever you need to do with it, for example copy somewhere
        FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
        driver.navigate().back();
    }
    else if(e.getText().contains(".jpg")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".png")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".PNG")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".gif")) {
        System.out.println("Contains Jpg file");
    }
    else if(e.getText().contains(".GIF")) {
        System.out.println("Contains Jpg file");
    }
}