¿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();
});
});
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]);
});
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()
.
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]);
}
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
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
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]);
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