Protractor: не удается получить текст или закрыть foundation alert. Приложение на ангуляре

protractor
windows
javascript
chrome
Теги: #<Tag:0x00007fedc12a8800> #<Tag:0x00007fedc12a85f8> #<Tag:0x00007fedc12a8058> #<Tag:0x00007fedc12b7e18>

(E2e) #1

Использую версию chrome=60.0.3112.113, chromedriver=2.28.455520, os.name: ‘Windows 7’,npm version 5.2.1 …
Делаю следующее Алерт появляется после нажатия баттона Continue
Пробовал достучатьсячерез switch to Alert

 helper.waitElementToBeClickable(previousBtn).then(function() {
                 return сontinueBtn.click();
                  })
               .then(function(alertText) {
                browser.wait(function () {
                    return browser.switchTo().alert().then(
                        function () {return true;},
                        function () {return false;}
                        );
                    }, 3000);
            var popupAlert = browser.switchTo().alert();
            alertText = popupAlert.getText();
            console.log("alertText: "+alertText);
            popupAlert.dismiss();
            return alertText;
        });

Вданном случае получаю вместо текста алерта вот такое: "ManagedPromise::12blabla
{[[PromiseStatus]]: “pending”}
Не получается ни кликнуть,ни получить текст алерта (это foundation алерт), ни закрыть его.
Подскажите, плз, как решить проблему…
Текст логов и кода …


(Eugene Tkachenko) #2
var popupAlert = browser.switchTo().alert();
popupAlert.getText().getText().then(function(text) {
    console.log('popup text: ' + text);
});

На сколько я знаю, switchTo возвращает промис, собственно он ждет пока ты его заресолвишь, потому и “Pending”.

Также если следовать контрол флоу, то jasmine ресолвит твой промис, если ты сделаешь так, то будет тоже работать:

var popupAlert = browser.switchTo().alert();
expect(popupAlert.getText()).toContain("some value here")

(E2e) #3

Спасибо за ответ, Евгений. Вроде я уже пробовал твой пример, перепроверю снова. Если не получится ничего - я вот подумал, может мне нужно было заимпортить в сам тест либы типа foundation.min.js и jquery-3.2.1.js - чтобы получить доступ к foundation алерту, как думаешь?
Юрий


(Eugene Tkachenko) #4

Я буду честен, очень сложно что-то сказать, не пощупав ни либы, не того, как вообще UI работает.

Вопрос, а разве вы не можете работать с вашим алертом без использования switchTo. Просто бывает такое, что доступ к алерту можно получить, как к любому другому элементу DOM-а?

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


(E2e) #5

Евгений, попробовал ваши два способа переключиться на алерт - получаю в обоих случаях No Such Alert error. Пробовал через executeScript(“document.querySelector(локатор)”) достучаться к алерту - пишет, что document не определен, через стандартный способ element(by.xpath(локатор)) - также безрезультатно. Подскажите, плиз, если есть какие-то идеи?


(E2e) #6

Вообще, насколько я знаю, вебдрайвер (а протрактор является его оберткой) умеет работать только с нативными алертами. В данном случае алерт завязан на thirdparty библиотеку foundation.js. Может кто-то пробовал импортить сторонние библиотеки в коде протрактора и обращаться к элементу, созданному на основе этой библиотеки?


(Oleksandr Khotemskyi) #7

Это не нативный алерт, а такой же элемент как все другие. Попробуйте поискать его с ожиданием, и поработайте с ним как с любым другим элементом.

Так же можно попробовать подебажить через protractor --elementExplorer


(Oleksandr Khotemskyi) #8

Ну и раз на то пошло я бы написал проще:

Если контрол флоу врублен:

helper.waitElementToBeClickable(previousBtn)
сontinueBtn.click()
let alertElem = $('.app-alert .alert-box')
browser.wait(EC.visiblityOf(alertElem), 5000, 'Expected alert to appear after clicking continue button')

alertElem.getText().then(txt => console.log(`alertText: ${txt}`))
alertElem.$('your locator to dismiss button inside alert here').click()
browser.wait(EC.invisibilityOf(alertElem), 5000, 'Expected alert to dissapear after dismissing')

(E2e) #9

Cпасибо, Олександр, за помощь. Хотел бы уточнить: для понимания:
$(’.app-alert .alert-box’) это не функция jQuery, а протракторовский element(by.css(.app-alert.alert-box’))?
и ваша запись alertElem.getText().then(txt => console.log(alertText: ${txt})) равносильна
alertElem.getText().then(function(txt){
console.log("alertText: "+txt);
}); или нет?


(E2e) #10

Теперь вот эта ошибка: Failed: Timed out waiting for asynchronous Angular tasks to finish after 15 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular
While waiting for element with locator - Locator: By(css selector, .app-alert .alert-box).
The following tasks were pending:
- $timeout: function () {
removeAlert(id);
}
Stack:
ScriptTimeoutError: asynchronous script timeout: result was not received in 15 seconds