Scraping Web Python - Test avec des grattoirs

Ce chapitre explique comment effectuer des tests à l'aide de web scrapers en Python.

introduction

Dans les grands projets Web, des tests automatisés du backend du site Web sont effectués régulièrement, mais les tests du frontend sont souvent ignorés. La principale raison derrière cela est que la programmation de sites Web est comme un réseau de divers langages de balisage et de programmation. Nous pouvons écrire un test unitaire pour une langue, mais cela devient difficile si l'interaction se fait dans une autre langue. C'est pourquoi nous devons avoir une suite de tests pour nous assurer que notre code fonctionne selon nos attentes.

Test avec Python

Lorsque nous parlons de tests, cela signifie de tests unitaires. Avant de plonger dans les tests avec Python, nous devons connaître les tests unitaires. Voici quelques-unes des caractéristiques des tests unitaires -

  • Au moins un aspect de la fonctionnalité d'un composant serait testé dans chaque test unitaire.

  • Chaque test unitaire est indépendant et peut également s'exécuter indépendamment.

  • Le test unitaire n'interfère pas avec le succès ou l'échec de tout autre test.

  • Les tests unitaires peuvent s'exécuter dans n'importe quel ordre et doivent contenir au moins une assertion.

Unittest - Module Python

Le module Python nommé Unittest pour les tests unitaires est livré avec toute l'installation standard de Python. Nous avons juste besoin de l'importer et le repos est la tâche de la classe unittest.TestCase qui fera ce qui suit -

  • Les fonctions SetUp et tearDown sont fournies par la classe unittest.TestCase. Ces fonctions peuvent s'exécuter avant et après chaque test unitaire.

  • Il fournit également des instructions d'assert pour permettre aux tests de réussir ou d'échouer.

  • Il exécute toutes les fonctions qui commencent par test_ comme test unitaire.

Exemple

Dans cet exemple, nous allons combiner le web scraping avec unittest. Nous allons tester la page Wikipedia pour rechercher la chaîne 'Python'. Il fera essentiellement deux tests, d'abord si la page de titre est la même que la chaîne de recherche, c'est-à-dire "Python" ou non et le second test s'assure que la page a un contenu div.

Tout d'abord, nous importerons les modules Python requis. Nous utilisons BeautifulSoup pour le web scraping et bien sûr unittest pour les tests.

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

Nous devons maintenant définir une classe qui étendra unittest.TestCase. L'objet global bs serait partagé entre tous les tests. Une fonction spécifiée unittest setUpClass l'accomplira. Ici, nous allons définir deux fonctions, l'une pour tester la page de titre et l'autre pour tester le contenu de la page.

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()

Après avoir exécuté le script ci-dessus, nous obtiendrons la sortie suivante -

----------------------------------------------------------------------
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)

Test avec du sélénium

Voyons comment utiliser Python Selenium pour les tests. Il est également appelé test de sélénium. Les deux Pythonunittest et Seleniumn’ont pas grand-chose en commun. Nous savons que Selenium envoie les commandes Python standard à différents navigateurs, malgré des variations dans la conception de leur navigateur. Rappelons que nous avons déjà installé et travaillé avec Selenium dans les chapitres précédents. Ici, nous allons créer des scripts de test dans Selenium et l'utiliser pour l'automatisation.

Exemple

Avec l'aide du prochain script Python, nous créons un script de test pour l'automatisation de la page de connexion Facebook. Vous pouvez modifier l'exemple pour automatiser d'autres formulaires et connexions de votre choix, mais le concept serait le même.

Tout d'abord pour la connexion au navigateur Web, nous importerons le pilote Web à partir du module sélénium -

from selenium import webdriver

Maintenant, nous devons importer des clés à partir du module sélénium.

from selenium.webdriver.common.keys import Keys

Ensuite, nous devons fournir un nom d'utilisateur et un mot de passe pour nous connecter à notre compte Facebook

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

Ensuite, indiquez le chemin d'accès au pilote Web pour Chrome.

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

Nous allons maintenant vérifier les conditions en utilisant le mot-clé assert.

assert "Facebook" in driver.title

Avec l'aide de la ligne de code suivante, nous envoyons des valeurs à la section e-mail. Ici, nous le recherchons par son identifiant mais nous pouvons le faire en le recherchant par nom commedriver.find_element_by_name("email").

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

Avec l'aide de la ligne de code suivante, nous envoyons des valeurs à la section mot de passe. Ici, nous le recherchons par son identifiant mais nous pouvons le faire en le recherchant par nom commedriver.find_element_by_name("pass").

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

La ligne de code suivante est utilisée pour appuyer sur entrée / connexion après avoir inséré les valeurs dans le champ e-mail et mot de passe.

element.send_keys(Keys.RETURN)

Nous allons maintenant fermer le navigateur.

driver.close()

Après avoir exécuté le script ci-dessus, le navigateur Web Chrome sera ouvert et vous pouvez voir que l'e-mail et le mot de passe sont insérés et cliqué sur le bouton de connexion.

Comparaison: unittest ou Selenium

La comparaison de l'unittest et du sélénium est difficile car si vous souhaitez travailler avec de grandes suites de tests, la rigidité syntaxique des unités est requise. D'un autre côté, si vous voulez tester la flexibilité du site Web, le test Selenium serait notre premier choix. Mais que se passerait-il si nous pouvions combiner les deux. Nous pouvons importer du sélénium dans Python unittest et tirer le meilleur parti des deux. Le sélénium peut être utilisé pour obtenir des informations sur un site Web et unittest peut évaluer si ces informations répondent aux critères de réussite du test ou non.

Par exemple, nous réécrivons le script Python ci-dessus pour l'automatisation de la connexion Facebook en les combinant comme suit -

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()