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

2015-04-08 selenium selenium-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();
    });
});

Answers

まず第一に、 セレンは、ブラウザーのタブを操作するための信頼できるクロスブラウザー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();

また、新しいタブを開くには、興味深いハック( ここで紹介)があり、基本的には新しいa要素をページに挿入してclickマウスイベントを呼び出し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()を介して開かれていない場合はタブを閉じません( 参照 )。つまり、これが手動で開いたタブの場合は、 browser.executeScript()を使用してwindow.open() -> window.close()アプローチを使用できます。

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

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

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

新しいタブでリンクを開いた後、次のコマンドを使用して現在のタブを閉じています

Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[1]).Close();

次に、次のコマンドを発行して、最後のタブに切り替えることができます。

Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[0]);

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

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

使用できます driver.close 次に、アクティブなタブに切り替えますdriver.SwitchTo().Window(m_driver.WindowHandles.First());または他の利用可能なタブ

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

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などのエラーを回避する必要がありOpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found

Sakshi Singlaが答えたように、 browser.driver.close()が私のために働いています。分度器Jasmineのspec.jsのサンプルを参照してください。

describe('Window handle', function() {  
      //Each single it function is a test script
      it('Navigae to the site', function() {
        browser.driver.ignoreSynchronization = true;
        browser.waitForAngularEnabled(false);     
        browser.driver.get('http://demo.automationtesting.in/Windows.html');    

      });

      it('handle the new window', function() {
          //This will open a new popup
            element(by.buttonText('click')).click();
          var winHandles=browser.getAllWindowHandles();
          winHandles.then(function(handles) 
          {
              var parentWindow=handles[0];
              var popUpWindow=handles[1];
              browser.switchTo().window(popUpWindow);
//verify title in the new window
              expect(browser.getTitle()).toEqual('Sakinalium | Home');
              element(by.linkText('Contact')).click();
//To close the popup
               browser.driver.close();
             //verify title in the parent window
              browser.switchTo().window(parentWindow);
              expect(browser.getTitle()).toEqual('Frames & windows');             
              element(by.linkText('Open Seperate Multiple Windows')).click();
              browser.sleep(7500);
          })
          });


})

Related