【发布时间】:2020-06-11 08:51:21
【问题描述】:
我正在一个 Angular 应用程序中编写一些 E2E 测试。我遇到的一个问题是,每当我重定向到新路线时,我都想验证是否显示了正确的组件。由于某种原因,这总是会导致失败并出现以下错误:
- Failed: script timeout
我一直在网上搜索以试图找到解决方案,但我找到的所有解决方案都对我不起作用。
示例
- 等待 Angular
browser.waitForAngular();
- 检查浏览器当前 URL 并与预期 URL 进行比较:
browser.driver.wait(() => {
browser.driver.getCurrentUrl().then((url) => {
return /expected-url/.test(url);
});
}, 10000);
代码示例
以下是测试登录功能的代码示例。
登录页面对象类
import { browser, element, by } from 'protractor';
export class LoginPage {
private credentials: { username: string, password: string } = {
username: 'admin',
password: 'admin'
};
navigateTo() {
return browser.get(browser.baseUrl) as Promise<any>;
}
getLoginComponent() {
return element(by.css('ra-login'));
}
getUsernameTextbox() {
return element(by.css('ra-login [data-test-id="username"]'));
}
getPasswordTextbox() {
return element(by.css('ra-login [data-test-id="password"]'));
}
getLoginButton() {
return element(by.css('ra-login [data-test-id="login-btn"]'));
}
getSecurePage() {
return element(by.css('ra-secure-content'));
}
login(credentials: { username: string, password: string } = this.credentials) {
this.getUsernameTextbox().sendKeys(credentials.username);
this.getPasswordTextbox().sendKeys(credentials.password);
this.getLoginButton().click();
}
getErrorMessage() {
return element(by.css('ra-login [data-test-id="login-error"]'));
}
}
登录 E2E 规范文件
describe('Login Functionality', () => {
let loginPage: LoginPage;
beforeEach(() => {
loginPage = new LoginPage();
});
// Test runs successfully
it('should display login', () => {
loginPage.navigateTo();
expect(loginPage.getLoginComponent().isPresent()).toBeTruthy();
});
// Test runs successfully
it('should have the login button disabled', () => {
loginPage.navigateTo();
expect(loginPage.getLoginButton().isEnabled()).toBe(false);
});
// Test runs fails
it('should redirect to a secure page', () => {
loginPage.navigateTo();
loginPage.login();
expect(loginPage.getSecurePage().isPresent()).toBeTruthy();
});
afterEach(async () => {
// Assert that there are no errors emitted from the browser
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
expect(logs).not.toContain(jasmine.objectContaining({
level: logging.Level.SEVERE,
} as logging.Entry));
});
});
使用上面的代码测试'should redirect to a secure page' 失败了。此测试试图验证成功登录后是否显示“安全内容”组件。该组件是一个包装器组件,用于托管只有在用户登录时才能显示的页面。
页面重定向总是成功的,并且正在显示正确的页面。我的怀疑是,测试以某种方式试图在实际重定向之前获取元素?
我是 E2E 新手,所以我不完全确定这是否是问题所在。
以防万一这里是重要包的版本号:
- 角度:8.2.14
- Angular CLI:8.2.2
- 量角器:5.4.2
- 茉莉花:2.8.0
【问题讨论】:
标签: angular protractor angular-e2e