2015-02-28 14 views
9

Suchen Sie nach Hilfe, wie ich ein neues "Pop-up" -Fenster erhalten soll, das nach dem Klicken auf einen "Login" -Button angezeigt wird.Wechseln in ein neues Fenster mit Selenium/Protractor Javascript

Ich bin in der Lage, zu bekommen, wenn das Fenster angezeigt wird, aber ich glaube nicht, dass der Code, den ich derzeit verwende, um das Fenster "Handle" greifen funktioniert ordnungsgemäß. Meine Situation ist etwas anders, da ich einen Winkelmesser in meinen Seiten verwende, aber das neue Fenster ist NICHT winkelbasiert, also muss ich auf Selenium WebDriver umschalten, während ich in diesem Fenster bin. (Jemand hat eine Idee, wenn es Probleme mit diesem Ansatz geben könnte?)

Unten finden Sie das Code-Snippet, das ich benutze, um den Selen-Treiber zu erstellen, sowie darunter, die versuchen, "/ handle" zu wechseln des neuen Fensters, das auftaucht. Ich weiß, dass es nicht richtig funktioniert, weil ich im folgenden Code immer wieder "No So Solem" -Fehler erhalte, wenn ich versuche, ein Formular auf der Seite zu finden.

// Create selenium webdriver/driver 
    var webdriver = require('selenium-webdriver'); 

    var driver = new webdriver.Builder(). 
     withCapabilities(webdriver.Capabilities.chrome()). 
     build(); 

    // Now make sure that the new window is popping up and we are navigating correctly to it 
     var handlePromise = browser.driver.getAllWindowHandles(); 
     handlePromise.then(function (handles) { 
     // parentHandle = handles[0]; 
     var popUpHandle = handles[1]; 

     // Change to new handle 
     browser.driver.switchTo().window(popUpHandle); 

     var popUpHandleFinal = browser.driver.getWindowHandle(); 
     expect(popUpHandleFinal).toEqual(popUpHandle); 
    }); 

Paar Dinge dazu:

  1. Wenn ich den "Browser" in der Zeile "browser.driver.switchTo() Fenster (popUpHandle)" entfernen, damit es als „Treiber liest. switchTo(). window (popUpHandle) "Ich erhalte zurück und Fehler, der liest wie" UnknownError: unbekannter Fehler: 'Name' muss eine nichtleere Zeichenfolge sein "Nach einigen Suchvorgang ist dies, weil die" switchTo() "-Methode auf Treiber kann nicht Null sein. Dieser Fehler ist behoben, wenn ich nur den oben gezeigten Code verwende.

  2. Ich bin nicht 100% sicher, ob ich Winkelmesser (globale "Browser" var) verwenden oder den geraden "Treiber" (Selenium) verwenden soll, den ich vorher als den Weg einstelle, um die Fenster zu bekommen.

Vielen Dank für Ihre Hilfe

+0

Kann sein, etw verwandten los: http://stackoverflow.com/questions/28511013/non-angular-page- nach einem Klick geöffnet. – alecxe

+1

Wenn Sie sich bereits im Kontext eines funktionierenden Winkelmessertreibers befinden, müssen Sie intern keine separate webdriver-Instanz starten. (Das wird den Browser wahrscheinlich verwirren, um zwei Fernsteuerungen zu haben). Der Winkelmesser macht den rohen Webdriver über 'browser.driver' verfügbar, so dass er korrekt verwendet werden sollte. –

+0

Das war mein Hauptproblem. Vielen Dank. Nachdem ich den anderen Treiber eingestellt hatte, ging ich nach einigen Iterationen wieder zur Verwendung von browser.driver über. – parchambeau

Antwort

12

Ab neueste Version von Protractor (v2.2) gibt es kein Problem bei der Verwendung Winkelmesser Fenstergriffe sein sollte, die eine Reihe von Fenstern gibt, die aktuell angezeigt werden . Wie P.T darauf hingewiesen hat, ist es nicht notwendig, eine separate Treiberinstanz aufzurufen, aber eine browser globale Variable wird funktionieren. Das Fenster, das Popup aufruft, hat einen Array-Index von 0 und das Popup-Fenster wird einen Array-Index von 1 haben. Unten ist ein Beispiel für den Wechsel in das Popup-Fenster, um daran zu arbeiten.

browser.getAllWindowHandles().then(function(handles){ 
    browser.switchTo().window(handles[1]).then(function(){ 
     //do your stuff on the pop up window 
    }); 
}); 

Ich hoffe, dies hilft.

+0

Vielen Dank, das hilft wirklich – lonewarrior556

+0

Hallo, ich habe versucht den Code, aber immer den gleichen Fehler: UnknownError: unbekannter Fehler: 'Name' muss eine nichtleere Zeichenfolge sein " Unten ist der Code var handlePromise = browser.driver.getAllWindowHandles(); \t \t handlePromise.then (function (Griffe) {// parentHandle = Griffe [0]; var popUpHandle = Griffe [1];. // Wechsel zur neuen Griff browser.driver.switchTo() Fenster (popUpHandle); \t \t}); –

+0

@anuvratingsh können Sie debuggen ein wenig mehr und sagen Sie mir, auf welche Linie Sie stehen thi s Fehler? Können Sie auch die Array-Länge "Griffe" überprüfen? Ich denke, du hast dort nicht zwei Fenster, sondern nur einen und kannst nicht zu 'handles [1]' wechseln. Danke –

1

Wenn Sie auf einen Link oder eine Schaltfläche klicken, um ein Popup-Fenster zu öffnen, fügen Sie einige Warten nach dem Klicken mit browser.sleep(ms) hinzu.

Das ist für mich gearbeitet und habe einen Fehler „fehlenden‚Handle‘Parameter“

element(by.className("name")).click(); 
browser.sleep(10000); //This line is important 
var winHandles=browser.getAllWindowHandles(); 
winHandles.then(function(handles) 
{ 
    var parentWindow=handles[0]; 
    var popUpWindow=handles[1]; 
    browser.switchTo().window(popUpWindow); 
    browser.switchTo().window(parentWindow); 
}) 
Verwandte Themen