¿Cómo esperar adecuadamente a que un marco esté disponible en python-selenium?

Tengo una configuración de página web bastante compleja que necesito probar, que contiene marcos anidados.

En el problema real, el código de selenio está cargando nuevos contenidos de páginas web que contienen un marco, al que quiero cambiar. Para evitar esperas explícitas, probé el siguiente fragmento de código:

self.driver.switch_to_default_content()
WebDriverWait(self.driver, 300).\
        until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame1')))
WebDriverWait(self.driver, 300).\
        until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame2')))

Sin embargo, este fragmento siempre falla y da como resultado el siguiente error:

  ...
  File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
    value = method(self._driver)
  File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/expected_conditions.py", line 247, in __call__
    self.frame_locator))
  File "/home/adietz/Projects/Venv/nosetests/local/lib/python2.7/site-packages/selenium/webdriver/support/expected_conditions.py", line 402, in _find_element
    raise e
WebDriverException: Message: TypeError: can't access dead object

Sin embargo, si uso un sueño además:

time.sleep(30)
self.driver.switch_to_default_content()
WebDriverWait(self.driver, 300).\
        until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame1')))
WebDriverWait(self.driver, 300).\
        until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'frame2')))

selenium puede encontrar el marco dentro del marco y cambiar a él. Parece que en el caso de error, selenium cambia a 'frame1' mientras 'frame2' aún no está cargado, pero 'frame2' se carga en alguna otra instancia de 'frame1', o no es reconocido por selenium (¿tal vez un error?). Así que ahora el selenio está dentro de un 'frame1' y por alguna razón no se da cuenta de que el 'frame2' ha sido cargado.

La única forma en que puedo solucionar esto (sin usar un sueño prolongado) es usando este feo código:

    mustend = time.time() + 300
    while time.time() < mustend:
        try:
            self.driver.switch_to_default_content()
            self.driver.switch_to.frame(self.driver.find_element_by_id("frame1"))
            self.driver.switch_to.frame(self.driver.find_element_by_id("frame2"))               
            break
        except WebDriverException as e:
            self.log("Sleeping 1 sec")
            time.sleep(1)
    if time.time() > mustend:
        raise TimeoutException

Entonces cada vez que recibo unWebDriverException (objeto muerto), voy al cuadro de nivel superior e intento cambiar al cuadro interno, cuadro por cuadro.

¿Hay algún otro enfoque que pueda probar?

Información Adicional

Los iframes están anidados, es decir, 'frame2' está dentro de 'frame1'.

Respuestas a la pregunta(2)

Su respuesta a la pregunta