Python Web Scraping - тестирование с помощью скребков

В этой главе объясняется, как выполнять тестирование с помощью веб-парсеров в Python.

Введение

В крупных веб-проектах автоматическое тестирование серверной части веб-сайта выполняется регулярно, но тестирование внешнего интерфейса часто пропускается. Основная причина этого в том, что программирование веб-сайтов похоже на сеть различных языков разметки и программирования. Мы можем написать модульный тест для одного языка, но это становится сложной задачей, если взаимодействие осуществляется на другом языке. Вот почему у нас должен быть набор тестов, чтобы убедиться, что наш код работает в соответствии с нашими ожиданиями.

Тестирование с использованием Python

Когда мы говорим о тестировании, это означает модульное тестирование. Прежде чем углубиться в тестирование с помощью Python, мы должны знать о модульном тестировании. Ниже приведены некоторые характеристики модульного тестирования.

  • По крайней мере, один аспект функциональности компонента будет тестироваться в каждом модульном тесте.

  • Каждый модульный тест независим и может выполняться независимо.

  • Модульное тестирование не влияет на успешность или неудачу любого другого теста.

  • Модульные тесты могут выполняться в любом порядке и должны содержать хотя бы одно утверждение.

Unittest - модуль Python

Модуль Python с именем Unittest для модульного тестирования поставляется со всей стандартной установкой Python. Нам просто нужно импортировать его, а остальное - это задача класса unittest.TestCase, который будет выполнять следующие действия:

  • Функции SetUp и tearDown предоставляются классом unittest.TestCase. Эти функции могут выполняться до и после каждого модульного теста.

  • Он также предоставляет операторы assert, позволяющие пройти или не пройти тесты.

  • Он запускает все функции, которые начинаются с test_, как модульный тест.

пример

В этом примере мы собираемся объединить парсинг веб-страниц с unittest. Мы протестируем страницу Википедии на предмет поиска строки «Python». По сути, он будет выполнять два теста: первый - будет ли титульная страница такой же, как строка поиска, то есть «Python» или нет, а второй тест проверяет, есть ли на странице контентный div.

Сначала мы импортируем необходимые модули Python. Мы используем BeautifulSoup для парсинга веб-страниц и, конечно же, unittest для тестирования.

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

Теперь нам нужно определить класс, который будет расширять unittest.TestCase. Глобальный объект bs будет использоваться всеми тестами. Это выполнит функция setUpClass, указанная в unittest. Здесь мы определим две функции: одну для тестирования титульной страницы, а другую для тестирования содержимого страницы.

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

После запуска вышеуказанного скрипта мы получим следующий вывод -

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

Давайте обсудим, как использовать Python Selenium для тестирования. Это также называется Selenium-тестированием. Оба Pythonunittest и Seleniumне имеют много общего. Мы знаем, что Selenium отправляет стандартные команды Python в разные браузеры, несмотря на различия в дизайне их браузеров. Напомним, что мы уже установили и работали с Selenium в предыдущих главах. Здесь мы создадим тестовые скрипты в Selenium и будем использовать их для автоматизации.

пример

С помощью следующего скрипта Python мы создаем тестовый скрипт для автоматизации страницы входа в Facebook. Вы можете изменить пример для автоматизации других форм и учетных записей по вашему выбору, однако концепция будет такой же.

Сначала для подключения к веб-браузеру мы импортируем webdriver из модуля selenium -

from selenium import webdriver

Теперь нам нужно импортировать ключи из модуля селена.

from selenium.webdriver.common.keys import Keys

Затем нам нужно указать имя пользователя и пароль для входа в нашу учетную запись facebook.

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

Затем укажите путь к веб-драйверу для Chrome.

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

Теперь мы проверим условия, используя ключевое слово assert.

assert "Facebook" in driver.title

С помощью следующей строки кода мы отправляем значения в раздел электронной почты. Здесь мы ищем его по идентификатору, но мы можем сделать это, выполнив поиск по имени какdriver.find_element_by_name("email").

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

С помощью следующей строки кода мы отправляем значения в раздел пароля. Здесь мы ищем его по идентификатору, но мы можем сделать это, выполнив поиск по имени какdriver.find_element_by_name("pass").

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

Следующая строка кода используется для нажатия клавиши ввода / входа после ввода значений в поле электронной почты и пароля.

element.send_keys(Keys.RETURN)

Теперь закроем браузер.

driver.close()

После запуска вышеуказанного скрипта откроется веб-браузер Chrome, и вы увидите, что адрес электронной почты и пароль вставляются и нажимаются на кнопку входа в систему.

Сравнение: unittest или Selenium

Сравнение unittest и selenium затруднено, потому что если вы хотите работать с большими тестовыми наборами, требуется синтаксическая жесткость unites. С другой стороны, если вы собираетесь протестировать гибкость веб-сайта, то первым выбором будет Selenium test. Но что, если мы сможем объединить их оба. Мы можем импортировать селен в Python unittest и получить лучшее от обоих. Selenium можно использовать для получения информации о веб-сайте, а unittest может оценить, соответствует ли эта информация критериям прохождения теста.

Например, мы переписываем приведенный выше сценарий Python для автоматизации входа в систему Facebook, объединяя их оба следующим образом:

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