java - 尝试提取嵌套 iframe 的 src 属性时出现陈旧元素引用异常

标签 java selenium

我正在尝试获取所有嵌套 iframe 的 src 属性,但出现过时引用异常。这是代码

public class findAllSources {

    ArrayList<String> sources = new ArrayList<String>();

    @Test
    public void iframeTest() {
        System.setProperty("webdriver.chrome.driver", "path to chrome driver");
        ChromeDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://www.engadget.com/");
        List<WebElement> allFrames = driver.findElements(By.xpath("//iframe[not(contains(@style,'display:none'))]"));
        for (WebElement frame : allFrames) {
            if(frame.isDisplayed()){
                    System.out.println("We clicked frame "+frame);
                    System.out.println(" with a source  "+frame.getAttribute("src"));
                    sources.add(frame.getAttribute("src"));
                    driver.switchTo().frame(frame);
                    findDeeperFrames(driver); 
                    driver.switchTo().defaultContent();
            }
        }
    }

    public void findDeeperFrames(ChromeDriver driver){

        List<WebElement> deeperFrames = driver.findElements(By.xpath("//iframe[not(contains(@style,'display:none'))]"));
        for (WebElement nframe: deeperFrames) {
            if (nframe.isDisplayed()){

                if (!nframe.getAttribute("src").isEmpty()){
                sources.add(nframe.getAttribute("src"));
                System.out.println("Nested source "+ nframe.getAttribute("src"));}

                 driver.switchTo().frame(nframe);
                 findDeeperFrames(driver);
                 //getting out of the frame
                driver.switchTo().defaultContent();
            }
        }
    }
}

还有其他方法可以实现我的目标吗?

最佳答案

当我尝试与 iframe(存储为 WebElement 变量)交互时,我遇到了相同的 StaleElementReferenceException,它实际上在页面上仍然可见,所以我不知道是什么导致了问题。原因是,首先,我将 iframe 存储为变量,之后,我使用 driver.switchTo().frame(thatFrame); 切换到该框架(与框架内的元素进行交互) ,但在我想再次与框架本身交互之前,我从未使用 driver.switchTo().defaultContent(); 切换回原始主框架。而“从内部”框架来看,实际的框架 DOM 元素是一个过时的对象(未附加到内部框架的 DOM)。

也许不是您问题的确切答案,只是为那些搜索此异常和框架的人提供注释。

关于java - 尝试提取嵌套 iframe 的 src 属性时出现陈旧元素引用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43164526/

相关文章:

Java:存储到内存+数字

java - 为什么 == 对 String 不起作用?

python - Selenium 留下正在运行的进程?

selenium - 自动化测试时是先写测试脚本再写测试用例还是相反?

python - 在消息列表中查找最新消息

python - 如何使用 PhantomJS 在 Selenium Webdriver 中用文本填充 <p> 标记?

如何创建泛型java数组

Java - 从二维数组列表读取数据时遇到问题

java - 使用 Java 进行非对称文件加密

javascript - 使用 Splinter/Selenium [Python] 与 iFrame 交互