web-dev-qa-db-fra.com

Comment passer à une nouvelle fenêtre dans Selenium pour Python?

Je travaille sur projet d'automatisation Selenium en utilisant Python.

Je suis confronté à un problème lié à la gestion de plusieurs fenêtres de navigateur.

Le scénario est le suivant. Lorsque je clique sur un lien de la page d'accueil, une nouvelle fenêtre s'ouvre. Dans la fenêtre nouvellement ouverte, je ne peux effectuer aucune action, car le focus est toujours sur le pilote Web de la page d'accueil.

Quelqu'un peut-il me montrer comment changer le focus de la fenêtre d'arrière-plan à la fenêtre nouvellement ouverte?

Une solution possible est driver.switch_to.window(), mais elle nécessite le nom de la fenêtre. Comment connaître le nom de la fenêtre? Si c'est une mauvaise façon de procéder, quelqu'un peut-il donner des exemples de code pour effectuer cette action?

45

Vous pouvez le faire en utilisant window_handles et switch_to_window méthode.

Avant de cliquer sur le lien, enregistrez d'abord le descripteur de fenêtre sous

window_before = driver.window_handles[0]

après avoir cliqué sur le lien stocker la poignée de fenêtre de la fenêtre nouvellement ouverte comme

window_after = driver.window_handles[1]

puis exécutez le passage à la fenêtre methow pour passer à la fenêtre nouvellement ouverte

driver.switch_to_window(window_after)

et de même, vous pouvez basculer entre l'ancienne et la nouvelle fenêtre. Voici l'exemple de code

import unittest
from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys
from Selenium.webdriver.common.by import By

class GoogleOrgSearch(unittest.TestCase):

     def setUp(self):
         self.driver = webdriver.Firefox()

    def test_google_search_page(self):
         driver = self.driver
         driver.get("http://www.cdot.in")
         window_before = driver.window_handles[0]
         print window_before
         driver.find_element_by_xpath("//a[@href='http://www.cdot.in/home.htm']").click()
         window_after = driver.window_handles[1]
         driver.switch_to_window(window_after)
         print window_after
         driver.find_element_by_link_text("ATM").click()
         driver.switch_to_window(window_before)


    def tearDown(self):
    self.driver.close()

if __== "__main__":
unittest.main()
39
vishy dewangan

window_handles devrait vous donner les références de toutes les fenêtres ouvertes.

this est ce que le docu a à dire sur le changement de fenêtre.

21
mata

En plus des réponses déjà données, pour ouvrir un nouvel onglet, la commande javascript window.open() peut être utilisée.

Par exemple:

# Opens a new tab
self.driver.execute_script("window.open()")

# Switch to the newly opened tab
self.driver.switch_to.window(self.driver.window_handles[1])

# Navigate to new URL in new tab
self.driver.get("https://google.com")
# Run other commands in the new tab here

Vous pouvez ensuite fermer l'onglet d'origine comme suit

# Switch to original tab
self.driver.switch_to.window(self.driver.window_handles[0])

# Close original tab
self.driver.close()

# Switch back to newly opened tab, which is now in position 0
self.driver.switch_to.window(self.driver.window_handles[0])

Ou fermez l'onglet nouvellement ouvert

# Close current tab
self.driver.close()

# Switch back to original tab
self.driver.switch_to.window(self.driver.window_handles[0])

J'espère que cela t'aides.

15
Elliot Ledger

Nous pouvons gérer les différentes fenêtres en se déplaçant entre les fenêtres nommées en utilisant la méthode "switchTo":

driver.switch_to.window("windowName")

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

Alternativement, vous pouvez passer un "handle de fenêtre" à la méthode "switchTo (). Window ()". Sachant cela, il est possible d'itérer sur chaque fenêtre ouverte comme ceci:

for handle in driver.window_handles:
    driver.switch_to.window(handle)
3
Shaik

par exemple. vous pouvez prendre

driver.get('https://www.naukri.com/')

puisque c'est une fenêtre courante, on peut la nommer

main_page = driver.current_window_handle

s'il y a au moins 1 fenêtre contextuelle à l'exception de la fenêtre actuelle, vous pouvez essayer cette méthode et mettre if condition dans l'instruction break par hit n trial pour l'index

for handle in driver.window_handles:
    if handle != main_page:
        print(handle)
        login_page = handle
        break

driver.switch_to.window(login_page)

Maintenant, quelles que soient les informations d'identification que vous devez appliquer, fournissez-les après la connexion. La fenêtre disparaîtra, mais vous devez vous rendre à la fenêtre de la page principale et vous avez terminé

driver.switch_to.window(main_page)
sleep(10)
2
Sanyam Gupta