javascript - Puppeteer:从点击输入标签按钮后不刷新的页面抓取html
问题描述
单击输入标记按钮后,我试图获取一些 html。我正在单击带有 page.evaluate() 的按钮,因为 page.click() 似乎不适用于输入标签按钮。我已经尝试在 puppeteer 启动选项中使用 headless:false 进行可视化调试,以验证浏览器在单击按钮后确实导航到该点。我不确定为什么 page.content() 在单击按钮之前返回 html 而不是在事件发生后返回 html。
const puppeteer = require('puppeteer');
const url = 'http://www.yvr.ca/en/passengers/flights/departing-flights';
const fs = require('fs');
const tomorrowSelector = '#flights-toggle-tomorrow'
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto(url);
await page.evaluate((selector)=>document.querySelector(selector).click(),tomorrowSelector);
let html = await page.content();
await fs.writeFile('index.html', html, function(err){
if (err) console.log(err);
console.log("Successfully Written to File.");
});
await browser.close();
});
解决方案
您可以单击收音机的标签。此外,您需要等待一些状态变化的迹象(对于 XHR/fetch 响应或新选择器)。例如,此代码适用于我,但您可以使用任何其他条件或等待几秒钟。
const fs = require('fs');
const puppeteer = require('puppeteer');
const url = 'http://www.yvr.ca/en/passengers/flights/departing-flights';
const tomorrowLabelSelector = 'label[for=flights-toggle-tomorrow]';
const tomorrowLabelSelectorChecked = '.yvr-form__toggle:checked + label[for=flights-toggle-tomorrow]';
puppeteer.launch({ headless: false }).then(async (browser) => {
const page = await browser.newPage();
await page.goto(url);
await Promise.all([
page.click(tomorrowLabelSelector),
page.waitForSelector(tomorrowLabelSelectorChecked),
]);
const html = await page.content();
await fs.writeFile('index.html', html, (err) => {
if (err) console.log(err);
console.log('Successfully Written to File.');
});
// await browser.close();
});
推荐阅读
- php - 如何使用 PHP 连接到 MongoDB
- flutter - Flutter ListView.builder 分页(先加载最后添加的数据)
- android - Xamarin 项目未显示在 Visual Studio Android 模拟器上
- linux - Linux VM 实例作为两个不同子网之间的网关
- javascript - 指针事件:在以前的指针事件之后都没有启用元素可点击性:无
- task - 在 Monix 中处理来自任务的错误
- perl - 在 perl 中,我如何模拟 unix fmt?
- php - 从控制器 Codeigniter 调用模型时未定义捕获的异常 ctype_digit()
- ios - 如何获取 .xcodeworkspace 用于应用程序的所有框架的列表?
- android - 视图寻呼机内的 Recyclerview 正在一次加载所有项目