Проблемы с параметром aliveNavigations метода injectFile - PullRequest
0 голосов
/ 06 ноября 2019

Я разработал акт PuppeteerCrawler и хотел внедрить некоторый общий код, используемый для всех страниц. Я нашел метод Apify.utils.puppeteer.injectFile, который отлично работает, если код внедряется при каждом событии 'domcontentloaded'. Но я хочу сделать это только один раз. Для этой цели есть опция «aliveNavigations», который должен вызывать повторное внедрение для каждой страницы.

К сожалению, эта опция не работает для меня. Пожалуйста, найдите тестовый код ниже, который демонстрирует мою проблему. Для первой страницы 'testfunction.js' не найден, для второй нет.

Что не так с моим кодом?

Cheers Wolfgang

Это тестовый сканер, который должен открыть две страницы, внедрить testfunction.js 'ONCE и выполнить его:

Apify.main( async () => {

const requestQueue = await Apify.openRequestQueue();
// Please replace urls by existing ones, if necessary!
// See here: '...'
await requestQueue.addRequest({ url: '...'});
await requestQueue.addRequest({ url: '...'});

var isAlreadyInjected;

const crawler = new Apify.PuppeteerCrawler({
    requestQueue: requestQueue,
    maxConcurrency: 1,

    gotoFunction: async ({page, request}) => {

        page.on('domcontentloaded', async () => {
            if(! isAlreadyInjected){
                await puppeteer.injectFile(page, 'testinject.js', {surviveNavigations: true} );
                isAlreadyInjected = true;
            }
        });
        return page.goto(request.url, {
            waitUntil: 'domcontentloaded'
        });

    },

    handlePageFunction: async ({ request, page }) => {

        var finding = await page.evaluate( () => {
            try{
                return testinject();
            } catch(err){
                return `Test inject was NOT found!`;
            }
        });
        log.info(finding + ` (${page.url()})`);

    },

    handleFailedRequestFunction: async ({ request }) => {
        log.info( `Failed Request:\t${request.url}` );
    },
});

await crawler.run();

});

Это' testfunction.js 'для внедрения:

testinject = function(){
return 'Test inject: I was found!'

};

1 Ответ

0 голосов
/ 06 ноября 2019

Вы используете глобальную переменную isAlreadyInjected, поэтому обрабатывается только страница первого запроса и вводится файл testfunction.js , остальные не будут.

Вы можете использоватьлокальной переменной и для сохранения данных переменной вы можете использовать userData ( Пользовательские данные, назначенные запросу )

...