Puppeteer 页面评估失败,并出现引用错误

Puppeteer page evaluation fails with reference error

提问人:Muhammad Usman Rana 提问时间:11/15/2023 更新时间:11/15/2023 访问量:14

问:

我正在尝试废弃LinkedIn,登录后我经常收到此错误。我的代码在开始时运行良好,但经过几天的测试,即使我没有进行任何更改,它也无法正常工作。我每次都收到此错误:

发生错误 错误 [ReferenceError]: 未定义oo_oo at evaluate (在 GET (webpack-internal:///(rsc)/./src/app/api/download-jobs/route.js:41:41), :1:45) 处评估)

下面是代码片段:

import { NextResponse } from "next/server";
import puppeteer from "puppeteer";
import { detectPlatform } from "@/utils";
export async function POST(request) {
    const { email, password, jobParam, location } = await request.json();
    console.log('recieved search params: ', email, password, jobParam, location)
    if (!email || !password) return NextResponse.json({ message: 'Credentials Required' }, { status: 400 })
    const url = `https://www.linkedin.com/checkpoint/lg/sign-in-another-account`

const browser = await puppeteer.launch({
    executablePath: detectPlatform(),
    headless: false,
    args: ['--no-sandbox', '--disable-setuid-sandbox', '--enable-gpu'],
    timeout: 72000000
})
const page = await browser.newPage();
page.setRequestInterception(true);
page.on('request', (request) => {
    request.continue({ timeout: 7200000 });
});
let jobListings = []
try {
    await page.goto(url);
    await new Promise((resolve) => setTimeout(resolve, 3000));
    await page.type('#username', email, { delay: 100 })
    await new Promise((resolve) => setTimeout(resolve, 1000));
    await page.type('#password', password, { delay: 100 })
    await new Promise((resolve) => setTimeout(resolve, 1000));
    await page.click('button[type=submit]')
    await page.waitForNavigation({ waitUntil: 'load' })
    console.log('capthca gone')
    await new Promise((resolve) => setTimeout(resolve, 15000));
    
    await page.goto(`https://www.linkedin.com/jobs/collections/recommended`)
        console.log('now find icon')
        await new Promise((resolve) => setTimeout(resolve, 15000));

        await page.waitForSelector('li-icon[aria-hidden="true"][type="job"]', {timeout: 0});
        const liIconElement = await page.$('li-icon[aria-hidden="true"][type="job"]');
        if (liIconElement) {
            console.log('icon found')
            await liIconElement.click();
            await new Promise(resolve => setTimeout(resolve, 15000))
            console.log('job icon clicked')
        }
        console.log('1')
        if (jobParam || location) {
            if (jobParam) {
                console.log('inside job Param Condition')
                await page.click('input[aria-label="Search by title, skill, or company"]')
                await new Promise((resolve) => setTimeout(resolve, 500));
                const jobField = await page.$('input[aria-label="Search by title, skill, or company"]');
                if (jobField) await jobField.type(jobParam, { delay: 100 })
                await new Promise((resolve) => setTimeout(resolve, 3000));
            }
            console.log('outside jobParam check')
            console.log('inside location param')
            await page.click('input[aria-label="City, state, or zip code"]')
            await new Promise((resolve) => setTimeout(resolve, 500));
            const locationField = await page.$('input[aria-label="City, state, or zip code"]');
            if (locationField) await locationField.type(location ?? " ", { delay: 100 })
            await new Promise((resolve) => setTimeout(resolve, 3000));
            
            await page.keyboard.press("Enter")
            console.log('enter pressed')
            await page.waitForNavigation()
            await new Promise((resolve) => setTimeout(resolve, 15000));

            let button = null;
            var i = 1;

            console.log('search param clicked')
            do {
                console.log('iteration number: ', i)
                i++
                const ulElement = await page.waitForSelector('ul.scaffold-layout__list-container');
                console.log('2', ulElement)
                if (!ulElement) {
                     console.log('no more job found ')
                     break
                 };
                console.log('3')
                await page.waitForSelector('ul.scaffold-layout__list-container');
                await new Promise(resolve=>setTimeout(resolve, 3000))
                const jobData = await page.$eval('body', element => {
                    console.log('4')
                    const baseElement = element.querySelector('ul.scaffold-layout__list-container');
                    let liArray = []
                    const liElems = baseElement.querySelectorAll('li.jobs-search-results__list-item > div')
                    liElems.forEach(item => {
                        const dataBaseElement = item?.querySelector('div.job-card-container > div.artdeco-entity-lockup > div.artdeco-entity-lockup__content')

                        // Job Title Data
                        const jobTitleElement = dataBaseElement?.querySelector('div.artdeco-entity-lockup__title')
                        const jobTitle = jobTitleElement?.querySelector('a.job-card-container__link')?.innerText;
                        const jobURL = jobTitleElement?.querySelector('a.job-card-container__link')?.href

                        // Company Data
                        const companyName = dataBaseElement?.querySelector('div.artdeco-entity-lockup__subtitle > span')?.innerText.trim()

                        // Job Location Data
                        const location = dataBaseElement?.querySelector('div.artdeco-entity-lockup__caption > ul > li.job-card-container__metadata-item')?.innerText?.trim();

                        // Posting Time Data
                        const postingTime = item?.querySelector('ul.job-card-list__footer-wrapper > li > time > span')?.innerText?.trim()

                        //Creating Response Data
                        liArray.push({
                            jobId: null,
                            jobTitle: jobTitle,
                            jobURL: jobURL,
                            companyName: companyName,
                            location: location,
                            postingTime: postingTime
                        })
                    })
                    return liArray
                })
                if (!jobData) break
                jobListings = [...jobListings, ...jobData]
                const paginationInstance = await page.waitForSelector('div.jobs-search-results-list__pagination > ul')
                if (!paginationInstance) break
                button = await page.$(`button[aria-label="Page ${i}"]`)
                if (button) {
                    await button.click();
                    await page.waitForNavigation();
                }
                await new Promise((resolve) => setTimeout(resolve, 15000))
                console.log('iteration completed')
            } while (button)

            for (let i = 0; i < jobListings.length; i++) {
                jobListings[i].jobId = i + 1;
            }
            console.log('jobs data: ', jobListings)
        }
        return NextResponse.json({ data: jobListings, count: jobListings.length }, { status: 200 })
    } catch (error) {
        console.log('Error Occured: ', error)
        if (error && jobListings.length > 0) {
            return NextResponse.json({
                data: jobListings||[],
                count: jobListings?.length ?? 0,
                message: "Data return but somethings' fishy",
                status: 500
            })
        }
    } finally {
        await page.close()
        await browser.close()
    }
}

我试过page.evaluate,page.$eval。但每次我都会遇到同样的错误。

傀儡师 参考错误 评估

评论


答: 暂无答案