web-dev-qa-db-fra.com

Comment gérer les dialogues d'impression dans Selenium?

Je dois gérer le dialogue 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 objets et comment?

22
zorglub76

Констрания, WebDriver dans la base de données de mots-clés pour ordinateurs de bureau (или любым другим браузером или диалогом ОС). Х х е х х, Вам нужно будет обнаружить и обработать каждый возможный случай, чтобы он работал везде. Ваши варианты включают в себя:

  • Класс __ Robotname , он позволяет программно "нажимать" что-нибудь на клавиатуре (или нажимать вслепую) и, следовательно, избавляться от диалога, скажем, нажатиемEnterили жеEscОднако, как сказано выше, любое расширенное взаимодействие зависит от ОС/языка/принтера.

    // 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 . Windows Vista, Windows, Windows Vista, Windows Vista, Windows Vista et Windows. Та же зависимость, что и выше.

То более или менее так. Если вы можете избежать диалогового окна печати, попробуйте сделать снимок экрана страницы и распечатать его используя стандартные инструменты Java .

24
Petr Janeček

Un CAN peut gérer le dialogue d'impression avec Selenium dans Chrome. Pas sûr des autres navigateurs.

La boîte de dialogue 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 dialogue Imprimer -> Inspecter l'élément. En conséquence, la boîte de dialogue 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 dialogue et les utiliser dans vos tests.

Pour fermer la boîte de dialogue Imprimer, vous pouvez procéder comme suit: 

//Switch to Print dialog
Set<String> 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();
4
Iryna

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

2

Vous pouvez simplement fermer le navigateur après l'apparition de la boîte de dialogue d'impression. 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 sur les systèmes d'exploitation 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 dialogue 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 une 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 fraîchement créée).

1
sleske

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 dialogue d'impression empêchait toute interaction avec la page.

J'ai fini par ne pas ouvrir la boîte de dialogue d'impression dans l'environnement 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 vérifier que la boîte de dialogue d'impression apparaît réellement.

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

0
Yngve Høiseth