Esta es la respuesta más válida que te podemos compartir, pero obsérvala pausadamente y valora si es compatible a tu trabajo.
Solución:
Para trabajar con elementos dentro iframe
debe cambiar a este específico iframe
.
Tu solución .switchTo().frame("FRAMENAME");
es correcto. Selenium no tiene otras formas de trabajar con iframe
envoltorios
marcos en línea
Según la documentación en Uso de marcos en línea, un marco en línea es una construcción que incrusta un documento en un documento HTML para que los datos incrustados se muestran dentro de una subventana de la ventana del navegador. Esto no significa una inclusión total y los dos documentos son independientes, y ambos se tratan como documentos completos, en lugar de tratarse uno como parte del otro.
estructura iframe y detalles
-
Generalmente, un elemento iframe está en forma de:
-
Los navegadores que admiten iframe muestran el documento al que hace referencia la URL en una subventana, normalmente con barras de desplazamiento verticales u horizontales. Dichos navegadores ignoran el contenido del elemento iframe (es decir, todo entre la etiqueta de inicio
y la etiqueta final). Los navegadores que no son compatibles con iframe (o tienen dicho soporte deshabilitado) hacen lo contrario, es decir, procesan el contenido como si el
ylas etiquetas no estaban allí. Por lo tanto, el contenido importa, a pesar de que algunos navegadores lo ignoran.
-
Entonces, para resumir, los marcos en línea no significan un incluir característica, aunque a veces puede servir para propósitos similares.
-
Tenga en cuenta que, cuando se utilizan marcos en línea, el navegador (si los admite) envía una solicitud al servidor al que hace referencia el
URL
en el elemento iframe, y después de obtener el documento solicitado, lo muestra dentro de un marco en línea. En este sentido, los marcos en línea son un problema conjunto del navegador y el servidor, pero solo el navegador debe ser específicamente consciente de iframe; desde el punto de vista del servidor, solo hay una solicitud HTTP normal para un documento, y envía el documento sin tener (o necesitar) ninguna idea de lo que el navegador va a hacer con él.
Algo más inteligente
según el mejores prácticas mientras cambia a un iframe necesitas inducir WebDriverWait como sigue:
-
Cambiar a través Nombre del marco (Código de muestra de Java):
new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
-
Cambiar a través iframeXPath (Código de muestra de Python):
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='ptifrmtgtframe' and @name='TargetContent']")))
-
Cambiar a través iframeSelectorCss (Código de ejemplo de C#):
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));
Referencia
Puede encontrar un par de discusiones relevantes en:
- Pitón: ¿Cómo puedo seleccionar un elemento html sin importar en qué marco se encuentre en Selenium?
- Java: ¿Es posible cambiar a un elemento en un marco sin usar driver.switchTo().frame(“frameName”) en Selenium Webdriver Java?
- C#: ¿Cómo esperar a que se cargue un marco antes de ubicar un elemento?
tl; Dr
Marcos en línea frente a marcos normales
Acuérdate de que tienes la capacidad de aclarar si diste con el hallazgo.