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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1 лайк

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

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

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!')
}
1 лайк