javascript selenium selenium-webdriver iframe protractor

javascript - Maneras de tratar con#document bajo iframe



selenium selenium-webdriver (2)

Para el portal que estoy probando ahora, vine con el problema de que no pude crear ningún localizador xpath, después de un tiempo descubrí que era debido a un ''#documento'', esto corta la ruta y hace que el simple "copy xpath "para dirigir el camino a un elemento completamente diferente.

<iframe id="FRAMENAME" src="/webclient/workspace/launch-task/REMbl?ds=BP" width="100%" height="100%" frameborder="0" data-navitemname="navitemname" style="" xpath="1"> #document <html> CODE.... </html>

Encontré que la solución para esto es simplemente agregar un switchTo como este:

driver.switchTo().frame("FRAMENAME");

Esto funciona y hace que el resto del código funcione correctamente, pero se demora un poco más en procesar este comando hasta que el código se desplaza a la siguiente línea.

Así que me gustaría preguntar, ¿hay una mejor solución para esto? ¿Algo más inteligente / más rápido?

Me preocupa que cuando llegue el momento en que tengo muchos scripts, el tiempo de ejecución sea demasiado largo.

No uso los localizadores de identificación, por ejemplo, porque todos son dinámicos, por lo que a veces se requiere una xpath.

¡Gracias!


marcos en línea

De acuerdo con la documentación de 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 muestren dentro de una subventana de la ventana del navegador. Esto no significa una inclusión completa y los dos documentos son independientes, y ambos se tratan como documentos completos, en lugar de tratar uno como parte del otro.

iframe estructura y detalles

  • Generalmente, un elemento iframe está en la forma de:

    <iframe src="URL" more attributes> alternative content for browsers which do not support iframe </iframe>

  • Los navegadores que admiten iframe muestran el documento al que hace referencia la URL en una subventana, generalmente con barras de desplazamiento verticales y / o horizontales. Dichos navegadores ignoran el contenido del elemento iframe (es decir, todo lo que se encuentra entre la etiqueta de inicio <iframe...> y la etiqueta de final </iframe> ). Los navegadores que no admiten iframe (o tienen desactivada dicha compatibilidad) hacen lo contrario, es decir, procesan el contenido como si las etiquetas <iframe...> y </iframe> no estuvieran allí. Por lo tanto, el contenido importa, a pesar de ser ignorado por algunos navegadores.

  • Entonces, para resumir, los marcos en línea no significan una característica de inclusión , aunque a veces puede tener 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 la URL en el elemento iframe, y después de que el documento solicitado lo muestra dentro de un marco en línea. En este sentido, los marcos en línea son un problema conjunto entre el navegador y el servidor, pero solo el navegador debe ser específicamente consciente de los marcos; Desde el punto de vista del servidor, solo hay una solicitud HTTP normal para un documento, y este envía el documento sin tener (o necesitar) ninguna idea de lo que el navegador va a hacer con él.

Algo más inteligente

De acuerdo con las mejores prácticas al cambiar a un iframe , debe inducir WebDriverWait de la siguiente manera:

  • Cambiar a través del nombre del marco (código de ejemplo de Java):

    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));

  • Cambiar a través de iframe XPath (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'']")))

  • Cambie a través de iframe CssSelector (C # Sample Code):

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));

Referencia

Puede encontrar una discusión detallada en ¿Es posible cambiar a un elemento en un marco sin usar driver.switchTo (). Frame (“frameName”) en Selenium Webdriver Java?

tl; Dr

Marcos en línea vs. marcos normales


Para trabajar con elementos dentro de iframe debe cambiar a este iframe específico.

Su solución .switchTo().frame("FRAMENAME"); es correcto. Selenium no tiene otras formas de trabajar con envoltorios de iframe .