Làm cách nào để mở một tab mới bằng Selenium WebDriver?


114

Làm cách nào để mở một tab mới trong trình duyệt Firefox hiện có bằng Selenium WebDriver (hay còn gọi là Selenium 2)?


Bạn đang sử dụng ngôn ngữ lập trình nào?
alecxe

2
Tôi sử dụng java. Tôi đã có một giải pháp "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" và nó hoạt động hoàn toàn tốt.
Bhakti Shah

Sau đó, bạn có thể kiểm soát tab mới không? Selenium không hỗ trợ các tab mới (thay vào đó nó sẽ cố gắng mở các cửa sổ mới). Xem câu trả lời của tôi stackoverflow.com/questions/14550360/…stackoverflow.com/questions/17225911/… . Chính xác là bạn đang cố đạt được điều gì?
Petr Janeček,

Tôi muốn sao chép một số văn bản và sau đó mở tab mới và dán văn bản tương tự vào tab mới. Tôi đã không cố gắng kiểm soát tab mới nhưng nó hoạt động tốt cho những gì tôi muốn đạt được.
Bhakti Shah

Tôi đã làm điều tương tự bằng cách sử dụng GetText () của phần tử đó và sau đó thực hiện Driver.get (văn bản).
Bhakti Shah

Câu trả lời:


53

Đoạn mã dưới đây sẽ mở liên kết trong Tab mới.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

Đoạn mã dưới đây sẽ mở Tab mới trống.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

7
sử dụng Keys.COMMAND thay vì Keys.CONTROL nếu bạn đang sử dụng mac
nanospeck

2
Giải pháp này có vẻ kém tối ưu vì nó phụ thuộc vào các phím tắt dành riêng cho hệ điều hành (và có thể là dành riêng cho trình duyệt) ... Ít nhất, nếu bạn sử dụng thứ gì đó như JS window.open(), bạn có thể mong đợi nó hoạt động trên nhiều nền tảng / trình duyệt.
mkasberg

86

Chỉ dành cho bất kỳ ai khác đang tìm kiếm câu trả lời trong các ràng buộc Ruby / Python / C # (Selenium 2.33.0).

Lưu ý rằng các khóa thực sự để gửi phụ thuộc vào hệ điều hành của bạn, chẳng hạn như Mac sử dụng COMMAND + tthay vì CONTROL + t.

Ruby

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

2
làm thế nào để bạn quay lại tab trước?
lurscher

11
WebDriver có thể xử lý nhiều tab - nó đơn giản coi chúng như các cửa sổ riêng biệt. Vì vậy, bạn chỉ cần driver.switchTo().window(windowName);truy cập vào bất kỳ tab hoặc cửa sổ nào. Rõ ràng, bạn cần theo dõi (các) tên cửa sổ như bình thường để cho phép chuyển đổi giữa chúng.
Mark Rowlands

