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.
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)
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)
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)
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.
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
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 .