74

JavaでのSeleniumWebDriverの使用。新しいタブを開いてそこでいくつかの操作を実行し、前のタブ(親)に戻る必要がある機能を自動化しようとしています。スイッチハンドルを使用しましたが、機能しません。そして、奇妙なことに、2つのタブのウィンドウハンドルが同じであるため、タブを切り替えることができません。

ただし、別のFirefoxウィンドウで試している場合は機能しますが、タブの場合は機能しません。

タブを切り替えるにはどうすればよいですか?または、私の場合、ウィンドウハンドルは両方のタブで同じであるため、ウィンドウハンドルを使用せずにタブを切り替えるにはどうすればよいですか?

(同じウィンドウで異なるタブを開いても、ウィンドウハンドルは同じままであることがわかりました)

4

24 に答える 24

122
    psdbComponent.clickDocumentLink();
    ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs2.get(1));
    driver.close();
    driver.switchTo().window(tabs2.get(0));

このコードは私にとって完璧に機能しました。やってみよう。新しいタブで何かをする前に、常にドライバを新しいタブに切り替える必要があります。

于 2014-04-08T17:31:56.227 に答える
26

これは、新しいタブを開き、フォーカスを変更し、タブを閉じて、フォーカスを古い/元のタブに戻すための簡単なソリューションです。

@Test
public void testTabs() {
    driver.get("https://business.twitter.com/start-advertising");
    assertStartAdvertising();

    // considering that there is only one tab opened in that point.
    String oldTab = driver.getWindowHandle();
    driver.findElement(By.linkText("Twitter Advertising Blog")).click();
    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
    newTab.remove(oldTab);
    // change focus to new tab
    driver.switchTo().window(newTab.get(0));
    assertAdvertisingBlog();

    // Do what you want here, you are in the new tab

    driver.close();
    // change focus back to old tab
    driver.switchTo().window(oldTab);
    assertStartAdvertising();

    // Do what you want here, you are in the old tab
}

private void assertStartAdvertising() {
    assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
}

private void assertAdvertisingBlog() {
    assertEquals("Twitter Advertising", driver.getTitle());
}
于 2013-05-14T11:27:25.137 に答える
14

Webドライバーがさまざまなウィンドウを処理する方法と、さまざまなタブを処理する方法には違いがあります。

ケース1:
複数のウィンドウがある場合は、次のコードが役立ちます。

//Get the current window handle
String windowHandle = driver.getWindowHandle();

//Get the list of window handles
ArrayList tabs = new ArrayList (driver.getWindowHandles());
System.out.println(tabs.size());
//Use the list of window handles to switch between windows
driver.switchTo().window(tabs.get(0));

//Switch back to original window
driver.switchTo().window(mainWindowHandle);


ケース2:
同じウィンドウに複数のタブがある場合、ウィンドウハンドルは1つだけです。したがって、ウィンドウハンドルを切り替えると、コントロールが同じタブに保持されます。
この場合、Ctrl + \ t(Ctrl + Tab)を使用してタブを切り替える方が便利です。

//Open a new tab using Ctrl + t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Switch between tabs using Ctrl + \t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");

詳細なサンプルコードはここにあります:http:
//design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

于 2014-11-27T15:06:09.537 に答える
7

回避策

仮定:Webページ上の何かをクリックすると、新しいタブが開きます。

以下のロジックを使用して、2番目のタブに切り替えます。

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();

同様に、最初のタブに戻すことができます。

new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();
于 2012-10-04T15:43:29.650 に答える
6

が順調ではないのでdriver.window_handles、より良い解決策はこれです。

まず、ショートカットを使用して最初のタブControl + Xに切り替え、ブラウザウィンドウの「x」番目のタブに切り替えます。

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "1");
# goes to 1st tab

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "4");
# goes to 4th tab if its exists or goes to last tab.
于 2018-06-10T04:54:24.020 に答える
4
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
    WebElement e = driver.findElement(By
            .xpath("html/body/header/div/div[1]/nav/a"));
