web-dev-qa-db-fra.com

Comment passer à l'onglet actif dans Selenium?

Nous avons développé une extension Chrome, et je veux tester notre extension avec Selenium. J'ai créé un test, mais le problème est que notre extension ouvre un nouvel onglet lorsqu'elle est installée, et je pense que je reçois une exception de l'autre onglet. Est-il possible de basculer vers l'onglet actif que je teste? Ou une autre option est de commencer avec l'extension désactivée, puis de se connecter à notre site Web et ensuite d'activer l'extension. Est-ce possible? Voici mon code:

def login_to_webapp(self):
    self.driver.get(url='http://example.com/logout')
    self.driver.maximize_window()
    self.assertEqual(first="Web Editor", second=self.driver.title)
    action = webdriver.ActionChains(driver=self.driver)
    action.move_to_element(to_element=self.driver.find_element_by_xpath(xpath="//div[@id='header_floater']/div[@class='header_menu']/button[@class='btn_header signature_menu'][text()='My signature']"))
    action.perform()
    self.driver.find_element_by_xpath(xpath="//ul[@id='signature_menu_downlist'][@class='menu_downlist']/li[text()='Log In']").click()
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class='input']/input[@name='useremail']").send_keys("[email]")
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/div[@class='input']/input[@name='password']").send_keys("[password]")
    self.driver.find_element_by_xpath(xpath="//form[@id='atho-form']/button[@type='submit'][@class='atho-button signin_button'][text()='Sign in']").click()

Le test échoue avec ElementNotVisibleException: Message: element not visible, Car dans le nouvel onglet (ouvert par l'extension) "Log In" n'est pas visible (je pense que le nouvel onglet n'est ouvert qu'après la commande self.driver.get(url='http://example.com/logout')).

Mise à jour: J'ai découvert que l'exception n'est pas liée à l'onglet supplémentaire, elle provient de notre site Web. Mais j'ai fermé l'onglet supplémentaire avec ce code, selon la réponse de @ aberna:

def close_last_tab(self):
    if (len(self.driver.window_handles) == 2):
        self.driver.switch_to.window(window_name=self.driver.window_handles[-1])
        self.driver.close()
        self.driver.switch_to.window(window_name=self.driver.window_handles[0])

Après avoir fermé l'onglet supplémentaire, je peux voir mon onglet dans la vidéo.

31
Uri

Quelques approches possibles:

1 - Basculer entre les onglets en utilisant les send_keys (CONTROL + TAB)

self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB)

2 - Basculer entre les onglets en utilisant les ActionsChains (CONTROL + TAB)

actions = ActionChains(self.driver)      
actions.key_down(Keys.CONTROL).key_down(Keys.TAB).key_up(Keys.TAB).key_up(Keys.CONTROL).perform()

- Une autre approche pourrait utiliser les méthodes Selenium pour vérifier la fenêtre courante et passer à une autre:

Vous pouvez utiliser

driver.window_handles

pour trouver une liste des poignées de fenêtre et après essayez de basculer en utilisant les méthodes suivantes.

- driver.switch_to.active_element      
- driver.switch_to.default_content
- driver.switch_to.window
27
aberna

Cela a réellement fonctionné pour moi dans 3.x:

driver.switch_to.window(driver.window_handles[1])

les poignées de fenêtre sont ajoutées, donc cela sélectionne le deuxième onglet de la liste

pour continuer avec le premier onglet:

driver.switch_to.window(driver.window_handles[0])
35
Avaricious_vulture

La réponse acceptée n'a pas fonctionné pour moi.
Pour ouvrir un nouvel onglet et faire basculer Selenium dessus, j'ai utilisé:

driver.execute_script('''window.open("https://some.site/", "_blank");''')
sleep(1) # you can also try without it, just playing safe
driver.switch_to_window(driver.window_handles[-1]) # last opened tab handle
# driver.switch_to.window(driver.window_handles[-1])  for newer versions.

si vous devez revenir à l'onglet principal, utilisez:

driver.switch_to_window(driver.window_handles[0])

Sommaire:

Le window_handles Contient une liste des handles des tabs ouverts, utilisez-les comme argument dans switch_to_window() pour basculer entre les onglets.

8
Pedro Lobito