2017-04-02 57 views
0

我试图让所有在嵌套的iframe的SRC属性的src属性但我正在逐渐陈旧参考exception.Here是代码获得旧元素引用异常,同时试图提取在嵌套的iframe

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(); 
      } 
     } 
    } 
} 

是否有任何我可以实现我的目标的其他方法?

回答

0

更新:

您的代码返回StaleExcceptionError,因为使用driver.switchTo().defaultContent();您的代码后,进入其依然采用allFrames webElement列表for循环的下一次迭代这是最初存储的切换到新的框架和那些元素之前不再附加到DOM。因此,为了避免你不得不再次确定该帧的名单,如下图所示:

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


for (int j=1; j<=deeperFrames.size(); j++) { 


      List<WebElement> myFrames = driver.findElements(By.xpath("//iframe")); 

      WebElement nframe = myFrames.get(j-1); 


      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(); 

      } 
} 
+0

我得到同样的错误此代码太 –

+0

陈旧的例外是当您尝试切换到另一个框架orwindow然后经过切换回原来的窗口;您尝试使用之前在切换之前存储的webelements,哪条线会引发您该错误? – kushal

+0

如果(nframe.isDisplayed()){} –