Как открыть новую вкладку с помощью Selenium WebDriver?
Как открыть новую вкладку в существующем браузере Firefox с помощью Selenium WebDriver (он же Selenium 2)?
37 ответов
Код ниже откроет ссылку в новой вкладке.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Код ниже откроет пустую новую вкладку.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Просто для тех, кто ищет ответ в привязках Ruby/Python/C# (Selenium 2.33.0).
Обратите внимание, что фактические ключи для отправки зависят от вашей ОС, например, Mac использует COMMAND + t
, вместо CONTROL + t
,
Рубин
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get('http://stackru.com/')
body = driver.find_element(:tag_name => 'body')
body.send_keys(:control, 't')
driver.quit
питон
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://stackru.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 StackruTests {
class OpenNewTab {
static void Main(string[] args) {
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://stackru.com/");
IWebElement body = driver.FindElement(By.TagName("body"));
body.SendKeys(Keys.Control + 't');
driver.Quit();
}
}
}
Почему бы не сделать это
driver.ExecuteScript("window.open('your url','_blank');");
Чтобы открыть новую вкладку с помощью JavascriptExecutor,
((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Будет контролировать на вкладке в соответствии с индексом:
driver.switchTo().window(tabs.get(1));
Управление драйвером на главной вкладке:
driver.switchTo().window(tabs.get(0));
Начиная с selenium>= 4.0, нет необходимости в javascript или
send_keys
обходные пути. Selenium 4 предоставляет новый API
newWindow
который позволяет вам создать новое окно (или вкладку) и автоматически переключиться на него. Поскольку новое окно или вкладка создается в том же сеансе, он позволяет избежать создания нового объекта WebDriver.
Python
Открыть новую вкладку
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.TAB)
Открыть новую вкладку
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.window import WindowTypes
driver.switch_to.new_window(WindowTypes.WINDOW)
Ява
Открыть новое окно
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/");
Открыть новую вкладку
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/")
Вы можете использовать следующий код, используя Java с Selenium WebDriver:
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Используя JavaScript:
WebDriver driver = new FirefoxDriver();//FF or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
Открыть новое окно в Chrome Driver.
//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);
Почти все ответы здесь устарели.
WebDriver теперь поддерживает открытие вкладок:
browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window
Откроется новая вкладка. Открытие окна стало практически нестандартным делом:
browser.manage.new_window(:window)
Вкладка или окно не будут фокусироваться автоматически. Чтобы переключиться на него:
browser.switch_to.window new_tab
Попробуйте это для браузера 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));
}
Чтобы открыть новую вкладку в существующем браузере Chrome с помощью Selenium WebDriver, вы можете использовать этот код:
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);
У меня были проблемы с открытием новой вкладки в Chrome на некоторое время. Четное driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Не работал для меня
Я обнаружил, что недостаточно, чтобы селен фокусировался на драйвере, у Windows также должно быть окно спереди.
Мое решение состояло в том, чтобы вызвать предупреждение на Chrome, которое выведет окно на передний план, а затем выполнить команду. образец кода:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Ниже код откроет ссылку в новом окне
String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
*ЯВА
Рекомендую использовать JavascriptExecutor
:
- Открыть новое пустое окно:
((JavascriptExecutor) driver).executeScript("window.open()");
- Открыть новое окно с определенным URL:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");
После импорта:
import org.openqa.selenium.JavascriptExecutor;
Эта строка кода откроет новую вкладку браузера с помощью селена webdriver
((JavascriptExecutor)getDriver()).executeScript("window.open()");
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
Как открыть новую вкладку с помощью Selenium WebDriver с Java для 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);
Выше код отключит первые расширения и с помощью класса робота откроется новая вкладка.
Если вам нужно открыть определенную ссылку в новой вкладке, вы можете отправить ярлык прямо на ссылку следующим образом:
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
driver.findElement(By.xpath("//a[strong[.='English']]")).sendKeys(selectLinkOpeninNewTab);
Если вам нужно открыть новую вкладку и вы хотите выбрать, какая ссылка сразу открывается на указанной вкладке, вы можете использовать JavaScriptExecutor следующим образом:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.open('https://www.wikipedia.org/', '_blank');");
Сделать это можно тремя способами. В приведенном ниже примере я делаю следующие шаги, чтобы открыть facebook в новой вкладке,
- Запуск
https://google.com
- Поиск текста и получение
URL
- Открытие
facebook
в другой таб.
Решение №1 : Использование
window handles
.
driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
driver.get(facebookUrl);
Решение №2 : Создавая новый
driver
пример. Это не рекомендуется, но это также возможный способ сделать это.
driver = new ChromeDriver(options);
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
/*Create an another instance of driver.*/
driver = new ChromeDriver(options);
driver.get(facebookUrl);
Решение # 3: использование Selenium 4
driver.get("https://www.google.com/search?q=facebook");
String facebookUrl = driver.findElement(By.xpath("(//a[contains(@href,'facebook.com')])[1]")).getAttribute("href");
driver.switchTo().newWindow(WindowType.TAB);
driver.navigate().to(facebookUrl);
Как открыть новую, но что более важно, как вы делаете вещи в этой новой вкладке? Webdriver не добавляет новый WindowHandle для каждой вкладки, а только контролирует первую вкладку. Итак, после выбора новой вкладки (Control + Tab Number) установите.DefaultContent() в драйвере, чтобы определить видимую вкладку как ту, над которой вы собираетесь работать.
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()
Я использую Selenium 2.52.0 в Java и Firefox 44.0.2. К сожалению, ни одно из вышеуказанных решений не помогло мне. Проблема в том, что если я вызываю driver.getWindowHandles(), я всегда получаю 1 единственный дескриптор. Почему-то это имеет смысл для меня, поскольку Firefox - это отдельный процесс, а каждая вкладка не является отдельным процессом. Но, возможно, я ошибаюсь. В любом случае я пытаюсь написать собственное решение:
// 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);
Я использовал комбинацию Ctrl+t, чтобы открыть новую вкладку, Ctrl+w, чтобы закрыть ее, и чтобы вернуться к исходной вкладке, я использовал Ctrl+1 (первая вкладка). Я знаю, что мое решение не является идеальным или даже хорошим, и я также хотел бы переключиться с помощью драйвера switchTo, но, как я уже писал, это было невозможно, так как у меня был только один дескриптор. Может быть, это будет полезно кому-то с такой же ситуацией.
Проверьте этот полный пример, чтобы понять, как открыть несколько вкладок и переключаться между вкладками и в конце закрыть все вкладки
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);
} }
Этот пример приведен на этой веб-странице
Из-за ошибки в https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 хотя webdriver.switchTo на самом деле переключает вкладки, фокус остается на первой вкладке. Вы можете подтвердить это, выполнив driver.get после switchWindow и увидев, что вторая вкладка фактически переходит к новому URL, а не к исходной вкладке.
Обходите сейчас то, что предложил @yardening2. Используйте js, чтобы открыть предупреждение, а затем используйте веб-драйвер, чтобы принять его.
Используйте фрагмент ниже, чтобы открыть ссылку на новой вкладке:
public void openLinkInNewTab(String link){
String currentHandle = driver().getWindowHandle();
((JavascriptExecutor) driver()).executeScript("window.open()");
//getting all the handles currently available
Set<String> handles = driver().getWindowHandles();
for (String actual : handles) {
if (!actual.equalsIgnoreCase(currentHandle)) {
//switching to the opened tab
driver().switchTo().window(actual);
//opening the URL saved.
driver.get(link);
}
}
}
Этот код работает для меня (селен 3.8.1, chromedriver=2.34.522940, хром =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();
}
Тот же пример для nodejs:
var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
withCapabilities(capabilities).
build();
...
driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");
Чтобы открыть новую вкладку в существующем браузере Firefox с помощью Selenium WebDriver
FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");
Если вы хотите открыть новую вкладку, вы можете использовать это
((JavascriptExecutor) getDriver()).executeScript("window.open()");
Если вы хотите открыть ссылку с новой вкладки, вы можете использовать это
с JavascriptExecutor:
public void openFromNewTab(WebElement element){
((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
}
с действиями:
WebElement element = driver.findElement(By.xpath("your_xpath"));
Actions actions = new Actions(driver);
actions.keyDown(Keys.LEFT_CONTROL)
.click(element)
.keyUp(Keys.LEFT_CONTROL)
.build()
.perform();
Вопрос: Как открыть новую вкладку с помощью Selenium WebDriver с Java?
Ответ: После нажатия на любую ссылку откройте новую вкладку.
Если мы хотим обработать вновь открытую вкладку, нам нужно обработать вкладку с помощью команды.switchTo(). Window().
Переключитесь на конкретную вкладку, затем выполните операцию и вернитесь на родительскую вкладку.
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));
}
}