【发布时间】:2017-08-21 14:25:10
【问题描述】:
我正在尝试在TypeScript 中使用async / await 和protractor。我在以下示例中进行操作: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();
}
}
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`);
});
});
在上面的测试规范中,我必须使用许多await 来调用浏览器交互。这为await 引入了很多样板。
问题是,有什么想法或方法可以减少样板文件吗?另外,这是将async / await 与protractor 一起使用的正确方法吗?
【问题讨论】:
-
第二个最好的选择是使用承诺链,它引入了更多的样板。我认为这是干净易读的代码。看到 await 会告诉您执行已在此处产生,因此全局状态可以在此处更改。
-
如果你愿意使用纯业力,你可以选择使用节点光纤
-
这对我来说似乎很好。无论如何,Imo
await并不是真正的样板代码。如果你的loginPage方法需要时间来解决,你需要在那里的await关键字来防止主线程阻塞。这样你的测试确实会运行得更快。 -
@TamasHegedus,是的。承诺链可能会引入更多样板。在这种情况下,我更喜欢
await。 -
@Randy,同意。我只是希望有某种方法可以从实际的测试代码中隐藏页面/浏览器的详细信息。例如,如果可能有一个注解告诉 js 引擎或 ts 转译器将
await添加到所有async函数而不是显式使用await,这将使编写实际测试代码更容易(无需记得使用await)。此外,它还避免了错误,以防有人忘记使用await。
标签: typescript protractor