如何使用 Selenium WebDriver 在新选项卡(chrome)中打开链接?

Posted

技术标签:

【中文标题】如何使用 Selenium WebDriver 在新选项卡(chrome)中打开链接?【英文标题】:How to open a link in new tab (chrome) using Selenium WebDriver? 【发布时间】:2016-04-22 02:59:46 【问题描述】:
System.setProperty("webdriver.chrome.driver", "D:\\softwares\\chromedriver_win32\\chromedriver.exe");

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("https://mail.google.com/");
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("www.facebook.com")).sendKeys(selectLinkOpeninNewTab);

新标签正在打开,但 URL 链接未打开。

【问题讨论】:

【参考方案1】:

Selenium 4 现在已经包含了这个功能,你可以用任何 URL 直接打开新标签或新窗口。

WebDriverManager.chromedriver().setup();

driver = new ChromeDriver(options);

driver.get("www.Url1.com");     
//  below code will open Tab for you as well as switch the control to new Tab
driver.switchTo().newWindow(WindowType.TAB);

// below code will navigate you to your desirable Url 
driver.get("www.Url2.com");

下载Maven依赖,这是我下载的-

        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>3.7.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency> 
        

您可以参考:https://codoid.com/selenium-4-0-command-to-open-new-window-tab/

观看视频:https://www.youtube.com/watch?v=7SpCMkUKq-Y&t=8s

google out for - WebDriverManager selenium 4

【讨论】:

【参考方案2】:

原始海报询问如何在新标签上打开链接。所以这就是我在 C# 中的做法。

        IWebDriver driver = new ChromeDriver();
        driver.Manage().Window.Maximize();
        driver.Navigate().GoToUrl("https://microsoft.com");
        IWebElement eventlink = driver.FindElement(By.Id("uhfLogo"));
        Actions action = new Actions(driver);
        action.KeyDown(Keys.Control).MoveToElement(eventlink).Click().Perform(); 

这实际上是在选定元素上执行 Control+Click 以在新选项卡中打开链接。

【讨论】:

【参考方案3】:

在选项卡之间切换动作类并不总是适用于所有浏览器和所有 webdriver。最好的方法是使用机器人类。试试这个代码。

        String website = "https://www.google.com";
        String website1 = "https://www.msn.com/en-in/";
        String controlpath = "C:\\Libraries\\msedgedriver.exe";
        System.setProperty("webdriver.edge.driver", controlpath);
        driver = new EdgeDriver();
        driver.manage().window().maximize(); //  Maximize browser
        driver.get(website);
        System.out.println("Google page");
        
        Robot robot = new Robot();                          
        robot.keyPress(KeyEvent.VK_CONTROL); 
        robot.keyPress(KeyEvent.VK_T); 
        robot.keyRelease(KeyEvent.VK_CONTROL); 
        robot.keyRelease(KeyEvent.VK_T);
        
        //Switch focus to new tab
        ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
        //System.out.println("Handle info"+ driver.getWindowHandles());
        driver.switchTo().window(tabs.get(1));
    
        //Launch URL in the new tab
        driver.get(website1);
        System.out.println("msn page");
        Thread.sleep(5000);
        driver.switchTo().window(tabs.get(0));
        Thread.sleep(5000);

【讨论】:

【参考方案4】:

我检查了下面的代码,它对我来说很好。我从here 找到答案。

    driver = new ChromeDriver();
    driver.manage().window().maximize();
            
    String baseUrl = "http://www.google.co.uk/";
    driver.get(baseUrl);
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1)); //switches to new tab
    driver.get("https://www.facebook.com");
    
    driver.switchTo().window(tabs.get(0)); // switch back to main screen        
    driver.get("https://www.news.google.com");

【讨论】:

