Comment ouvrir un nouvel onglet dans le navigateur Firefox existant à l'aide de Selenium WebDriver (a.k.a. Selenium 2)?
Le code ci-dessous ouvrira le lien dans un nouvel onglet.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Le code ci-dessous ouvrira un nouvel onglet vide.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Juste pour ceux qui cherchent une réponse dans les reliures Ruby/Python/C # (Selenium 2.33.0).
Notez que les clés à envoyer dépendent de votre système d'exploitation. Par exemple, Mac utilise COMMAND + t
au lieu de CONTROL + t
.
Rubis
require 'Selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get('http://stackoverflow.com/')
body = driver.find_element(:tag_name => 'body')
body.send_keys(:control, 't')
driver.quit
Python
from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://stackoverflow.com/")
body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.CONTROL + 't')
driver.close()
C #
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
namespace StackOverflowTests {
class OpenNewTab {
static void Main(string[] args) {
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://stackoverflow.com/");
IWebElement body = driver.FindElement(By.TagName("body"));
body.SendKeys(Keys.Control + 't');
driver.Quit();
}
}
}
Pourquoi ne pas faire ça
driver.ExecuteScript("window.open('your url','_blank');");
Pour ouvrir une nouvelle fenêtre dans le pilote Chrome.
//The script that will will open a new blank window
//If you want to open a link new tab, replace 'about:blank' with a link
String a = "window.open('about:blank','_blank');";
((JavascriptExecutor)driver).executeScript(a);
Essayez ceci pour le navigateur FireFox.
/* Open new tab in browser */
public void openNewTab()
{
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
}
Vous pouvez utiliser le code suivant en utilisant Java avec Selenium WebDriver:
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
En utilisant JavaScript:
WebDriver driver = new FirefoxDriver();//FF or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
Le code ci-dessous ouvrira le lien dans une nouvelle fenêtre
String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
Pour ouvrir un nouvel onglet dans le navigateur Chrome existant à l'aide de Selenium WebDriver, vous pouvez utiliser ce code:
driver.FindElement(By.CssSelector("body")).SendKeys(Keys.Control + "t");
string newTabInstance = driver.WindowHandles[driver.WindowHandles.Count-1].ToString();
driver.SwitchTo().Window(newTabInstance);
driver.Navigate().GoToUrl(url);
Cette ligne de code ouvrira un nouvel onglet de navigateur à l'aide de Selenium Webdriver.
((JavascriptExecutor)getDriver()).executeScript("window.open()");
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
Pour ouvrir un nouvel onglet avec JavascriptExecutor,
((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Va contrôler sur l'onglet selon l'index:
driver.switchTo().window(tabs.get(1));
Contrôle du pilote sur l'onglet principal:
driver.switchTo().window(tabs.get(0));
J'utilise Selenium 2.52.0 en Java et Firefox 44.0.2. Malheureusement, aucune des solutions ci-dessus n'a fonctionné pour moi. Le problème est que si j'appelle driver.getWindowHandles (), je reçois toujours un seul descripteur. En quelque sorte, cela me semble logique puisque Firefox est un processus unique et que chaque onglet n’est pas un processus séparé. Mais peut-être que je me trompe. 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é la combinaison Ctrl + t pour ouvrir un nouvel onglet, Ctrl + w pour le fermer et pour revenir à l'onglet d'origine, j'ai utilisé Ctrl + 1 (le premier onglet). Je suis conscient que la solution proposée n’est pas parfaite ni bonne, et j’aimerais également passer d’un appel du conducteur à l’autre, mais comme j’ai écrit, cela n’était pas possible car je n’avais qu’un seul manche. Peut-être que cela sera utile à quelqu'un dans la même situation.
Comment ouvrir un nouvel onglet avec Selenium WebDriver avec Java for chrome?
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.navigate().to("https://google.com");
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_T);
Le code ci-dessus désactive les premières extensions et, à l'aide de la classe robot, un nouvel onglet s'ouvre.
J'ai eu du mal à ouvrir un nouvel onglet en chrome pendant un moment . Même driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
n'a pas fonctionné pour moi.
J'ai découvert qu'il ne suffisait pas que Selenium se concentre sur le pilote, Windows devait également avoir la fenêtre à l'avant.
Ma solution consistait à appeler une alerte sur Chrome qui ferait apparaître la fenêtre, puis à exécuter la commande. exemple de code:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Ce code fonctionne pour moi (Selenium 3.8.1, chromedriver = 2.34.522940, chrome = 63.0):
public void openNewTabInChrome() {
driver.get("http://www.google.com");
WebElement element = driver.findElement(By.linkText("Gmail"));
Actions actionOpenLinkInNewTab = new Actions(driver);
actionOpenLinkInNewTab.moveToElement(element)
.keyDown(Keys.CONTROL) // MacOS: Keys.COMMAND
.keyDown(Keys.SHIFT).click(element)
.keyUp(Keys.CONTROL).keyUp(Keys.SHIFT).perform();
ArrayList<String> tabs = new ArrayList(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get("http://www.yahoo.com");
//driver.close();
}
Question : Comment ouvrir un nouvel onglet avec Selenium WebDriver avec Java?
Réponse : Après avoir cliqué sur un lien, ouvrez un nouvel onglet.
Si nous voulons gérer un onglet récemment ouvert, nous devons le faire en utilisant la commande .switchTo (). Window ()
Basculez vers un onglet particulier, puis effectuez l'opération et revenez dans l'onglet parent.
package test;
import Java.util.ArrayList;
import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.firefox.FirefoxDriver;
public class Tab_Handle {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver", "geckodriver_path");
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com");
// Store all currently open tabs in Available_tabs
ArrayList<String> Available_tabs = new ArrayList<String>(driver.getWindowHandles());
// Click on link to open in new tab
driver.findElement(By.id("Url_Link")).click();
// Switch newly open Tab
driver.switchTo().window(Available_tabs.get(1));
// Perform some operation on Newly open tab
// Close newly open tab after performing some operations.
driver.close();
// Switch to old(Parent) tab.
driver.switchTo().window(Available_tabs.get(0));
}
}
Selenium ne prend pas en charge l'ouverture de nouveaux onglets, il ne prend en charge que l'ouverture de nouvelles fenêtres. À toutes fins utiles, une nouvelle fenêtre est néanmoins équivalente à un nouvel onglet.
Il existe plusieurs méthodes pour contourner le problème, mais elles vous poseront d’autres problèmes à long terme.
cochez cet exemple complet pour comprendre comment ouvrir plusieurs onglets, basculer d'un onglet à l'autre et fermer tous les onglets.
public class Tabs {
WebDriver driver;
Robot rb;
@BeforeTest
public void setup() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Anuja.AnujaPC\\Downloads\\chromedriver_win32\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("http://qaautomated.com");
}
@Test
public void openTab() {
//Open tab 2 using CTRL + t keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Open URL In 2nd tab.
driver.get("http://www.qaautomated.com/p/contact.html");
//Call switchToTab() method to switch to 1st tab
switchToTab();
//Call switchToTab() method to switch to 2nd tab.
switchToTab();
}
public void switchToTab() {
//Switching between tabs using CTRL + tab keys.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
//Switch to current selected tab's content.
driver.switchTo().defaultContent();
}
@AfterTest
public void closeTabs() throws AWTException {
//Used Robot class to perform ALT + SPACE + 'c' keypress event.
rb =new Robot();
rb.keyPress(KeyEvent.VK_ALT);
rb.keyPress(KeyEvent.VK_SPACE);
rb.keyPress(KeyEvent.VK_C);
} }
Cet exemple est donné par cette page Web
Pour ouvrir un nouvel onglet dans le navigateur Firefox existant à l'aide de Selenium WebDriver
FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
Même exemple pour nodejs:
var webdriver = require('Selenium-webdriver');
...
driver = new webdriver.Builder().
withCapabilities(capabilities).
build();
...
driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");
Comment ouvrir une nouvelle page, mais plus important encore, comment faites-vous des choses dans ce nouvel onglet? Webdriver n'ajoute pas de nouveau WindowHandle pour chaque onglet et ne contrôle que le premier. Ainsi, après avoir sélectionné un nouvel onglet (numéro de contrôle + onglet), définissez .DefaultContent () sur le pilote pour définir l'onglet visible comme étant 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()
En raison d'un bogue dans https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 même si webdriver.switchTo change d'onglet, le focus reste sur le premier. Vous pouvez le confirmer en exécutant un fichier driver.get après la fenêtre switchWindow et en vous assurant que le deuxième onglet est en fait dirigé vers la nouvelle URL et non vers l'onglet d'origine.
Pour le moment, c’est ce que @ yardening2 a suggéré… .. Utilisez js pour ouvrir une alerte, puis utilisez webdriver pour l’accepter.