Esta web utiliza cookies, puedes ver nuestra política de cookies aquí. Si continuas navegando estás aceptándola

NodeJS/Puppeteer


La automatización de acciones en interfaces web es un campo muy interesante, en un artículo anterior ya explicamos como hacerlo mediante Python/Selenium, en esta ocasión utilizaremos NodeJS/Puppeteer. El ejemplo hará login en un formulario web y acto seguido clickará sobre un botón determinado.
 

Podemos encontrar el proyecto en Github: https://github.com/puppeteer/puppeteer

Para instalarlo tan solo necesitamos nodejs:

emerge -av net-libs/nodejs

Instalamos puppeteer mediante npm:

npm i puppeteer

En mi caso utilizo esta extensión de Chrome para crear el script básico y a partir de este ir adaptándolo a mis necesidades:

https://chrome.google.com/webstore/detail/puppeteer-recorder/djeegiggegleadkkbgopoonhjimgehda

El script final quedaría del siguiente modo:

vi login.js 
const puppeteer = require('puppeteer');
function delay(time) {
   return new Promise(function(resolve) {
       setTimeout(resolve, time)
   });
}

(async () => {
  //const browser = await puppeteer.launch({headless: false, slowMo: 50})
  const browser = await puppeteer.launch({headless: true, slowMo: 50})
  const page = await browser.newPage()
  
  const navigationPromise = page.waitForNavigation()
  await page.goto('URL')
  
  await page.setViewport({ width: 1919, height: 993 })
  
  await navigationPromise

  await page.waitForSelector('.card-content > .mat-form-auth > .w-100:nth-child(1) > .mat-form-field-wrapper > .mat-form-field-flex')
  await page.click('.card-content > .mat-form-auth > .w-100:nth-child(1) > .mat-form-field-wrapper > .mat-form-field-flex')
  
  await page.type('.w-100 #mat-input-0', 'EMAIL')

  await page.waitForSelector('.w-100 #mat-input-1')
  await page.click('.w-100 #mat-input-1')
  await page.type('.w-100 #mat-input-1', 'PASSWORD')

  await page.waitForSelector('.card > .card-content > .mat-form-auth > .float-right > .mat-button-wrapper')
  await page.click('.card > .card-content > .mat-form-auth > .float-right > .mat-button-wrapper')

  await delay(4000);

  await page.waitForSelector('.card-body > .ml-2 > .mat-fab > .mat-button-wrapper > .mat-icon')
  await page.click('.card-body > .ml-2 > .mat-fab > .mat-button-wrapper > .mat-icon')
   
  await browser.close()
})()

NOTA: Se ha intriducido un slowmotion slowMo: 50 para que el comportamiento parezca mas humano y un delay await delay(4000) para que la web cargue por completo antes de realizar el click.

Para probarlo tan solo hay que ejecutarlo del siguiente modo:

node login.js

Autor: Kr0m -- 11/12/2019 20:33:19