Page.evaluate () возвращает неопределенное значение, но оператор работает в Chrome devTools - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь получить значения src для всех изображений в поиске изображений Bing для поискового запроса.Я использую кукловод для этого.Я написал селектор для захвата каждого тега изображения, и он работает в Chrome DevTools.Это, однако, не работает, когда я пишу это в коде -

const puppeteer = require("puppeteer");

(async () => {
    try{
        let url = `https://www.bing.com/images/search?q=cannabis`
        const browser = await puppeteer.launch({headless: false})
        const page = await browser.newPage()
        await page.goto(url)
        await page.waitForSelector("ul.dgControl_list li img.mimg")

        console.log(await page.evaluate(() => {
            Array.from(document.querySelectorAll("ul.dgControl_list>li img.mimg"), img => img.src)
        }))
    } catch(err){
        console.log("error - " + err)
    }
})()

Я получаю вывод в виде объекта, содержащего массивы из 10 элементов каждый в devTools, но когда я запускаю его в консоличерез мой код он не определен.Как мне прочитать этот объект?

1 Ответ

1 голос
/ 16 мая 2019

Вы не возвращаете никаких данных из вызова page.evaluate.Чтобы вернуть данные, вы должны использовать оператор return или использовать короткий синтаксис (как описано ниже):

console.log(await page.evaluate(() => {
    return Array.from(document.querySelectorAll("ul.dgControl_list>li img.mimg"), img => img.src)
}))

Объяснение: Функция стрелки

Функция стрелки имеет два способа:напиши им.Одним из них является короткий синтаксис, вы можете использовать его так:

const func = () => 1; // func() will simply return 1

Вы можете вставить туда только один оператор (который может вызывать другие операторы).В качестве альтернативы вы можете использовать длинную форму:

const func = () => { return 1; }; // Same function as above

Вы можете использовать объявления переменных и любой вид кода внутри этой функции (так же, как в обычном function() { ... }, но на этот раз вы должны использовать return для возврата значения.

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

console.log(await page.evaluate(
    () => Array.from(document.querySelectorAll("ul.dgControl_list>li img.mimg"), img => img.src)
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...