Python-web-scraping-testing-with-scrapers
Python Webスクレイピング-スクレーパーを使用したテスト
この章では、PythonでWebスクレーパーを使用してテストを実行する方法について説明します。
前書き
大規模なWebプロジェクトでは、Webサイトのバックエンドの自動テストが定期的に実行されますが、フロントエンドのテストは頻繁にスキップされます。 この背後にある主な理由は、ウェブサイトのプログラミングは、さまざまなマークアップ言語とプログラミング言語のネットのようなものだからです。 ある言語の単体テストを書くことはできますが、相互作用が別の言語で行われている場合は困難になります。 そのため、期待どおりにコードが実行されていることを確認するための一連のテストが必要です。
Pythonを使用したテスト
テストについて話すとき、それは単体テストを意味します。 Pythonでのテストに深く入る前に、ユニットテストについて知る必要があります。 以下は、単体テストの特徴の一部です-
- コンポーネントの機能の少なくとも1つの側面は、各ユニットテストでテストされます。
- 各ユニットテストは独立しており、独立して実行することもできます。
- 単体テストは、他のテストの成功または失敗を妨げません。
- 単体テストは任意の順序で実行でき、少なくとも1つのアサーションが含まれている必要があります。
Unittest-Pythonモジュール
ユニットテスト用のUnittestという名前のPythonモジュールは、すべての標準Pythonインストールに付属しています。 私たちはちょうどそれをインポートする必要があり、残りは以下を行うunittest.TestCaseクラスのタスクです-
- SetUpおよびtearDown関数は、unittest.TestCaseクラスによって提供されます。 これらの関数は、各ユニットテストの前後に実行できます。
- また、テストの成功または失敗を許可するアサートステートメントも提供します。
- 単体テストとしてtest_で始まるすべての関数を実行します。
例
この例では、Webスクレイピングと unittest を組み合わせます。 ウィキペディアのページをテストして、文字列「Python」を検索します。 基本的に2つのテストを実行します。最初は、タイトルページが検索文字列と同じか、つまり「Python」かどうか、そして2番目のテストではページにコンテンツdivがあることを確認します。
最初に、必要なPythonモジュールをインポートします。 WebスクレイピングにはBeautifulSoupを使用し、テストにはもちろんunittestを使用しています。
from urllib.request import urlopen
from bs4 import BeautifulSoup
import unittest
ここで、unittest.TestCaseを拡張するクラスを定義する必要があります。 グローバルオブジェクトbsは、すべてのテスト間で共有されます。 unittestで指定された関数setUpClassはそれを達成します。 ここでは、タイトルページのテスト用とページコンテンツのテスト用の2つの関数を定義します。
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テストとも呼ばれます。 Pythonの unittest と Selenium には共通点はあまりありません。 Seleniumは、ブラウザのデザインが異なっていても、標準のPythonコマンドを異なるブラウザに送信することを知っています。 前の章ですでにSeleniumをインストールして使用したことを思い出してください。 ここでは、Seleniumでテストスクリプトを作成し、自動化に使用します。
例
次のPythonスクリプトの助けを借りて、Facebookログインページを自動化するためのテストスクリプトを作成しています。 選択した他のフォームとログインを自動化するために例を変更できますが、概念は同じです。
最初にウェブブラウザに接続するために、セレンモジュールからウェブドライバをインポートします-
from selenium import webdriver
次に、Seleniumモジュールからキーをインポートする必要があります。
from selenium.webdriver.common.keys import Keys
次に、Facebookアカウントにログインするためのユーザー名とパスワードを入力する必要があります
user = "[email protected]"
pwd = ""
次に、ChromeのWebドライバーへのパスを指定します。
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
次のコード行を使用して、値を電子メールセクションに送信します。 ここではIDで検索していますが、名前で* driver.find_element_by_name( "email")*として検索することで実行できます。
element = driver.find_element_by_id("email")
element.send_keys(user)
次のコード行を使用して、パスワードセクションに値を送信します。 ここではIDで検索していますが、名前で* driver.find_element_by_name( "pass")*として検索することで実行できます。
element = driver.find_element_by_id("pass")
element.send_keys(pwd)
電子メールとパスワードのフィールドに値を挿入した後、次のコード行を使用してEnter/Loginを押します。
element.send_keys(Keys.RETURN)
次に、ブラウザを閉じます。
driver.close()
上記のスクリプトを実行すると、Chrome Webブラウザーが開き、メールとパスワードが挿入され、ログインボタンをクリックしたことがわかります。
比較:unittestまたはSelenium
unittestとセレンの比較は困難です。なぜなら、大規模なテストスイートを使用する場合は、unitsの構文上の剛性が必要だからです。 一方、Webサイトの柔軟性をテストする場合は、Seleniumテストが最初の選択肢になります。 しかし、両方を組み合わせることができたらどうでしょう。 セレンをPython unittestにインポートして、両方の利点を活用できます。 Seleniumを使用してWebサイトに関する情報を取得し、unittestでその情報がテストに合格するかどうかを評価できます。
たとえば、次のように両方を組み合わせて、Facebookログインの自動化のために上記のPythonスクリプトを書き換えています-
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()