<head>...</head><body> <frameset id="mainFrameSet">
...
<frameset id="main" ...>
...
<frame id="navigationFrame" src="navigationMonitor.htm?devId=4"...> #document <html> <head>...</head> <body> <div id="navigationTree">...</div> </body> </html> </frame>
</frameset> </frameset></body></html> # just logged in so...
# wait until main frame set is visible wait.until(EC.visibility_of_element_located((By.ID, 'mainFrameSet')))
# list all the frames in DOM
# this works as expected and lists all frames in DOM for frame in driver.find_elements_by_tag_name('frame'): log_msg('f name: {}'.format(frame.get_attribute('name')))
# get nested div element but if fails due to #document 'element' wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'navigationFrame'))) driver.find_element_by_id('navigationTree')
1579834426.5536537 f name: tabArea1579834426.5623124 f name: sensorInfo1579834426.569566 f name: monitorInfo1579834426.57814 f name: deviceStatus1579834426.588289 f name: navigationFrame1579834426.5970855 f name: detailArea1579834426.6044142 f name: activeEventsArea1579834426.6769533 driver failedTraceback (most recent call last): File "./test_unity_navigation_with_chrome.py", line 291, in <module> test_login() File "./test_unity_navigation_with_chrome.py", line 279, in test_login login_unity() File "./test_unity_navigation_with_chrome.py", line 74, in login_unity driver.find_element_by_id('navigationTree') File "/home/phawkins/devel/work/rf/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 360, in find_element_by_id return self.find_element(by=By.ID, value=id_) File "/home/phawkins/devel/work/rf/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element 'value': value})['value'] File "/home/phawkins/devel/work/rf/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/home/phawkins/devel/work/rf/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace)selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="navigationTree"]"} (Session info: chrome=79.0.3945.130)
Tool | Version | Path-------------+--------------------+------------------------------------- Linux Dist | Ubuntu 18.04.3 LTS | NALinux Kernel | 4.15.0-58-generic | NA Git commit | 2173279a | NA Python | 3.6.8 | /home/phawkins/devel/work/rf/bin/python RF | 3.2b1 | /home/phawkins/devel/work/rf/bin/robot RF Selenium | 4.1.0 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages RF Requests | 0.6.3 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages Selenium | 3.141.0 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages Requests | 2.22.0 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages Net-SNMP | 5.7.3 | /usr/bin/snmpget Easysnmp | 0.2.5 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages Poster | 0.8.1 | /home/phawkins/devel/work/rf/lib/python3.6/site-packages Chrome | 79.0.3945.130 | /usr/bin/google-chromechromedriver | 79.0.3945.36 | /home/phawkins/devel/work/rf/bin/chromedriver Firefox | 72.0.1 | /usr/bin/firefox Geckodriver | 0.26.0 | /home/phawkins/devel/work/rf/bin/geckodriver------------------------------------------------------------------------
# driver, wait, and EC are global and set in another method
def login_unity(): # find login fields and input credentials log_msg('wait for login box, enter creds, login') log_in_btn = wait.until(EC.element_to_be_clickable((By.ID, 'login'))) user = driver.find_element_by_id('username') pw = driver.find_element_by_id('password') user.send_keys(g_user) pw.send_keys(g_pw) log_in_btn.click()
log_msg('wait until top frameset is visible') wait.until(EC.visibility_of_element_located((By.ID, 'mainFrameSet'))) driver.switch_to_default_content()
log_msg('switch to nested frame') wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'navigationFrame')))
log_msg('find element in frame content') link_element = wait.until(EC.presence_of_element_located((By.ID, 'report164160')))
# above was change that made it work instead of just a find_element_by_id()
log_msg('click link') link_element.click()