Неугловая страница открывается после клика

Я пытаюсь реализовать следующий тестовый сценарий:

  • выполнить клик по логотипу на странице
  • подтвердите, что открыто новое окно браузера (вкладка в 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");
        }
    });
};
Другие вопросы по тегам