InjectFile方法的SurvivalNavigations选项存在问题

时间:2019-11-06 16:30:56

标签: apify

我开发了一个PuppeteerCrawler法案,想注入一些用于所有页面的通用代码。我发现了Apify.utils.puppeteer.injectFile方法,如果代码是由每个“ domcontentloaded”事件注入的,则该方法可以正常工作。但我只想注入一次。为此,有一个“ surviveNavigations”选项,该选项应导致每页重新注入。

不幸的是,此选项对我不起作用。请在下面找到一些测试代码,以演示我的问题。在第一页中找到了“ testfunction.js”文件,在第二页中没有找到该文件。

我的代码有什么问题?

欢呼沃尔夫冈

这是测试搜寻器,应打开两个页面,注入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 :(得分:0)

您使用的是全局变量isAlreadyInjected,因此只有第一个请求的页面得到处理,并注入了文件 testfunction.js ,其余的则不会。

您可以使用局部变量,并可以使用userDataCustom user data assigned to the request)来保留变量数据