Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Selenium switch into an iframe within an iframe

I am trying to access an iframe within an iframe using Selenium, Python, and BS4

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import html5lib

driver = webdriver.Firefox()
driver.implicitly_wait(10)

driver.get('http://myurl.com')
try:
    time.sleep(4)
    iframe = driver.find_elements_by_tag_name('iframe')[0]
    driver.switch_to_default_content()

    driver.switch_to_frame(iframe)
    driver.switch_to_default_content()
    driver.find_elements_by_tag_name('iframe')[0]

    output = driver.page_source

    print output

finally:
    driver.quit();

Within the returned text, there appears to be two more iframes. How would I access those? I have attempted in the code above without success.

like image 219
Alpinestar22 Avatar asked Apr 25 '14 20:04

Alpinestar22


People also ask

How do I switch to nested iframe in Selenium?

To work with different nested iframes, we can use the method switchTo() to switch the frames using Index, Name, or Id & Web Element. Moreover, you can switch to immediate parent iframe using method switchTo(). parentFrame(). You can switch to the main web page from child iframe using method switchTo().

How do I switch back from iframe?

We have to come out of the iframe. To move back to the parent frame, you can either use switchTo(). parentFrame() or if you want to get back to the main (or most parent) frame, you can use switchTo(). defaultContent();

Can we interact with elements inside iframes without switching to it?

Interact with elements of Nested iFrames If an iFrame has another iFrame, then we call it as nested iFrame. In such a case, we need to switch to iFrame within the iFrame. The content of nested iFrame is only available from inside an iFrame. We can't access elements from outside the iFrame.


1 Answers

switch_to_default_content() will return you to the top of the document. What was happening is you switched into the first iframe, switched back to the top of the document, then tried to find the second iframe. Selenium can't find the second iframe, because it's inside of the first iframe.

If you remove the second switch_to_default_content() you should be fine:

iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to.default_content()

driver.switch_to.frame(iframe)
driver.find_elements_by_tag_name('iframe')[0]
like image 133
Richard Avatar answered Dec 08 '22 22:12

Richard