为什么 Puppeteer page.click 不等待(也许是 Browserless?)
Why isn't Puppeteer page.click waiting (maybe Browserless?)
目标:
我有一个页面,我需要在第一次单击页面上的某些内容后从中获取 html。
问题:
返回的 html 不等待该元素单击。
这是我尝试过的一种方法。
await page.setViewport({width: 1400, height: 800});
await page.waitForSelector('.specs .accent', {visible: true, timeout: 80000});
const html = await page.evaluate(() => {
const moreButton = document.querySelector('.specs .accent');
moreButton.click();
return document.body.innerHTML;
});
console.log(html);
这是我尝试过的另一种方法:
await page.setViewport({width: 1400, height: 800});
await page.waitForSelector('.specs .accent', {timeout: 80000});
await page.click('.specs .accent');
const html = await page.evaluate(() => document.body.innerHTML);
console.log(html);
返回的 html 是点击发生之前的 html。让我相信点击坏了,但没有出错。
备注:
- 我在 page.click 之后截图了。元素在那里,但没有被点击。
- 我找不到
page.click
的错误,但我可能调试错了。
- 我最近实现了 Browserless。上面的代码曾经可以工作,但是从那时到我实现 Browserless (https://www.browserless.io/docs/docker-quickstart) 之间的某个时间,它停止工作了。也许他们的 page.click 或 Puppeteer 版本有问题?
- 还有一个代理。所以流程是 app -> browserless (puppeteer) -> proxy -> page.
- 我要点击的东西是
<a href="javascript:void(0)" class="accent">More</a>
点击后,它会用预加载的数据填充一些。
最后:
我真的不确定如何进一步调试它。有什么线索吗?
参考页面:https://www.article.com/product/16190/mod-blue-berry-armchair
在使用您通过电子邮件发送给我的无浏览器支持的 URL 进行测试后,我能够通过实时调试器看到默认视口是“移动”,因此页面结构已更改...导航栏的汉堡包按钮和您尝试单击的按钮所在的规格部分已折叠。
我在导航到页面之前添加了这一行:
await page.setViewport({
width: 1920,
height: 1080
})
这使视口在水平方向上变大了,之后,我转到控制台并 运行 一个 document.querySelector('.specs .accent').click()
然后我可以单击并根据需要展开信息。
解决方案是某些 javascript 请求被阻止可能会中断 Puppeteer 单击元素的能力。如果您遇到问题,请确保没有请求被 Browerless、Puppeteer 或您的代理阻止,然后再次尝试 page.click。
一个简单的调试解决方案是使用 page.screenshot 查看是否确实点击了某些内容。
目标: 我有一个页面,我需要在第一次单击页面上的某些内容后从中获取 html。
问题: 返回的 html 不等待该元素单击。
这是我尝试过的一种方法。
await page.setViewport({width: 1400, height: 800});
await page.waitForSelector('.specs .accent', {visible: true, timeout: 80000});
const html = await page.evaluate(() => {
const moreButton = document.querySelector('.specs .accent');
moreButton.click();
return document.body.innerHTML;
});
console.log(html);
这是我尝试过的另一种方法:
await page.setViewport({width: 1400, height: 800});
await page.waitForSelector('.specs .accent', {timeout: 80000});
await page.click('.specs .accent');
const html = await page.evaluate(() => document.body.innerHTML);
console.log(html);
返回的 html 是点击发生之前的 html。让我相信点击坏了,但没有出错。
备注:
- 我在 page.click 之后截图了。元素在那里,但没有被点击。
- 我找不到
page.click
的错误,但我可能调试错了。 - 我最近实现了 Browserless。上面的代码曾经可以工作,但是从那时到我实现 Browserless (https://www.browserless.io/docs/docker-quickstart) 之间的某个时间,它停止工作了。也许他们的 page.click 或 Puppeteer 版本有问题?
- 还有一个代理。所以流程是 app -> browserless (puppeteer) -> proxy -> page.
- 我要点击的东西是
<a href="javascript:void(0)" class="accent">More</a>
点击后,它会用预加载的数据填充一些。
最后: 我真的不确定如何进一步调试它。有什么线索吗?
参考页面:https://www.article.com/product/16190/mod-blue-berry-armchair
在使用您通过电子邮件发送给我的无浏览器支持的 URL 进行测试后,我能够通过实时调试器看到默认视口是“移动”,因此页面结构已更改...导航栏的汉堡包按钮和您尝试单击的按钮所在的规格部分已折叠。
我在导航到页面之前添加了这一行:
await page.setViewport({
width: 1920,
height: 1080
})
这使视口在水平方向上变大了,之后,我转到控制台并 运行 一个 document.querySelector('.specs .accent').click()
然后我可以单击并根据需要展开信息。
解决方案是某些 javascript 请求被阻止可能会中断 Puppeteer 单击元素的能力。如果您遇到问题,请确保没有请求被 Browerless、Puppeteer 或您的代理阻止,然后再次尝试 page.click。
一个简单的调试解决方案是使用 page.screenshot 查看是否确实点击了某些内容。