e.sendKeys(selectLinkOpeninNewTab);//to open the link in a current page in to the browsers new tab

    e.sendKeys(Keys.CONTROL + "\t");//to move focus to next tab in same browser
    try {
        Thread.sleep(8000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    //to wait some time in that tab
    e.sendKeys(Keys.CONTROL + "\t");//to switch the focus to old tab again

それがあなたに役立つことを願っています。

于 2015-04-24T07:11:41.553 に答える
3

最初に行う必要があるのは、新しいタブを開いてそのハンドル名を保存することです。キーは自動化サーバーで常に使用できるとは限らないため、キー(ctrl + t)ではなくjavascriptを使用して実行するのが最適です。例:

public static String openNewTab(String url) {
    executeJavaScript("window.parent = window.open('parent');");
    ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
    String handleName = tabs.get(1);
    bot.driver.switchTo().window(handleName);
    System.setProperty("current.window.handle", handleName);
    bot.driver.get(url);
    return handleName;
}

次に行う必要があるのは、タブを切り替えることです。ウィンドウハンドルを切り替えるだけでそれを行うと、作業するタブが常にフォーカスされているとは限らず、Seleniumが失敗することがあるため、常に機能するとは限りません。私が言ったように、キーを使用するのは少し問題があり、javascriptはタブの切り替えを実際にはサポートしていないので、アラートを使用してタブを切り替えました。これは魅力のように機能しました。

public static void switchTab(int tabNumber, String handleName) {
        driver.switchTo().window(handleName);
        System.setProperty("current.window.handle", handleName);
        if (tabNumber==1)
            executeJavaScript("alert(\"alert\");");
        else
            executeJavaScript("parent.alert(\"alert\");");
        bot.wait(1000);
        driver.switchTo().alert().accept();
    }
于 2016-10-19T12:55:30.450 に答える
2
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);

この方法は、複数のウィンドウを切り替えるのに役立ちます。この方法の制限の問題は、必要なウィンドウに達するまで、何度も使用できることです。それが役に立てば幸い。

于 2016-04-28T17:17:33.650 に答える
2

JavaでFirefox47.0.1をWebDriverとして使用するSelenium2.53.1では、開いたタブの数に関係なく、「driver.getWindowHandles()」は1つのハンドルしか返さないため、タブを切り替えることはできませんでした。

Chrome 51.0を使い始めると、すべてのハンドルを取得できました。次のコードは、各ドライバー内の複数のドライバーと複数のタブにアクセスする方法を示しています。

// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());

// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)

// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
   driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
   // SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
   Thread.sleep(100);

// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());

// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   driver1.switchTo().window(tabs1.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
   drvier2.switchTo().window(tabs2.get(ii));
   // LOGIC FOR THAT DRIVER'S CURRENT TAB
}

うまくいけば、それはあなたに複数のブラウザウィンドウで複数のタブを操作する方法の良いアイデアを与えるでしょう。

于 2016-08-24T14:38:11.403 に答える
2

私のために働いた簡単な答え:

for (String handle1 : driver1.getWindowHandles()) {
        System.out.println(handle1); 
        driver1.switchTo().window(handle1);     
}
于 2017-10-09T18:31:35.493 に答える
2
Set<String> tabs = driver.getWindowHandles();
Iterator<String> it = tabs.iterator();
tab1 = it.next();
tab2 = it.next();
driver.switchTo().window(tab1);
driver.close();
driver.switchTo().window(tab2);

これを試して。動作するはずです

于 2020-07-10T19:16:47.830 に答える
1

最近問題が発生しました。リンクは新しいタブで開かれましたが、セレンはまだ最初のタブに焦点を合わせていました。

私はChromedriverを使用していますが、タブに焦点を合わせる唯一の方法は、を使用することswitch_to_window()でした。

Pythonコードは次のとおりです。

driver.switch_to_window(driver.window_handles[-1])

したがって、ヒントは、必要なウィンドウハンドルの名前を見つけることです。これらは、リストとして保存されます。

driver.window_handles
于 2013-04-29T05:00:29.720 に答える
1

下記を参照してください:

WebDriver driver = new FirefoxDriver();

driver.manage().window().maximize();
driver.get("https://www.irctc.co.in/");
String oldTab = driver.getWindowHandle();

//For opening window in New Tab
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("Hotels & Lounge")).sendKeys(selectLinkOpeninNewTab);

// Perform Ctrl + Tab to focus on new Tab window
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, Keys.TAB)).perform();

// Switch driver control to focused tab window
driver.switchTo().window(oldTab);

driver.findElement(By.id("textfield")).sendKeys("bangalore");

これがお役に立てば幸いです。

于 2014-01-31T11:39:29.807 に答える
1

client.window(callback)これは非常に単純なプロセスです。タブが2つあると仮定すると、switchコマンドが「最初に使用可能なタブに切り替わる」ため、を使用して現在のタブを最初に閉じる必要があります。次に、を使用してタブを簡単に切り替えることができますclient.switchTab

于 2015-04-14T06:17:06.583 に答える
1

ブラウザのタブを切り替える方法の簡単な例(1つのウィンドウの場合):

// open the first tab
driver.get("https://www.google.com");
Thread.sleep(2000);

// open the second tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
driver.get("https://www.google.com");
Thread.sleep(2000);

// switch to the previous tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "" + Keys.SHIFT + "" + Keys.TAB);
Thread.sleep(2000);

Thread.sleep(2000)タブ間の切り替えを確認するためにタイムアウトするためだけに作成します。

CTRL + TABを使用して次のタブに切り替え、CTRL + SHIFT+TABを使用して前のタブに切り替えることができます。

于 2016-04-22T13:09:59.890 に答える
1

これは、FirefoxおよびChrome用のMacOSで機能します。

// opens the default browser tab with the first webpage
driver.get("the url 1");
thread.sleep(2000);

// opens the second tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
driver.get("the url 2");
Thread.sleep(2000);

// comes back to the first tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");
于 2016-09-08T10:12:29.567 に答える
1

