132 votes

Comment ouvrir un nouvel onglet en utilisant Selenium WebDriver en Java ?

Comment ouvrir un nouvel onglet dans le navigateur Firefox existant en utilisant Selenium WebDriver (alias Selenium 2) en Java ?

3voto

yardening2 Points 61

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");

3voto

Caner Points 15625

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/")

1voto

mahi Points 21
// To open a new tab in an existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +  "t");

1voto

BClaydon Points 665

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

1voto

Gico Points 162

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X