2015-04-07 1 views
19

C'è un modo per chiudere fisicamente una scheda tramite Goniometro o WebDriver?C'è un modo per chiudere una scheda in WebDriver o Goniometro?

Chiedo perché mentre so come fare a switch tabs a livello di programmazione, ma non porta la scheda attiva in primo piano. Non posso sempre dire cosa sta succedendo nei miei test E2E eseguiti su SauceLabs perché quando guardo i cast dello schermo mostra la scheda da cui sono navigato, non quella attiva.

Sto andando all'incirca in questo modo?

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

risposta

39

È possibile provare quanto segue:

Passare alla nuova scheda aperta. Chiudi le finestre correnti (in questo caso, la nuova scheda). Torna alla prima finestra.

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

'close()' ha chiuso la scheda per me quando ho aperto un'immagine. Tuttavia, non ancora sicuro! –

+0

@alecxe funziona perfettamente per me. – Aaron

+0

@Aaron buono a sapersi, funziona sia per Firefox che per Chrome? Grazie. – alecxe

8

Innanzitutto, selenio non non fornisce un affidabile API cross-browser per funzionare con schede del browser. Un approccio comune per aprire o chiudere una scheda (sicuramente, non del tutto attendibile) è invocare scelte rapide del browser, per Chrome:

  • aperta scheda: CTRL/COMMAND + T
  • Chiudi scheda: CTRL/COMMAND + W

In goniometro, trovare l'elemento body e "invia i tasti" ad esso:

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

Oppure, utilizzando browser.actions():

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

Inoltre, per aprire una nuova scheda, c'è un trucco interessante (introdotto here), che inietta fondamentalmente una nuova a elemento nella pagina e invoca click del mouse evento:

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

C'è anche window.close() divertente ction, ma non chiuderà la scheda se non è stata aperta tramite window.open() (reference). In altre parole, se questa è una scheda che si apre manualmente, è possibile utilizzare l'approccio window.open() -> window.close() con l'aiuto di browser.executeScript().

+0

usando 'window.open()' sai come aprire un riferimento a una scheda esistente che era stata precedentemente aperta usando 'window.open()'? Ho un'estensione di Chrome in esecuzione nella seconda scheda per catturare le intestazioni HTTP e non riesco a capire come tornare a quella scheda per controllarle quando qualcosa si rompe. – luker02

-1

Sto usando il seguente comando per chiudere la scheda corrente dopo aver aperto il link in una nuova scheda

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

Quindi, è possibile passare all'ultima scheda per il comando:

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

C# versione di risposta di Sakshi:

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

È possibile utilizzare driver.close e quindi passare alla scheda attiva driver.SwitchTo().Window(m_driver.WindowHandles.First()); o un'altra scheda disponibile

1

chiudere tutte le schede ad eccezione di primo e passare alla prima scheda:

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 

Prestare attenzione alla durata di due linee, devono evitare tali errori come OpenQA.Selenium.NoSuchWindowException: no such window: target window already closed from unknown error: web view not found