我的测试代码如下:
pageLogin(userName: string, password: string) {
element(by.id('loginUserName')).clear();
element(by.id('loginPassword')).clear();
element(by.id('loginUserName')).sendKeys(userName);
element(by.id('loginPassword')).sendKeys(password);
element(by.id('loginButton')).click();
expect(element(by.id('ngApp')).isPresent()).toBe(true);
}
有人可以向我解释。在期待之前,我是否需要等待从函数的前五行返回的promise?此函数内的行是否执行异步?
答案 0 :(得分:2)
Protractor使用一种名为control flows的方法让您以看起来同步的方式编写测试。实际发生的是调用你在函数内部调用的调用队列,并且只在函数返回时才开始执行。
因此,当您的函数完成运行时,量角器会查看队列并执行第一项,即element(by.id('loginUserName')).clear()
语句。当浏览器完成清除loginUserName文本框后,它会发出protractor信号,并且量角器会执行队列中的下一个项目。
在您的示例中,element(by.id('ngApp')).isPresent()
将是队列中的最后一项。此调用还返回一个promise,该promise将在从队列中删除此项后执行并返回一个值。
Jasmine的expect()
函数已经过调整,因此它不是同步检查值,而是注意到你传递了一个promise,所以它在检查期望之前等待该promise的解析。
最后,一旦队列中的所有项目都已执行,量角器就会完成文本的运行并转到下一个文本。