Puppeteer : .evaluate ()에서 변수 전달
Puppeteer 의 page.evaluate()
함수에 변수를 전달하려고하는데 다음과 같은 매우 간단한 예제를 사용하면 변수 가 정의되지 않습니다.evalVar
저는 Puppeteer를 처음 사용하고 빌드 할 예제를 찾을 수 없으므로 해당 변수를 page.evaluate()
함수에 전달 하여 내부에서 사용할 수 있도록 도움이 필요합니다 .
const puppeteer = require('puppeteer');
(async() => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
const evalVar = 'WHUT??';
try {
await page.goto('https://www.google.com.au');
await page.waitForSelector('#fbar');
const links = await page.evaluate((evalVar) => {
console.log('evalVar:', evalVar); // appears undefined
const urls = [];
hrefs = document.querySelectorAll('#fbar #fsl a');
hrefs.forEach(function(el) {
urls.push(el.href);
});
return urls;
})
console.log('links:', links);
} catch (err) {
console.log('ERR:', err.message);
} finally {
// browser.close();
}
})();
다음 pageFunction
과 같이 변수를 인수로 전달해야합니다 .
const links = await page.evaluate((evalVar) => {
console.log(evalVar); // should be defined now
…
}, evalVar);
인수는 https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args에서 직렬화 할 수도 있습니다 .
이 스타일은 더 편리 하고 읽기 쉬우 므로 계속 사용하는 것이 좋습니다 .
let name = 'jack';
let age = 33;
let location = 'Berlin/Germany';
await page.evaluate(({name, age, location}) => {
console.log(name);
console.log(age);
console.log(location);
},{name, age, location});
단일 변수 :
You can pass one variable to page.evaluate()
using the following syntax:
await page.evaluate(example => { /* ... */ }, example);
Note: You do not need to enclose the variable in
()
, unless you are going to be passing multiple variables.
Multiple Variables:
You can pass multiple variables to page.evaluate()
using the following syntax:
await page.evaluate((example_1, example_2) => { /* ... */ }, example_1, example_2);
Note: Enclosing your variables within
{}
is not necessary.
It took me quite a while to figure out that console.log()
in evaluate()
can't show in node console.
Ref: https://github.com/GoogleChrome/puppeteer/issues/1944
everything that is run inside the page.evaluate function is done in the context of the browser page. The script is running in the browser not in node.js so if you log it will show in the browsers console which if you are running headless you will not see. You also can't set a node breakpoint inside the function.
Hope this can help.
For pass a function
, there are two ways you can do it.
// 1. Defined in evaluationContext
await page.evaluate(() => {
window.yourFunc = function() {...};
});
const links = await page.evaluate(() => {
const func = window.yourFunc;
func();
});
// 2. Transform function to serializable(string). (Function can not be serialized)
const yourFunc = function() {...};
const obj = {
func: yourFunc.toString()
};
const otherObj = {
foo: 'bar'
};
const links = await page.evaluate((obj, aObj) => {
const funStr = obj.func;
const func = new Function(`return ${funStr}.apply(null, arguments)`)
func();
const foo = aObj.foo; // bar, for object
window.foo = foo;
debugger;
}, obj, otherObj);
You can add devtools: true
to the launch options for test
참고URL : https://stackoverflow.com/questions/46088351/puppeteer-pass-variable-in-evaluate
'Programing' 카테고리의 다른 글
SQL Server 쿼리에서 월 이름 반환 (0) | 2020.10.16 |
---|---|
npm-EPERM : Windows에서 허용되지 않는 작업 (0) | 2020.10.16 |
프로젝트 파일이 불완전합니다. (0) | 2020.10.16 |
ArrayList에서 쉼표로 구분 된 문자열을 어떻게 생성합니까? (0) | 2020.10.16 |
자바 스크립트를 사용하여 게시 요청 매개 변수를 읽는 방법 (0) | 2020.10.16 |