web-dev-qa-db-fra.com

Est-il possible de fermer un onglet dans WebDriver ou Protractor?

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();
    });
});
30
Aaron

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]);
});
56
Sakshi Singla

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:

  • onglet ouvert: CTRL/COMMAND + T
  • onglet fermé: 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().

12
alecxe

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]);
   }
5
Mark Rowe

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

2
Oleg Neumyvakin

Vous pouvez utiliser driver.close Puis passer à l'onglet actif driver.SwitchTo().Window(m_driver.WindowHandles.First()); ou à tout autre onglet disponible.

0
v_vitalik