量角器中的async/await样板

Di *_*ang 14 typescript protractor

我正在尝试使用async/ awaitwith protractorin TypeScript.我正在关注以下示例:https://github.com/angular/protractor/tree/master/exampleTypescript/asyncAwait

它在我的实验中运行良好.但是,我必须await在与浏览器交互相关的每个调用上使用.

例如:

我有一个登录页面的页面对象:

login.ts:

import {browser, element, by, By, $, $$, ExpectedConditions} from "protractor";
import { DashboardPage } from "./dashboard";
export class LoginPage {
    usernameInput = element(by.id("username"));
    passwordInput = element(by.id("password"));
    loginButton = element(by.id("login_button"));

    async get() {
        await browser.get(login_url);
        return this;
    }

    async getTitle() {
        let title = await browser.getTitle();
        return title;
    }

    async typeUsername(username: string) {
        await this.usernameInput.sendKeys(username);
    }

    async typePassword(password: string) {
        await this.passwordInput.sendKeys(password);
    }

    async login() {
        await this.loginButton.click();
        return new DashboardPage();
    }
}
Run Code Online (Sandbox Code Playgroud)

LoginSpec.ts:

import {browser, element, by, By, $, $$, ExpectedConditions} from "protractor";
import { LoginPage } from "../pages/login";
describe("Login Page", function() {

    beforeEach(() => {
        // login page is not an angular page.
        browser.ignoreSynchronization = true;
    });

    afterEach(() => {
        browser.ignoreSynchronization = false;
    });

    it("should go to dashboard page after successfully login", async (): Promise<any> => {
        let loginPage = new LoginPage();
        await loginPage.get();
        await loginPage.typeUsername(username);
        await loginPage.typePassword(password);
        let dashboard = await loginPage.login();
        expect(await dashboard.getTitle()).toEqual(`Dashboard`);
    });
});
Run Code Online (Sandbox Code Playgroud)

在上面的测试规范中,我必须使用很多await来调用浏览器交互.这引入了很多样板await.

问题是,是否有任何减少样板的想法或方法?此外,这是用正确的方法async/ awaitprotractor

Xot*_*bu4 4

不幸的是,如果没有所有这些等待 - 您的代码将无法正确同步。在某些情况下,您可以省略粘贴等待 - 但大多数情况下这是必要的,因为等待使您的承诺一一安排。

Async/Await 仍然依赖于 Promise。所以你的等待代码的工作方式与此相同:

it("should go to dashboard page after successfully login", (): Promise<any> => {
    let loginPage = new LoginPage();
    return loginPage.get().then(() => {
        return loginPage.typeUsername(username);
    }).then(() => {
        return loginPage.typePassword(password);
    }).then(()=> {
        return loginPage.login();
    }).then((dashboard)=> {
        return expect(dashboard.getTitle()).toEqual(`Dashboard`);
    })
});
Run Code Online (Sandbox Code Playgroud)

因此,考虑等待就像一个很好的语法糖而不是承诺链: https://github.com/SeleniumHQ/selenium/wiki/WebDriverJs#option-1-use-classic-promise-chaining

但是有一种方法可以在不放置 waits\thens\generators\callbacks 的情况下进行同步。它被称为“纤维”。不幸的是量角器不支持这一点,但WebdriverIO使用它来同步代码: https ://www.facebook.com/ProtractorAngularJS/posts/1950761568515087