1
Bạn có thể giải thích tại sao bạn đang truy xuất một phần tử và gửi Ctrl-t cho phần tử đó không? Điều đó không có ý nghĩa gì ... bạn không thể "Ctrl + t trên một phần tử web"? Tại sao không chỉ chạy các Hành động mới (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Xin vui lòng ai đó có thể giải thích?
Brondahl

4
@Thayne một lỗi ChromeDriver ngăn CTRL + T hoạt động. Bạn có thể sử dụng CTRL + LMB như một giải pháp thay thế. Xem code.google.com/p/chromedriver/issues/detail?id=903#c2 để biết mã mẫu.
Gili

1
Chỉ cần thêm ví dụ về mã python để sử dụng CTRL + LMB. ActionChains(driver).key_down(Keys.CONTROL).click(element_to_be_clicked).key_up(Keys.CONTROL).perform(). Các ActionChains được nhập khẩu từ selenium.webdriver.common.action_chains.
Java Xu

34

Tại sao không làm điều này

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

hầu hết các trình chặn cửa sổ bật lên sẽ chặn nỗ lực này
Bert Lamb

1
lẽ là an toàn để thử nghiệm nơi bạn đang ở trong kiểm soát các thiết lập trình duyệt của bạn
kernowcode

1
có thể sẽ hoạt động tốt. chromedriver dường như vô hiệu hóa tất cả các phần mở rộng (tức là adblock.)
Josh O'Bryan

4
Phương thức gửi khóa không còn hoạt động đối với tôi sau khi cập nhật lên Chrome 49.0.2623.75m và phương pháp này hoạt động trên phiên bản Chrome đó.
Steven

6
Nếu bạn muốn mở một trang trống trong tab, bạn có thể driver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

Để mở tab mới bằng JavascriptExecutor,

((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

Sẽ kiểm soát trên tab theo chỉ mục:

driver.switchTo().window(tabs.get(1));

Kiểm soát trình điều khiển trên tab chính:

driver.switchTo().window(tabs.get(0));

Làm thế nào về việc khởi chạy 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));, Tôi đã thử điều này nhưng nhận được mảng ra khỏi ngoại lệ bị ràng buộc, Nếu bạn biết bất kỳ giải pháp nào, hãy cho tôi biết.
cruisepandey

Nó cũng hoạt động tương tự cho tab thứ 3. Tôi có thể biết chính xác nơi ném ngoại lệ (Khi trình điều khiển đóng)?
Ishita Shah

Không, ở dòng này driver.switchTo().window(tabs.get(2));, Điều này hoạt động tốt ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");nhưng tôi sẽ không có bất kỳ điều khiển nào để chuyển sang cửa sổ.
cruisepandey 27/12/18


8

Bạn có thể sử dụng mã sau bằng Java với Selenium WebDriver:

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

Bằng cách sử dụng JavaScript:

WebDriver driver = new FirefoxDriver();//FF or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");

Sau khi mở tab mới, nó cần chuyển sang tab đó:

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

Các thao tác bằng tay Ctrl + T để mở một tab mới đã được thực hiện ở đây
Ripon Al Wasim

@ Chandra Shekhar: Bạn có thể vui lòng thử mã JS của tôi ở trên được không?
Ripon Al Wasim

@ Shivam: Cảm ơn bạn rất nhiều. Thật tốt khi nghe mã hoạt động.
Ripon Al Wasim

5

Hãy thử điều này cho trình duyệt 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

Mã dưới đây sẽ mở liên kết trong cửa sổ mới

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

1
loại đối tượng 'phím' không có thuộc tính 'âm'
Robino

@Robino. Tôi thấy nó trong lớp Keys (org.openqa.Selenium)
MrBCut vào

3

Hầu như tất cả các câu trả lời ở đây đều đã lỗi thời.

WebDriver hiện đã hỗ trợ mở các tab:

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

Sẽ mở một tab mới. Mở cửa sổ đã thực sự trở thành trường hợp không chuẩn:

browser.manage.new_window(:window)

Tab hoặc cửa sổ sẽ không tự động được lấy tiêu điểm. Để chuyển sang nó:

browser.switch_to.window new_tab

2

Để mở tab mới trong trình duyệt Chrome hiện có bằng Selenium WebDriver, bạn có thể sử dụng mã này:

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

Có, điều này hoạt động tốt khi mở một url mới trong cùng một tab của url hiện có, tốt cho nhiều thử nghiệm liên kết vì nó không sử dụng nhiều tài nguyên.
John Peters

2

Tôi đã gặp sự cố khi mở tab mới trong chrome trong một thời gian. Thậm chí driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");không làm việc cho tôi.

Tôi phát hiện ra rằng việc selen tập trung vào trình điều khiển là chưa đủ, Windows còn phải có cửa sổ ở phía trước.

Giải pháp của tôi là gọi một cảnh báo trên chrome sẽ đưa cửa sổ lên phía trước và sau đó thực thi lệnh. mã mẫu:

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

1

Tôi đang sử dụng Selenium 2.52.0 trong Java và Firefox 44.0.2. Thật không may, không có giải pháp nào ở trên làm việc cho tôi. Vấn đề là nếu tôi gọi driver.getWindowHandles (), tôi luôn nhận được 1 xử lý duy nhất. Bằng cách nào đó, điều này có ý nghĩa với tôi vì Firefox là một quá trình duy nhất và mỗi tab không phải là một quá trình riêng biệt. Nhưng có lẽ tôi đã nhầm. Nhưng dù sao tôi cũng cố gắng viết giải pháp của riêng mình:

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

Tôi đã sử dụng tổ hợp Ctrl + t để mở tab mới, Ctrl + w để đóng và để chuyển về tab ban đầu, tôi đã sử dụng Ctrl + 1 (tab đầu tiên). Tôi biết rằng giải pháp của tôi không hoàn hảo hoặc thậm chí là tốt và tôi cũng muốn chuyển sang công tắc của trình điều khiển Để cuộc gọi, nhưng như tôi đã viết thì không thể thực hiện được vì tôi chỉ có một tay cầm. Có thể điều này sẽ hữu ích với những người có cùng hoàn cảnh.


1
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

1

Làm cách nào để mở một tab mới bằng Selenium WebDriver với Java cho 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);

