Puppeteer 始终未定义,但 devtools 适用于嵌套节点列表
Puppeteer always undefined but devtools works for nested node lists
我是 Puppeteer 的新手,不太确定我在这里做错了什么,但在 DevTools 中,我得到了正确的输出。但是,我希望创建一个包含这些值的文件并不断获取 undefined
.
我认为它与节点列表有关并且无法 return 它们,但我不知道如何修复它。
这在 DevTools 中有效:
let arr2 = Array.from(document.querySelectorAll(
"#data > div.data-wrapper > div > div > table > tbody tr"))
.map(row => (
{site:row.querySelector('td:nth- child(2)').innerText,
pass:row.querySelector('td:nth- child(10)').innerText,
user:row.querySelector('td:nth-child(9)').innerText
}))
//with a console.log()
我也试过 row.evaluate(()=>)
但对我不起作用。
这是我的代码不起作用:
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.authenticate({ username: "username", password: "password" });
await page.goto("https://website/.../all");
await page.waitFor(120000); // beacuse It loads everything slowly and times out the default 30000
console.log("started evalating");
var data = await page.evaluate(() => {
Array.from(
document.querySelectorAll(
"#data > div.data-wrapper > div > div > table > tbody tr"
)
).map(row => {
return {
site: row.querySelector("td:nth-child(2)").innerText,
pass: row.querySelector("td:nth-child(10)").innerText,
user: row.querySelector("td:nth-child(9)").innerText
};
});
});
console.log(data);
})();
//I want an array of objects but the result throws errors or comes back with [undefined,......]
传给page.evaluate()
is missing a return
statement, and therefore does not return a value. As a result, the variable data
is undefined
的页面功能。
您还应注意两个额外的细节:
Array.from()
has a built-in map
函数。
Array.from(arrayLike, mapFn) // good
Array.from(arrayLike).map(mapFn) // bad
您应该尽可能使用 let
or const
instead of var
。
let data = ... // good
var data = ... // bad
这是您的代码的修订版,应该可以正常工作:
'use strict';
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.authenticate({
username: 'username',
password: 'password',
});
await page.goto('https://website/.../all');
await page.waitFor(120000);
console.log('started evalating');
let data = await page.evaluate(() => {
return Array.from(
document.querySelectorAll('#data > div.data-wrapper > div > div > table > tbody tr'),
row => ({
site: row.querySelector('td:nth-child(2)').innerText,
pass: row.querySelector('td:nth-child(10)').innerText,
user: row.querySelector('td:nth-child(9)').innerText,
})
);
});
console.log(data);
})();
我是 Puppeteer 的新手,不太确定我在这里做错了什么,但在 DevTools 中,我得到了正确的输出。但是,我希望创建一个包含这些值的文件并不断获取 undefined
.
我认为它与节点列表有关并且无法 return 它们,但我不知道如何修复它。
这在 DevTools 中有效:
let arr2 = Array.from(document.querySelectorAll(
"#data > div.data-wrapper > div > div > table > tbody tr"))
.map(row => (
{site:row.querySelector('td:nth- child(2)').innerText,
pass:row.querySelector('td:nth- child(10)').innerText,
user:row.querySelector('td:nth-child(9)').innerText
}))
//with a console.log()
我也试过 row.evaluate(()=>)
但对我不起作用。
这是我的代码不起作用:
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.authenticate({ username: "username", password: "password" });
await page.goto("https://website/.../all");
await page.waitFor(120000); // beacuse It loads everything slowly and times out the default 30000
console.log("started evalating");
var data = await page.evaluate(() => {
Array.from(
document.querySelectorAll(
"#data > div.data-wrapper > div > div > table > tbody tr"
)
).map(row => {
return {
site: row.querySelector("td:nth-child(2)").innerText,
pass: row.querySelector("td:nth-child(10)").innerText,
user: row.querySelector("td:nth-child(9)").innerText
};
});
});
console.log(data);
})();
//I want an array of objects but the result throws errors or comes back with [undefined,......]
传给page.evaluate()
is missing a return
statement, and therefore does not return a value. As a result, the variable data
is undefined
的页面功能。
您还应注意两个额外的细节:
Array.from()
has a built-inmap
函数。Array.from(arrayLike, mapFn) // good Array.from(arrayLike).map(mapFn) // bad
您应该尽可能使用
let
orconst
instead ofvar
。let data = ... // good var data = ... // bad
这是您的代码的修订版,应该可以正常工作:
'use strict';
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.authenticate({
username: 'username',
password: 'password',
});
await page.goto('https://website/.../all');
await page.waitFor(120000);
console.log('started evalating');
let data = await page.evaluate(() => {
return Array.from(
document.querySelectorAll('#data > div.data-wrapper > div > div > table > tbody tr'),
row => ({
site: row.querySelector('td:nth-child(2)').innerText,
pass: row.querySelector('td:nth-child(10)').innerText,
user: row.querySelector('td:nth-child(9)').innerText,
})
);
});
console.log(data);
})();