web-dev-qa-db-ja.com

WebDriverまたはProtractorでタブを閉じる方法はありますか?

分度器またはWebDriverを介してタブを物理的に閉じる方法はありますか?

タブを切り替える をプログラムで行う方法は知っているが、アクティブなタブが前面に表示されないためです。画面キャストを表示すると、アクティブなタブではなく、移動したタブが表示されるため、SauceLabsで実行するE2Eテストで何が行われているのかを常に確認できません。

私はこれについて間違って行っていますか?

it('should do something in the previous tab', function(done) {
    browser.getAllWindowHandles().then(function (handles) {
        browser.switchTo().window(handles[0]);
        // do something
        expect(something).toEqual(thisThing);
        done();
    });
});
30
Aaron

以下を試すことができます:

新しく開いたタブに切り替えます。現在のウィンドウ(この場合は新しいタブ)を閉じます。最初のウィンドウに戻ります。

browser.getAllWindowHandles().then(function (handles) {
    browser.driver.switchTo().window(handles[1]);
    browser.driver.close();
    browser.driver.switchTo().window(handles[0]);
});
56
Sakshi Singla

まず、Seleniumは、ブラウザのタブを操作するための信頼できるクロスブラウザAPIを提供していません。タブを開いたり閉じたりする一般的な方法は(信頼性はそれほど高くありませんが)、Chromeのブラウザーショートカットを呼び出すことです:

  • タブを開く:CTRL/COMMAND + T
  • タブを閉じる:CTRL/COMMAND + W

分度器で、body要素を見つけ、それに「キーを送信」し​​ます。

_var body = element(by.tagName("body"));
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "t"))
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "w"))
_

または、browser.actions()を使用:

_browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('t').perform();
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('w').perform();
_

また、新しいタブを開くには、面白いハックがあります(導入された here )。これは基本的にページに新しいa要素を挿入し、clickマウスイベントを呼び出します。 :

_function openNewTab (url) {
    return browser.driver.executeScript(function(url) {(
        function(a, url){
            document.body.appendChild(a);
            a.setAttribute('href', url);
            a.dispatchEvent((function(e){
                e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null);
                return e;
            }(document.createEvent('MouseEvents'))))
        }(document.createElement('a'), url)
    );
    }, url)
};
_

window.close() 関数もありますが、window.open()reference )で開かなかった場合、タブは閉じません。つまり、これが手動で開いたタブである場合、window.open() -> window.close()の助けを借りてbrowser.executeScript()アプローチを使用できます。

12
alecxe

Sakshiの答えのC#バージョン:

   var tabs = driver.WindowHandles;
   if (tabs.Count > 1)
   {
       driver.SwitchTo().Window(tabs[1]);
       driver.Close();
       driver.SwitchTo().Window(tabs[0]);
   }
5
Mark Rowe

最初のタブを除くすべてのタブを閉じて、最初のタブに切り替えます。

var tabs = driver.WindowHandles; // 

foreach (var tab in tabs)
{
     // "tab" is a string like "CDwindow-6E793DA3E15E2AB5D6AE36A05344C68"
     if (tabs[0] != tab) 
     {                                    
         driver.SwitchTo().Window(tab); 
         driver.Close();
     }
}

driver.SwitchTab(tabs[0]); // Switch to first tab
driver.SwitchTo().DefaultContent(); // Switch to default frame

最後の2行に注意してください。OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not foundなどのエラーを回避する必要があります

2
Oleg Neumyvakin

_driver.close_を使用して、アクティブなタブdriver.SwitchTo().Window(m_driver.WindowHandles.First());または他の使用可能なタブに切り替えることができます

0
v_vitalik