我正在尝试获取所有嵌套 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/