Python Web Kazıma - Kazıyıcılarla Test Etme

Bu bölüm, Python'da web kazıyıcıları kullanarak nasıl test yapılacağını açıklar.

Giriş

Büyük web projelerinde, web sitesinin arka ucunun otomatik testi düzenli olarak gerçekleştirilir, ancak ön uç testi sıklıkla atlanır. Bunun arkasındaki ana sebep, web sitelerinin programlanmasının çeşitli biçimlendirme ve programlama dillerinden oluşan bir ağ gibi olmasıdır. Bir dil için birim testi yazabiliriz, ancak etkileşim başka bir dilde yapılıyorsa zorlaşır. Bu nedenle, kodumuzun beklentilerimize göre çalıştığından emin olmak için bir dizi test yapmalıyız.

Python kullanarak test etme

Testten bahsettiğimizde, birim testi anlamına gelir. Python ile testlere derinlemesine dalmadan önce, birim testi hakkında bilgi sahibi olmalıyız. Aşağıda, birim testinin özelliklerinden bazıları verilmiştir -

  • Bir bileşenin işlevselliğinin en az bir yönü, her birim testinde test edilecektir.

  • Her birim testi bağımsızdır ve bağımsız olarak da çalışabilir.

  • Birim testi, başka herhangi bir testin başarısına veya başarısızlığına müdahale etmez.

  • Birim testleri herhangi bir sırayla çalıştırılabilir ve en az bir iddia içermelidir.

Unittest - Python Modülü

Birim testi için Unittest adlı Python modülü, tüm standart Python kurulumuyla birlikte gelir. Sadece içeri aktarmamız gerekiyor ve geri kalanı, aşağıdakileri yapacak unittest.TestCase sınıfının görevidir -

  • SetUp ve tearDown fonksiyonları, unittest.TestCase sınıfı tarafından sağlanır. Bu işlevler, her birim testinden önce ve sonra çalışabilir.

  • Ayrıca, testlerin başarılı veya başarısız olmasına izin vermek için assert ifadeleri de sağlar.

  • Birim testi olarak test_ ile başlayan tüm fonksiyonları çalıştırır.

Misal

Bu örnekte, web kazıma ile birleştireceğiz unittest. 'Python' dizesini aramak için Wikipedia sayfasını test edeceğiz. Temel olarak iki test yapacak, ilk önce başlık sayfasının arama dizgisiyle aynı olduğu, yani 'Python' olup olmadığı ve ikinci test sayfanın bir içerik div'e sahip olduğundan emin olacak.

İlk olarak, gerekli Python modüllerini içe aktaracağız. BeautifulSoup'u web kazıma için ve tabii ki test için unittest kullanıyoruz.

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

Şimdi unittest.TestCase'i genişletecek bir sınıf tanımlamamız gerekiyor. Global nesne bs tüm testler arasında paylaşılacaktır. SetUpClass ile belirtilen birim testi işlevi bunu başaracaktır. Burada, biri başlık sayfasını test etmek ve diğeri sayfa içeriğini test etmek için iki işlev tanımlayacağız.

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

Yukarıdaki betiği çalıştırdıktan sonra aşağıdaki çıktıyı alacağız -

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

Selenium ile test etme

Python Selenium'un test için nasıl kullanılacağını tartışalım. Selenyum testi olarak da adlandırılır. Her iki Pythonunittest ve Seleniumpek ortak yanımız yok. Selenium'un standart Python komutlarını, tarayıcılarının tasarımındaki farklılıklara rağmen farklı tarayıcılara gönderdiğini biliyoruz. Önceki bölümlerde Selenium'u kurduğumuzu ve üzerinde çalıştığımızı hatırlayın. Burada Selenium'da test betikleri oluşturup otomasyon için kullanacağız.

Misal

Bir sonraki Python betiğinin yardımıyla, Facebook Giriş sayfasının otomasyonu için test komut dosyası oluşturuyoruz. Seçtiğiniz diğer formları ve oturum açma bilgilerini otomatikleştirme örneğini değiştirebilirsiniz, ancak konsept aynı olacaktır.

Öncelikle web tarayıcısına bağlanmak için, selenium modülünden web sürücüsünü içe aktaracağız -

from selenium import webdriver

Şimdi anahtarları selenyum modülünden içe aktarmamız gerekiyor.

from selenium.webdriver.common.keys import Keys

Daha sonra facebook hesabımıza giriş yapmak için kullanıcı adı ve şifre sağlamamız gerekiyor.

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

Ardından, Chrome için web sürücüsünün yolunu sağlayın.

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

Şimdi assert anahtar sözcüğünü kullanarak koşulları doğrulayacağız.

assert "Facebook" in driver.title

Aşağıdaki kod satırının yardımıyla e-posta bölümüne değerler gönderiyoruz. Burada kimliğine göre arıyoruz, ancak adıyla arayarak yapabiliriz.driver.find_element_by_name("email").

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

Aşağıdaki kod satırı yardımı ile şifre bölümüne değerler gönderiyoruz. Burada kimliğine göre arıyoruz, ancak adıyla arayarak yapabiliriz.driver.find_element_by_name("pass").

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

Sonraki kod satırı, değerleri e-posta ve şifre alanına girdikten sonra enter / login tuşuna basmak için kullanılır.

element.send_keys(Keys.RETURN)

Şimdi tarayıcıyı kapatacağız.

driver.close()

Yukarıdaki komut dosyasını çalıştırdıktan sonra, Chrome web tarayıcısı açılacak ve e-posta ve şifrenin girildiğini ve giriş düğmesine tıklandığını görebilirsiniz.

Karşılaştırma: birim testi veya Selenyum

Birim testi ve selenyumun karşılaştırılması zordur çünkü büyük test takımlarıyla çalışmak istiyorsanız, birimlerin sözdizimsel sertliği gereklidir. Öte yandan, web sitesi esnekliğini test edecekseniz, Selenium testi ilk tercihimiz olacaktır. Ama ya ikisini birden birleştirebilirsek? Selenyum'u Python birim testine aktarabilir ve her ikisinden de en iyisini alabiliriz. Selenium, bir web sitesi hakkında bilgi almak için kullanılabilir ve birim test, bu bilgilerin testi geçme kriterlerini karşılayıp karşılamadığını değerlendirebilir.

Örneğin, Facebook oturum açma otomasyonu için yukarıdaki Python betiğini, ikisini de aşağıdaki gibi birleştirerek yeniden yazıyoruz -

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