当我使用量角器执行以下代码时,它可以工作。我将嵌套的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"); } }); } }); });
您需要牢记,不能将for-loop与promises一起使用。一切都是异步的,所以 最终它会咬到你 ,这意味着它it已经准备好了,但测试还没有。
for
it
根据您的示例,建议创建一个名为例如的方法logon(将其放置在Page Object或其他对象中)。它将为您完成登录和操作。添加一个空的promise- container(数组)并将promise推入其中。
logon
当for-loop完成后,你可以一次解决全部承诺容器,它会在彼此之后执行所有的承诺1。它看起来像这样。
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); } }); }
例如,如果您使用的是Node 7,则可以使用async/await或使用Babel来翻译代码。如果您可以编写TypeScript,还可以获得async/await
async/await