Как передать объект json в функцию $ eval - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь передать JSON функции безуспешно, вот что я пытался до сих пор

await aHandle.$eval('input[name="date"]', (el) => (el.value =input.date)(input) );

или как это

await aHandle.$eval('input[name="date"]', (el) => (el.value =input.date),input );

или как это

await aHandle.$eval('input[name="date"]', (el) => (el.value =input.date) ).(input);

пожалуйста, посоветуйте правильный путь

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

$ eval (селектор, pageFunction [, ... args])

Аргументы / аргументы сериализуются, так что вы можете передать дескриптор и дополнительные данные, подобные этой.

await aHandle.$eval(selector, (yourElementHandle, yourJsonData) => {
  yourElementHandle.value = yourJsonData.username
}, (yourJsonData) ); // <-- pass the handle and data here

По сути, все, что вы передаете после функции, будет сериализовано и доступно для вас в этой функции в указанном порядке.

Это должно работать даже без установки скобок (), так как оно распространяетаргументы.

1 голос
/ 26 сентября 2019

Это работает

const Apify = require('apify');

Apify.main(async () => {
    const q = await Apify.openRequestQueue();
    await q.addRequest({ url: 'http://example.com' })

    const c = new Apify.PuppeteerCrawler({
        requestQueue: q,
        handlePageFunction: async ({ page }) => {
            const inputServerSide = {
                date: '2019-09-26'
            };
            const aHandle = await page.$('div');
            await aHandle.$eval('h1', (el, inputClientSide) => {
                el.name = inputClientSide.date;
            }, inputServerSide );
            const name = await page.$eval('h1', (el) => el.name);
            console.log('Name:', name);
        }
    })

    await c.run();
});
...