有没有办法关闭WebDriver或Protractor中的选项卡?

时间:2015-04-07 22:10:11

标签: selenium selenium-webdriver protractor

有没有办法通过Protractor或WebDriver物理关闭标签?

我问,因为虽然我以编程方式知道如何switch tabs,但它没有将活动标签置于前台。我不能总是告诉我在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();
    });
});

11 个答案:

答案 0 :(得分:47)

您可以尝试以下操作:

切换到新打开的标签页。关闭当前窗口(在本例中为新选项卡)。切换回第一个窗口。

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

答案 1 :(得分:11)

首先, 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鼠标事件:< / p>

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()方法。

答案 2 :(得分:5)

C#版本的Sakshi回答:

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

答案 3 :(得分:2)

关闭除第一个标签以外的所有标签并切换到第一个标签:

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

注意最后两行,他们需要避免像OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found

这样的错误

答案 4 :(得分:1)

你可以做到

await browser.executeScript('window.close()');

别忘了切换到工作标签

let tabs = await browser.getAllWindowHandles();
await browser.switchTo().window(tabs[0]);

答案 5 :(得分:0)

你可以使用 driver.close 然后切换到活动标签driver.SwitchTo().Window(m_driver.WindowHandles.First());或任何其他可用标签

答案 6 :(得分:0)

正如Sakshi Singla回答的那样,browser.driver.close()为我工作,请参阅量角器茉莉花的示例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);
          })
          });


})

答案 7 :(得分:0)

如果将键盘库与硒一起使用,则非常简单,可以打开选项卡并关闭等:

首先安装键盘库:

pip install keyboard

使用第二个键盘来关闭代码中的标签,例如:

    def change_tab_my_func(self, number):
        driver.switch_to.window(driver.window_handles[number])

    change_tab_my_func(0)   #your tab index    
    keyboard.send('ctrl+w')  

答案 8 :(得分:0)

由于我们不确定,哪个标签是新打开的;如果您知道所需选项卡的 URL 包含一些独特的部分,您可以在 C# 中执行以下操作:

string uniqueURL = "your unique text in URL of the tab you want to keep";
var windowHandles = driver.WindowHandles;
if(windowHandles.Count > 1)
{
       foreach(var tab in windowHandles)
       {
              driver.SwitchTo().Window(tab);
              if(!driver.Url.Contains(uniqueURL))
              {
                    driver.Close();
              }
       }

       driver.SwitchTo().Window(driver.WindowHandles.First());
}

答案 9 :(得分:0)

此代码适用于带有 Java 的 selenium

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

注意:根据您的要求关闭标签

答案 10 :(得分:-1)

我在打开新标签页中的链接

后,使用以下命令关闭当前标签页
Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[1]).Close();

然后,您可以通过发出命令切换到最后一个选项卡:

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