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
Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Autor: kr0m -- 19/06/2019 08:31:35