以下代码永远不会命中控制台日志点“ post4”或“ post3”。它确实返回了诺言,但是如果我尝试从该诺言中进行连锁,那么连锁就永远不会遵循。

loginPage.prototype.doLogin = function(isGood){
    var d = webdriver.promise.defer();
    this.driver.findElement(webdriver.By.css('input.loginbutton')).click(function() {
        if(isGood){
            //return new statementPage;
            console.log("post3")
            d.fulfill(new statement.statementPage(this.driver));
        } else {
            console.log("post4")
            d.fulfill(this);
        }
    });
    console.log("post5")
    return d.promise;
}


如果我呼叫login.doLogin(true).then(function(){console.log("foo")}),它将永远不会记录post3,post4或foo。

在我的代码的其他地方,我还有其他承诺可以成功地工作,所以我不明白为什么这不起作用。

最佳答案

webdriverjs的click函数不接受任何参数/回调,因此您的函数从未运行过。 click代码如下(来自API):

webdriver.WebElement.prototype.click = function() {
  return this.schedule_(
      new webdriver.Command(webdriver.CommandName.CLICK_ELEMENT),
      'WebElement.click()');
};


这是一个fiddle,表明不带任何参数的js函数实际上不会使用该参数,除非使用arguments变量指定了该参数。

使用then element.click().then(function(){d.fulfill()});允许实现点击承诺,然后运行您的代码。阅读Webdriverjs Page中的承诺

关于javascript - promise 永远无法实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19494090/

10-11 11:22