selenium js等待iframe完全加载

时间:2016-03-20 14:30:28

标签: javascript selenium

我有一个加载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

1 个答案:

答案 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;
};
编辑:忘记了第二个等待函数