親ウィンドウのハンドルを取得します。

String parentHandle = driverObj.getWindowHandle();
public String switchTab(String parentHandle){
    String currentHandle ="";
    Set<String> win  = ts.getDriver().getWindowHandles();   

    Iterator<String> it =  win.iterator();
    if(win.size() > 1){
        while(it.hasNext()){
            String handle = it.next();
            if (!handle.equalsIgnoreCase(parentHandle)){
                ts.getDriver().switchTo().window(handle);
                currentHandle = handle;
            }
        }
    }
    else{
        System.out.println("Unable to switch");
    }
    return currentHandle;
}
于 2017-08-09T06:36:14.683 に答える
1

選択された回答の欠点は、が不必要に順序を想定していることwebDriver.getWindowHandles()です。このgetWindowHandles()メソッドは、を返しますがSet、これは順序を保証するものではありません。

次のコードを使用してタブを変更しましたが、順序は想定されていません。

String currentTabHandle = driver.getWindowHandle();
String newTabHandle = driver.getWindowHandles()
       .stream()
       .filter(handle -> !handle.equals(currentTabHandle ))
       .findFirst()
       .get();
driver.switchTo().window(newTabHandle);
于 2018-02-28T11:21:51.547 に答える
1
protected void switchTabsUsingPartOfUrl(String platform) {
    String currentHandle = null;
    try {
        final Set<String> handles = driver.getWindowHandles();
        if (handles.size() > 1) {
            currentHandle = driver.getWindowHandle();
        }
        if (currentHandle != null) {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
                    break;
                }
            }
        } else {
            for (final String handle : handles) {
                driver.switchTo().window(handle);
                if (currentUrl().contains(platform)) {
                    break;
                }
            }
        }
    } catch (Exception e) {
        System.out.println("Switching tabs failed");
    }
}

このメソッドを呼び出し、切り替え先のタブのurlのサブストリングをパラメーターに渡します

于 2018-03-15T09:45:31.800 に答える
1

パブリッククラスTabBrowserDemo{

public static void main(String[] args) throws InterruptedException {
    System.out.println("Main Started");
    System.setProperty("webdriver.gecko.driver", "driver//geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.get("https://www.irctc.co.in/eticketing/userSignUp.jsf");
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    driver.findElement(By.xpath("//a[text()='Flights']")).click();
    waitForLoad(driver);
    Set<String> ids = driver.getWindowHandles();
    Iterator<String> iterator = ids.iterator();
    String parentID = iterator.next();
    System.out.println("Parent WIn id " + parentID);
    String childID = iterator.next();
    System.out.println("child win id " + childID);

    driver.switchTo().window(childID);
    List<WebElement> hyperlinks = driver.findElements(By.xpath("//a"));

    System.out.println("Total links in tabbed browser " + hyperlinks.size());

    Thread.sleep(3000);
//  driver.close();
    driver.switchTo().window(parentID);
    List<WebElement> hyperlinksOfParent = driver.findElements(By.xpath("//a"));

    System.out.println("Total links " + hyperlinksOfParent.size());

}

public static void waitForLoad(WebDriver driver) {
    ExpectedCondition<Boolean> pageLoadCondition = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
                }
            };
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(pageLoadCondition);
}
于 2018-06-25T07:28:27.477 に答える
1
    public void switchToNextTab() {
        ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tab.get(1));
    }
    
    public void closeAndSwitchToNextTab() {
        driver.close();
        ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tab.get(1));
    }

    public void switchToPreviousTab() {
        ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tab.get(0));
    }

    public void closeTabAndReturn() {
        driver.close();
        ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tab.get(0));
    }

    public void switchToPreviousTabAndClose() {
        ArrayList<String> tab = new ArrayList<>(driver.getWindowHandles());
        driver.switchTo().window(tab.get(1));
        driver.close();
    }
于 2020-06-24T15:01:51.243 に答える
1
WebDriver driver = new FirefoxDriver();

driver.switchTo().window(driver.getWindowHandles().toArray()[numPage].toString());

numPage - int (0,1..)
于 2021-11-24T15:01:34.470 に答える
0

文字列mainWindow=driver.getWindowHandle(); seleniumHelper.switchToChildWindow(); ....//アサーションの手順

seleniumHelper.switchToWindow(mainWindow);

于 2022-02-10T13:25:05.167 に答える
0

Javaでは、これを使用してセレンフォーカスを新しいタブに切り替えました。

//Before the action that redirect to the new tab:
String windHandleCurrent = driver.getWindowHandle();
// code that click in a btn/link in order to open a new tab goes here
// now to make selenium move to the new tab 
ArrayList<String> windows = new ArrayList<String>(driver.getWindowHandles());
    for(int i =0;i<windows.size();i++ ) {
        String aWindow = windows.get(i);
        if(aWindow != windHandleCurrent) {
            driver.switchTo().window(aWindow);
        }
    }
// now you can code your AssertJUnit for the new tab.
于 2022-02-16T16:30:29.107 に答える