Как открыть новую вкладку с помощью Selenium WebDriver?

114

Как открыть новую вкладку в существующем браузере Firefox с помощью Selenium WebDriver (он же Selenium 2)?

Бхакти Шах
источник
Какой язык программирования вы используете?
alecxe 09
2
Я использую java. У меня есть одно решение "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" и он работает нормально.
Bhakti Shah
Сможете ли вы управлять новой вкладкой? Selenium не поддерживает новые вкладки (вместо этого он пытается открывать новые окна). См. Мои ответы stackoverflow.com/questions/14550360/… и stackoverflow.com/questions/17225911/… . Чего именно вы пытаетесь достичь?
Петр Янечек
Я хотел скопировать текст, а затем открыть новую вкладку и вставить тот же текст в новую вкладку. Я не пробовал управлять новой вкладкой, но она отлично работает для того, чего я хочу достичь.
Bhakti Shah
Я сделал то же самое, используя GetText () этого элемента, а затем сделал Driver.get (text).
Bhakti Shah

Ответы:

53

Приведенный ниже код откроет ссылку в новой вкладке.

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);
Нагараджу Джампани
источник
7
используйте Keys.COMMAND вместо Keys.CONTROL, если вы используете Mac
nanospeck
2
Это решение кажется неоптимальным, поскольку оно зависит от специфичных для ОС (и, возможно, специфичных для браузера) ярлыков ... По крайней мере, если вы используете что-то вроде JS window.open(), вы можете ожидать, что оно будет работать на многих платформах / браузерах.
mkasberg
86

Просто для всех, кто ищет ответ в привязках Ruby / Python / C # (Selenium 2.33.0).

Обратите внимание, что фактические ключи для отправки зависят от вашей ОС, например, Mac использует COMMAND + tвместо CONTROL + t.

Рубин

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();
        }
    }
}
И Цзэн
источник
3
как вернуться на предыдущую вкладку?
lurscher
11
WebDriver может обрабатывать более одной вкладки - он просто рассматривает их как отдельные окна. Таким образом, вам нужно только driver.switchTo().window(windowName);получить доступ к любой вкладке или окну. Очевидно, вам нужно будет отслеживать имена окон как обычно, чтобы можно было переключаться между ними.
Марк Роулендс
1
Не могли бы вы объяснить, почему вы извлекаете элемент и отправляете ему Ctrl-t? В этом нет никакого смысла ... вы не можете "Ctrl + t на веб-элементе"? Почему бы просто не запустить новые Действия (WebDriver) .SendKeys (Keys.Control + «w») .Perform (); Пожалуйста, кто-нибудь объяснит?
Brondahl 01
1
У меня это не работает. Я пробовал несколько разных способов нажатия ctrl + t, ни один из них не открыл новую вкладку.
Thayne
4
@Thayne ошибка ChromeDriver препятствует работе CTRL + T. Вы можете использовать CTRL + LMB как обходной путь. См. Code.google.com/p/chromedriver/issues/detail?id=903#c2 для примера кода.
Gili
34

Почему бы не сделать это

driver.ExecuteScript("window.open('your url','_blank');");
kernowcode
источник
большинство блокировщиков всплывающих окон заблокируют эту попытку
Берт Лэмб,
1
вероятно, безопасно для тестирования, когда вы контролируете настройки своего браузера
kernowcode
1
наверное, отлично сработает. chromedriver, кажется, отключает все расширения (например, блокировку рекламы)
Джош О'Брайан
4
Метод отправки ключей больше не работает для меня после обновления до Chrome 49.0.2623.75m, и этот метод работает в этой версии Chrome.
Стивен
6
Если вы хотите открыть пустую страницу во вкладке, вы можетеdriver.ExecuteScript("window.open('about:blank','_blank');");
Стивен
12

Чтобы открыть новую вкладку с помощью 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));
Ишита Шах
источник
Как насчет запуска 3 URL? driver.switchTo().window(tabs.get(1)); driver.get("https://www.stackoverflow.com"); Thread.sleep(2000); driver.switchTo().window(tabs.get(2)); driver.get("https://www.flipkart.com"); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(1)); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(0));, Я пробовал это, но получаю исключение из связанного массива. Если вы знаете какое-либо решение, дайте мне знать.
cruisepandey
Аналогично работает и для третьей вкладки. Могу ли я узнать, где именно возникает исключение (при закрытии драйвера)?
Ishita Shah
Нет, в этой строке driver.switchTo().window(tabs.get(2));это работает нормально, ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");но у меня не будет никакого контроля, чтобы переключиться на окна.
cruisepandey
8

Вы можете использовать следующий код, используя 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()");

После открытия новой вкладки необходимо переключиться на эту вкладку:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Рипон Аль Васим
источник
Здесь была реализована ручная операция Ctrl + T для открытия новой вкладки
Рипон Аль Васим
@ Чандра Шекхар: Не могли бы вы попробовать мой код JS, указанный выше?
Рипон Аль Васим,
@ Шивам: Большое спасибо. Приятно слышать, как код работал.
Рипон Аль Васим
5

