Puppeteer `waitForNavigation` 总是 return 超时
Puppeteer `waitForNavigation` always return timeout
之前可能有人问过这个问题,但 Whosebug 中的所有现有解决方案都无法帮助我。我有以下片段:
const puppeteer = require('puppeteer');
const loginFn = async () => {
const browser = await puppeteer.launch();
const deviceWidth = 1920;
const deviceHeight = 1080;
const page = await browser.newPage();
await page.setCacheEnabled(false);
await page.setViewport({ width: deviceWidth, height: deviceHeight });
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
);
await page.goto('https://testwebsite.com/');
await page.click('.qrNYy');
await page.waitForSelector('input[type="email"]');
await page.waitForSelector('input[type="password"]');
await page.type('input[type="email"]', 'test@gmail.com');
await page.type('input[type="password"]', 'test123');
await Promise.all([
page.click('.ffwHVz'),
page.waitForNavigation({
waitUntil: 'networkidle0',
}),
]);
await page.screenshot({ path: 'example.png' });
await browser.close();
}
(async () => {
await loginFn();
})();
我总是得到 TimeoutError: Navigation timeout of 30000 ms exceeded
错误,我尝试了 waitUntil
的所有选项,包括 networkidle0
、networkidle2
、load
和 domcontentloaded
无济于事(这些来自谷歌搜索和计算器)。我还按照上述许多解决方案的建议在 click
和 waitForNavigation
上使用了 Promise.all
,但我似乎无法绕过这个问题。
是网站本身的问题吗?这是根据网站本身的具体情况还是我的代码?注意:testwebsite.com 只是一个示例,但这正是我正在测试的网站上发生的事情,无论我多么努力,我似乎都无法通过。有人可以帮我吗?
waitForNavigation 的 Puppeteer 文档指出:
This resolves when the page navigates to a new URL or reloads
作为 SPA,Coinmarketcap 在登录或注册时不会重新加载页面或导航到另一个页面,因此 waitForNavigation
在这里不起作用。
相反,我建议您等待一个仅在用户登录时出现的元素。这可能会起作用(未经测试):
await Promise.all([
page.click('.ffwHVz'),
page.waitForSelector('.icon-User-Filled'),
]);
之前可能有人问过这个问题,但 Whosebug 中的所有现有解决方案都无法帮助我。我有以下片段:
const puppeteer = require('puppeteer');
const loginFn = async () => {
const browser = await puppeteer.launch();
const deviceWidth = 1920;
const deviceHeight = 1080;
const page = await browser.newPage();
await page.setCacheEnabled(false);
await page.setViewport({ width: deviceWidth, height: deviceHeight });
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
);
await page.goto('https://testwebsite.com/');
await page.click('.qrNYy');
await page.waitForSelector('input[type="email"]');
await page.waitForSelector('input[type="password"]');
await page.type('input[type="email"]', 'test@gmail.com');
await page.type('input[type="password"]', 'test123');
await Promise.all([
page.click('.ffwHVz'),
page.waitForNavigation({
waitUntil: 'networkidle0',
}),
]);
await page.screenshot({ path: 'example.png' });
await browser.close();
}
(async () => {
await loginFn();
})();
我总是得到 TimeoutError: Navigation timeout of 30000 ms exceeded
错误,我尝试了 waitUntil
的所有选项,包括 networkidle0
、networkidle2
、load
和 domcontentloaded
无济于事(这些来自谷歌搜索和计算器)。我还按照上述许多解决方案的建议在 click
和 waitForNavigation
上使用了 Promise.all
,但我似乎无法绕过这个问题。
是网站本身的问题吗?这是根据网站本身的具体情况还是我的代码?注意:testwebsite.com 只是一个示例,但这正是我正在测试的网站上发生的事情,无论我多么努力,我似乎都无法通过。有人可以帮我吗?
waitForNavigation 的 Puppeteer 文档指出:
This resolves when the page navigates to a new URL or reloads
作为 SPA,Coinmarketcap 在登录或注册时不会重新加载页面或导航到另一个页面,因此 waitForNavigation
在这里不起作用。
相反,我建议您等待一个仅在用户登录时出现的元素。这可能会起作用(未经测试):
await Promise.all([
page.click('.ffwHVz'),
page.waitForSelector('.icon-User-Filled'),
]);