我有以下用于量角器测试的打字稿类。正在运行身份验证的OpenAM服务器。
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
几乎立即出现,好像wait()
s对它们没有影响。但是,如果删除测试失败,那么它们似乎是相关的。
是等待只适用于WebDriver对象吗? doco没有说清楚。
答案 0 :(得分:0)
量角器中的几乎所有命令都是async
。这意味着他们首先需要解决。这也取决于wait
,请参阅docs。
所以在你的情况下,命令都是在彼此之后执行的,但由于console.log()
是同步的,它会比上一行的promis更早地记录结果。
如果你遇到麻烦,也许this article可以帮助你做承诺。
如果您希望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
将"持有"在上一行解决之前执行下一行。另请参阅protractor github 上的示例项目
希望有所帮助