它工作正常,但又打开了一个浏览器窗口 它在新标签中对我有用。您能否确认此 (driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t"); ) 命令是否会为您打开新窗口或新标签页? 对我不起作用。只有一个标签打开第一个网址 行 driver.switchTo().window(tabs.get(1)) 处抛出异常; java.lang.IndexOutOfBoundsException:索引:1,大小:1 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429) at test.SeleniumTest.main( SeleniumTest.java:31) 我在上面的 chromedriver 中尝试过,但没有成功。然后我尝试了 ((javascriptExecutor)driver).executeScript("window.open()");这打开了一个新标签。【参考方案5】:

使用SeleniumWebDriver有多种方法可以在新标签页中打开链接。


用例 A:打开相邻的空白选项卡并遍历迭代器

代码块:

import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class NewTab_blank_iterator 

    public static void main(String[] args) 

        System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("start-maximized");
        WebDriver driver =  new ChromeDriver(options); 
        driver.get("https://mail.google.com/");
        String firstWindowHandle = driver.getWindowHandle();
        System.out.println("First Window Handle is: "+firstWindowHandle);
        // Opening an adjacent blank tab
        ((JavascriptExecutor)driver).executeScript("window.open('','_blank');");
        new WebDriverWait(driver, 10).until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> allWindowHandles = driver.getWindowHandles();
        // Using iterator
        Iterator<String> itr = allWindowHandles.iterator();
        while(itr.hasNext()) 
            String nextWindow = itr.next();
            if(!firstWindowHandle.equalsIgnoreCase(nextWindow)) 
                driver.switchTo().window(nextWindow);
                System.out.println("New Tab Window Handle is: "+nextWindow);
            
        
    

控制台输出:

First Window Handle is: CDwindow-0D89767363ED691767000F01E6712D0B
New Tab Window Handle is: CDwindow-7232D2058514ED22344F129D30A0CCE7

浏览器快照:


用例 B:使用 url 打开相邻的选项卡并遍历迭代器

代码块:

import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class NewTab_url_forLoop 

    public static void main(String[] args) 

        System.setProperty("webdriver.chrome.driver","C:\\WebDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("start-maximized");
        WebDriver driver =  new ChromeDriver(options); 
        String url1 = "https://mail.google.com/";
        String url2 = "https://www.facebook.com/";
        driver.get(url1);
        String firstWindowHandle = driver.getWindowHandle();
        System.out.println("First Window Handle is: "+firstWindowHandle);
        // Opening Facebook in the adjacent TAB
        ((JavascriptExecutor)driver).executeScript("window.open('" + url2 +"');");
        new WebDriverWait(driver, 10).until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> allWindowHandles = driver.getWindowHandles();
        // Using iterator
        Iterator<String> itr = allWindowHandles.iterator();
        while(itr.hasNext()) 
            String nextWindow = itr.next();
            if(!firstWindowHandle.equalsIgnoreCase(nextWindow)) 
                driver.switchTo().window(nextWindow);
                System.out.println("New Tab Window Handle is: "+nextWindow);
            
        
    

控制台输出:

First Window Handle is: CDwindow-01F5622275A2EA2C1ABE2F0CDEB3D09B
New Tab Window Handle is: CDwindow-9E3349B91FB2FA4D5B7D4A90D0E87BD3

浏览器快照:

【讨论】:

【参考方案6】:

点击预期从新标签打开的链接使用这个

WebDriver driver = new ChromeDriver(); 
driver.get("https://www.yourSite.com"); 
WebElement link=driver.findElement(By.xpath("path_to_link")); 

Actions actions = new Actions(driver); 
actions.keyDown(Keys.LEFT_CONTROL) 
       .click(element) 
       .keyUp(Keys.LEFT_CONTROL) 
       .build() 
       .perform(); 

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

【讨论】:

【参考方案7】:

我想给我的小儿子做一个机器人,然后播放一个 Youtube 视频,而不是展示一个跳舞的机器人。

由于某种原因,上面解释的 CONTROL + T 之类的命令对我不起作用,也许这不是正确的答案,但我使用这样的自定义 Javascript 脚本解决了我的问题:

using (var driver = new ChromeDriver())
            
                var link1 = "https://www.youtube.com/watch?v=0GIgk4yuHOQ";
                //open a music
                driver.Navigate().GoToUrl(link1);
                var link2 = "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/fbe53d6d-c13f-4eec-9bcf-62f19cfab15a/d4m0h4v-9442b1f2-6a49-4818-8f51-5ebe216f043c.gif?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwic3ViIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsImF1ZCI6WyJ1cm46c2VydmljZTpmaWxlLmRvd25sb2FkIl0sIm9iaiI6W1t7InBhdGgiOiIvZi9mYmU1M2Q2ZC1jMTNmLTRlZWMtOWJjZi02MmYxOWNmYWIxNWEvZDRtMGg0di05NDQyYjFmMi02YTQ5LTQ4MTgtOGY1MS01ZWJlMjE2ZjA0M2MuZ2lmIn1dXX0.BTTlingNpBqH5O9dNVienFsArNqkfUc7KXnIgHumrBQ";
                //Dance robot, dance
                driver.ExecuteScript($"window.open('link2', '_blank');");
                Thread.Sleep(20000);
            

【讨论】:

【参考方案8】:

如果您可以获得链接元素,则可以使用它。它还会将您带到您打开的标签页。

WebElement link= driver.findElement(By.tagname("a"));  
String keyString =   Keys.CONTROL+Keys.SHIFT.toString()+Keys.ENTER.toString());
link.sendKeys(keyString);

【讨论】:

这将打开新窗口而不是标签。【参考方案9】:

我使用下面的代码在浏览器中使用 C# selenium 打开了一个新选项卡。

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;

js.ExecuteScript("window.open();");

【讨论】:

对于 Java,它是 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("window.open()");【参考方案10】:

Selenium 只能在浏览器的 WebElements 上实现自动化。打开新选项卡是在独立应用程序 webBrowser 上执行的操作。为此,您可以使用 java.util.* 包中的 Robot 类,无论它是什么类型的应用程序,它都可以使用键盘执行操作。 因此,这是您的操作代码。 请注意,您无法使用 Robot 类自动化独立应用程序,但您可以执行键盘或鼠标操作

System.setProperty("webdriver.chrome.driver","softwares\\chromedriver_win32\\chromedriver.exe"); 
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("http://www.google.com");
Robot rob = new Robot();
rob.keyPress(keyEvent.VK_CONTROL);
rob.keyPress(keyEvent.VK_T);
rob.keyRelease(keyEvent.VK_CONTROL);
rob.keyRelease(keyEvent.VK_T);

在这一步之后,您将需要一个窗口迭代器来切换到新选项卡:

Set <String> ids = driver.getWindowHandles();
Iterator <String> it = ids.iterator();
String currentWindow = it.next();
String newWindow = it.next();
driver.switchTo().window(newWindow);
driver.findElement(By.linkText("www.facebook.com")).sendKeys(selectLinkOpeninNewTab);

【讨论】:

【参考方案11】:

我尝试了其他技术,但都没有奏效,也没有产生错误,但是当我使用下面的代码时,它对我有用。

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

【讨论】:

你的答案和上面nur的答案有什么区别? Nur 比您早一年多做出回应。【参考方案12】:

您可以使用以下代码打开多个浏览器或窗口:

WebDriver driver = new ChromeDriver();
driver.get("http://yahoo.com");  

WebDriver driver1 = new ChromeDriver();
driver1.get("google.com");

WebDriver driver2 = new InternetExplorerDriver();
driver2.get("google.com/gmap");

【讨论】:

我不完全清楚为什么这会收到如此多的反对票。我遇到的所有其他答案要么不起作用,要么会迫使我超越 selenium 内置框架(javascript 命令)。我确实看到了将其用于许多选项卡的问题以及系统资源滥用的可能性。但是,我真的只需要两个选项卡,这使我可以留在 selenium 框架内。感谢 Satheesh Kumar P 提供的这个不同的答案,它确实完成了所需的任务。【参考方案13】:

以下代码适用于 Selenium 3 和 chrome 版本 58。

    WebDriver driver = new ChromeDriver();
    driver.get("http://yahoo.com");  
    ((JavascriptExecutor)driver).executeScript("window.open()");
    ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    driver.get("http://google.com");

【讨论】:

这是最好的解决方案,因为 Ctrl + t 在 chrome 浏览器上总是坏掉,github.com/SeleniumHQ/selenium/issues/5462 超级它按预期工作 ctrl+t 在 chome 中被破坏,但铬中的一个问题“org.openqa.selenium.WebDriverException:断开连接:无法连接到渲染器”可以用 catch 块处理谢谢答案 driver.switchTo().window(tabs.get(tabs.size()-1)); 【参考方案14】:

首先使用 Ctrl + t 键打开空的新选项卡,然后使用 .get() 获取所需的 URL。你的代码应该是这样的 -

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

driver.get("www.facebook.com");

如果您想在新选项卡中打开当前视图的链接,则可以使用您上面编写的代码。确保使用适当的 By 选择器类来选择 Web 元素,而不是 By.linkText()

【讨论】:

以上是关于如何使用 Selenium WebDriver 在新选项卡(chrome)中打开链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 Selenium WebDriver (Selenium 2) 中最大化浏览器窗口?

如何使用selenium webdriver来判断一个网页加载完毕

如何在 Java 中使用 Selenium WebDriver (Selenium 2) 输入文本框?

如何在 ruby​​ 中使用 Selenium WebDriver (selenium 2.0) 客户端设置选项

如何在 Selenium WebDriver Java 中使用 JavaScript

Selenium & webdriver.io 如何使用 executeScript?