Come gestire la finestra di dialogo di stampa in Selenium?

Devo gestire la finestra di dialogo di stampa (la stessa che appare quando si clicca ctrl-p nel browser). Ho provato con:

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

ma non ha funzionato. Inoltre non ho potuto prendere il suo manico della finestra, perché non è una finestra …

È ansible gestire questi oggetti e come?

Sfortunatamente, WebDriver non può gestire questi (o qualsiasi altro browser o finestra di dialogo del SO). Inoltre, tendono ad avere un aspetto diverso nei browser / sistemi / impostazioni della lingua, quindi probabilmente non c’è una risposta definita. Avrai bisogno di rilevare e gestire ogni caso ansible per farlo funzionare ovunque. Le tue opzioni includono:

  • La class Robot , ti permette di “premere” programmaticamente qualsiasi cosa sulla tastiera (o cliccando ciecamente) e quindi di liberarti della finestra di dialogo, per esempio, premendo Invio o Esc . Tuttavia, come detto sopra, qualsiasi interazione avanzata dipende dal sistema operativo / linguaggio / stampante.

     // press Escape programatically - the print dialog must have focus, obviously Robot r = new Robot(); r.keyPress(KeyEvent.VK_ESCAPE); r.keyRelease(KeyEvent.VK_ESCAPE); 
  • AutoIt . È un programma per Windows utile per gestire qualsiasi automazione a livello di sistema. La stessa dipendenza di cui sopra.

Questo è più o meno. Se è ansible evitare la finestra di dialogo di stampa, provare a prendere lo screenshot della pagina e stamparlo utilizzando gli strumenti Java standard .

La risposta di Slanec è corretta: WebDriver non ha capacità native per questo. Il modo in cui ho risolto questo problema in Windows è con l’object 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); 

In realtà ho questo in un ciclo che stampa un sacco di dichiarazioni. Funziona come un fascino.

Una CAN può gestire la finestra di dialogo Stampa con Selenium in Chrome. Non sono sicuro di altri browser.

La finestra di dialogo Accedi alla stampa è stata aggiunta in ChromeDriver-2.17. I dettagli possono essere trovati qui: https://bugs.chromium.org/p/chromedriver/issues/detail?id=1087

Fai clic destro sulla finestra di dialogo Stampa -> Ispeziona elemento. Di conseguenza, la finestra di dialogo DOM di Stampa si aprirà in una finestra separata. Ora puoi creare locatori per qualsiasi elemento nella finestra di dialogo e utilizzarli nei test.

Per chiudere la finestra di dialogo Stampa, è ansible effettuare le seguenti operazioni:

 //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(); 

È sufficiente chiudere il browser dopo che è stata visualizzata la finestra di dialogo di stampa. Questa è certamente una misura un po ‘drastica, ma i vantaggi sono:

  • è semplice
  • non richiede strumenti esterni
  • Funziona su sistemi operativi e browser

Chiama soltanto:

 myWebDriver.quit(); 

In genere, si esegue il test e si controllano gli elementi nella pagina per la stampa come al solito. WebDriver può controllare gli elementi della pagina anche se la finestra di dialogo di stampa è aperta.

Una volta che hai finito, esci dal browser (e aprine uno nuovo per il prossimo test).


Lo abbiamo usato con successo su un progetto. Per semplificare le cose, abbiamo scritto una class wrapper che tiene traccia di una “istanza di WebDriver corrente”. Ho dei metodi per recuperare questa istanza (crearne una come richiesto) e chiuderla. In questo modo, puoi sempre chiamare getCurrentWebDriver() e ottenere un’istanza valida (riutilizzata o appena creata).

Usando Selenium e Facebook WebDriver con Codeception, ho avuto lo stesso problema: lo scenario di test si arrestava perché la finestra di dialogo di stampa impediva qualsiasi interazione con la pagina.

Ho finito per non aprire la finestra di dialogo di stampa nell’ambiente di test (ad esempio con Symfony e 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 %} 

Questo ha il vantaggio di non interrompere il test. Tuttavia, non consente di verificare che la finestra di dialogo di stampa venga effettivamente visualizzata.

Come test del fumo, ho aggiunto $I->seeInCurrentUrl('print=true'); (poiché questo parametro URL triggers window.print() ).