Попробуйте это для браузера 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));
}
Prasanth RJ
источник
3

Код ниже откроет ссылку в новом окне

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
Нагараджу Джампани
источник
1
Тип объекта «Ключи» не имеет атрибута «аккорд»
Робино
@Robino. Я вижу это в классе ключей (org.openqa.Selenium)
MrBCut
3

Почти все ответы здесь устарели.

WebDriver теперь поддерживает открытие вкладок:

browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window

Откроется новая вкладка. Открытие окна стало практически нестандартным делом:

browser.manage.new_window(:window)

Вкладка или окно не будут автоматически фокусироваться. Чтобы переключиться на него:

browser.switch_to.window new_tab
Маттиас Винкельманн
источник
2

Чтобы открыть новую вкладку в существующем браузере 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);
user2000197
источник
Да, это хорошо работает, открывая новый URL-адрес на той же вкладке существующего URL-адреса, хорошо для многих тестов ссылок, потому что он не использует много ресурсов.
Джон Питерс
2

Некоторое время у меня были проблемы с открытием новой вкладки в 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");
садоводство2
источник
1

Я использую Selenium 2.52.0 в Java и Firefox 44.0.2. К сожалению, ни одно из вышеперечисленных решений не помогло мне. Проблема в том, что если я вызываю driver.getWindowHandles (), я всегда получаю один единственный дескриптор. Каким-то образом это имеет для меня смысл, поскольку 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 call, но, как я уже писал, это было невозможно, поскольку у меня был только один дескриптор. Может быть, это будет полезно кому-нибудь в такой же ситуации.

Gico
источник
1
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
махи
источник
1

Как открыть новую вкладку с помощью 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);

Приведенный выше код отключит первые расширения, и при использовании класса робота откроется новая вкладка.

Нихил Шах
источник
1

Эта строка кода откроет новую вкладку браузера с помощью selenium webdriver.

((JavascriptExecutor)getDriver()).executeScript("window.open()");
Халифа Шейк
источник
Когда я запустил код выше, в Chrome открылась новая вкладка. Однако в firefox открывается новое окно. В обоих случаях обработчик окон отличается для вновь открытых. Поэтому я думаю, что вкладка более или менее похожа на окно. Конечно, окно инкогнито определенно отличается от обычной вкладки окна.
MamathaMacherla
1

*ЯВА

Рекомендую использовать JavascriptExecutor:

  • Открыть новое пустое окно:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Открыть новое окно с определенным URL:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

После импорта:

import org.openqa.selenium.JavascriptExecutor;
frianH
источник
0

Тот же пример для nodejs:

var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
                    withCapabilities(capabilities).
                    build();
...

driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");
дрянь
источник
0

Как открыть новую, но, что более важно, как вы делаете что-то на этой новой вкладке? 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()
BClaydon
источник
0

Чтобы открыть новую вкладку в существующем браузере Firefox с помощью Selenium WebDriver

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 
vickisys
источник
0
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
Алекс Мэтью
источник
В будущем предоставляйте пояснительный текст вместе с фрагментом кода, чтобы облегчить понимание ваших сообщений.
Тайлер Жандро
0
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());

driver.switchTo().window(tabs.get(0));
Rajan.M
источник
0

проверьте этот полный пример, чтобы понять, как открывать несколько вкладок и переключаться между вкладками, а в конце закрывать все вкладки

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

Этот пример приведен на этой веб-странице

ануджа джайн
источник
0

Из-за ошибки в https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465, хотя webdriver.switchTo действительно переключает вкладки, фокус остается на первой вкладке. Вы можете подтвердить это, выполнив driver.get после switchWindow и увидев, что вторая вкладка фактически переходит на новый URL-адрес, а не на исходную вкладку.

На данный момент это то, что предлагает @ yardening2. Используйте js, чтобы открыть предупреждение, а затем используйте webdriver, чтобы принять его.

желанный
источник
0

Этот код работает для меня (селен 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();
}
Джанг Фан
источник
0

Вопрос : Как открыть новую вкладку с помощью 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));

    }

}
Sandeep Shewale
источник
0

Selenium не поддерживает открытие новых вкладок, он поддерживает только открытие новых окон. Во всех смыслах новое окно в любом случае функционально эквивалентно новой вкладке.

Существуют различные приемы, позволяющие обойти эту проблему, но в долгосрочной перспективе они могут вызвать другие проблемы.

Ардеско
источник
0

Если вы хотите открыть новую вкладку, вы можете использовать это

 ((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();
Норайр Саргсян
источник
-1
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");// open in new tab
driver.get("ur link");
Лики
источник
-1

Обработка окна браузера с помощью Selenium Webdriver:

String winHandleBefore = driver.getWindowHandle();

for(String winHandle : driver.getWindowHandles())  // Switch to new opened window
{
    driver.switchTo().window(winHandle);
}

driver.switchTo().window(winHandleBefore);   // move to previously opened window
Джайниш Кападиа
источник
Не может ответить на вопрос. Вы отвечаете о переходе в уже существующее окно, ОП спросил, как открыть новое.
Thomas Hirsch