Я пишу несколько тестов E2E в приложении Angular. У меня проблема в том, что всякий раз, когда я перенаправляю на новый маршрут, я хотел бы убедиться, что отображается правильный компонент. По какой-то причине это всегда приводит к ошибке со следующей ошибкой:
- Failed: script timeout
Я искал во всем Интернете, чтобы найти решение, но все решения, которые я ' я обнаружил, что у меня ничего не вышло.
Пример
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 Spe c Файл
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, поэтому не совсем уверен, что это проблема.
На всякий случай вот номер версии важных пакетов:
- Angular: 8.2.14
- Angular CLI : 8.2.2
- Транспортир : 5.4.2
- Жасмин : 2.8.0