Cómo manejar el diálogo de impresión en Selenium?

Tengo que manejar el cuadro de diálogo de impresión (el mismo que aparece al hacer clic en ctrl-p en el navegador). Intenté con:

Alert printDialog = driver.switchTo().alert(); printDialog.dismiss(); 

pero no funcionó. Además, no pude ver el asa de su ventana, porque no es una ventana …

¿Es posible manejar estos objetos y cómo?

Desafortunadamente, WebDriver no puede manejar estos (ni ningún otro navegador o cuadro de diálogo del sistema operativo). Además, tienden a verse de manera diferente en los navegadores / sistemas / configuraciones de idioma, por lo que probablemente no haya una respuesta definitiva. Tendrá que detectar y manejar todos los casos posibles para que funcione en todas partes. Sus opciones incluyen:

  • La clase Robot , le permite “presionar” programáticamente cualquier cosa en el teclado (o hacer clic a ciegas) y, por lo tanto, deshacerse del diálogo, por ejemplo, presionando Enter o Esc . Sin embargo, como se dijo anteriormente, cualquier interacción avanzada depende de OS / language / printer.

     // press Escape progtwigtically - the print dialog must have focus, obviously Robot r = new Robot(); r.keyPress(KeyEvent.VK_ESCAPE); r.keyRelease(KeyEvent.VK_ESCAPE); 
  • AutoIt . Es un progtwig de Windows útil para manejar cualquier automatización a nivel de sistema. La misma dependencia que arriba.

Eso es más o menos eso. Si puede evitar el cuadro de diálogo de impresión, intente tomar una captura de pantalla de la página e imprímala utilizando las herramientas estándar de Java .

La respuesta de Slanec es correcta: WebDriver no tiene capacidad nativa para esto. La forma en que resolví esto en Windows es con el objeto System.Windows.Forms.SendKeys:

  SendKeys.SendWait("^p"); System.Threading.Thread.Sleep(500); SendKeys.SendWait("~"); // give it a minute to spool onto the printer System.Threading.Thread.Sleep(5000); 

De hecho, tengo esto en un bucle de impresión de un montón de declaraciones. Funciona de maravilla.

Uno PUEDE manejar el cuadro de diálogo Imprimir con Selenium en Chrome. No estoy seguro acerca de otros navegadores.

Se agregó el cuadro de diálogo Acceso al Imprimir en ChromeDriver-2.17. Los detalles se pueden encontrar aquí: https://bugs.chromium.org/p/chromedriver/issues/detail?id=1087

Haga clic derecho en el cuadro de diálogo Imprimir -> Inspeccionar elemento. Como resultado, el cuadro de diálogo DOM of Print se abrirá en una ventana separada. Ahora puede producir localizadores para cualquier elemento en el diálogo y usarlos en sus pruebas.

Para cerrar el cuadro de diálogo Imprimir uno puede hacer lo siguiente:

 //Switch to Print dialog Set windowHandles = driver.getWindowHandles(); if (!windowHandles.isEmpty()) { driver.switchTo().window((String) windowHandles.toArray()[windowHandles.size() - 1]); } //Now work with the dialog as with an ordinary page: driver.findElement(By.className("cancel")).click(); 

Simplemente puede cerrar el navegador después de que aparezca el cuadro de diálogo de impresión. Esto es una medida un tanto drástica, pero las ventajas son:

  • Es simple
  • no requiere ninguna herramienta externa
  • funciona en sistemas operativos y navegadores

Solo llama:

 myWebDriver.quit(); 

Por lo general, debe ejecutar su prueba y verificar los elementos en la página para imprimir como de costumbre. WebDriver puede verificar los elementos de página incluso si el cuadro de diálogo de impresión está abierto.

Una vez que haya terminado, salga del navegador (y encienda uno nuevo para la próxima prueba).


Lo hemos usado con éxito en un proyecto. Para facilitar las cosas, escribimos una clase contenedora que realiza un seguimiento de una “instancia actual de WebDriver”. Tengo métodos para recuperar esta instancia (crear una según sea necesario) y cerrarla. De esta forma, siempre puede llamar a getCurrentWebDriver() y obtener una instancia válida (reutilizada o recién creada).

Usando Selenium y Facebook WebDriver con Codeception, tuve el mismo problema: el escenario de prueba dejaría de ejecutarse porque el diálogo de impresión impedía cualquier interacción con la página.

Terminé no abriendo el diálogo de impresión en el entorno de test (ejemplo usando Symfony y Twig):

 {# Selenium can't interact with the OS native print dialog. #} {# Therefore, it's disabled in the test environment. #} {% if app.environment != 'test' %} $(document).ready(function () { var orderShouldBePrinted = window.location.href.indexOf( 'print=true' ) !== -1; if (orderShouldBePrinted) { window.print(); } }); {% endif %} 

Esto tiene la ventaja de no detener la prueba. Sin embargo, no permite las pruebas de que el diálogo de impresión realmente aparece.

Como prueba de humo, agregué $I->seeInCurrentUrl('print=true'); (porque este parámetro URL activa window.print() ).