Я разработал акт 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!'
};