当我使用量角器执行以下代码时,它可以工作。我将嵌套的json传递给for循环。由于for循环的异步工作,它打印变量i的所有值并达到最后一个值,因此它总是访问最后一对用户名和密码。我该如何解决这个问题?
var data = require('.../testdata.json');
describe('homepage Test', function() {
it('candidate login', function() {
browser.driver.get('https://abcxyz.com');
for (i in data.testdata) {
element(by.id('tool_btn3')).click();
console.log(i);
browser.getTitle().then(function(title) {
console.log("Title: " + title)
if (title === "<page title>") {
browser.driver.sleep(3000);
element(by.id('email_input')).sendKeys(data.testdata[i].username);
element(by.id('pwd_input')).sendKeys(data.testdata[i].password);
element(by.xpath('//*[@id="signIn_btn"]/div[2]')).click();
browser.sleep(3000);
element(by.id('setting_img')).click();
browser.sleep(2000);
element(by.id('logout_div')).click().then(function() {
console.log('success');
});
} else {
console.log("problem");
}
});
}
});
});
&#13;
答案 0 :(得分:1)
您需要记住,您不能使用承诺的for
循环。所有都是异步的,所以在结尾它会咬你屁股,这意味着it
已准备就绪,但测试不是。
根据您的示例,它会建议创建一个名为logon
的方法(将其放在Page Object或其他内容中)。它将为您执行登录和操作。添加一个空的promise-container(数组)并在那里推送promises。
当for
- 循环完成后,您可以立即解析完整的promise容器,并且它将一个接一个地执行所有的promise。它看起来像这样。
var data = require('.../testdata.json');
describe('homepage Test', function() {
it('candidate login', function() {
var promises = [];
browser.driver.get('https://abcxyz.com');
for (i in data.testdata) {
promises.push(expect(logon(data.testdata[i].username, data.testdata[i].password)).to.equal(true));
promises.push(console.log(i));
}
Promise.all(promises);
});
});
/**
* Logon
* @params {string} username
* @params {string} password
* @return {boolean}
*/
function logon(username, password) {
element(by.id('tool_btn3')).click();\
return browser.getTitle().then(function(title) {
console.log("Title: " + title)
if (title === "<page title>") {
browser.driver.sleep(3000);
element(by.id('email_input')).sendKeys(username);
element(by.id('pwd_input')).sendKeys(password);
element(by.xpath('//*[@id="signIn_btn"]/div[2]')).click();
browser.sleep(3000);
element(by.id('setting_img')).click();
browser.sleep(2000);
return element(by.id('logout_div')).click()
.then(function() {
return Promise.resolve(true);
});
} else {
return Promise.resolve(false);
}
});
}
&#13;
如果您使用的是节点7,则可以使用async/await
,或使用Babel来转换代码。如果您可以编写TypeScript,您还可以获得async/await