如何使用java在Selenium WebDriver中处理iframe

时间:2012-03-30 12:27:25

标签: java selenium iframe selenium-webdriver

<div>    
  <iframe id="cq-cf-frame ">    
    <iframe id="gen367">   
      <body spellcheck="false" id="CQrte" style="height: 255px; font-size: 12px; font-family:tahoma,arial,helvetica,sans-serif; background-image: url(&quot;/libs/cq/ui/widgets/themes/default/ext/form/text-bg.gif&quot;); background-repeat: repeat-x; background-attachment: fixed;">
        <p>4t43t4<br></p>
      </body >
    </iframe>
  </iframe>    
</div> 

在这种情况下,iframe下有iframe。我必须选择外部iframe转到内部iframe并写入内部iframe中的正文。

接下来,我必须从内部iframe向外iframe出来,然后点击确定按钮(位于外部iframe)。

以下是我的代码

/*Line 1 */ driver.switchTo().frame("cq-cf-frame");
/*     2 */ driver.findElement(By.css("#extdd-9 > div.tblRow >  input.edititem").click();
/*     3 */ driver.switchTo().Frame("cq-gen379");
/*     4 */ driver.findElement(By.id("CQrte").sendKeys("Tnx");  
/*     5 */ selenium.selectFrame("relative=up");       
/*     6 */ driver.findElement(By.xpath("//button[text()='OK']")).click(); 

以下是我的问题:

我的测试代码工作正常,直到第4行,即写入正文,但我想从内到外iframe,它表示找不到元素//button[text()='OK']

我尝试使用index,parent,relative,但没有运气。

注意:如果我没有选择内框(cq-gen379)。我可以点击OK按钮。

7 个答案:

答案 0 :(得分:50)

在Webdriver中,您应该使用driver.switchTo().defaultContent();离开框架。 您需要先退出所有帧,然后再次切换到外帧。

// between step 4 and step 5
// remove selenium.selectFrame("relative=up");
driver.switchTo().defaultContent(); // you are now outside both frames
driver.switchTo().frame("cq-cf-frame");
// now continue step 6
driver.findElement(By.xpath("//button[text()='OK']")).click(); 

答案 1 :(得分:35)

您必须使用以下代码退出Iframe:

driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();

希望有所帮助

答案 2 :(得分:20)

您需要先找到iframe。您可以使用以下声明来完成此操作。

WebElement iFrame= driver.findElement(By.tagName("iframe"));

然后,您可以使用switchTo对象上的WebDriver方法切换到它。

driver.switchTo().frame(iFrame);

要回到父框架,您可以使用switchTo().parentFrame(),或者如果您想要返回主(或大多数父框架)框架,可以使用switchTo().defaultContent();

driver.switchTo().parentFrame();    // to move back to parent frame
driver.switchTo().defaultContent(); // to move back to most parent or main frame

希望它有所帮助。

答案 3 :(得分:3)

要返回父框架,请使用:

driver.switchTo().parentFrame();

要返回第一个/主框架,请使用:

driver.switchTo().defaultContent();

答案 4 :(得分:3)

WebDriver driver=new FirefoxDriver();
driver.get("http://www.java-examples.com/java-string-examples");
Thread.sleep(3000);
//Switch to nested frame
driver.switchTo().frame("aswift_2").switchTo().frame("google_ads_frame3");

答案 5 :(得分:2)

以下框架处理方法:当没有嵌套框架的id或名称时

WebElement element =driver.findElement(By.xpath(".//*[@id='block-block19']//iframe"));
driver.switchTo().frame(element);
driver.findElement(By.xpath(".//[@id='carousel']/li/div/div[3]/a")).click();

答案 6 :(得分:0)

Selenium Web驱动程序处理框架
由于它是iframe,因此无法直接通过XPath点击iframe首先我们必须切换到框架,然后我们可以使用xpath点击。

driver.switchTo().frame()有多个重载。

  1. driver.switchTo().frame(name_or_id)
    这里你的iframe没有id或名字,所以不适合你。

  2. driver.switchTo().frame(index)
    这是最后一个选择的选项,因为使用索引不够稳定,你可以想象。如果这是您在页面中唯一的iframe,请尝试driver.switchTo().frame(0)

  3. driver.switchTo().frame(iframe_element)
    最常见的一个。您可以像其他元素一样找到iframe,然后将其传递给方法。

  4. driver.switchTo(). defaultContent (); [parentFrame, defaultContent, frame]

    // Based on index position:
    int frameIndex = 0;
    List<WebElement> listFrames = driver.findElements(By.tagName("iframe"));
    System.out.println("list frames   "+listFrames.size());
    driver.switchTo().frame(listFrames.get( frameIndex ));
    
    // XPath|CssPath Element:
    WebElement frameCSSPath = driver.findElement(By.cssSelector("iframe[title='Fill Quote']"));
    WebElement frameXPath = driver.findElement(By.xpath(".//iframe[1]"));
    WebElement frameTag = driver.findElement(By.tagName("iframe"));
    
    driver.switchTo().frame( frameCSSPath ); // frameXPath, frameTag
    
    
    driver.switchTo().frame("relative=up"); // focus to parent frame.
    driver.switchTo().defaultContent(); // move to the most parent or main frame
    
    // For alert's
    Alert alert = driver.switchTo().alert(); // Switch to alert pop-up
    alert.accept();
    alert.dismiss();
    

    XML测试:

    <html>
        <IFame id='1'>...       parentFrame() « context remains unchanged. <IFame1>
        |
         -> <IFrame id='2'>...  parentFrame() « Change focus to the parent context. <IFame1>
    </html>
    
    </html>
    <frameset cols="50%,50%">
        <Fame id='11'>...     defaultContent() « driver focus to top window/first frame. <html>
        |
         -> <Frame id='22'>... defaultContent() « driver focus to top window/first frame. <Fame11> 
                               frame("relative=up") « focus to parent frame. <Fame11>
    </frameset>
    </html>
    

    将RC转换为Web驱动程序Java命令。 link

    <frame>是一个HTML元素,它定义了可以显示另一个HTML文档的特定区域。应在<frameset>内使用框架。 « Deprecated 。不适用于新网站。