¿Cómo puedo seleccionar un elemento html sin importar en qué marco se encuentre en selenium?

Estoy tratando de seleccionar un elemento que reside dentro de un iframe y probablemente en otros iframes.

¿Es posible de alguna manera seleccionar un elemento dentro de algún (sub) iframe en (python) selenium sin seleccionar los iframes antes? ¿Hay alguna manera de “pasar” sobre cada iframe de alguna manera y de verificar dónde encontrar mi elemento …?

¿Y cómo hacer eso en el caso de los elementos y las cosas html e iframes que podrían ser cargados …?

No , no es posible interactuar con ningún WebElement dentro de un iframe través de Selenium sin cambiar al iframe respectivo.

Razón:

Cuando se carga una página, el enfoque de Selenium por defecto permanece en la Top Window . La Top Window contiene los otros iframes y los framesets . Entonces, cuando necesitamos interactuar con un WebElement que está dentro de un iframe, tenemos que cambiar al iframe respectivo a través de uno de los métodos mencionados a continuación:

Métodos de cambio de marco:

Podemos cambiar a los marcos por 3 formas.

Por nombre de cuadro :

Name atributo de iframe a través del cual podemos cambiarlo.

Ejemplo:

 driver.switch_to.frame("iframe_name") 

Por ID de cuadro :

Atributo de ID del iframe a través del cual podemos cambiarlo.

Ejemplo:

 driver.switch_to.frame("iframe_id") 

Por índice de cuadros :

Supongamos que si hay 10 marcos en la página, podemos cambiar al iframe usando el índice.

Ejemplo:

 driver.switch_to.frame(0) driver.switch_to.frame(1) 

Volviendo al marco principal :

Podemos volver al marco principal utilizando default_content() o parent_frame()

Ejemplo:

 driver.switch_to.default_content() driver.switch_to.parent_frame() 

Un mejor enfoque para cambiar de marcos:

Una mejor manera de cambiar los marcos será inducir a WebDriverWait por la disponibilidad del marco deseado con las condiciones expected_conditions establecidas en frame_to_be_available_and_switch_to_it siguiente manera:

  • A través de Frame ID :

     WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID,"id_of_iframe")) 
  • A través del Frame Name :

     WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"name_of_iframe")) 
  • A través del Frame Xpath :

     WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.XPATH,"xpath_of_iframe")) 
  • A través del Frame CSS :

     WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.CSS_SELECTOR,"css_of_iframe")) 

Escribir tu propio buscador recursivo debería ser bastante fácil. Disculpas, no sé python pero en Java sería algo así como:

 public void findInAllFrames(WebElement e, String targetIdStr) { List l = e.findElements(By.tagName("iframe")); for(int inx=0; inx targets = l.get(inx).findElements(By.id(targetIdStr)); if(targets.size()>0) { // Do something with your targets } findInAllFrames(l.get(inx), targetIdStr); } }