Cómo hacer clic en un botón en un sitio web utilizando titiritero sin ninguna clase, identificación, ... asignado a él?

votos
1

Por eso quiero hacer clic en un botón en un sitio web. El botón tiene ningún id, clase, ... Así que debe encontrar una manera de hacer clic en el botón con el nombre que está en ella. En este ejemplo debería hacer clic con el nombre Supreme® / El bolso de cuero de The North Face

Este es mi código en Node.js

const puppeteer = require('puppeteer');

let scrape = async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://www.supremenewyork.com/shop/all/bags');
await page.click(...);
browser.close();
return result;
};

Este es el elemento que quiero hacer clic en:

<a class=name-link href=/shop/bags/a9cz4te2r/rsth86fbl>Supreme®/The 
North Face® Leather Shoulder Bag</a>
Publicado el 20/10/2018 a las 10:43
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
3

Aquí es una forma de recoger los datos. Pruebe estos navegadores en la consola por primera vez.

[...document.querySelectorAll('a.name-link')]
.filter(element => 
  element.innerText.includes('Supreme®/The North Face® Leather Shoulder Bag')
)

¿Que está pasando aqui?

  • document.querySelectorAll Busca todos los elementos con que el selector.
  • .filter devolverá el resultado de que coincide con la consulta.
  • .includes devolverá datos que incluye una cadena dada.

Si a.name-linkno funciona, a continuación, busque a, si eso no funciona, entonces encontrar el elemento padre y usar eso.

Una vez que tienes el elemento en su navegador, puede solicitar que en su código, haga clic en él, etc.

Uso:

Se puede utilizar page.evaluatepara filtrar y haga clic.

const query = "Supreme®/The North Face® Leather Shoulder Bag";

page.evaluate(query => {
  const elements = [...document.querySelectorAll('a.name-link')];

  // Either use .find or .filter, comment one of these
  // find element with find
  const targetElement = elements.find(e => e.innerText.includes(query));

  // OR, find element with filter
  // const targetElement = elements.filter(e => e.innerText.includes(query))[0];

  // make sure the element exists, and only then click it
  targetElement && targetElement.click();
}, query)
Respondida el 20/10/2018 a las 14:08
fuente por usuario

votos
0

La siguiente función haga clic en el primer elemento que coincide con cierto texto:

const clickText = text => {
    return page.evaluate(text => [...document.querySelectorAll('*')].find(e => e.textContent.trim() === text).click(), text);
};

Puede utilizar la función en el script titiritero utilizando el siguiente método:

await clickText('Supreme®/The North Face® Leather Shoulder Bag');
Respondida el 21/10/2018 a las 00:08
fuente por usuario

votos
0

Si te tengo derecho, el siguiente fragmento de código debe permitir que se hace clic en ese enlace:

const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('https://www.supremenewyork.com/shop/all/bags');
await page.click("a[href$='a05ivugj2']");
await browser.close();
})();
Respondida el 20/10/2018 a las 11:48
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more