Пишу отдельным топиком, тк это уже подтема — написание тестов.
Меня интересует как сделать так, чтобы скриншот был снят только после какого-то события (например, на объекте window). Это важно для тестирование SPA, они не сразу отрисовываются, а из JavaScript.
Для простоты я пока не пользуюсь своим кастомным событием, а просто проверяю, работает ли с load
.
Я не нашла в документации возможности реагировать на события, поэтому пытаюсь пользоваться флагом и функциями executeJS
и waitForJSCondition
.
Текст теста вот такой:
var gemini = require('gemini');
var examples = [
'1.1',
'1.2-1',
'2.1'
];
examples.forEach(function(example) {
gemini.suite(example, function(suite) {
suite.setUrl('/styleguide/#/section/' + example + '/fullscreen')
.setCaptureElements('body')
.capture('plain', function(actions, find){
actions.executeJS(function(window) {
window.addEventListener('load', function() {
window.doTake = true;
});
})
actions.waitForJSCondition(function(window) {
return window.doTake;
}, 3000);
});
});
});
Но ничего не получается, на снятии скриншотов получаю отлуп "Condition was not met in 3000ms".
Важно отметить, что если я просто пользуюсь actions.wait(3000)
, то все скриншоты снимаются как надо.
Теперь вопросы:
- Правильно ли я делаю ожидание события на window или может быть есть какой-то более простой путь?
- Почему не работает?
- Как дебажить тесты? Я хочу писать console.log и видеть, что там происходит.
/cc @arikon @sevinf
Пинг! Без ответа на этот вопрос не могу снимать скриншоты. А с ответом сразу смогу, вот!
@varya На
window.load
нет необходимости вешаться — webdirver его дожидается при открытии страницы и твой код выполняется уже после. Насколько я понимаю, у тебя инициализация как-то асинхронно происходит. Я бы предложил тут какой-то другой индикатор того, что начальный JS отработал заиспользовать — может, наbody
какой-то специфичный класс после загрузки вешается, или какой-то определенный элемент появляется, или фреймворк для SPA какое-то событие генерирует после загрузки.У меня же написано в тексте, что
load
взят просто для примера. У меня другое событие, но ни одно событие не получается обработать. Специфичных классов у приложения нет. Ну то есть конечно есть у каких-то компонентов после инициализации. Но задача — снимать весьbody
, независимо от того что там за компоненты. Есть какая-то возможность работать именно с событиями? Также остаётся нерешенным вопрос, как дебажить.@varya Для дебага браузерного кода с выводом в консоль пока возможностей нет. Завёл issue https://github.com/gemini-testing/gemini/issues/187
Ты пишешь про
load
, но обработчикload
не сработает, потому что код про назначение обработчика выполнится уже после загрузки страницы (когда событиеload
наступит). Возможно, в твоём случае с другим событием точно такая же ситуация — событие уже наступило до выполнения кода про навешивание на него обработчика.Спасибо. Выглядит логично, тогда сделаю класс на
body
как предлагал Сережа выше. Некрасиво, но ладно.