¿Hay alguna forma de cerrar una pestaña en WebDriver o Protractor?


¿Hay alguna forma de cerrar físicamente una pestaña a través de Transportador o WebDriver?

Pregunto porque si bien sé cómo cambiar pestañas programáticamente, pero no trae la pestaña activa al primer plano. No siempre puedo decir lo que está pasando en mis pruebas E2E que se ejecutan en SauceLabs porque cuando veo los lanzamientos de pantalla está mostrando la pestaña de la que navegué, no la activa.

¿Estoy haciendo esto incorrectamente?

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();
    });
});
Author: Community, 2015-04-08

6 answers

Puede intentar lo siguiente:

Cambie a la nueva pestaña abierta. Cierre las ventanas actuales (en este caso, la pestaña nueva). Vuelve a la primera ventana.

browser.getAllWindowHandles().then(function (handles) {
    browser.driver.switchTo().window(handles[1]);
    browser.driver.close();
    browser.driver.switchTo().window(handles[0]);
});
 45
Author: Sakshi Singla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-03 06:03:05

En primer lugar, selenium no proporciona una API confiable para trabajar con pestañas del navegador. Un enfoque común para abrir o cerrar una pestaña (aunque no es muy confiable) es invocar accesos directos del navegador para Chrome:

  • abrir pestaña: CTRL/COMMAND + T
  • cerrar pestaña: CTRL/COMMAND + W

En protractor, encuentre el elemento body y "envíe claves"a él:

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

O, usando browser.actions():

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

También, para abrir una nueva pestaña, hay un truco interesante (introducido aquí ), que básicamente inyecta un nuevo elemento a en la página e invoca el evento click del ratón:

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)
};

También hay window.close() función, pero no cerraría la pestaña si no se abría a través de window.open() (referencia ). En otras palabras, si esta es una pestaña que abre manualmente, entonces puede usar el enfoque window.open() -> window.close() con la ayuda de browser.executeScript().

 9
Author: alecxe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-29 22:38:43

Versión en C# de la respuesta de Sakshi:

   var tabs = driver.WindowHandles;
   if (tabs.Count > 1)
   {
       driver.SwitchTo().Window(tabs[1]);
       driver.Close();
       driver.SwitchTo().Window(tabs[0]);
   }
 3
Author: Mark Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-18 19:10:50

Cierra todas las pestañas excepto la primera y cambia a la primera pestaña:

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

Presta atención a las dos últimas líneas, son necesarias para evitar errores como OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found

 1
Author: Oleg Neumyvakin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-13 11:12:59

Puede utilizar driver.close y luego cambia a la pestaña activa driver.SwitchTo().Window(m_driver.WindowHandles.First()); o a cualquier otra pestaña disponible

 0
Author: v_vitalik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 13:35:02

Estoy usando el siguiente comando para cerrar la pestaña actual después de abrir el enlace en la pestaña nueva

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

Luego, puede cambiar a la última pestaña emitiendo el comando:

Instance.Driver2.SwitchTo().Window(Instance.Driver2.WindowHandles[0]);
 -1
Author: Loc Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-06 08:36:27