Как сделать снимки экрана внутри execute или executeAsync с использованием Intern

В этом тесте я работаю над, я использую executeAsync() поймать некоторые события тестируемой страницы. Я не знаю, сколько событий произойдет, и для каждого пойманного события я хочу сделать снимок экрана с .takeScreenshot(), В настоящее время я использую этот код:

return this.parent
    .setExecuteAsyncTimeout(5000)
    .executeAsync(function(done) {
        window.events = function(event){
            if(event.message == 'takeScreenshot'){
                return done(event);
            } else if(event.message == 'endTest'){
                return done(event);
            }
        };
    }, [])
    .then(function(event){
         return this.parent
             .takeScreenshot()
             .then(function(data) {
                 //previously defined array to save the screenshots
                 bufferArray.push(data);
             })
    .end();
})

Этот код работает, но проблема в том, что он делает только один снимок экрана, так как он только ловит первое событие и затем завершает тест, а не ждет других событий. Может кто-нибудь сказать мне, если можно позвонить .takeScreenshot() внутри .executeAsync() вместо возврата обратного вызова сделано (событие)?

1 ответ

Решение

takeScreenshot метод не может быть вызван изнутри executeAsync, так что вам нужно сделать что-то еще. Без async/await рекурсия, вероятно, является наиболее простым решением, примерно таким (непроверенным):

function takeScreenshots() {
    return this.parent
        // Wait for a takeScreenshot or endTest event
        .executeAsync(function (done) {
            window.events = function (event) {
                if (
                    event.message === 'takeScreenshot' ||
                    event.message === 'endTest'
                ) {
                    done(event);
                }
            };
        })
        .then(function (event) {
            // If the event was a takeScreenshot, take it and then
            // call takeScreenshots again to wait for another
            // event.
            if (event.message === 'takeScreenshot') {
                return this.parent
                    .takeScreenshot()
                    .then(function (data) {
                        bufferArray.push(data);
                    })
                    .then(takeScreenshots);
            }
        });
}

return this.parent
    .setExecuteAsyncTimeout(5000)
    .then(takeScreenshots);
Другие вопросы по тегам