Selenium WebDriverを使用して新しいタブを開く方法は?


114

Selenium WebDriver(別名Selenium 2)を使用して既存のFirefoxブラウザーで新しいタブを開く方法は?


どのプログラミング言語を使用していますか?
alecxe 2013

2
私はjavaを使用します。「m_Driver.findElement(By.cssSelector( "body"))。sendKeys(Keys.CONTROL + "t");」という1つのソリューションが得られました そして、その完全に正常に動作します。
バクティシャー

その後、新しいタブを制御できますか?Seleniumは新しいタブをサポートしていません(代わりに新しいウィンドウを開こうとします)。私の回答stackoverflow.com/questions/14550360/…stackoverflow.com/questions/17225911/…を参照してください。正確に何を達成しようとしていますか?
PetrJaneček2013

テキストをコピーして新しいタブを開き、同じテキストを新しいタブに貼り付けたいと思っていました。私は新しいタブを制御しようとしませんでしたが、それは私が達成したいもののためにうまく働きます。
バクティシャー2013

その要素のGetText()を使用して同じことを行い、次にDriver.get(text)を実行しました。
バクティシャー2013

回答:


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
Macを使用している場合は、Keys.CONTROLではなくKeys.COMMANDを使用してください
nanospeck

2
このソリューションは、OS固有の(そしておそらくブラウザー固有の)ショートカットに依存しているため、最適とは言えないようです...少なくとも、JSのようなものを使用する場合window.open()、多くのプラットフォーム/ブラウザーで機能することが期待できます。
mkasberg

86

Ruby / Python / C#バインディング(Selenium 2.33.0)で答えを探している人のために。

送信する実際のキーはOSによって異なることに注意してください。たとえば、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();
        }
    }
}

2
どのようにして前のタブに戻りますか?
lurscher 2013

11
WebDriverは複数のタブを処理できます-単純にそれらを別々のウィンドウとして扱います。したがってdriver.switchTo().window(windowName);、タブやウィンドウにアクセスするだけで済みます。もちろん、ウィンドウ名を通常どおり追跡して、ウィンドウ名を切り替えられるようにする必要があります。
Mark Rowlands 2013

1
要素を取得し、その要素にCtrl-tを送信する理由を説明できますか?それは意味がありません... "Web要素でCtrl + t"を実行できませんか?新しいActions(WebDriver).SendKeys(Keys.Control + "w").Perform();を実行しないのはなぜですか。誰か説明していただけませんか?
Brondahl 2014年

4
@Thayne ChromeDriverのバグにより、CTRL + Tが機能しません。回避策としてCTRL + LMBを使用できます。サンプルコードについては、code.google.com / p / chromedriver / issues / detail?id = 903#c2をご覧ください。
ギリ

1
CTRL + LMBを使用するには、Pythonコードの例を追加するだけです。ActionChains(driver).key_down(Keys.CONTROL).click(element_to_be_clicked).key_up(Keys.CONTROL).perform()ActionChainsはから輸入されますselenium.webdriver.common.action_chains
Java Xu

34

なぜこれをしませんか

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

ほとんどのポップアップブロッカーはこの試みをブロックします
バートラム

1
ブラウザーの設定を制御している場所でのテストではおそらく安全
kernowcode

1
おそらくうまくいきます。chromedriverがすべての拡張機能(つまりadblock)を無効にするようです
Josh O'Bryan

4
キーを送信する方法は、Chrome 49.0.2623.75mに更新した後は機能しなくなり、この方法はそのChromeバージョンで機能します。
Steven

6
タブで空白のページを開きたい場合は、次のことができますdriver.ExecuteScript("window.open('about:blank','_blank');");
Steven

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番目のタブでも同様に機能します。例外がスローされる場所を正確に知っていてもよいですか(ドライバーの終了時)
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 2018


8

Selenium WebDriverでJavaを使用して次のコードを使用できます。

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がここに実装されました
Ripon Al Wasim

@チャンドラシェカール:上記の私のJSコードを試していただけますか?
Ripon Al Wasim

@ Shivam:ありがとうございました。コードが機能するのを聞くのは良いことです。
Ripon Al Wasim

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
タイプオブジェクト 'Keys'には属性 'chord'がありません
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

Selenium WebDriverを使用して既存のChromeブラウザーで新しいタブを開くには、次のコードを使用できます。

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を開きます。リソースをあまり使用しないため、多くのリンクテストに適しています。
John Peters、

2

しばらくChromeで新しいタブを開けませんでした。でも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

JavaおよびFirefox 44.0.2でSelenium 2.52.0を使用しています。残念ながら、上記の解決策はどれもうまくいきませんでした。問題は、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呼び出しで切り替えたいのですが、書いたように、ハンドルが1つしかなかったため不可能でした。多分これは同じ状況の誰かに役立つでしょう。


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

1

クロムのJavaでSelenium WebDriverを使用して新しいタブを開く方法は?

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

このコード行は、セレンWebドライバーを使用して新しいブラウザータブを開きます

((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 +タブ番号)を選択した後、ドライバーに.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

Selenium WebDriverを使用して既存のFirefoxブラウザーで新しいタブを開くには

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

今後は、投稿をわかりやすくするために、コードスニペットと一緒に説明テキストを提供してください。
タイラーヤンドロ16

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

この例は、このWebページで提供されています


0

https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465のバグのためが原因で、webdriver.switchToが実際にタブを切り替えても、フォーカスは最初のタブに残ります。これを確認するには、switchWindowの後にdriver.getを実行し、2番目のタブが実際には元のタブではなく新しいURLに移動していることを確認します。

今のところ回避策は@ yardening2が提案したものです。jsを使用してアラートを開き、webdriverを使用してそれを受け入れます。


0

このコードは私のために機能します(selenium 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

質問:JavaでSelenium WebDriverを使用して新しいタブを開く方法は?

回答:リンクをクリックした後、新しいタブを開きます。

新しく開いたタブを処理する場合は、.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

質問に対処できません。答えは、既存のウィンドウに切り替えることです。OPは新しいウィンドウを開く方法を尋ねました。
Thomas Hirsch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.