web-dev-qa-db-fra.com

Comment ouvrir une nouvelle fenêtre sur un navigateur en utilisant Selenium WebDriver pour python?

J'essaie d'ouvrir un nouvel onglet OR une nouvelle fenêtre dans un navigateur utilisant Selenium pour python. Peu importe si un nouvel onglet ou une nouvelle fenêtre est ouvert, il est seulement important qu'un la deuxième instance du navigateur est ouverte.

J'ai déjà essayé plusieurs méthodes différentes et aucune n'a réussi.

  1. Passer à une fenêtre qui n'existe pas en espérant qu'elle ouvrirait alors une nouvelle fenêtre en cas d'échec de localisation de cette fenêtre:

    driver.switch_to_window(None)

  2. Itération à travers des fenêtres ouvertes (bien qu'il n'y en ait qu'une seule actuellement)

    for handle in driver.window_handles:
        driver.switch_to_window(handle)
    
  3. Tentative de simulation d'une pression sur une touche du clavier

    from Selenium.webdriver.common.keys import Keys
    driver.send_keys(Keys.CONTROL + 'T')
    

Le problème avec celui-ci en particulier était qu'il ne semble pas possible d'envoyer des clés directement au navigateur, uniquement à un élément spécifique comme celui-ci:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T')

Cependant, lorsqu'une commande comme celle-ci est envoyée à un élément, elle ne semble absolument rien faire. J'ai tenté de localiser l'élément HTML le plus haut sur la page et d'envoyer les clés à cela, mais j'ai de nouveau rencontré un échec:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T')

J'ai trouvé une autre version de ceci en ligne et je n'ai pas pu vérifier sa validité ou son absence car je ne sais pas quelle classe/module qui doit être importé

act = ActionChains(driver)
act.key_down(browserKeys.CONTROL)
act.click("").perform()
act.key_up(browserKeys.CONTROL)

Quelque chose de très similaire avec une syntaxe différente (je ne sais pas si l'une ou les deux sont une syntaxe correcte)

actions.key_down(Keys.CONTROL)
element.send_keys('t')
actions.key_up(Keys.CONTROL)
14
Zach Posten

Que diriez-vous de faire quelque chose comme ça

driver = webdriver.Firefox() #First FF window
second_driver = webdriver.Firefox() #The new window you wanted to open

Selon la fenêtre avec laquelle vous souhaitez interagir, vous envoyez des commandes en conséquence

print driver.title #to interact with the first driver
print second_driver.title #to interact with the second driver

Pour tous les votants:


Le PO a demandé "it is only important that a second instance of the browser is opened. ". Cette réponse ne comprend pas TOUTES les exigences possibles de chacun des cas d'utilisation. Les autres réponses ci-dessous peuvent répondre à votre besoin particulier.

20
Amey

Vous pouvez utiliser execute_script pour ouvrir une nouvelle fenêtre.

driver = webdriver.Firefox()
driver.get("https://linkedin.com")
# open new tab
driver.execute_script("window.open('https://Twitter.com')")
print driver.current_window_handle

# Switch to new window
driver.switch_to.window(driver.window_handles[-1])
print " Twitter window should go to facebook "
print "New window ", driver.title
driver.get("http://facebook.com")
print "New window ", driver.title

# Switch to old window
driver.switch_to.window(driver.window_handles[0])
print " Linkedin should go to gmail "
print "Old window ", driver.title
driver.get("http://gmail.com")
print "Old window ", driver.title

# Again new window
driver.switch_to.window(driver.window_handles[1])
print " Facebook window should go to Google "
print "New window ", driver.title
driver.get("http://google.com")
print "New window ", driver.title
16
Dhiraj

Je recommande d'utiliser CTRL + N commande sur Firefox pour réduire moins l'utilisation de la mémoire que pour créer de nouvelles instances de navigateur.

import Selenium.webdriver as webdriver
from Selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox()
body = browser.find_element_by_tag_name('body')
body.send_keys(Keys.CONTROL + 'n')

La façon de changer et de contrôler les fenêtres a déjà été mentionnée par Dhiraj .

6
fx-kirin