Как использовать утверждения Мокко в событиях Puppeteer page.on? UnhandledPromiseRejectionWarning: AssertionError - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь запустить утверждения внутри события Puppeteer's page.on('response'), однако выдается следующая ошибка и тест проходит неправильно: UnhandledPromiseRejectionWarning: AssertionError.

Я прочитал, что возврат обещания должен сделать хитрость, но как я могу решить обещание, если я не знаю, когда событие прекратит излучаться?

Вот полный пример кода:

const assert = require('assert');
const puppeteer = require('puppeteer');
const config = require('../config.json');

describe('Tests', function () {
    let browser;
    let page;

    this.timeout(30000);

    before(async function () {
        browser = await puppeteer.launch({
            headless: config.headless
        });
        page = await browser.newPage();
    });

    after(async function () {
        await browser.close();
    });

    it('No responses with blacklisted URLs', async function () {
        const blacklistedUrls = ['tia', 'example'];

        page.on('response', response => {
            blacklistedUrls.forEach(blacklistedUrl => {
                const contains = response.url().includes(blacklistedUrl);
                assert.equal(contains, false);
            });
        });

        await page.goto('http://google.com/');
    });
});

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете иметь массив во внешней области действия page.on для заполнения URL-адресами из черного списка, а затем ждать, пока page.goto завершит загрузку страницы sh, используя page.goto waitUntil Опции и установить длину массива в конце загрузки страницы. Вы даже можете использовать этот массив для печати занесенных в черный список URL-адресов в сообщении подтверждения.

Пожалуйста, прочитайте встроенные комментарии

it('No responses with blacklisted URLs', async function () {
    const blacklistedUrls = ['tia', 'example'];

    // Have an array to keep each blacklisted URLs
    const blacklistedUrlsFound = [];

    page.on('response', response => {
        // Use some instead forEach to evaluate the rule, it will be faster
        const hasBlacklistedUrls = blacklistedUrls.some(url => response.url().indexOf(url) >= 0);

        // If response url has blacklisted urls add the url to the array
        if (hasBlacklistedUrls) {
            blacklistedUrlsFound.push(response.url());
        }
    });

    // Visit tha page and wait for network to be idle (finish requesting external urls)
    await page.goto('http://google.com/', { waitUntil: ["networkidle0"] });

    // Finally assert using the blacklistedUrlsFound.length and print the black-listed urls
    assert.equal(blacklistedUrlsFound.length > 0, false,
        `There are black-listed URLs:\n${blacklistedUrlsFound.map(url => `\t${url}`).join('\n')}`);
});

Вы будете заставить ваш тест работать без каких-либо исключений, и, конечно, он не будет выполнен, потому что есть URL-адреса ответов, содержащие по крайней мере tia:

Puppeteer Mocha assert test

...