I am new to Selenium for Python and was trying to locate element in multiple iframes. This is the DOM element I can see.
As per the HTML you have shared to retrieve the id of the body tag of the second child <frame>
you can use the following code :
# Switch to the first iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@src='BuyFlow.aspx']")))
# Fill in Address and ZipCode inputbox and submit form
address_input.send_keys(address)
postcode_input.send_keys(postcode)
postcode_input.send_keys(Keys.RETURN)
# Check Available - Inner iframe
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"CreativeLiftFrame")))
print(WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body'))).get_attribute("id"))
In general, when navigating frames in Selenium, the following method is probably most reliable.
On every single frame change, go back to the root frame, or default:
driver.switch_to.default_content()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//Some XPATH here')))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '//Some Xpath here')))
In your case, switch to default, then switch to first child, then next child, and so on. On the next frame switch, repeat this - first to default, then to 1st child, etc.
I'd also add the you are searching for frames by tag_name, which is not very specific. How many tags with that tag_name are there in the whole document?
If there really is no unique id
or name
on that frame, you can search by the frame's src
using something like this:
By.XPath("//iframe[contains(@src,'<src url here')]")