Python Web Scraping - Test con Scrapers

Questo capitolo spiega come eseguire test utilizzando web scrapers in Python.

introduzione

Nei grandi progetti web, il test automatizzato del backend del sito web viene eseguito regolarmente, ma il test del frontend viene spesso saltato. Il motivo principale alla base di ciò è che la programmazione dei siti Web è proprio come una rete di vari markup e linguaggi di programmazione. Possiamo scrivere unit test per una lingua, ma diventa difficile se l'interazione viene eseguita in un'altra lingua. Questo è il motivo per cui dobbiamo disporre di una suite di test per assicurarci che il nostro codice funzioni secondo le nostre aspettative.

Testare usando Python

Quando parliamo di test, significa test unitario. Prima di immergerci in profondità nei test con Python, dobbiamo conoscere i test unitari. Di seguito sono riportate alcune delle caratteristiche dei test unitari:

  • Almeno un aspetto della funzionalità di un componente verrebbe testato in ogni unit test.

  • Ogni unit test è indipendente e può anche essere eseguito indipendentemente.

  • Il test unitario non interferisce con il successo o il fallimento di qualsiasi altro test.

  • Gli unit test possono essere eseguiti in qualsiasi ordine e devono contenere almeno un'asserzione.

Unittest - Modulo Python

Il modulo Python denominato Unittest per unit test viene fornito con tutta l'installazione standard di Python. Dobbiamo solo importarlo e il resto è compito della classe unittest.TestCase che farà quanto segue:

  • Le funzioni SetUp e tearDown sono fornite dalla classe unittest.TestCase. Queste funzioni possono essere eseguite prima e dopo ogni unit test.

  • Fornisce inoltre istruzioni di asserzione per consentire il superamento o il fallimento dei test.

  • Esegue tutte le funzioni che iniziano con test_ come unit test.

Esempio

In questo esempio combineremo il web scraping con unittest. Testeremo la pagina di Wikipedia per la ricerca della stringa "Python". Fondamentalmente farà due test, primo se la pagina del titolo è uguale alla stringa di ricerca, cioè "Python" o meno, e il secondo test si assicura che la pagina abbia un div di contenuto.

Per prima cosa, importeremo i moduli Python richiesti. Stiamo usando BeautifulSoup per il web scraping e ovviamente unittest per i test.

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

Ora dobbiamo definire una classe che estenderà unittest.TestCase. Gli oggetti globali bs sarebbero condivisi tra tutti i test. Una funzione specificata unittest setUpClass lo realizzerà. Qui definiremo due funzioni, una per testare il frontespizio e l'altra per testare il contenuto della pagina.

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

Dopo aver eseguito lo script precedente, otterremo il seguente output:

----------------------------------------------------------------------
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 con selenio

Parliamo di come utilizzare Python Selenium per i test. È anche chiamato test del selenio. Entrambi Pythonunittest e Seleniumnon hanno molto in comune. Sappiamo che Selenium invia i comandi Python standard a diversi browser, nonostante la variazione nel design del loro browser. Ricordiamo che abbiamo già installato e lavorato con Selenium nei capitoli precedenti. Qui creeremo script di test in Selenium e lo useremo per l'automazione.

Esempio

Con l'aiuto del prossimo script Python, stiamo creando uno script di test per l'automazione della pagina di accesso di Facebook. Puoi modificare l'esempio per automatizzare altri moduli e accessi a tua scelta, tuttavia il concetto sarebbe lo stesso.

In primo luogo per la connessione al browser web, importeremo il webdriver dal modulo selenio -

from selenium import webdriver

Ora, dobbiamo importare le chiavi dal modulo selenio.

from selenium.webdriver.common.keys import Keys

Successivamente dobbiamo fornire nome utente e password per accedere al nostro account Facebook

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

Quindi, fornisci il percorso del driver web per Chrome.

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

Ora verificheremo le condizioni utilizzando assert keyword.

assert "Facebook" in driver.title

Con l'aiuto della seguente riga di codice stiamo inviando i valori alla sezione email. Qui lo stiamo cercando per il suo ID ma possiamo farlo cercandolo per nome comedriver.find_element_by_name("email").

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

Con l'aiuto della seguente riga di codice stiamo inviando valori alla sezione password. Qui lo stiamo cercando per il suo ID ma possiamo farlo cercandolo per nome comedriver.find_element_by_name("pass").

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

La riga di codice successiva viene utilizzata per premere invio / login dopo aver inserito i valori nel campo e-mail e password.

element.send_keys(Keys.RETURN)

Adesso chiuderemo il browser.

driver.close()

Dopo aver eseguito lo script sopra, il browser web Chrome verrà aperto e potrai vedere l'email e la password che vengono inserite e fare clic sul pulsante di accesso.

Confronto: unittest o selenio

Il confronto tra unittest e selenio è difficile perché se si desidera lavorare con grandi suite di test, è necessaria la rigidità sintattica delle unità. D'altra parte, se hai intenzione di testare la flessibilità del sito web, il test del selenio sarebbe la nostra prima scelta. Ma cosa succede se possiamo combinare entrambi? Possiamo importare il selenio in Python unittest e ottenere il meglio da entrambi. Il selenio può essere utilizzato per ottenere informazioni su un sito Web e unittest può valutare se tali informazioni soddisfano o meno i criteri per il superamento del test.

Ad esempio, stiamo riscrivendo lo script Python sopra per l'automazione dell'accesso a Facebook combinando entrambi come segue:

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