Як відкрити нову вкладку за допомогою Selenium WebDriver?


114

Як відкрити нову вкладку у існуючому браузері Firefox за допомогою Selenium WebDriver (він же Selenium 2)?


Яку мову програмування ви використовуєте?
alecxe

2
Я використовую Java. Я отримав одне рішення "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" і це працює абсолютно чудово.
Бхакти Шах

Ви зможете керувати новою вкладкою? Selenium не підтримує нові вкладки (він намагається відкрити нові вікна). Дивіться мої відповіді stackoverflow.com/questions/14550360/… та stackoverflow.com/questions/17225911/… . Чого саме ви намагаєтесь досягти?
Петро Янечек

Я хотів скопіювати якийсь текст, а потім відкрити нову вкладку та вставити той самий текст у нову вкладку. Я не намагався контролювати нову вкладку, але вона добре працює для того, що я хочу досягти.
Бхакти Шах

Я зробив те саме, використовуючи GetText () цього елемента, а потім зробив Driver.get (текст).
Бхакти Шах

Відповіді:


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

Пітон

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 (); Будь ласка, хтось може пояснити?
Брондал

1
Це не працює для мене. Я спробував кілька різних способів натискання клавіш ctrl + t, жоден з яких не вдається відкрити нову вкладку.
Thayne

4
@Thayne помилка ChromeDriver не дозволяє CTRL + T працювати. Ви можете використовувати CTRL + LMB як спосіб вирішення. Див. Code.google.com/p/chromedriver/isissue/detail?id=903#c2 для зразкового коду.
Гілі

34

Чому б цього не зробити

driver.ExecuteScript("window.open('your url','_blank');");

більшість блокаторів спливаючих вікон заблокують цю спробу
Берт Ламб

1
напевно безпечно для тестування, де ви контролюєте налаштування свого браузера
kernowcode

1
певно працювали б чудово. chromedriver, здається, вимикає всі розширення (тобто adblock)
Josh O'Bryan

4
Після оновлення до Chrome 49.0.2623.75 м метод пересилання ключів більше не працює, і цей метод працює у цій версії 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

Це працює аналогічно і для 3-ї вкладки. Чи можу я знати, де саме кидає виняток (On driver close)?
Ішита Шах

Ні, у цьому рядку 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 для відкриття нової вкладки
Ріпон Аль Васім

@ Chandra Shekhar: Чи можете ви, будь ласка, спробувати мій 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));
}

3

Нижче коду відкриється посилання у новому вікні

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);

1
type object 'Keys' не має атрибута 'акорд'
Robino

@Robino Я бачу це в класі Keys (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);

Так, це добре працює, відкрийте нову URL-адресу в тій самій вкладці існуючої URL-адреси, що добре для тестів партії, оскільки вона не використовує багато ресурсів.
Джон Петерс

2

Я певний час відкрив нову вкладку в хромі. Навіть driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");не працював для мене.

Я з'ясував, що недостатньо того, що селен зосереджується на драйвері, Windows також має мати вікно спереду.

Моє рішення полягала в тому, щоб викликати попередження про хром, яке приведе вікно спереду, а потім виконає команду. зразок коду:

((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

1

Я використовую 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 (перша вкладка). Я усвідомлюю, що моє рішення не є ідеальним або навіть хорошим, і я також хотів би переключитися з комутатором водія для виклику, але, як я писав, це було неможливо, оскільки у мене була лише одна ручка. Можливо, це буде корисно для когось із такою ж ситуацією.


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

Цей рядок коду відкриє нову вкладку браузера за допомогою веб-диска селену

((JavascriptExecutor)getDriver()).executeScript("window.open()");

Коли я перебіг вище коду, у chrome його відкрив нову вкладку. Однак у firefox відкриється нове вікно. В обох випадках обробник вікон відрізняється для нововідкритих. Тому я думаю, що вкладка більш-менш збігається з вікном. Звичайно, анонімне вікно, безумовно, відрізняється від звичайної вкладки вікна.
MamathaMacherla

1

* JAVA

Я рекомендую використовувати JavascriptExecutor:

  • Відкрити нове порожнє вікно:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Відкрийте нове вікно із вказаною URL-адресою:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Після імпорту:

import org.openqa.selenium.JavascriptExecutor;

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

0

Щоб відкрити нову вкладку у існуючому браузері Firefox за допомогою Selenium WebDriver

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 

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

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/isissue/detail?id=1465, навіть незважаючи на те, що webdriver.switchTo насправді робить перемикання вкладок, фокус залишається на першій вкладці. Ви можете підтвердити це, виконавши driver.get після перемиканняWWW і переконавшись, що друга вкладка переходить на нову URL-адресу, а не на початкову вкладку.

Наразі вирішуйте те, що @ yardening2 запропонувало. Використовуйте js, щоб відкрити сповіщення, а потім скористайтесь веб-драйвером, щоб прийняти його.


0

Цей код працює для мене (селен 3.8.1, хромедрівер = 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();
}

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

    }

}

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

Не вдається вирішити питання. Ви відповідаєте про перехід до вже наявного вікна, ОП запитав, як відкрити нове.
Томас Гірш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.