在量角器中使用wait()
时遇到问题
这是我的代码:
var timeOut = function(callback) {
browser.driver.wait(function() {
callback();
}, 5000);
};
this.Then(/^input userName "([^"]*)", password "([^"]*)" and click login$/, function (userName, password, next) {
login();
function login() {
var userNameElm = by.css('[id="userName"]');
browser.driver.isElementPresent(userNameElm).then(function(exist) {
if (exist) {
browser.driver.findElement(userNameElm).sendKeys("oh my gold!");
browser.driver.findElement(by.css('[id="pass"]')).sendKeys("pass test");
browser.driver.findElement(by.id('login')).click().then(function(){
return next();
});
} else {
timeOut(login);
}
});
}
});
我收到了错误Message: Failed: Wait timed out after
。出现问题是因为它将永远调用timeOut(login);
我该如何杀死wait()函数。谢谢。
答案 0 :(得分:1)
在这种情况下,您应该只使用setTimeout
,而不是使用browser.driver.wait
或browser.driver.sleep
:
login();
function login() {
var userNameElm = by.css('[id="userName"]');
return browser.driver.isElementPresent(userNameElm).then(function(exist) {
if (exist) {
browser.driver.findElement(userNameElm).sendKeys("oh my gold!");
browser.driver.findElement(by.css('[id="pass"]')).sendKeys("pass test");
return browser.driver.findElement(by.id('login')).click();
} else {
return browser.driver.sleep(5000).then(function() {
return login();
});
}
});
}
答案 1 :(得分:0)
你应该看一下protractors异步性(这是一个有效的单词吗?)和结果的promise链来反映类似于同步的行为,因此可以控制你的步骤顺序和有效的结果。
建议:
this.Then(/^input userName "([^"]*)", password "([^"]*)" and click login$/, function (userName, password) {
return browser.driver.isElementPresent(by.css('[id="userName"]'))
.then(function(element) {
if (element != null) {
return browser.driver.findElement(userNameElm)
.sendKeys("oh my gold!");
} else {
//fail- element not found
return false;
}
})
.then(function(){
return browser.driver.findElement(by.css('[id="pass"]'))
.sendKeys("pass test");
})
.then(function(){
return browser.driver.findElement(by.id('login'))
.click();
})
});
}
});
如果你没有将它放到promise链的末尾,整个块将超时,由量角器配置中的allScriptsTimeout给出。