提问人:Saloni Saraiya 提问时间:10/20/2023 最后编辑:Saloni Saraiya 更新时间:11/2/2023 访问量:79
不寻常的傀儡师行为
Unusual Puppeteer behavior
问:
我正在使用 Puppeteer 无头打开网络浏览器以在 JS 中操作一个网站。网站在处理前需要登录。因此,它会打开一个弹出窗口并在登录时将其关闭。我正在尝试通过 Puppeteer 在弹出窗口中填写电子邮件和密码以登录。有时它运行良好,有时它无法填充电子邮件。
我尝试了各种选择。此外,它在脚本中完美运行。但是当我通过 API 访问脚本时,问题就来了。
可能的原因是什么?
const express = require('express');
const dotenv = require('dotenv');
const cors = require('cors');
dotenv.config({ path: '.env' });
global.__appRootDir = __dirname;
app.use(cors());
app.use(express.json({ limit: '50mb' }));
const PORT = process.env.PORT ?? '3059'
const HOST = process.env.HOST ?? 'localhost';
app.get('/', (req, res) => {
res.send('server is responding')
})
app.post('/conversion', conversion)
const conversion = async (req, res) => {
try {
const browser = await puppeteer.launch({
headless: true
});
const page = await browser.newPage();
await page.goto(process.env.SITE_URL, { waitUntil: 'domcontentloaded' });
await page.waitForSelector('button[id="login"]');
await page.click('button[id="login"]');
console.log("Popup Opened");
const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page())));
const popup = await newPagePromise;
console.log("Find Inputs");
const usernameInput = await popup.waitForSelector('input[id="username"]', { timeout: 30000 });
await usernameInput.type(process.env.USERNAME)
await popup.keyboard.press('Enter')
const passwordInput = await popup.waitForSelector('input[id="password"]', { timeout: 30000 });
await passwordInput.type(process.env.PASSWORD)
console.log("Form Filled");
await popup.keyboard.press('Enter')
// Create a promise that resolves when the popup page is closed
const popupClosedPromise = new Promise((resolve) => {
popup.once('close', () => {
resolve()
})
})
// Wait for the popup page to close
await popupClosedPromise
console.log("popup closed");
console.log('login done')
// next process - works perfectly.
} catch (error) {
console.error(error)
return res.status(500).json({ message: error.message })
}
}
// listen for requests
app.listen(PORT, HOST, () => {
console.log(`Server is listening on port ${HOST}:${PORT}`);
});
站点 URL 为:https://magicul.io/
任何用户名和密码都可用于测试。这里的问题是,用户名和密码没有填写在字段中。您可以使用任何文本进行测试。
有时,它运行良好,有时,它在打印“查找输入”后停止。
答:
0赞
Lucas
10/20/2023
#1
您是否设置了等待此组件的时间限制?尝试设置超时。可以使用 waitForSelector 和 waitForTimeout。 可能是它没有出现,也可能是有一些东西阻止了它被填充,你必须等待一定的时间才能尝试在它上运行一些东西。
评论
popupClosedPromise
await popup.keyboard.press('Enter')
setDefaultTimeout(0)