Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Protractor фейлит весь тест-сьют если не находит элемент

protractor
selenium
Теги: #<Tag:0x00007fedc1023710> #<Tag:0x00007fedc10233a0>

(Eugene Petrash) #1

Это нормально, что Protractor через раз фейлит весь тест сьют если не находит какой-то элемент при обычном поиске элемента или при ожидении элемента(protractor.ExpectedConditions)?


Если да, то как вы с этим боритесь?


(Oleksii Ihnatiuk) #2

Вставьте куски кода текстом пожалуйста. Покажите как вы запускаете тест сьюты. И что значит ваш “через раз”.


(Eugene Petrash) #3

На первом и последнем скриншоте виден код, на котором происходит падение.
Вставлять что-то определенное из кода не стал так как подобные падения происходят не регулярно и в разных местах кода.
Интересует вопрос почему фейлится весь набор тестов, а на только один ‘it’?
Как мы запускаем тест сьюты:

exports.config = {
    specs: [
        ''+process.env.VM_TESTS_DIR+'/specs/*.e2e.ts'
    ],

Т.е. по определенному пути запускаются все тесты, которые лежат в файлах с окончанием e2e.ts


(Valentin Buryakov) #4

Да это нормально, добро пожаловать в мир Javascript’a, где всё асинхронно, поэтому может быть возможно всё ))
В первом случае у вас ожидается loader в течении 60c и если он появляется, то соответственно ждет пока он исчезнет, но у вас похоже он так и появился и промис зареджектился, в этом случае возможно обработать ситуацию, когда loader может и не появится, если такое допускается в вашем приложении. То в then можно передатать 2ым параметром функцию, которая будет обрабатывать эту ошибку:
.then(onSuccesFunc, onErrorFunc) или просто увеличить еще время ожидания DELAY, возможно 60сек недостаточно или у вас плавающие баги, нужно разбираться
Во 2ом и 3ем случае аналогично не дожидается элемента, попробуйте тоже увеличить время или поисследовать приложение, возможно, что-то у вас не так работает.


(Oleksii Ihnatiuk) #5

Попробуйте явно указать, что не нужно останавливаться после ошибки
https://jasmine.github.io/2.5/node.html#section-21


(Bolatbek) #6

По скринам что-то все вперемежку: и await, и protractor.defer();
Интересно.


(Eugene Petrash) #7

Спасибо, добавлю.

Спасибо, укажу явно false. Но на сколько я понял, этот параметр по дефолту false и он будет останавливать выполнение только одной спеки, но не всего набора спек. А у меня останавливается выполнение всех спек, просто все прерывается.

Это переходный период, почти весь код уже переписан на async/await

Нормально воспроизведение ошибки через раз из-за асинхронности. Но для меня по прежнему остается открытым вопрос, почему полностью останавливается выполнение, хотя впереди есть еще несколько спек(файлов), почему не фейлится только один it?!


(Valentin Buryakov) #8

Кстати это плохо очень, использование mix’a из async/await из control flow может привести к непредсказуемым последствиям https://github.com/angular/protractor/tree/master/exampleTypescript/asyncAwait. Рекомендуют отключать ведрайверские промисы SELENIUM_PROMISE_MANAGER: false

Это тоже странно, видимо где-то у вас не хэндлиться еррор и он вываливается на самый верх и запуск обрыввается. Попробуйте поставить conf файле ignoreUncaughtExceptions: true


(Oleksandr Khotemskyi) #9

Все правильно. Миксовать контрол флоу и асинк авейты нельзя.


(Oleksandr Khotemskyi) #10

вы не реджектите промис если вейт не прошел -

exports.waitForLoader = function (loader) {
    let deffered = protractor.promise.defer()
    browser.wait(
        protractor.ExpectedConditions.presenceOf(loader),
        DELAY, 'Loader is not appear!'
    ).then(() => {
        browser.wait(
        protractor.ExpectedConditions.stalenessOf(loader),
        DELAY, 'Loader is not disappear!'
    }).then(deferred.fulfill, defered.reject)
    return deferred.promise
}

Но я бы переписал, если контрол флоу врублен -

exports.waitForLoader = function (loader) {
    const EC = protractor.ExpectedConditions
    return protractor.promise.all([
        browser.wait(EC.presenceOf(loader), DELAY, 'Loader is not appear!'),
        browser.wait(EC.stalenessOf(loader), DELAY, 'Loader is not disappear!')
    ])
}

если асинк авейты -

exports.waitForLoader = async function (loader) {
    const EC = protractor.ExpectedConditions
    await browser.wait(EC.presenceOf(loader), DELAY, 'Loader is not appear!')
    await browser.wait(EC.stalenessOf(loader), DELAY, 'Loader is not disappear!')
}