Python Selenium (a la espera de un marco, búsqueda de elementos)

Tengo estos incluye:

from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.keys import Keys 

Configuración del navegador a través de

 browser = webdriver.Firefox() browser.get(loginURL) 

Sin embargo a veces lo hago

 browser.switch_to_frame("nameofframe") 

Y no funcionará (a veces lo hace, a veces no lo hace).

No estoy seguro de si esto se debe a que Selenium en realidad no está esperando a que se carguen las páginas antes de ejecutar el rest del código o qué. ¿Hay alguna manera de forzar la carga de una página web?

Porque a veces voy a hacer algo como

 browser.find_element_by_name("txtPassword").send_keys(password + Keys.RETURN) #sends login information, goes to next page and clicks on Relevant Link Text browser.find_element_by_partial_link_text("Relevant Link Text").click() 

Y funcionará muy bien la mayor parte del tiempo, pero a veces obtengo un error donde no puede encontrar el “Texto de enlace relevante” porque no puede “verlo” o alguna otra cosa similar.

Además, ¿hay una mejor manera de verificar si un elemento existe o no? Es decir, cuál es la mejor manera de manejar:

 browser.find_element_by_id("something") 

¿Cuándo ese elemento puede o no existir?

Podrías usar WebDriverWait :

 from contextlib import closing from selenium.webdriver import Chrome as Browser from selenium.webdriver.support.ui import WebDriverWait from selenium.common.exceptions import NoSuchFrameException def frame_available_cb(frame_reference): """Return a callback that checks whether the frame is available.""" def callback(browser): try: browser.switch_to_frame(frame_reference) except NoSuchFrameException: return False else: return True return callback with closing(Browser()) as browser: browser.get(url) # wait for frame WebDriverWait(browser, timeout=10).until(frame_available_cb("frame name"))