Angular Protractor的异步性质测试等待

时间:2017-06-23 06:45:52

标签: angular selenium asynchronous protractor wait

我有以下用于量角器测试的打字稿类。正在运行身份验证的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没有说清楚。

1 个答案:

答案 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

上的示例项目

希望有所帮助