简体   繁体   中英

Can't select an Iframe in selenium webdriver

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>

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

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.

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.

We can also get an element using locator to that iframe then switch to iframe using that element. more info here

// Store the web element
const iframe = driver.findElement(By.css('#modal > iframe'));

// Switch to the frame
await driver.switchTo().frame(iframe);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM