Mocha + Chai + Puppeteer 测试响应挂起测试

Mocha + Chai + Puppeteer Testing Response Hangs The Tests

it('Successfully Fetch Numbers',async(done)=>{
    page.on('response', response => {
        if (response.url().endsWith("allspecialnumbers"))
        {
         
            try {
                expect(response.status()).to.equal(200);
                done();

            }catch (err){
                console.log(err);
                done(err)

            }
        }
    })
    await page.$eval('#getsmsspecialnumbers_btn', el => el.click());
});

此测试挂起代码,并且在控制台上测试以红色突出显示,没有任何错误消息。 我正在使用 chai、mocha 和 puppeteer 编辑: 我安慰了this.currentTest

afterEach(function(){
    if (this.currentTest.state !== 'passed'){
        console.log("Faied",this.currentTest)
    }
})

我错了

err: <ref *3> Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

错误 Resolution method is overspecified. Specify a callback *or* return a Promise; not both. 来自 Mocha。原因是你的测试

it('Successfully Fetch Numbers',async(done)=>{

既是一个异步函数(它总是 returns 一个 Promise),也接受 done 回调。你应该选择其中之一。

例如,如果您选择回调样式,您可以只删除 asyncawait(并可能添加 .catch(done) 以确保任何承诺拒绝都转换为回调)。

谢谢帕西。您的回答有助于解决我发布的问题。但是在完成任务之前,我遇到了许多其他问题。所以我在这里和那里调整了我的代码,下面是我完成工作的最终代码。

responseEventHandlerWrapper(page,done,urlEndsWith,checkError,ExpectThis) {

return async function responseEventHandler(response) {

    if (response.url().endsWith(urlEndsWith))
    {
        try {
            let result  = await response.json();
            (ExpectThis.constructor.name == 'AsyncFunction')?
            await ExpectThis(checkError ? result.error : result.payload):
                ExpectThis(checkError ? result.error : result.payload);
            page.removeListener('response',responseEventHandler);
            done();
        }
        catch (err){
            page.removeListener('response',responseEventHandler);
            done(err)
        }
    }

};

}

然后在我的测试中

it('(Login Successful', (done) => {

    let urlEndsWith = "login";

   //Steps For Login Process Are Performed Here

    page.on('response', responseEventHandlerWrapper(
        page,
        done,
        urlEndsWith,
        true,
        async (error)=> {
            expect(error).to.be.oneOf([null]);
        }
    ));
});