3 votes

Contournement de la popup d'impression de selenium2

Je travaille actuellement sur un programme qui, avec l'aide du webdriver de Selenium et de Firefox, parcourt les domaines, en récupérant tout le texte visible. (programme écrit en python)

Lorsque selenium ouvre des pages avec le javascript window.print() le crawler est en train de s'arrêter, attendant que je clique manuellement sur "fermer" sur la fenêtre popup qui apparaît.

J'ai essayé le driver.select_pop_up() après un temps de retard, dans l'espoir de pouvoir fermer() la fenêtre après l'avoir sélectionnée. Cependant, je n'ai pas pu sélectionner la fenêtre.

Je me suis renseigné sur la question, et d'après cette page FAQ sur le sélénium J'en ai conclu que je devais trouver une solution de rechange :

Pour résoudre ce problème, vous pouvez utiliser une solution de contournement (s'il en existe une) ; sinon, vous devrez peut-être exclure le test de votre corpus automatisé.

La seule solution que je vois est de ne pas ouvrir les pages Web dont la description des liens contient le mot "imprimer". Je trouve cependant cette solution peu élégante et j'aimerais savoir si quelqu'un d'autre a une meilleure idée.

Code qui montre un exemple de mon problème :

from selenium               import webdriver  
import time

skrivutsiden = 'www.alfkvam.no/index.php?id=4849944&cat=159037&printable=1'
vanligside = 'http://www.google.no'

driver = webdriver.Firefox()

driver.get(vanligside)
driver.get(skrivutsiden)

EDIT :

En utilisant le code proposé par prestomanifesto, j'ai effectivement réussi à déclencher une "fenêtre popup d'impression" dans une fenêtre vide de firefox. Lorsque le code produit l'événement que j'essaie d'éviter, je me dis que ce n'est peut-être pas le bon code en premier lieu ? Est-ce une conclusion erronée ? Le code ci-dessous a produit la fenêtre popup :

from selenium               import webdriver  
import time

driver = webdriver.Firefox()
driver.execute_script("window.print() = function() {}")

RE-EDIT :

La raison pour laquelle le code ci-dessus déclenche la fenêtre popup, c'est que je me suis trompé dans le javascript - j'ai écrit

"window.print() = function() {}"

au lieu de

"window.print = function() {}"

Cela n'a pas résolu le problème original, mais cela explique la fenêtre popup inattendue, introduite dans la première édition.

mes excuses presto manifeste

RE-EDIT :

Solutions de mise à jour essayées. J'ai trouvé ce site où j'ai vu la ligne de code suivante proposée :

((JavascriptExecutor)m_driver).executeScript("window.confirm = function(msg){return
false;};");

Sur cette base, j'ai essayé ce qui suit, sans succès :

driver.execute_script("window.print = function(msg) {return false;};")

5voto

Rookie Points 730

J'ai finalement trouvé une solution :

J'ai collé

    "print.always_print_silent": "true",
    "print.show_print_progress": "false",

dans le profil de l'utilisateur de Firefox. Selenium possède son propre profil utilisateur par défaut, que vous pouvez modifier. Le fichier contenant le profil s'appelle firefox_profile.py.

Veuillez noter que cela permet simplement d'imprimer sans demander à l'utilisateur par le biais d'une fenêtre pop-up. Cela fonctionne pour moi, car je n'ai pas d'imprimante connectée.

J'ai trouvé ces deux lignes de code dans l'introduction de l'application r-kiosk add-on .

2voto

prestomanifesto Points 4135

Vous pourriez essayer la solution de contournement qui existait auparavant pour alert avant que Selenium ne soit en mesure de les prendre en charge. En fait, vous voulez remplacer la fonction print de sorte qu'il ne fait rien.

Vous feriez donc quelque chose comme ceci au début de vos tests :

driver.execute_script("window.print = function() {}");

(Désolé si le code n'est pas correct, je n'utilise pas très souvent python).

De cette façon, une fois que la page appelle window.print() rien ne se passera et votre test pourra se poursuivre sans interruption.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X