Can't select an Iframe in selenium webdriver

2019-01-19 22:28发布

问题:

I am trying to select an Iframe by a class name but it's not working , I am trying with tagName it works but then when I tried to type within the element in the Iframe I couldn't, could you please help me here is my code:

webDriver driver.switchTo().frame( driver.findElement( By.className( "cke_wysiwyg_frame cke_reset" ) ) );
driver.findElement( By.xpath( "//body[contains(text(),'type here')]" ) ).sendKeys( "Testing" );

And here is the HTML in my webpage:

<div id="cke_534_contents" class="cke_contents cke_reset" role="presentation" style="height: 75px;">
   <span id="cke_586" class="cke_voice_label">Press ALT 0 for help</span>
   <iframe class="cke_wysiwyg_frame cke_reset" frameborder="0" src="" style="width: 100%; height: 100%;" aria-describedby="cke_586" tabindex="0" allowtransparency="true">
      <!DOCTYPE html>
      <html lang="en-gb" dir="ltr">
         <head>
         <body class="cke_editable cke_editable_themed cke_contents_ltr cke_show_borders" contenteditable="true" spellcheck="true">
            type here
         </body>
      </html>
   </iframe>
</div>

回答1:

the problem was solved by finding the iFrame by xpath

driver.switchTo().defaultContent();
driver.switchTo().frame( driver.findElement( By.xpath( iframeXpath ) ) );

and then return to the top window:

 driver.switchTo().defaultContent();


回答2:

You cant select an iFrame using class.Check the webdriver documentation using : -

https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.TargetLocator.html

  1. You can switch to iFrame by 'Name'/'id' attribute.

    driver.switchTo().frame("frame1");
    
  2. You can switch by frame index.

    driver.switchTo().frame(driver.findElements(By.tagName("iframe").get(0));
    

Now you have to check in the whole page how many iFrames are present ?? If its say : 3, use the 3rd iFrame always.

driver.switchTo().frame(driver.findElements(By.tagName("iframe").get(3));

I hope it helps.



回答3:

Yes, there was a mistake..Ok you can do one thing..Manually count how many iframe are there in the page, if its 3rd one whre you want to switch.

Directly specify the int value as doc says,

driver.switchTo().frame(index)

So your code can become something like this : -

driver.switchTo().frame(3);

And dont forget to get back to default Content.

driver.switchTo().defaultContent();

Please let me know if that works or not.