Неугловая страница, открытая по клику — угловая не определена с использованием ignoreSynchronization или ожидает Angular без

После долгих исследований и переделки я не могу заставить свой тест Protractor делать что-либо еще, кроме ошибки, связанной с Angular, хотя я использую браузер, чтобы вообще избежать обнаружения Angular.

Тест включает в себя приложение Angular, открытие в нем раскрывающегося списка и нажатие на ссылку для консоли; консоль открывает не-Angular страницу администратора в отдельном окне.

Итак, основываясь на многих информативных сообщениях SO, которые я нашел, я впервые использовал это...

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
//expect for new window here
            });
        });

Что, похоже, сработало, так как я мог довольно легко добраться до окна через repl. Проблема заключается в том, что было добавлено одно из следующих...

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
        expect(browser.getLocationAbsUrl()).toContain('/console/login.jsp');
        expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

Один ожидает проверки URL-адреса, а другой проверяет элемент header на странице, который является заголовком таблицы. Когда я запускаю это, я получаю следующее:

Ошибка при ожидании синхронизации Protractor со страницей: «не удалось найти угловой в окне»

Когда я решаю использовать browser.ignoreSynchronization = true как в функции, так и в beforeEach, с последующим afterEach значением false или без него, я получаю следующее:

JavascriptError: angular не определен

Кажется, я не могу получить какие-либо «полезные» ошибки, которые помогут мне отладить его, и попытка в repl не помогает, так как я получаю ту же проблему. Чтобы быть исчерпывающим, попытка моего URL-адреса ожидать без получения второго окна даст мне корень, а другое не удастся. Просто выполнение одного или другого вызовет ту же проблему. Переход на обычный синтаксис (element(by.css...)) ничего не меняет.


person Omar Ahmad    schedule 08.12.2015    source источник
comment
Метод, с помощью которого вы пытаетесь получить URL-адрес, не очень «AngularJS», например, было бы намного проще внедрить «$ state» в ваш тестовый контроллер Angular, а затем получить оттуда URL-адрес, $state.href( ) Например. Вы также можете использовать element для доступа к элементам DOM, здесь вы можете найти его использование: stackoverflow.com/questions/19429025/   -  person cullimorer    schedule 08.12.2015


Ответы (2)


Так много для моего первого вопроса...

Похоже, что мое использование browser.getLocationAbsUrl() предназначено для использования на странице Angular и вызывало мою проблему... По сути, хотя я считал, что использую чистые вызовы Webdriver, это call по-прежнему требуется Angular на странице для работы... Как указано в другом сообщении, использование browser. driver.getCurrentUrl() – это вызов, отличный от Angular, с использованием Webdriver, который устранил проблему. Таким образом, окончательный код выглядит следующим образом...

browser.sleep(1000); //to wait for the page to load
        browser.driver.getAllWindowHandles().then(function(handles) {
            browser.driver.switchTo().window(handles[1]).then(function() {
                expect(browser.driver.getCurrentUrl()).toContain('/console/login.jsp');
                expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

Это работает без установки ignoreSynchronization, BTW. Я понял, что это, вероятно, будет что-то относительно простое, чтобы исправить это, просто не ожидал, что получу это так быстро (я намеревался отправить вопрос прошлой ночью, но вместо этого разместил его сегодня утром).

В любом случае, я надеюсь, что это, по крайней мере, будет хорошей ссылкой для всех, кто сталкивается с той же проблемой.

person Omar Ahmad    schedule 08.12.2015
comment
Это актуально: getLocationAbsUrl vs getCurrentUrl. - person alecxe; 08.12.2015

Похоже, что getLocationAbsUrl – угловой URL-адрес abs.
Попробуйте использовать вместо этого используется собственный драйвер getCurrentUrl.

-- expect(browser.getLocationAbsUrl()).toContain('/console/login.jsp');
++ expect(browser.driver.getCurrentUrl() ...

person Nihau    schedule 08.12.2015
comment
Спасибо, я понял это и писал ответ, когда вы опубликовали это. Ссылка на страницу документа определенно полезна; метод проб и ошибок привел меня к тому, что я сам нашел ответ. - person Omar Ahmad; 08.12.2015