Ejecutar Selenium Webdriver en Termux

Selenium Webdriver Termux


Introducción

Termux es un entorno Linux para Android con el que, entre otras cosas, puedes ejecutar Python en dispositivos móviles. Para instalar Python simplemente ejecuta:

$ pkg install python

En Termux puedes hacer muchas cosas, pero algo que me costó mucho fue ejecutar selenium-webdriver en Termux. No hay problema en instalar selenium, simplemente hazlo mediante pip:

$ pip install selenium

El problema es que no hay manera de instalar Chomium o Firefox directamente: no hay un navegador web sobre el que automatizar tareas. La única solución es instalar Ubuntu en Termux.


Ubuntu en Termux

Instalación

Gracias al gestor de paquetes pkg y a proot es posible instalar Ubuntu en Termux simplemente ejecutando dos comandos:

$ pkg install proot-distro
$ proot-distro install ubuntu

Iniciar sesión

Para iniciar sesión (entrar en Ubuntu desde Termux) ejecuta lo siguiente:

$ proot-distro login ubuntu

Fíjate en que el prompt del terminal ha cambiado de $ a root@localhost:~#: has iniciado sesión como usuario root en ubuntu, pero recuerda que este ubuntu se está ejecutando bajo proot, de modo que solamente puedes realizar acciones propias de root en el espacio limitado por proot (no eres root en Android y dentro de proot no puedes modificar el sistema).

Actualizar APT

No confundas el gestor de paquetes apt de Termux con el de Ubuntu. No son los mismos y tienen acceso a repositorios distintos.

Dentro de la sesión ubuntu ejecuta:

root@localhost:~# apt update
root@localhost:~# apt upgrade

A continuación instalaremos Firefox y geckodriver.


Firefox y Geckodriver

Dentro de la sesión ubuntu ejecuta los siguientes comandos para instalar Firefox y su webdriver:

root@localhost:~# apt install firefox
root@localhost:~# apt install firefox-geckodriver

Si intentas ejecutar Firefox mediante:

root@localhost:~# firefox

Se producirá un error, ya que no has instalado un gestor de ventanas en ubuntu. En otras palabras, Firefox no puede mostrar su interfaz gráfica. No obstante, para utilizar selenium no necesitamos instalar un gestor de ventanas, ya que podemos desplegar el navegador en modo headless.


Ejemplo (test.py)

Quizás te sorprenda que no es necesario que instales python en ubuntu si ya lo instalaste en Termux. Todos los programas que instales en la sesión ubuntu solamente son accesibles desde ubuntu, pero proot-distro install ubuntu configuró algunas cosas por nosotros para que podamos acceder a los "programas globales" para no tener que reinstalarlos.

Como ya habíamos instalado python y selenium en Termux y en la sesión ubuntu hemos instalado Firefox y Geckodriver prueba a crear un script como el siguiente (por ejemplo con el editor nano):

# test.py

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('--headless') # EN SEGUNDO PLANO, SIN GUI

driver = webdriver.Firefox(executable_path='/usr/bin/geckodriver', options=options)

driver.get('https://google.es')
html = driver.page_source
print(html)

driver.quit()

Mediante options.add_argument('--headless') conseguimos que el navegador se ejecute en segundo plano y no se produzca error por no disponer el subsistema de un gestor de ventanas.

Puedes ejecutar el programa con cpython así:

root@localhost:~# python3 test.py

Comprobarás que funciona perfectamente


Usar pypy3 (opcional)

Si lo deseas puedes ejecutar selenium con pypy3 en lugar de cpython. pypy3 no está disponible para Termux pero si para Ubuntu. En el subsistema ubuntu ejecuta:

root@localhost:~# apt update
root@localhost:~# apt install pypy3
root@localhost:~# wget https://bootstrap.pypa.io/get-pip.py
root@localhost:~# pypy3 get-pip.py
root@localhost:~# rm get-pip.py
root@localhost:~# pypy3 -m pip install selenium

Ahora puedes ejecutar el ejemplo (test.py) que vimos anteriormente así:

root@localhost:~# pypy3 test.py

NOTAS SOBRE PROOT

En Termux puedes ejecutar otras distribuciones Linux gracias a proot, que es un programa similar a chroot pero que a diferencia de este no requiere que seas root a expensas de una penalización en el rendimiento. En el espacio de un usuario-no-root y con proot se puede ejecutar un proceso para el que el directorio raíz sea cualquier subdirectorio en el espacio de usuario. Esto significa que este proceso y sus subprocesos tienen su acceso limitado a este directorio, ya que lo consideran el directorio raíz. En este directorio puedes instalar una distribución linux distinta a la original que compartirá el kernel de la original, que en este caso es el kernel de Android.