45

How would I switch to this iframe in selenium knowing only

<iframe name="Dialogue Window">
Asclepius
  • 57,944
  • 17
  • 167
  • 143
Sarah H.
  • 581
  • 1
  • 5
  • 13

3 Answers3

111

You can use an XPath to locate the <iframe>:

iframe = driver.find_element_by_xpath("//iframe[@name='Dialogue Window']")

Then switch_to the <iframe>:

driver.switch_to.frame(iframe)

Here's how to switch back to the default content (out of the <iframe>):

driver.switch_to.default_content()
Asclepius
  • 57,944
  • 17
  • 167
  • 143
budi
  • 6,351
  • 10
  • 55
  • 80
  • 2
    Good general solution, especially if the iframe has to be targeted by something other than a `name` - which is really the only way that [the selenium docs](http://selenium-python.readthedocs.io/navigating.html#moving-between-windows-and-frames) specify transitioning – kevlarr Jan 18 '18 at 20:53
  • Works perfectly at last! After I have been researching a lot about why I can't find certain elements in the browser. I have been getting NoSuchElementException error before. I didn't realise that I need to switch to another iframe. Thanks! – toking May 04 '23 at 12:43
33

As per the HTML of the <iframe> element, it has the name attribute set as Dialogue Window. So to switch within the <iframe> you need to use the switch_to() method and you can use either of the following approaches:

  • Using the name attribute of the <iframe> node as follows:

    # driver.switch_to.frame(‘frame_name’)
    driver.switch_to.frame("Dialogue Window")
    
  • Using the <iframe> WebElement identified through name attribute as follows:

    driver.switch_to.frame(driver.find_element_by_name('Dialogue Window'))
    
  • Using the <iframe> WebElement identified through as follows:

    driver.switch_to.frame(driver.find_element_by_css_selector("iframe[name='Dialogue Window']"))
    
  • Using the <iframe> WebElement identified through as follows:

    driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@name='Dialogue Window']"))
    

Ideally, you should induce WebDriverWait inconjunction with expected_conditions as frame_to_be_available_and_switch_to_it() for the desired frame as follows:

  • Using NAME:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.NAME,"Dialogue Window"))) 
    
  • Using CSS_SELECTOR:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name='Dialogue Window']")))
    
  • Using XPATH:

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@name='Dialogue Window']")))
    

Switching back from frame

  • To switch back to the Parent Frame you can use the following line of code:

    driver.switch_to.parent_frame()
    
  • To switch back to the Top Level Browsing Context / Top Window you can use the following line of code:

    driver.switch_to.default_content()
    

tl; dr

Ways to deal with #document under iframe

Smart Manoj
  • 5,230
  • 4
  • 34
  • 59
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
-2

I have resolved this issue in Python-Selenium. Please use the below code:

srtHandle = driver.window_handles
driver.switch_to_window(srtHandle[0])

Then switch to the frame in which the element is located.

Josef
  • 2,869
  • 2
  • 22
  • 23