web-dev-qa-db-fra.com

Vérifiez si une alerte existe avec Selenium avec python

J'essaie d'écrire un test avec Selenium dans python langage pour une page Web qui gère des utilisateurs. Dans cette page, quelqu'un peut ajouter un rôle pour des utilisateurs. Si un rôle existe lors de l'ajout, une alerte Je ne sais pas s'il s'agit d'une alerte javascript ou d'un élément de la page Web. Je souhaite vérifier automatiquement l'existence de l'alerte, car la recherche du rôle dans la liste représente une perte de temps et une charge énorme. essayé ceci:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
    alert = browser.switch_to_alert()
    alert.accept()
    print "alert accepted"
except:
    print "no alert"

Mais cela n’a pas fonctionné et j’ai eu la "UnexpectedAlertPresentException". J'ai aussi essayé ceci:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
s = set(browser.window_handles)
s.remove(browser.current_window_handle)
browser.switch_to_window(s.pop()) 

Mais j'ai la même exception. De plus, j'ai essayé d'accéder à l'alerte avec firebug pour vérifier si je pouvais y accéder avec ses propriétés, mais le clic droit était désactivé. J'ai besoin d'une solution très rapidement, même dans d'autres langues. Je peux comprendre l'approche quand même. Je vais apprécier toute aide.

49
Zeinab Abbasimazar

Ce que je fais est de définir un délai conditionnel avec WebDriverWait juste avant le point auquel j'attends de voir l'alerte, puis de basculer sur cette alerte, comme ceci:

from Selenium import webdriver
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
browser.find_element_by_id("add_button").click()

try:
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                                   'Timed out waiting for PA creation ' +
                                   'confirmation popup to appear.')

    alert = browser.switch_to.alert
    alert.accept()
    print("alert accepted")
except TimeoutException:
    print("no alert")

WebDriverWait(browser,) attendra au moins 3 secondes qu'une alerte prise en charge apparaisse.

78
A.R.

Je sais que c'est une réponse trop tardive et que vous avez résolu cette question il y a des années, mais je souhaite tout de même publier mes analyses et résultats pour référence éventuelle.

Je travaille sur un projet de développement de site Web Django, et il existe actuellement un bogue qui dit qu'une fois qu'une page Web est ouverte, un message d'erreur s'affiche. Mon environnement est le suivant:

  • Django 1.8
  • Python 2.7
  • Sélénium 2.46.0

J'ai lu le document ici à propos de "UnexpectedAlertPresentException" et il est écrit:

Lancé quand une alerte inattendue est apparue.

Généralement déclenché lorsqu'un modal attendu bloque la forme webdriver en exécutant d'autres commandes.

J'ai testé dans mon projet et mes conclusions sont:

  • Lorsque la boîte d'alerte est activée, les méthodes find_element_by_X Peuvent réussir.
  • Le click () ou send_keys () échouera avec "UnexpectedAlertPresentException".

Par conséquent, je pense que le bloc try...catch Ne fonctionne pas car "UnexpectedAlertPresentException" est projetée dans la ligne

browser.find_the_element_by_id("add_button").click()

Cela signifie également que la boîte d’alerte peut apparaître dès que la page Web est ouverte par cette ligne:

browser.get("url")

En d'autres termes, il pourrait y avoir un problème caché plus profondément derrière qui a provoqué la boîte d'alerte dès que la page est ouverte. Vous devrez peut-être résoudre ce problème en premier.

Une autre chose est: En supposant que la boîte d’alerte apparaisse après cette ligne:

browser.find_the_element_by_id("add_button").click()

Alors la alert = browser.switch_to_alert() devrait bien fonctionner sans exception, ce qui est en contradiction avec ce que vous décrivez ici. Cela m'a également fait penser que le problème est aussi ancien que la ligne browser.get("url").

Je ne suis pas très sûr de savoir comment la solution choisie vous a aidé à résoudre le problème car mon analyse montre que le problème se situe à un endroit différent. Quoi qu'il en soit, je ne demande pas de resélectionner la solution acceptée. Je veux simplement partager mes pensées avec les futurs lecteurs. Excusez-moi si j'ai oublié ou mal compris quelque chose dans cette question qui a rendu mon analyse erronée (et qui vous fait perdre du temps à lire ceci :-) .

6
yaobin

Dans Java nous le faisons comme ceci

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();

Il attendra implicitement l'alerte si l'alerte n'est pas présente, il lancera le message "L'alerte n'est pas présente, sauf que vous pouvez prendre et continuer.

J'espère que ça aide.

1
Abhishek Singh
alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()
0
Ricardo Valbuena