Existe-t-il un moyen de fermer physiquement un onglet via Protractor ou WebDriver?
Je demande parce que je sais comment changer d'onglet par programmation, mais cela ne ramène pas l'onglet actif au premier plan. Je ne peux pas toujours savoir ce qui se passe dans mes tests E2E qui s'exécutent sur SauceLabs car lorsque je visualise les conversions d'écran, il montre l'onglet vers lequel j'ai navigué, et non l'actif.
Est-ce que j'y vais mal?
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();
});
});
Vous pouvez essayer ce qui suit:
Basculer vers le nouvel onglet ouvert. Fermez les fenêtres actuelles (dans ce cas, le nouvel onglet). Revenez à la première fenêtre.
browser.getAllWindowHandles().then(function (handles) {
browser.driver.switchTo().window(handles[1]);
browser.driver.close();
browser.driver.switchTo().window(handles[0]);
});
Tout d’abord, , Selenium ne fournit pas d’API inter-navigateurs fiable pour fonctionner avec les onglets du navigateur . Une approche courante pour ouvrir ou fermer un onglet (bien que peu fiable) consiste à appeler des raccourcis de navigateur pour Chrome:
CTRL
/COMMAND
+ T
CTRL
/COMMAND
+ W
Dans le rapporteur, recherchez l'élément body
et envoyez-lui les clés:
var body = element(by.tagName("body"));
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "t"))
body.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "w"))
Ou, en utilisant browser.actions()
:
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('t').perform();
browser.actions().keyDown(protractor.Key.CONTROL).sendKeys('w').perform();
En outre, pour ouvrir un nouvel onglet, il existe un hack intéressant (introduit ici ), qui injecte un nouvel élément a
dans la page et appelle l'événement de souris 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)
};
Il y a aussi window.close()
, mais il ne fermerait pas l'onglet s'il n'était pas ouvert via window.open()
( référence ). En d’autres termes, s’il s’agit d’un onglet que vous ouvrez manuellement, vous pouvez utiliser l’approche window.open() -> window.close()
à l’aide de browser.executeScript()
.
Version C # de la réponse de Sakshi:
var tabs = driver.WindowHandles;
if (tabs.Count > 1)
{
driver.SwitchTo().Window(tabs[1]);
driver.Close();
driver.SwitchTo().Window(tabs[0]);
}
Fermez tous les onglets sauf le premier et passez au premier onglet:
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
Faites attention aux deux dernières lignes, elles sont nécessaires pour éviter des erreurs telles que OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found
Vous pouvez utiliser driver.close
Puis passer à l'onglet actif driver.SwitchTo().Window(m_driver.WindowHandles.First());
ou à tout autre onglet disponible.