Comment ouvrir un nouvel onglet dans le navigateur Firefox existant en utilisant Selenium WebDriver (alias Selenium 2) en Java ?
Réponses
Trop de publicités?Pendant un certain temps, j'ai eu du mal à ouvrir un nouvel onglet dans Google Chrome.
Même driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
n'a pas fonctionné pour moi.
J'ai découvert qu'il ne suffit pas que Selenium se concentre sur le pilote. Il faut aussi que Windows ait la fenêtre à l'avant.
Ma solution était d'invoquer une alerte dans Chrome qui ferait apparaître la fenêtre au premier plan et exécuterait ensuite la commande. Exemple de code :
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
A partir de selenium >= 4.0, il n'est plus nécessaire d'utiliser javascript ou send_keys
des solutions de contournement. Selenium 4 fournit une nouvelle API appelée newWindow
qui vous permet de créer une nouvelle fenêtre (ou un nouvel onglet) et de passer automatiquement à celle-ci. Comme la nouvelle fenêtre ou le nouvel onglet est créé dans la même session, cela évite de créer un nouvel objet WebDriver.
Python
Ouvrir un nouvel onglet
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.TAB)
Ouvrir une nouvelle fenêtre
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.WINDOW)
Java
Ouvrir une nouvelle fenêtre
driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
// Opens LambdaTest homepage in the newly opened window
driver.navigate().to("https://www.lambdatest.com/");
Ouvrir un nouvel onglet
driver.get("https://www.google.com/");
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.TAB);
// Opens LambdaTest homepage in the newly opened tab
driver.navigate().to("https://www.lambdatest.com/")
Comment ouvrir un nouvel onglet, mais surtout, comment faire des choses dans ce nouvel onglet ?
Webdriver n'ajoute pas un nouveau WindowHandle pour chaque onglet, et n'a le contrôle que du premier onglet. Ainsi, après avoir sélectionné un nouvel onglet (Contrôle + Numéro d'onglet), définissez .DefaultContent() sur le pilote pour définir l'onglet visible comme celui sur lequel vous allez travailler.
Visual Basic
Dim driver = New WebDriver("Firefox", BaseUrl)
' Open new tab - send Control T
Dim body As IWebElement = driver.FindElement(By.TagName("body"))
body.SendKeys(Keys.Control + "t")
' Go to a URL in that tab
driver.GoToUrl("YourURL")
' Assuming you have m tabs open, go to tab n by sending Control + n
body.SendKeys(Keys.Control + n.ToString())
' Now set the visible tab as the drivers default content.
driver.SwitchTo().DefaultContent()
J'utilise Selenium 2.52.0 en Java et Firefox 44.0.2. Malheureusement, aucune des solutions précédentes n'a fonctionné pour moi.
Le problème est que si j'appelle driver.getWindowHandles(), j'obtiens toujours un seul et unique handle. D'une manière ou d'une autre, cela me semble logique car Firefox est un processus unique et chaque onglet n'est pas un processus distinct. Mais je me trompe peut-être. Quoi qu'il en soit, j'essaie d'écrire ma propre solution :
// Open a new tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// URL to open in a new tab
String urlToOpen = "https://url_to_open_in_a_new_tab";
Iterator<String> windowIterator = driver.getWindowHandles()
.iterator();
// I always get handlesSize == 1, regardless how many tabs I have
int handlesSize = driver.getWindowHandles().size();
// I had to grab the original handle
String originalHandle = driver.getWindowHandle();
driver.navigate().to(urlToOpen);
Actions action = new Actions(driver);
// Close the newly opened tab
action.keyDown(Keys.CONTROL).sendKeys("w").perform();
// Switch back to original
action.keyDown(Keys.CONTROL).sendKeys("1").perform();
// And switch back to the original handle. I am not sure why, but
// it just did not work without this, like it has lost the focus
driver.switchTo().window(originalHandle);
J'ai utilisé le Ctrl + T combinaison pour ouvrir un nouvel onglet, Ctrl + W pour le fermer, et pour revenir à l'onglet original, j'ai utilisé Ctrl + 1 (le premier onglet).
Je suis conscient que ma solution n'est pas parfaite, ni même bonne, et j'aurais également voulu commuter avec l'appel switchTo du pilote, mais comme je l'ai écrit, ce n'était pas possible car je n'avais qu'une seule poignée. Peut-être cela sera-t-il utile à quelqu'un qui se trouve dans la même situation.