在用户触发事件后在 puppeteer 中解析 page.evaluate()
Resolve page.evaluate() in puppeteer after user triggered event
我 运行 page.evaluate()
必须 return 我在页面上的输入字段中手动输入的内容。我写了一段我知道行不通的代码,但它显示了它背后的意图:
let inputText = await page.evaluate(() => {
// some non-automated process done by hand
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
return text;
}, false);
// wait for text?
});
console.log(inputText);
如何让 puppeteer 在 page.evaluate()
中等待我的事件触发,然后 return 将我输入的文本返回到 nodejs 上下文?
你不能让 evaluate
等待那个,但你可以使用 exposeFunction 注册一个回调函数。
await page.exposeFunction('processInput', inputText => console.log(inputText));
await page.evaluate(() => {
// some non-automated process done by hand
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
processInput(text);
}, false);
});
正如 miyagisan 评论的那样,这是一个好主意,也可以 return 一个承诺:
const inputText = await page.evaluate(() => {
return new Promise((resolve, reject) => {
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
resolve(text);
}, false);
});
});
我 运行 page.evaluate()
必须 return 我在页面上的输入字段中手动输入的内容。我写了一段我知道行不通的代码,但它显示了它背后的意图:
let inputText = await page.evaluate(() => {
// some non-automated process done by hand
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
return text;
}, false);
// wait for text?
});
console.log(inputText);
如何让 puppeteer 在 page.evaluate()
中等待我的事件触发,然后 return 将我输入的文本返回到 nodejs 上下文?
你不能让 evaluate
等待那个,但你可以使用 exposeFunction 注册一个回调函数。
await page.exposeFunction('processInput', inputText => console.log(inputText));
await page.evaluate(() => {
// some non-automated process done by hand
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
processInput(text);
}, false);
});
正如 miyagisan 评论的那样,这是一个好主意,也可以 return 一个承诺:
const inputText = await page.evaluate(() => {
return new Promise((resolve, reject) => {
let sendButton = document.querySelector(".button");
sendButton.addEventListener("click", () => {
let text = document.querySelector(".input").value;
resolve(text);
}, false);
});
});