J'essaie de faire un peu de grattage Web avec Puppeteer, mais le script semble incapable de trouver le sélecteur que je cherche. Fondamentalement ce code:
const puppeteer = require('puppeteer');
let scrape = async () => {
const year = 18;
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://cobbcounty.org/index.php?option=com_wrapper&view=wrapper&Itemid=2008');
await page.waitFor(5000);
var id = '';
for(i=0;i<10000;i++){
id = i;
await page.click('#txtCase');
await page.keyboard.type(year + '-P-' + id);
await page.select('#lstDoc','Estate');
}
}
scrape().then((value) => {
console.log('script ended');
});
Me donne cette erreur:
(node:31125) UnhandledPromiseRejectionWarning: AssertionError
[ERR_ASSERTION]: No node found for selector: #txtCase
Autant que je sache, #txtCase est un sélecteur réel sur la page, donc je ne sais pas pourquoi le marionnettiste ne peut pas le trouver. Si quelqu'un pouvait m'expliquer ce que je faisais mal, ce serait vraiment utile.
Autant que je sache, #txtCase est un sélecteur réel sur la page, donc je ne sais pas pourquoi le marionnettiste ne peut pas le trouver.
Essayez de charger la page et d’utiliser la console pour trouver cet élément.
document.querySelector('#txtCase')
null
Ce n'est pas là. Je sais que vous pouvez le voir lorsque vous effectuez un clic droit pour inspecter ce champ de texte, mais celui-ci est imbriqué dans un iframe. Vous devez accéder à ce cadre, trouver le bouton, puis cliquer dessus.
const frame = await page.frames().find(f => f.name() === 'iframe');
const button = await frame.$('#txtCase');
button.click();
Ce bouton est imbriqué à l'intérieur d'un iframe (auquel la page elle-même ne peut accéder ni exécuter de fonctions telles que click
on). Vous devez cibler l'URL d'iFrame dans le goto de votre page, comme indiqué ici .