#jasmine #protractor
#jasmine #транспортир
Вопрос:
Каждый раз, когда локатор элементов Protractor выходит из строя, он выдает ошибку и продолжает идти по ужасному пути бесконечных каскадных сбоев в моей спецификации и наборе. Каждый последующий тест зависит от того, найдет ли локатор элемента свой элемент, и зависит от текущей передачи спецификации.
Я хотел бы оставить тестируемую веб-страницу открытой, пока я использую консоль. Цель состоит в том, чтобы отладить текущее состояние страницы и выяснить, почему локатору элементов, возможно, не удалось найти свою цель.
Я не слишком обеспокоен сбоем всего набора и выходом при первом сбое спецификации (я видел другие ответы на —fail-fast и остановку при первом сбое спецификации.) Это не тот подход, который я хотел бы использовать. Я хочу установить точку останова и проверить среду во время работы страницы.
Может быть, есть что-то вроде опции Jasmine для doThisOnFailure: () => { debugger }
, которая, я думаю, сработает для меня.
Мне действительно не нравится решение использовать spec reporter для выполнения во afterEach
время и проверки количества неудачных спецификаций в среде Jasmine для всей функции спецификации. Я хочу сразу узнать, когда произошел сбой локатора элементов, и немедленно прерваться, как только он потерпел неудачу.
Может быть, что-то действительно грубое сработает $('element').click().catch(() => { debugger })
.
РЕДАКТИРОВАТЬ: Пожалуйста, обратите внимание, что я спрашиваю о разрыве в спецификации, а не о разрыве в конце спецификации.
it('should execute deadly code', function () {
p.navigation.openStorageConfigTab()
$$('.bad-selector').get(0).click() /* IMPORTANT: I want to break here */
p.volume.navigateTo()
})
it('should not execute this spec', function () {
$$('.bad-selector').get(0).click()
})
И вывод
✗ should execute deadly code
- Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)
✗ should not execute this spec
- Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By(css selector, .bad-selector)
Ответ №1:
Я могу порекомендовать вам подход, который я использую, и я надеюсь, что вы сможете использовать его здесь
Общий подход заключается в том, чтобы подождать, пока вы не введете close/
команду в URL браузера:
await browser.waitForAngularEnabled(false);
await browser.wait(
async () => {
let url = await browser.getCurrentUrl();
return url.includes('close/');
},
5 * 60 * 1000,
'Keep-alive timeout reached, closing the session...'
);
Вопрос в том, когда вы хотите его вызвать. Я использую преимущество onComplete
функции обратного вызова в файле конфигурации. Когда он вызывается, браузер по-прежнему доступен. Поэтому, как только все тесты будут завершены, он не завершится в течение 5 минут, если я не отправлю close/
в поле url. Очевидно, что это может быть условным, добавив что-то вроде if (DEBUG === true)
Недостатком этой настройки является то, что она вызывается, когда все тесты завершены, и, возможно, ваша спецификация переместилась со страницы, на которой была ошибка. Итак, что вы также можете сделать, это использовать преимущество jasmine reporter (если вы используете jasmine). Грубо говоря, вам просто нужно добавить это в свою onPrepare
функцию:
jasmine.getEnv().addReporter({
jasmineStarted: function(suiteInfo) {},
suiteStarted: function(result) {},
specStarted: function(result) {},
specDone: async function(spec) {
if (spec.status === 'failed') {
await browser.waitForAngularEnabled(false);
await browser.wait(
async () => {
let url = await browser.getCurrentUrl();
return url.includes('close/');
},
5 * 60 * 1000,
'Keep-alive timeout reached, closing the session...'
);
await browser.close();
process.exit(35);
}
},
suiteDone: function(result) {},
jasmineDone: function(result) {},
});
Итак, если какой-либо it
блок имеет failed
статус, он остановится. НО я не тестировал это, я оставлю это на ваше усмотрение. И, во-вторых, я не подумал о том, что произойдет с остальными спецификациями в очереди, поскольку вы перенаправлены на несуществующий URL close/
, но я верю, что это все равно сработает для вас. В худшем случае вы можете поиграть и продолжить или закрыть экземпляр браузера, если вы поняли концепцию
PS Я изменил код, чтобы закрыть браузер при вводе close/
, добавив
await browser.close();
process.exit(35);
Я тестировал этот код со следующими сценариями:
- счастливый путь: все 5
it
завершены успешно - сбой поиска первого элемента второго
it
блока - сбой поиска второго элемента второго
it
блока
Все прошло. Код работает так, как ожидалось
Комментарии:
1. это так. Что происходит, когда protractor не может найти элемент, если помечает
it
блок как неудачный, выдает ошибку, завершает этот конкретный шаг (it
), и перед запуском следующегоspecDone
вызывается функция. Не позволяйте имениspec
сбивать вас с толку —spec === it
(не файл спецификации) иsuite === describe
. Сначала попробуйте и дайте мне знать, с какими ошибками вы сталкиваетесь2. в худшем случае поместите его в
afterEach
раздел и проверьте, не сбился лиit
статус. Хотя вам придется дублировать код для каждого файла спецификации3. Вы будете удивлены, если попробуете
4. ну, одно исправление, если вы не обернете все
$(...)
вtry/catch
это, сработает5. @activedecay Я только что протестировал код локально, все работает. Я улучшил код для выхода из protractor при вводе
close/