Неугловая страница открывается после клика
Я пытаюсь реализовать следующий тестовый сценарий:
- выполнить клик по логотипу на странице
- подтвердите, что открыто новое окно браузера (вкладка в Chrome) и проверьте текущий URL
Проблема в том, что страница, открываемая в новом окне браузера, является неугловой страницей, а главная страница, на которой я выполняю клик, является угловой страницей.
Вот моя первая попытка:
it("should show logo", function () {
var logo = scope.page.logo;
expect(logo.isDisplayed()).toEqual(true);
// opens a new page on click
logo.click().then(function () {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[1]).then(function () {
expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
});
// switch back to the main window
browser.switchTo().window(handles[0]);
});
});
});
который терпит неудачу с:
Ошибка: ошибка при ожидании синхронизации транспортира со страницей: "не удалось найти угловой в окне"
что понятно.
Моя вторая попытка была поиграть с ignoreSynchronization
логический флаг:
browser.ignoreSynchronization = true;
logo.click().then(function () {
browser.getAllWindowHandles().then(function (handles) {
browser.switchTo().window(handles[1]).then(function () {
expect(browser.getCurrentUrl()).toEqual('http://myurl.com/');
});
// switch back to the main window
browser.switchTo().window(handles[0]);
});
Это на самом деле делает этот тест без ошибок, но влияет на каждый тест, выполненный после этого, потому что browser
является глобальным объектом и разделяется между тестами - транспортир больше не синхронизируется с углом на странице, что приводит к всевозможным ошибкам.
Как мне выполнить тест?
В качестве обходного пути я могу изменить restartBrowserBetweenTests
установка на true
и изменить ignoreSynchronization
Значение без каких-либо проблем - но это значительно замедляет тесты.
2 ответа
Вы можете установить ignoreSynchronization
быть ложным, как только ваша проверка будет завершена. Тем не менее, обратите внимание, что ignoreSynchronization является синхронным, в то время как все остальное (click/get/etc) асинхронно, поэтому вы должны быть осторожны с этим. Вероятно, самый безопасный способ - установить значение true в beforeEach и false в afterEach, и просто проверить этот одиночный щелчок логотипа в этом тесте.
Другое решение: я использовал sleep
поскольку getWindowHandles
возвращал только одно имя окна (родительское / угловое окно). Дайте мне знать, если есть лучший способ.
this.validateProductPageInfo = function (productTitle) {
browser.sleep(5000);
browser.getAllWindowHandles().then(function (handles) {
if (handles.length === 2) {
browser.switchTo().window(handles[1]).then(function () {
var prodTitle = by.xpath('//h1[@id="fw-pagetitle"]');
browser.driver.findElement(prodTitle).getText().then(function (text) {
expect(text).toBe(productTitle);
});
});
browser.switchTo().window(handles[0]);
} else {
console.log("Error in switching to non angular window");
}
});
};