Raspado web de Python: prueba con raspadores

Este capítulo explica cómo realizar pruebas usando web scrapers en Python.

Introducción

En proyectos web grandes, las pruebas automatizadas del backend del sitio web se realizan con regularidad, pero las pruebas de frontend se omiten con frecuencia. La razón principal detrás de esto es que la programación de sitios web es como una red de varios lenguajes de programación y marcado. Podemos escribir una prueba de unidad para un idioma, pero se vuelve un desafío si la interacción se realiza en otro idioma. Es por eso que debemos tener un conjunto de pruebas para asegurarnos de que nuestro código esté funcionando según nuestras expectativas.

Probando usando Python

Cuando hablamos de pruebas, significa pruebas unitarias. Antes de profundizar en las pruebas con Python, debemos conocer las pruebas unitarias. A continuación se presentan algunas de las características de las pruebas unitarias:

  • Al menos un aspecto de la funcionalidad de un componente se probaría en cada prueba unitaria.

  • Cada prueba unitaria es independiente y también se puede ejecutar de forma independiente.

  • La prueba unitaria no interfiere con el éxito o el fracaso de ninguna otra prueba.

  • Las pruebas unitarias pueden ejecutarse en cualquier orden y deben contener al menos una afirmación.

Unittest - Módulo Python

El módulo de Python denominado Unittest para pruebas unitarias viene con toda la instalación estándar de Python. Solo necesitamos importarlo y el resto es la tarea de unittest.TestCase class que hará lo siguiente:

  • Las funciones SetUp y tearDown son proporcionadas por unittest.TestCase class. Estas funciones pueden ejecutarse antes y después de cada prueba unitaria.

  • También proporciona declaraciones de aserción para permitir que las pruebas pasen o fallen.

  • Ejecuta todas las funciones que comienzan con test_ como prueba unitaria.

Ejemplo

En este ejemplo, combinaremos el web scraping con unittest. Probaremos la página de Wikipedia para buscar la cadena 'Python'. Básicamente hará dos pruebas, primero si la página de título es la misma que la cadena de búsqueda, es decir, 'Python' o no, y la segunda prueba se asegura de que la página tenga un div de contenido.

Primero, importaremos los módulos de Python requeridos. Estamos usando BeautifulSoup para web scraping y, por supuesto, unittest para realizar pruebas.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest

Ahora necesitamos definir una clase que extenderá unittest.TestCase. Los objetos globales bs se compartirían entre todas las pruebas. Una función especificada de unittest setUpClass lo logrará. Aquí definiremos dos funciones, una para probar la página de título y otra para probar el contenido de la página.

class Test(unittest.TestCase):
   bs = None
   def setUpClass():
      url = '<a target="_blank" rel="nofollow" href="https://en.wikipedia.org/wiki/Python">https://en.wikipedia.org/wiki/Python'</a>
      Test.bs = BeautifulSoup(urlopen(url), 'html.parser')
   def test_titleText(self):
      pageTitle = Test.bs.find('h1').get_text()
      self.assertEqual('Python', pageTitle);
   def test_contentExists(self):
      content = Test.bs.find('div',{'id':'mw-content-text'})
      self.assertIsNotNone(content)
if __name__ == '__main__':
   unittest.main()

Después de ejecutar el script anterior, obtendremos el siguiente resultado:

----------------------------------------------------------------------
Ran 2 tests in 2.773s

OK
An exception has occurred, use %tb to see the full traceback.

SystemExit: False

D:\ProgramData\lib\site-packages\IPython\core\interactiveshell.py:2870:
UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

Pruebas con selenio

Analicemos cómo usar Python Selenium para realizar pruebas. También se llama prueba de selenio. Ambos Pythonunittest y Seleniumno tienen mucho en común. Sabemos que Selenium envía los comandos estándar de Python a diferentes navegadores, a pesar de la variación en el diseño de su navegador. Recuerde que ya instalamos y trabajamos con Selenium en capítulos anteriores. Aquí crearemos scripts de prueba en Selenium y los usaremos para la automatización.

Ejemplo

Con la ayuda del próximo script de Python, estamos creando un script de prueba para la automatización de la página de inicio de sesión de Facebook. Puede modificar el ejemplo para automatizar otros formularios e inicios de sesión de su elección, sin embargo, el concepto sería el mismo.

Primero, para conectarse al navegador web, importaremos el controlador web desde el módulo selenium -

from selenium import webdriver

Ahora, necesitamos importar claves del módulo de selenio.

from selenium.webdriver.common.keys import Keys

A continuación, debemos proporcionar el nombre de usuario y la contraseña para iniciar sesión en nuestra cuenta de Facebook.

user = "[email protected]"
pwd = ""

A continuación, proporcione la ruta al controlador web para Chrome.

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")

Ahora verificaremos las condiciones usando la palabra clave assert.

assert "Facebook" in driver.title

Con la ayuda de la siguiente línea de código, enviamos valores a la sección de correo electrónico. Aquí lo estamos buscando por su id, pero podemos hacerlo buscándolo por su nombre comodriver.find_element_by_name("email").

element = driver.find_element_by_id("email")
element.send_keys(user)

Con la ayuda de la siguiente línea de código, enviamos valores a la sección de contraseña. Aquí lo estamos buscando por su id, pero podemos hacerlo buscándolo por su nombre comodriver.find_element_by_name("pass").

element = driver.find_element_by_id("pass")
element.send_keys(pwd)

La siguiente línea de código se usa para presionar enter / login después de insertar los valores en el campo de correo electrónico y contraseña.

element.send_keys(Keys.RETURN)

Ahora cerraremos el navegador.

driver.close()

Después de ejecutar el script anterior, se abrirá el navegador web Chrome y podrá ver que se inserta el correo electrónico y la contraseña y se hace clic en el botón de inicio de sesión.

Comparación: unittest o Selenium

La comparación de unittest y selenium es difícil porque si desea trabajar con grandes conjuntos de pruebas, se requiere la rigidez sintáctica de unites. Por otro lado, si va a probar la flexibilidad del sitio web, la prueba de selenio sería nuestra primera opción. Pero, ¿y si pudiéramos combinar ambos? Podemos importar selenio en unittest de Python y obtener lo mejor de ambos. El selenio se puede utilizar para obtener información sobre un sitio web y unittest puede evaluar si esa información cumple con los criterios para aprobar la prueba o no.

Por ejemplo, estamos reescribiendo la secuencia de comandos de Python anterior para la automatización del inicio de sesión de Facebook combinando ambos de la siguiente manera:

import unittest
from selenium import webdriver

class InputFormsCheck(unittest.TestCase):
   def setUp(self):
      self.driver = webdriver.Chrome(r'C:\Users\gaurav\Desktop\chromedriver')
      def test_singleInputField(self):
      user = "[email protected]"
      pwd = ""
      pageUrl = "http://www.facebook.com"
      driver=self.driver
      driver.maximize_window()
      driver.get(pageUrl)
      assert "Facebook" in driver.title
      elem = driver.find_element_by_id("email")
      elem.send_keys(user)
      elem = driver.find_element_by_id("pass")
      elem.send_keys(pwd)
      elem.send_keys(Keys.RETURN)
   def tearDown(self):
      self.driver.close()
if __name__ == "__main__":
   unittest.main()