如何使用 Intern 在 execute 或 executeAsync 中截取屏幕截图

How to take screenshots inside execute or executeAsync using 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();
})

此代码有效,但问题是它只截取一个屏幕截图,因为它只捕获第一个事件,然后完成测试而不是等待其他事件。谁能告诉我是否可以在 .executeAsync() 中调用 .takeScreenshot() 而不是返回回调完成(事件)?

无法从 executeAsync 中调用 takeScreenshot 方法,因此您需要执行其他操作。没有 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);