Тестирование перенаправления URL с использованием Cucumber Protractor и Typescript
Последний шаг в коде завершается неудачно с ошибкой утверждения, поскольку фактическое значение остается LoginPage, я полагаю, потому что шаг завершен до того, как браузер фактически перенаправлен на HomePage.
Я пытался с помощью browser.sleep(10000)
а также browser.wait()
, но они не работают для меня. Как правильно решить эту проблему?
import {browser, by, protractor} from 'protractor';
import { ClientPage } from '../pages/offerScreenPage';
import {CallbackStepDefinition, defineSupportCode} from 'cucumber';
import {By} from "selenium-webdriver";
import {Events} from "../pages/Event";
let chai = require('chai').use(require('chai-as-promised'));
let expect = chai.expect;
defineSupportCode(function ({ Given, When, Then}) {
let client: ClientPage = new ClientPage();
Given(/^User is in Login Page $/, async () => {
await expect(browser.getTitle()).to.eventually.equal('LoginPage');
});
When(/^User enters credentials$/, async () => {
await client.userId.sendKeys("abc123");
await client.password.sendKeys("passwod");
});
When(/^User clicks the submit button$/, async () => {
await client.submit.click();
});
Then(/^User is redirected to a new page$/, async () => {
await expect(browser.getTitle()).to.eventually.equal('HomePage');
});
});
3 ответа
Ваша функция ожидания слишком сложна. Если вы используете async/await, ваш код может быть проще. И трюк с сохранением URL вне обещания не сработает, ваша переменная будет неопределенной, пока обещание не будет разрешено. Также я не рекомендую использовать абсолютные URL-адреса в реальном проекте, это будет больно, если URL вашей среды будет изменен. Сохраните его как некоторую переменную конфигурации и добавьте необходимый путь.
Проверь это:
async function waitForUrlToChangeTo(URL) {
let urlIsChangedTo = async () => (await browser.getCurrentUrl()) == URL
return browser.wait(urlIsChangedTo, 10000, `Expected URL to be changed to ${URL} in 10 seconds, but it wasn't`)
}
2 подхода
1) Дождитесь нового URL: http://www.protractortest.org/#/api?view=ProtractorExpectedConditions.prototype.urlContains
var EC = protractor.ExpectedConditions;
// Waits for the URL to contain 'foo'.
browser.wait(EC.urlContains('foo'), 5000);
2) Подождите, пока некоторые уникальные элементы существуют только на этой странице:
http://www.protractortest.org/#/api?view=ProtractorExpectedConditions.prototype.visibilityOf
var EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to be visible on the dom.
browser.wait(EC.visibilityOf($('#abc')), 5000);
При желании передайте третий параметр в browser.wait(), чтобы выдать приятное сообщение об ошибке:
browser.wait(EC.visibilityOf($('ololo')), 5000, 'Expected to be on Home page, but element ololo was not became visible in 5 seconds')
import {browser, by, protractor} from 'protractor';
import { ClientPage } from '../pages/offerScreenPage';
import {CallbackStepDefinition, defineSupportCode} from 'cucumber';
import {By} from "selenium-webdriver";
import {Events} from "../pages/Event";
let chai = require('chai').use(require('chai-as-promised'));
let expect = chai.expect;
defineSupportCode(function ({ Given, When, Then}) {
let client: ClientPage = new ClientPage();
/**
* @name waitForUrlToChangeTo
* @description Wait until the URL changes to match a provided regex
* @param {RegExp} urlRegex wait until the URL changes to match this regex
* @returns {!webdriver.promise.Promise} Promise
*/
function waitForUrlToChangeTo(urlRegex) {
let currentUrl;
return browser.getCurrentUrl().then(function storeCurrentUrl(url) {
currentUrl = url;
}
).then(function waitForUrlToChangeTo() {
return browser.wait(function waitForUrlToChangeTo() {
return browser.getCurrentUrl().then(function compareCurrentUrl(url) {
return url == urlRegex;
});
});
}
);
}
Given(/^User is in Login Page $/, async () => {
await expect(browser.getTitle()).to.eventually.equal('LoginPage');
});
When(/^User enters credentials$/, async () => {
await client.userId.sendKeys("abc123");
await client.password.sendKeys("passwod");
});
When(/^User clicks the submit button$/, async () => {
await client.submit.click();
});
Then(/^User is redirected to a new page$/, async () => {
await waitForUrlToChangeTo("https://github.com/login")
await expect(browser.getTitle()).to.eventually.equal('HomePage');
});
});