我有一个加载iframe的页面,在iframe中旋转一个旋转器(覆盖在字段上)
我正在使用selenium切换到iframe,
return this.driver.wait(function() {
return self.webdriver.until.ableToSwitchToFrame(self.driver.findElement(self.page.loginIframe.selector))
}, this.config.driver.defaultTimeout);
然后在上面返回true后调用this.driver.switchTo().frame(0);
但是我需要等到微调器消失并且输入字段已准备好输入。
如果我使用driver.sleep
我能够正确输入数据,但是当我尝试.elementIsVisible时,它会立即尝试输入数据并失败。
尝试登录的代码:
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
});
});
});
抛出错误的代码:
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);
};
错误消息:NoSuchElementError: no such element
答案 0 :(得分:0)
如果它存在,我首先通过了这个检查,iframe的dom没有直接加载导致错误。
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;
};