Angular 带等待的角度量角器测试的异步性质
我有以下用于量角器测试的typescript类。正在为身份验证运行OpenAM服务器Angular 带等待的角度量角器测试的异步性质,angular,selenium,asynchronous,protractor,wait,Angular,Selenium,Asynchronous,Protractor,Wait,我有以下用于量角器测试的typescript类。正在为身份验证运行OpenAM服务器 import { element, by, ElementFinder, browser, ExpectedConditions} from 'protractor'; import { BasePage } from './base.pageobject'; import { SelectSitePage } from './select-site.pageobject'; export class Aut
import { element, by, ElementFinder, browser, ExpectedConditions} from 'protractor';
import { BasePage } from './base.pageobject';
import { SelectSitePage } from './select-site.pageobject';
export class AuthPage extends BasePage {
readonly url: string = '/';
readonly loginMenu: ElementFinder = element(by.css('nav.profile-menu'));
readonly loginLink: ElementFinder = element(by.cssContainingText('a', 'Login'));
readonly logoutLink: ElementFinder = element(by.cssContainingText('a', 'Logout'));
// On OpenAM login page
readonly userNameField: ElementFinder = element(by.id('idToken1'));
readonly passwordField: ElementFinder = element(by.id('idToken2'));
readonly loginButton: ElementFinder = element(by.id('loginButton_0'));
readonly aintExist: ElementFinder = element(by.id('loginButton_666'));
private selectSitePage: SelectSitePage = new SelectSitePage();
/**
* Log in if are not already
*/
public logIn() {
this.loginMenu.click();
this.loginLink.isPresent().then((isPresent: boolean) => {
if (isPresent) {
this.loginLink.click();
this.disableWaitingForAngular();
var EC = ExpectedConditions;
let loginButtonExpected = EC.presenceOf(this.loginButton);
console.log('wait for login button ...');
browser.driver.wait(loginButtonExpected, 2000);
console.log('login button present');
this.userNameField.clear();
this.userNameField.sendKeys('user');
this.passwordField.clear();
this.passwordField.sendKeys('pw');
this.loginButton.click();
let searchBoxExpected = EC.presenceOf(this.selectSitePage.searchBox);
console.log('wait for searchBox ...');
browser.driver.wait(searchBoxExpected, 2000);
console.log('searchBox present');
this.enableWaitingForAngular();
} else {
console.log('AuthPage / logIn - already logged in');
}
});
}
这运行正常,但是console.log
s几乎立即出现,就好像wait()
s对它们没有影响一样。但是,如果移除,测试将失败,因此它们似乎是相关的
等待是否只针对WebDriver对象?doco没有明确说明这一点。量角器中几乎所有的命令都是
异步的。这意味着首先需要解决这些问题。这也适用于等待
,请参阅
因此,在您的情况下,所有命令都是在彼此之后执行的,但由于console.log()
是同步的,因此它将比前一行的promis得到解决更快地记录结果
如果你在承诺方面遇到困难,也许可以帮助你
如果希望console.log()
发生在前一行之后,可以执行以下操作
var EC = ExpectedConditions;
let loginButtonExpected = EC.presenceOf(this.loginButton);
console.log('wait for login button ...');
browser.driver.wait(loginButtonExpected, 2000)
.then(() => {
console.log('login button present');
});
顺便说一下。您正在使用TypeScript。这意味着您还可以使用方法async/await
,这将使您的代码更加“同步”,并且await
将在解析前一行之前“保持”执行下一行。另请参见上的示例项目
希望有帮助好的,是的,这是有道理的。我同意这些承诺,但要意识到几乎所有的命令都是async
,这是关键。现在,如果它们都是异步的,那么是什么阻止它们无序解析呢?感谢您提供有关async
和wait
的提示。考虑到量角器似乎能实现自己的承诺,我认为这是行不通的。谢谢这就是控制流的目的,请参见[此处](dragrator/blob/master/docs/Control flow.md)是的,我记得我读过关于它的文章。因此,为什么量角器有自己的承诺,因为它们在核心/本机承诺之外的特殊执行上下文中运行。选择!顺便说一句,链接是Tnx,这就是我看到的,也是他们要删除的原因,因为不同的承诺令人困惑?这是有道理的,所以看看他们的想法会很有趣。