【问题标题】:Is there a way to close a tab in WebDriver or Protractor?有没有办法关闭 WebDriver 或 Protractor 中的选项卡?
【发布时间】:2015-06-12 16:18:28
【问题描述】:

有没有办法通过 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();
    });
});

【问题讨论】:

    标签: selenium selenium-webdriver protractor


    【解决方案1】:

    您可以尝试以下方法:

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

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

    【讨论】:

    • close() 在我打开图像时为我关闭了标签。但是,还不确定!
    • @Aaron 很高兴知道,它适用于 firefox 和 chrome 吗?谢谢。
    • 处理多个浏览器窗口的绝佳解决方案。量角器的 API 页面上没有记录(至少我们今天找不到 -protractortest.org/#/api?view=ProtractorBrowser)。
    • C# 版本 var tabs = driver.WindowHandles; if (tabs.Count > 1) { driver.SwitchTo().Window(tabs[1]);司机。关闭(); driver.SwitchTo().Window(tabs[0]); }
    • @MarkRowe:这是经过测试且可以工作的代码吗?如果是,那么我可以编辑我的答案以包含 C# 版本
    【解决方案2】:

    首先,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)打开的标签页,它不会关闭标签页。换句话说,如果这是您手动打开的选项卡,那么您可以在browser.executeScript() 的帮助下使用window.open() -> window.close() 方法。

    【讨论】:

    • 使用window.open() 你知道如何打开对以前使用window.open() 打开的现有选项卡的引用吗?我在第二个选项卡中运行了一个 chrome 扩展程序来捕获 HTTP 标头,但我不知道如何返回该选项卡以在出现问题时检查它们。
    【解决方案3】:

    Sakshi 答案的 C# 版本:

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

    【讨论】:

      【解决方案4】:

      关闭除第一个选项卡以外的所有选项卡并切换到第一个选项卡:

      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这样的错误

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          正如 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】:

            如果使用带有 selenium 的键盘库,则打开选项卡和关闭等非常简单:

            首先安装键盘库:

            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】:

              你可以的

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

              别忘了切换到工作标签

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

              【讨论】:

                【解决方案9】:

                由于我们不确定,新打开的标签是哪个标签;如果您知道所需选项卡的 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());
                }
                

                【讨论】:

                  【解决方案10】:

                  此代码适用于 Java 中的 selenium

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

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

                  【讨论】:

                    【解决方案11】:

                    在新标签页中打开链接后,我正在使用以下命令关闭当前标签页

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

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-10-05
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-15
                      • 2019-04-26
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多