我是Puppeteer和JavaScript的新手。我正在尝试自动化一些简单的任务,只是这些元素出现在iframe中-但我已经解决了这一问题。我不清楚的是取消注释await browser.close()
时抛出的异常。
我的代码:
const baseUrl = "https://test-environment.com/ABH2829.html?token=dhdj7s8383937hndkeie8j3jebd";
const puppeteer = require('puppeteer');
const expect = require('chai').expect;
const clickClothingButton = async () => {
try {
const browser = await puppeteer.launch({
headless: false,
slowMo: 250,
});
const page = await browser.newPage();
await page.setViewport({width: 1280, height: 800});
process.on('unhandledRejection', (reason, p) => {
console.error('Unhandled Rejected at: Promise', p, 'reason:', reason);
browser.close();
});
await page.goto(baseUrl, {waitUntil: 'networkidle2'});
const navigationPromise = page.waitForNavigation({timeout: 3000});
await page.waitForSelector('.widget-title');
const frame = page.frames().find(frame => frame.name() === 'iframe');
const clothingButton = await frame.$('#clothing-button');
clothingButton.click();
await navigationPromise;
await browser.close();
} catch (error) {
console.log(error);
throw new Error(error);
}
};
clickClothingButton();
现在运行正常,但我总是得到以下信息:
Unhandled Rejected at: Promise Promise {
<rejected> Error: TimeoutError: Navigation Timeout Exceeded: 3000ms exceeded
如果我试着做到:
await browser.close();
然后将其倒入:
Unhandled Rejected at: Promise Promise {
<rejected> { Error: Protocol error (Runtime.callFunctionOn): Target closed.
妥善处理此问题的最佳方法是什么,为什么我不能仅关闭浏览器?请记住,我仍在学习Promises和必须为他们履行的合同。
答案 0 :(得分:0)
首先,您要访问的网站需要验证。
您可以使用page.authenticate()
来提供HTTP身份验证的凭据:
await page.authenticate({
username: 'username',
password: 'password',
});
此外,您为page.waitForNavigation()
设置的timeout
仅为3000
毫秒(3秒),而默认值为30000
毫秒(30秒),因此花费的时间比设置的页面加载时间长,您将收到TimeoutError
。
我强烈建议您至少允许默认的最大导航时间30秒才能进行导航。您可以在timeout
中使用page.waitForNavigation()
选项,也可以使用page.setDefaultNavigationTimeout()
。
最后,elementHandle.click()
返回一个Promise
,因此您需要await
clothingButton.click()
:
await clothingButton.click();