我在点击输入标签按钮后尝试抓取一些html。我点击了带有page.evaluate()的按钮,因为page.click()似乎不适用于输入标签按钮。我尝试使用headless进行可视化调试:在puppeteer启动选项中使用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();
});