web-dev-qa-db-fra.com

Python webdriver pour gérer les fenêtres contextuelles du navigateur qui ne sont pas une alerte

Je travaille sur une application web, dans laquelle en cliquant sur un lien, une autre fenêtre contextuelle apparaît. La fenêtre pop n'est pas une alerte mais c'est un formulaire avec différents champs à saisir par l'utilisateur et cliquez sur "Suivant".

Comment puis-je gérer/automatiser ces fenêtres contextuelles en utilisant Selenium.

Sommaire :-

  1. Cliquez sur l'hyperlien (url) - "CLIQUEZ ICI"
  2. Un formulaire d'inscription d'utilisateur apparaît sous forme de pop-up
  3. Une donnée doit être renseignée par l'utilisateur
  4. Cliquez sur le bouton Suivant/Soumettre.
  5. Un autre suivant redirigé vers une autre page/formulaire "Page d'informations personnelles de l'utilisateur"
  6. Les informations personnelles doivent être renseignées par l'utilisateur
  7. Cliquez sur "Suivant/Soumettre"
  8. Le pop-up a disparu.
  9. Maintenant, traitement ultérieur sur la page d'origine/de base.
22
Ronu

Passer à une fenêtre contextuelle est difficile pour au moins deux raisons distinctes:

  1. Celui que beaucoup de gens connaissent, c'est que vous devez utiliser driver.switch_to.window(window_handle) à la fois lorsque la fenêtre contextuelle apparaît, afin que vous puissiez trouver des éléments dans la fenêtre contextuelle, et après la fermeture de la fenêtre contextuelle, afin que vous puissiez trouver éléments de retour dans la fenêtre principale.
  2. Celui que seules les personnes avec des machines lentes sont susceptibles de rencontrer, c'est que lorsque Selenium rend un handle de fenêtre disponible en tant que variable, il est initialement défini sur Aucun et prend un peu de temps avant d'être rempli avec une valeur.

Voici un code qui résout ces problèmes lors de l'exécution de la séquence demandée. J'écarte les instructions import et j'utilise des noms de variables qui, je l'espère, sont évidents. Notez également que j'aime utiliser find_element(s)_by_xpath dans mon code; n'hésitez pas à utiliser d'autres méthodes find_element(s)_by:

main_window_handle = None
while not main_window_handle:
    main_window_handle = driver.current_window_handle
driver.find_element_by_xpath(u'//a[text()="click here"]').click()
signin_window_handle = None
while not signin_window_handle:
    for handle in driver.window_handles:
        if handle != main_window_handle:
            signin_window_handle = handle
            break
driver.switch_to.window(signin_window_handle)
driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1)
driver.find_element_by_xpath(u'//input[@value="OK"]').click()
driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2)
driver.find_element_by_xpath(u'//input[@value="OK"]').click()
driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content()

Veuillez me faire savoir si quelqu'un (peut-être moi) a besoin d'ajouter plus à l'exemple, ou de fournir d'autres informations, pour le rendre plus clair.

39
Lindsay

S'il s'agit d'un nouveau window ou d'un iframe, vous devez utiliser la fonction driver.switch_to_frame(webelement) ou driver.switch_to_window(window_name). Cela devrait alors vous permettre d'interagir avec le elements dans le popup. Une fois que vous avez terminé, vous devez alors driver.switch_to_default_content() pour revenir à la page Web principale.

6
Mark Rowlands