2

New to python selenium here, what is the best way of switching between these iframes after clicks or page/popup loads?

I seem to have to use default_content to get back to the parent iframe, then switch into each iframe individually, to find the element I need after virtually every click or submit action. Here is a piece of my script, if I don't do the iframe switching like this, it will fail to find the element that follow. Surely there is a better way to do this, right? TIA!

##locates iframes to get into patient search frame, enters lastname, waits, submits, waits
seq = driver.find_elements(By.TAG_NAME, 'MSMainIntro')
driver.switch_to.frame("MSMainIntro")
driver.switch_to.frame("MainFrame")
driver.switch_to.frame("PtSrchFrame")
driver.find_element(By.XPATH, '//*[@id="ClinicSrch"]/input[1]').send_keys("able")
driver.implicitly_wait(3)
driver.find_element(By.NAME, "Search").click()
driver.implicitly_wait(2)

##clicks on patient, waits
driver.find_element(By.XPATH, '//*[@id="tb1"]/tbody/tr/td[1]/span').click()
driver.implicitly_wait(3)

##need to use default_context to get back to parent iframe after page load
driver.switch_to.default_content()

##switch to main iframes, expand patient chart
driver.switch_to.frame("MSMainIntro")
driver.switch_to.frame("MainFrame")
driver.find_element(By.XPATH, '//*[@id="headerDiv"]/div[2]/span[1]').click()
driver.implicitly_wait(5)

##switch back to problemframe, click add button, waits
driver.switch_to.default_content()
driver.switch_to.frame("MSMainIntro")
driver.switch_to.frame("MainFrame")
driver.switch_to.frame("ProblemFrame")
driver.find_element(By.XPATH, '//*[@id="ContentPlaceHolder1_btnAdd"]').click()
driver.implicitly_wait(3)

##switch to parent iframe, go into iframe for add problem
driver.switch_to.default_content()
driver.switch_to.frame("MSMainIntro")
driver.switch_to.frame("MainFrame")
driver.switch_to.frame("pntChartPopupFrame")

## enters search criteria, click search, waits
driver.find_element(By.XPATH, '//*[@id="SearchTb"]/tbody/tr[1]/td[2]/input[1]').send_keys("blood")
driver.find_element(By.XPATH, '//*[@id="SearchTb"]/tbody/tr[2]/td[2]/input').click()
driver.implicitly_wait(2)
WeDoneLost
  • 21
  • 2
  • the question needs sufficient code for a minimal reproducible example: https://stackoverflow.com/help/minimal-reproducible-example – D.L Sep 03 '22 at 00:39

0 Answers0