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:
Instalamos las librerias de python para trabajar con Selenium:
El siguiente script hará login en la web y presionará el botón los dÃas y a las horas indicadas:
#!/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:
su kr0m -c "nohup python /home/kr0m/.scripts/login.py &"
Le damos los permisos necesarios:
Arrancamos el servicio:
Comprobamos que esté en marcha:
kr0m 22650 0.0 0.1 88192 18396 ? S jun17 0:08 /usr/lib/python-exec/python2.7/python /home/kr0m/.scripts/login.py