Comment gérer les dialogs d’impression dans Selenium?

Je dois gérer le dialog d’impression (le même qui apparaît lorsque vous cliquez sur ctrl-p dans le navigateur). J’ai essayé avec:

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

mais ça n’a pas marché. Aussi je ne pouvais pas attraper sa poignée de fenêtre, parce que ce n’est pas une fenêtre …

Est-il possible de manipuler ces objects et comment?

Malheureusement, WebDriver ne peut pas les gérer (ni aucun autre navigateur ou dialog OS). De plus, ils ont tendance à avoir une apparence différente selon les navigateurs / systèmes / parameters de langue, donc il n’y a probablement pas de réponse définitive. Vous aurez besoin de détecter et de gérer tous les cas possibles afin de le faire fonctionner partout. Vos options incluent:

  • La classe Robot vous permet “d’appuyer” par programmation sur tout ce que vous avez sur le clavier (ou en cliquant à l’aveuglette) et par conséquent de vous débarrasser de la boîte de dialog en appuyant sur Entrée ou sur Échap . Cependant, comme indiqué ci-dessus, toute interaction avancée dépend du système d’exploitation / de la langue / de l’imprimante.

     // 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 . C’est un programme Windows utile pour gérer toute automatisation au niveau du système. Même dépendance que ci-dessus.

C’est plus ou moins ça. Si vous pouvez éviter la boîte de dialog d’impression, essayez de prendre une capture d’écran de la page et imprimez-la à l’ aide des outils Java standard .

Un CAN peut gérer la boîte de dialog Imprimer avec Selenium dans Chrome. Pas sûr des autres navigateurs.

La boîte de dialog Accès à l’impression a été ajoutée dans ChromeDriver-2.17. Les détails peuvent être trouvés ici: https://bugs.chromium.org/p/chromedriver/issues/detail?id=1087

Cliquez avec le bouton droit sur la boîte de dialog Imprimer -> Inspecter l’élément. En conséquence, la boîte de dialog DOM of Print s’ouvrira dans une fenêtre séparée. Vous pouvez maintenant produire des localisateurs pour n’importe quel élément de la boîte de dialog et les utiliser dans vos tests.

Pour fermer la boîte de dialog Imprimer, vous pouvez effectuer les opérations suivantes:

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

La réponse de Slanec est correcte – WebDriver n’a pas de capacité native pour cela. La façon dont j’ai résolu cela dans Windows est avec 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); 

En fait, je vois cela dans une boucle imprimant un tas de déclarations. Fonctionne comme un charme.

Vous pouvez simplement fermer le navigateur une fois que la boîte de dialog d’impression est apparue. Il s’agit certes d’une mesure quelque peu drastique, mais les avantages sont les suivants:

  • C’est simple
  • il ne nécessite aucun outil externe
  • cela fonctionne avec les OS et les navigateurs

Il suffit d’appeler:

 myWebDriver.quit(); 

Généralement, vous exécutez votre test et vérifiez les éléments de la page à imprimer normalement. WebDriver peut vérifier les éléments de la page même si la boîte de dialog Imprimer est ouverte.

Une fois que vous avez terminé, quittez le navigateur (et lancez-en un nouveau pour le prochain test).


Nous l’avons utilisé avec succès sur un projet. Pour faciliter les choses, nous avons écrit une classe wrapper qui garde la trace d’une “instance WebDriver actuelle”. J’ai des méthodes pour récupérer cette instance (en créer une si nécessaire) et la fermer. De cette façon, vous pouvez toujours appeler getCurrentWebDriver() et obtenir une instance valide (réutilisée ou nouvellement créée).

En utilisant Selenium et Facebook WebDriver avec Codeception, j’avais le même problème: le scénario de test cessait de s’exécuter car la boîte de dialog d’impression empêchait toute interaction avec la page.

J’ai fini par ne pas ouvrir la boîte de dialog d’impression dans l’environnement de test (exemple avec Symfony et 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 %} 

Cela a l’avantage de ne pas arrêter le test. Cependant, cela ne permet pas de tester le fait que la boîte de dialog d’impression apparaît réellement.

Comme test de fumée, j’ai ajouté $I->seeInCurrentUrl('print=true'); (car ce paramètre d’URL déclenche window.print() ).