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

Selenium con python


Selenium es un entorno de pruebas de software para aplicaciones basadas en la web, este nos permite automatizar tareas a través de un navegador, en este caso simularemos un login en un web y un click sobre un botón de dicha web. Todo este proceso lo automatizaremos mediante un script en python que comprobará que hora es y actuará en consecuencia, este script lo dejaremos en forma de servicio para que corra idefinidamente.

 

Primero nos bajamos la versión de Selenium correspondiente a nuestro SO:

https://github.com/mozilla/geckodriver/releases

Movemos el binario a un lugar accesible:

mv geckodriver /usr/local/bin/

Instalamos las librerias de python para trabajar con Selenium:

pip install selenium --user

El siguiente script hará login en la web y presionará el botón los días y a las horas indicadas:

vi .scripts/login.py

#!/usr/bin/python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.firefox.options import Options
import time
import random
import schedule
import sys
from datetime import datetime

def job(executeNow):
    f = open("/tmp/login.log","a")
    now = datetime.now()
    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

    options = Options()
    if executeNow == '1':
        f.write("Executing job NOW: %s\r\n" % (dt_string))
    else:
        options.headless = True
        # More human behaviour trick:
        randomValue = random.randint(0,120)
        time.sleep(randomValue)
        f.write("Executing job: %s\r\n" % (dt_string))

    f.close()

    usernameStr = 'XXXXXXXXXXX'
    passwordStr = 'YYYYYYYYYYY'

    cap = DesiredCapabilities().FIREFOX
    browser = webdriver.Firefox(options=options, capabilities=cap, executable_path="/usr/local/bin/geckodriver")
    browser.get('https://URL/')

    username = browser.find_element_by_id('mat-input-0')
    username.send_keys(usernameStr)
    password = browser.find_element_by_id('mat-input-1')
    password.send_keys(passwordStr)
    signInButton = browser.find_element_by_name('loginButton')
    signInButton.click()

    time.sleep(8)
    fingerPrint = browser.find_element_by_xpath("/html/body/app-root/div/app-layout/section/div/div/div/section/app-dashboard-tasks/div/div/app-signup/div/div/div/div[2]/div/button")
    fingerPrint.click()

    time.sleep( 10 )
    browser.quit()



if len(sys.argv) > 1:
    job('1')
    exit()
else:
    #schedule.every(10).seconds.do(job)
    #schedule.every().hour.do(job)
    #schedule.every().day.at("10:30").do(job)
    #schedule.every(5).to(10).minutes.do(job)
    #schedule.every().monday.do(job)
    #schedule.every().wednesday.at("13:15").do(job)
    #schedule.every().minute.at(":17").do(job)

    schedule.every().friday.at("12:41").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)​​​​​​​

NOTA: Casi todos los elementos de una web pueden ser obtenidos mediante las funcione find_element_by_ de selenium pero hay ocasiones en las que esto no es posible, en estos casos nos vemos forzados a utilizar xpaths, para obtener un xpath tendremos que darle al botón derecho sobre el elemento -> Inspeccionar, Copy -> Copy Xpath

Creamos el servicio:

vi /etc/local.d/login.start
su kr0m -c "nohup python /home/kr0m/.scripts/login.py &"

Le damos los permisos necesarios:

chmod 700 /etc/local.d/login.start

Arrancamos el servicio:

/etc/local.d/login.start

Comprobamos que esté en marcha:

ps aux|grep login.py
kr0m     22650  0.0  0.1  88192 18396 ?        S    jun17   0:08 /usr/lib/python-exec/python2.7/python /home/kr0m/.scripts/login.py

Autor: Kr0m -- 19/06/2019 08:31:35