Estoy intentando hacer clic en un botón usando un código sin una identificación o clase, pero mi terminal siempre responde con:
document.getElementsByTagName("Accept Cookies"); ^ ReferenceError: document is not definedEste es mi código:
const puppeteer = require('puppeteer'); const product_url = "https://www.nike.com/launch" async function givePage() { const browser = await puppeteer.launch({headless: false}); const page = await browser.newPage(); return page; } async function acceptCookies(page) { await page.goto(product_url); const btn = await page.waitForSelector('#cookie-settings-layout > div > div > div > div:nth-child(3) > div.ncss-col-md-6.ncss-col-sm-12.mb5-sm > button') await btn.click() } async function notifyMe(page) { await page.goto(product_url); document.querySelector("button[type=\"submit\"]").click("Notify Me"); } async function checkout() { var page = await givePage(); await acceptCookies(page); await notifyMe(page); } checkout();¿Qué hice mal y cómo puedo solucionarlo?
Ya tienes un ejemplo en tu código sobre cómo acceder a los elementos. En lugar de document.querySelector , use page.waitForSelector como lo hizo en la línea 12.
document.querySelector('button[type="submit"]').click()debiera ser
(await page.waitForSelector('button[type="submit"]')).click()No hay una variable integrada en NodeJS llamada document , ya que no se ejecuta en el navegador.
Si desea acceder al document , en Puppeteer hay una función page.evaluate() donde puede acceder a la variable del document (así como a todo lo demás dentro del JS del lado del cliente):
// ... await page.evaluate(() => { document.querySelector("button[type=\"submit\"]").click(); });Sin embargo, tenga en cuenta que todo el JavaScript que ejecute se ejecutará en el navegador, no en NodeJS, por lo que si desea recuperar el valor, puede devolver:
const result = await page.evaluate(() => { var something = document.getElementById("something"); return something.innerText; }); console.log(result); // will print in the console "blah blah blah"Del mismo modo, si desea pasar variables a la devolución de llamada, debe dárselas a la función de evaluación:
await page.evaluate((name, age) => { // do something with 'name' and 'age' }, "John", 34);En Nodejs, no tiene acceso a las API web como una ventana, un documento, etc., por lo que no puede usar document.querySelector para seleccionar elementos aquí.
En lugar de manejar los clics en los elementos DOM en el lado del servidor, debe manejar esos clics solo en el lado del cliente y luego obtener los datos del servidor en consecuencia.