Python Web Scraping - Testen mit Scrapern
In diesem Kapitel wird erläutert, wie Sie Tests mit Web-Scrapern in Python durchführen.
Einführung
In großen Webprojekten werden regelmäßig automatisierte Tests des Backends der Website durchgeführt, die Frontend-Tests werden jedoch häufig übersprungen. Der Hauptgrund dafür ist, dass die Programmierung von Websites wie ein Netz aus verschiedenen Markup- und Programmiersprachen ist. Wir können Unit-Tests für eine Sprache schreiben, aber es wird schwierig, wenn die Interaktion in einer anderen Sprache durchgeführt wird. Aus diesem Grund müssen wir eine Reihe von Tests durchführen, um sicherzustellen, dass unser Code unseren Erwartungen entspricht.
Testen mit Python
Wenn wir über das Testen sprechen, bedeutet dies Unit-Test. Bevor wir uns eingehend mit dem Testen mit Python befassen, müssen wir uns mit Unit-Tests auskennen. Im Folgenden sind einige der Merkmale von Unit-Tests aufgeführt:
In jedem Komponententest würde mindestens ein Aspekt der Funktionalität einer Komponente getestet.
Jeder Komponententest ist unabhängig und kann auch unabhängig ausgeführt werden.
Der Unit-Test beeinträchtigt weder Erfolg noch Misserfolg eines anderen Tests.
Unit-Tests können in beliebiger Reihenfolge ausgeführt werden und müssen mindestens eine Aussage enthalten.
Unittest - Python-Modul
Das Python-Modul mit dem Namen Unittest für Unit-Tests wird mit der gesamten Standard-Python-Installation geliefert. Wir müssen es nur importieren und ruhen ist die Aufgabe von unittest.TestCase Klasse, die die folgenden Aufgaben erledigt -
SetUp- und TearDown-Funktionen werden von der unittest.TestCase-Klasse bereitgestellt. Diese Funktionen können vor und nach jedem Komponententest ausgeführt werden.
Es enthält auch Assert-Anweisungen, mit denen Tests bestanden oder nicht bestanden werden können.
Es werden alle Funktionen ausgeführt, die mit test_ als Komponententest beginnen.
Beispiel
In diesem Beispiel kombinieren wir Web Scraping mit unittest. Wir werden die Wikipedia-Seite auf die Suche nach der Zeichenfolge 'Python' testen. Grundsätzlich werden zwei Tests durchgeführt: Erstens, ob die Titelseite mit der Suchzeichenfolge identisch ist, dh "Python" oder nicht, und der zweite Test stellt sicher, dass die Seite einen Inhaltsbereich hat.
Zuerst importieren wir die erforderlichen Python-Module. Wir verwenden BeautifulSoup zum Web-Scraping und natürlich nicht zum Testen.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
Jetzt müssen wir eine Klasse definieren, die unittest.TestCase erweitert. Das globale Objekt bs wird von allen Tests gemeinsam genutzt. Eine unittest angegebene Funktion setUpClass wird dies ausführen. Hier definieren wir zwei Funktionen, eine zum Testen der Titelseite und eine zum Testen des Seiteninhalts.
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()
Nach dem Ausführen des obigen Skripts erhalten wir die folgende Ausgabe:
----------------------------------------------------------------------
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)
Testen mit Selen
Lassen Sie uns diskutieren, wie Python Selenium zum Testen verwendet wird. Es wird auch als Selentest bezeichnet. Beide Pythonunittest und Seleniumhabe nicht viel gemeinsam. Wir wissen, dass Selenium die Standard-Python-Befehle an verschiedene Browser sendet, obwohl das Design des Browsers unterschiedlich ist. Denken Sie daran, dass wir Selenium bereits in früheren Kapiteln installiert und mit ihm gearbeitet haben. Hier erstellen wir Testskripte in Selenium und verwenden sie zur Automatisierung.
Beispiel
Mit Hilfe des nächsten Python-Skripts erstellen wir ein Testskript für die Automatisierung der Facebook-Anmeldeseite. Sie können das Beispiel für die Automatisierung anderer Formulare und Anmeldungen Ihrer Wahl ändern, das Konzept ist jedoch dasselbe.
Um eine Verbindung zum Webbrowser herzustellen, importieren wir zunächst den Webdriver aus dem Selenium-Modul.
from selenium import webdriver
Jetzt müssen wir Schlüssel aus dem Selenmodul importieren.
from selenium.webdriver.common.keys import Keys
Als nächstes müssen wir den Benutzernamen und das Passwort für die Anmeldung in unserem Facebook-Konto angeben
user = "[email protected]"
pwd = ""
Geben Sie als Nächstes den Pfad zum Webtreiber für Chrome an.
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'
driver = webdriver.Chrome(executable_path=path)
driver.get("http://www.facebook.com")
Jetzt werden wir die Bedingungen mit dem Schlüsselwort assert überprüfen.
assert "Facebook" in driver.title
Mit Hilfe der folgenden Codezeile senden wir Werte an den E-Mail-Bereich. Hier suchen wir es nach seiner ID, aber wir können es tun, indem wir es nach Namen als suchendriver.find_element_by_name("email").
element = driver.find_element_by_id("email")
element.send_keys(user)
Mit Hilfe der folgenden Codezeile senden wir Werte an den Passwortbereich. Hier suchen wir es nach seiner ID, aber wir können es tun, indem wir es nach Namen als suchendriver.find_element_by_name("pass").
element = driver.find_element_by_id("pass")
element.send_keys(pwd)
In der nächsten Codezeile drücken Sie die Eingabetaste, nachdem Sie die Werte in das Feld E-Mail und Passwort eingegeben haben.
element.send_keys(Keys.RETURN)
Jetzt schließen wir den Browser.
driver.close()
Nach dem Ausführen des obigen Skripts wird der Chrome-Webbrowser geöffnet und Sie können sehen, dass E-Mail und Passwort eingefügt und auf die Anmeldeschaltfläche geklickt werden.
Vergleich: unittest oder Selen
Der Vergleich von Unittest und Selen ist schwierig, da bei der Arbeit mit großen Testsuiten die syntaktische Steifigkeit von Units erforderlich ist. Wenn Sie jedoch die Flexibilität Ihrer Website testen möchten, ist der Selenium-Test unsere erste Wahl. Aber was ist, wenn wir beide kombinieren können? Wir können Selen unittest in Python importieren und das Beste aus beiden herausholen. Selen kann verwendet werden, um Informationen über eine Website zu erhalten, und unittest kann bewerten, ob diese Informationen die Kriterien für das Bestehen des Tests erfüllen oder nicht.
Zum Beispiel schreiben wir das obige Python-Skript zur Automatisierung der Facebook-Anmeldung neu, indem wir beide wie folgt kombinieren:
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()