2016-03-20 9 views
0
laden zu

Ich habe eine Seite, die einen Iframe lädt, innerhalb des iframe ein Spinner dreht (Overlay über die Felder)Selen warten js für iframe voll

ich Selen in die iframe zu wechseln verwende,

return this.driver.wait(function() { 
    return self.webdriver.until.ableToSwitchToFrame(self.driver.findElement(self.page.loginIframe.selector)) 
    }, this.config.driver.defaultTimeout); 

dann this.driver.switchTo().frame(0);, sobald die oben kehrt Aufruf wahren

aber ich warten müssen, bis die Spinner gegangen sind, und dass die Eingabefelder für die Eingabe bereit sind.

Wenn ich eine driver.sleep benutze, kann ich die Daten richtig eingeben, aber wenn ich versuche, .elemenIsVisible, versucht es sofort, Daten einzugeben und schlägt fehl.

Code ein Login, um zu versuchen:

var self = this; 
this.waitForPageLoad().then(function pageLoaded() { 
    console.log("page loaded"); 
    self.switchToIframe().then(function switchedToIframe() { 
     console.log("switched to iframe"); 
     // THIS FIXES the issue, but I do not want a random sleep self.driver.sleep(10000); 
     self.waitForIframeLoad().then(function iframeLoaded() { 
     console.log("iframe loaded!");    
     self.setUserName(self.config.user.userName);//FAILS HERE 
     }); 
    }); 
}); 

Code, den Fehler auslöst:

Login.prototype.waitForIframeLoad = function() { 
    var self = this; 
    //console.log(self.webdriver.until); 
    return this.driver.wait(function() { 
    return self.webdriver.until.elementIsVisible(self.driver.findElement(self.page.usernameInputField.selector)) 
    }, this.config.driver.defaultTimeout); 
}; 

Fehlermeldung: NoSuchElementError: no such element

Antwort

0

Ich habe Vergangenheit diese Überprüfung zuerst, wenn es vorhanden ist, der dom der iframe hat nicht sofort geladen, was den Fehler verursacht hat.

Login.prototype.waitForIframeLoad = function() { 
 
    var self = this; 
 
    console.log(self.webdriver.until); 
 
    var deferred = this.webdriver.promise.defer(); 
 
    this.driver.wait(function(){ 
 
    //wait for the element to be present 
 
    return self.driver.isElementPresent(self.page.usernameInputField.selector); 
 
    }).then(function(){ 
 
    // then check if it is visibile 
 
    return self.driver.wait(self.webdriver.until.elementIsVisible(self.driver.findElement(self.page.usernameInputField.selector))); 
 
    }).then(deferred.fulfill); 
 
    return deferred.promise; 
 
};
edit: vergessen haben, die zweite Wartefunktion

Verwandte Themen