Comment puis-je gérer une alerte avec GhostDriver via Python?

Problème: l' API GhostDriver ne prend pas encore en charge la gestion des alertes. Il existe une solution de rechange acceptable pour l'instant, c'est-à-dire d'injecter votre propre javascript dans la page qui gérera l'alerte et vous enregistrera le texte.

J'ai du mal à utiliser cette solution de contournement via les liaisons python webdriver. Cela pourrait être lié à ma compréhension de javascript par le niveau novice.

Voici un exemple de la solution de contournement que j'essaie d'utiliser: https://github.com/detro/ghostdriver/issues/20#issuecomment-15641983

J'utilise un site public qui démontre une alerte pour rendre cela plus direct: http://www.tizag.com/javascriptT/javascriptalert.php

Voici mon code:

from selenium import webdriver button_xpath = "/html/body/table[3]/tbody/tr/td[2]/table/tbody/tr/td/div[4]/form/input" js = """ (function () { var lastAlert = undefined; window.alert = function (message) { lastAlert = message; }; window.getLastAlert = function () { var result = lastAlert; lastAlert = undefined; return result; }; }()); """ driver = webdriver.PhantomJS() driver.get('http://www.tizag.com/javascriptT/javascriptalert.php') driver.execute_script("window.alert = %s" % js) driver.find_element_by_xpath(button_xpath).click() #exception just occured driver.execute_script("return window.getLastAlert && window.getLastAlert();") 

L'exception est la suivante:

 WebDriverException: Message: u'Error Message => \'Click failed: TypeError: \'undefined\' is not a function (evaluating \'alert(\'Are you sure you want to give us the deed to your house?\')\')\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:41752","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"0eaf7680-9897-11e2-b375-55b9cb6ceb0f\\", \\"id\\": \\":wdc:1364578560610\\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/0eaf7680-9897-11e2-b375-55b9cb6ceb0f/element/%3Awdc%3A1364578560610/click"}' ; Screenshot: available via screen 

Je suis un noob JS. J'espère que quelqu'un peut me pointer dans la bonne direction.

Une solution simple consiste à réécrire la méthode window.alert pour générer l'argument vers une variable globale.

Définissez la variable d'injection js avec votre fonction de suppression:

 js = """ window.alert = function(message) { lastAlert = message; } """ 

Et puis passez la variable js à travers l'appel execute_script en python comme ceci:

 driver.execute_script("%s" % js) 

Ensuite, quand tout a été exécuté, vous pouvez exécuter un retour sur la dernière alerte globale:

 driver.execute_script("return lastAlert") 

C'est une solution de contournement.

Utilisez ceci pour chaque page rechargée qui aurait une alerte plus tard.

 driver.execute_script("window.confirm = function(){return true;}"); 

Cela fonctionne pour PhantomJS dans Selenium / Splinter.

Voir plus de référence ici .