以下代码永远不会命中控制台日志点“ 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/