Đoạn mã trên sẽ tắt các tiện ích mở rộng đầu tiên và sử dụng tab mới của lớp rô bốt sẽ mở ra.


1

Dòng mã này sẽ mở một tab trình duyệt mới bằng cách sử dụng trình duyệt web selen

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

Khi tôi chạy đoạn mã trên, trong chrome, nó đã mở ra một tab mới. Tuy nhiên trong firefox một cửa sổ mới được mở ra. Trong cả hai trường hợp, trình xử lý cửa sổ khác nhau đối với những trình xử lý mới mở. Vì vậy, tôi nghĩ rằng một tab ít nhiều giống như một cửa sổ. Tất nhiên, cửa sổ ẩn danh chắc chắn khác với tab thông thường của cửa sổ.
MamathaMacherla

1

* JAVA

Tôi khuyên bạn nên sử dụng JavascriptExecutor:

  • Mở cửa sổ trống mới:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Mở cửa sổ mới với url cụ thể:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

Nhập sau:

import org.openqa.selenium.JavascriptExecutor;

0

Ví dụ tương tự cho 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

Làm thế nào để mở một tab mới, nhưng quan trọng hơn, bạn thực hiện các nội dung trong tab mới đó như thế nào? Webdriver không thêm WindowHandle mới cho mỗi tab và chỉ có quyền kiểm soát tab đầu tiên. Vì vậy, sau khi chọn tab mới (Control + Tab Number), hãy đặt .DefaultContent () trên trình điều khiển để xác định tab hiển thị là tab bạn sẽ thực hiện.

Ngôn ngữ lập trình

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

Cách mở tab mới trong trình duyệt Firefox hiện có bằng 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();

Trong tương lai, hãy cung cấp một số văn bản giải thích cùng với đoạn mã để làm cho bài đăng của bạn dễ hiểu hơn.
Tyler Jandreau

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

kiểm tra ví dụ hoàn chỉnh này để hiểu cách mở nhiều tab và chuyển đổi giữa các tab và cuối cùng đóng tất cả các tab

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

Ví dụ này được cung cấp bởi trang web này


0

Do lỗi trong https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 mặc dù webdriver.switchĐể thực sự chuyển đổi các tab, tiêu điểm vẫn nằm trên tab đầu tiên. Bạn có thể xác nhận điều này bằng cách thực hiện một driver.get sau switchWindow và thấy rằng tab thứ hai thực sự chuyển đến URL mới chứ không phải tab gốc.

Làm việc xung quanh bây giờ là những gì @ yardening2 đề xuất. Sử dụng js để mở một cảnh báo và sau đó sử dụng webdriver để chấp nhận nó.


0

Mã này phù hợp với tôi (selen 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

Câu hỏi : Làm cách nào để mở một tab mới bằng Selenium WebDriver với Java?

Câu trả lời : Sau khi nhấp vào bất kỳ liên kết nào, hãy mở tab mới.

Nếu chúng ta muốn xử lý tab mới mở thì chúng ta cần xử lý tab bằng cách sử dụng lệnh .switchTo (). Window ().

Chuyển sang tab cụ thể sau đó thực hiện thao tác và chuyển trở lại thành tab mẹ.

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 không hỗ trợ mở tab mới mà chỉ hỗ trợ mở cửa sổ mới. Đối với tất cả các mục đích, một cửa sổ mới có chức năng tương đương với một tab mới.

Có nhiều cách hack khác nhau để giải quyết vấn đề này nhưng chúng sẽ gây ra cho bạn các vấn đề khác về lâu dài.


0

Nếu bạn muốn mở tab mới, bạn có thể sử dụng

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

Nếu bạn muốn mở liên kết từ tab mới, bạn có thể sử dụng

với JavascriptExecutor:

 public void openFromNewTab(WebElement element){
            ((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
        }

với các Hành động:

 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

Xử lý cửa sổ trình duyệt bằng 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

Không giải quyết được câu hỏi. Bạn trả lời là chuyển sang một cửa sổ đã có, OP hỏi cách mở một cửa sổ mới.
Thomas Hirsch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.