提问人:Muhammad Usman Rana 提问时间:11/15/2023 更新时间:11/15/2023 访问量:14
Puppeteer 页面评估失败,并出现引用错误
Puppeteer page evaluation fails with reference error
问:
我正在尝试废弃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。但每次我都会遇到同样的错误。
答: 暂无答案
评论