2. 入門

2.1. 簡単な使い方

Selenium Pythonバインディングをインストールしている場合は、このようにPythonから使用することができます。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

上記のスクリプトはファイルに保存することができます(例: - python_org_search.py )。これは次のように実行できます:

python python_org_search.py

実行している Python には、Selenium モジュールがインストールされている必要があります。

2.2. 使い方の説明

selenium.webdriver モジュールは、すべてのWebDriverを提供します。現在サポートされているWebDriverはFirefox、Chrome、IE、Remoteです。Keys クラスは、RETURN、F1、ALTなどのキーボードのキーを提供します。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

次に、Firefox WebDriverのインスタンスが作成されます。

driver = webdriver.Firefox()

driver.get メソッドは、URLによって指定されたページに移動します。WebDriverは、テストまたはスクリプトが実行する前に、ページが完全にロードされる(つまり、「onload」イベントが発生する)まで待機します。あなたのページがロード時にたくさんのAJAXを使用すると、WebDriverは完全にロードされたかどうかわからないということに注意する必要があります:

driver.get("http://www.python.org")

次の行は、タイトルに「Python」という単語があることを確認するためのアサーションです。:

assert "Python" in driver.title

WebDriverには、find_element_by_* メソッドのひとつを使って要素を見つけることができます。例えば、入力テキスト要素は、find_element_by_name メソッドを使用して name 属性で検索できます。要素を見つける詳細な説明は、要素を見つける の章を参照して下さい:

elem = driver.find_element_by_name("q")

次に、キーを送信しています。これはキーボードを使用してキーを入力するのと同じです。特殊キーは、 selenium.webdriver.common.keys からインポートした Keys クラスを使用して送信できます。安全のため、あらかじめ入力フィールド(例:「検索」)に入力したテキストをクリアしましょう。そうすれば、検索結果には影響に影響を及ぼしません。:

elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

ページのサブミット後、もしページが存在すれば結果を得られます。いくつかの結果が見つかるようにするには、アサーションを作成しましょう。:

assert "No results found." not in driver.page_source

最後に、ブラウザウィンドウを閉じます。cloce メソッド代わりに`quit` メソッドを呼び出すこともできます。quit メソッドはブラウザ全体が終了しますが、 close メソッドは1つのタブが閉じます。しかし、1つのタブだけが開いている場合、デフォルトではほとんどのブラウザが完全に終了します。:

driver.close()

2.3. Seleniumを使ってテストを書く

Seleniumは主にテストケースを書くときに使用されます。selenium パッケージ自体はテストツール/フレームワークを提供しません。Pythonのunittestモジュールを使ってテストケースを書くことができます。その他のツール/フレームワークには、pytestとnoseがあります。

この章では、unittest を選択の枠組みとして使用します。ここにunittestモジュールを使用した変更例を示します。これは python.org 検索機能のテストです:

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source


    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main()

以下のようなシェルから上記のテストケースを実行することができます:

python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s

OK

上記の結果は、テストが正常に完了したことを示しています。

2.4. 例を見てみましょう

はじめに必要なすべての基本モジュールをインポートします。unittest モジュールは、JavaのJUnitをベースにした組み込みPythonです。このモジュールは、テストケースを編成するためのフレームワークを提供します。selenium.webdriver モジュールは、すべてのWebDriverを提供します。現在サポートされているWebDriverはFirefox、Chrome、IE、Remoteです。Keys クラスは、RETURN、F1、ALTなどのキーボードのキーを提供します。:

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

テストケースクラスは unittest.TestCase から継承されます。TestCase クラスを継承することは、これがテストケースであることを unittest モジュールに伝える方法です。:

class PythonOrgSearch(unittest.TestCase):

setUp は初期化の一部です。このメソッドは、このテストケースクラスに書き込むすべてのテスト関数の前に呼び出されます。ここでは、Firefox WebDriverのインスタンスを作成しています。:

def setUp(self):
    self.driver = webdriver.Firefox()

これはテストケースメソッドです。 テストケースメソッドは常に test で始める必要があります。このメソッド内の最初の行は、 setUp メソッドで作成されたドライバオブジェクトへのローカル参照を作成します。:

def test_search_in_python_org(self):
    driver = self.driver

driver.get メソッドは、URLによって指定されたページに移動します。WebDriverは、テストまたはスクリプトが実行する前に、ページが完全にロードされる(つまり、「onload」イベントが発生する)まで待機します。あなたのページがロード時にたくさんのAJAXを使用すると、WebDriverは完全にロードされたかどうかわからないということに注意する必要があります:

driver.get("http://www.python.org")

次の行は、タイトルに「Python」という単語があることを確認するためのアサーションです。:

self.assertIn("Python", driver.title)

WebDriverには、find_element_by_* メソッドのひとつを使って要素を見つけることができます。例えば、入力テキスト要素は、find_element_by_name メソッドを使用して name 属性>で検索できます。要素を見つける詳細な説明は、要素を見つける の章を参照して下さい:

elem = driver.find_element_by_name("q")

次に、キーを送信しています。これはキーボードを使用してキーを入力するのと同じです。特別なキーは、 selenium.webdriver.common.keys からインポートした Keys クラスを使用して送信できます。:

elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)

ページの送信後、もしあれば検索ごとの結果が得られます。結果が確実に見つかるようにするには、アサーションを作成しましょう。:

assert "No results found." not in driver.page_source

tearDown メソッドはすべてのテストメソッド実行後に呼び出されます。これは全ての処理をクリーンアップする場所です。下記の方法では、ブラウザウィンドウが閉じられます。close の代わりに quit メソッドを呼び出すこともできます。quit はブラウザ全体が終了しますが、 close はタブを閉じます。デフォルトでほとんどのブラウザは完全に終了します。:

def tearDown(self):
    self.driver.close()

最終の行はテストスイートを実行するためのボイラープレートコードです。:

if __name__ == "__main__":
    unittest.main()

2.5. リモートWebDriverでSeleniumを使用する

リモートWebDriverを使用するには、Seleniumサーバーを実行する必要があります。サーバーを実行するには、次のコマンドを使用します。:

java -jar selenium-server-standalone-2.x.x.jar

Seleniumサーバーを実行しているとき、次のようなメッセージが表示されます。:

15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub

上記は、このURLを使用してリモートWebDriverに接続できることを示しています。ここではいくつかの例を示します。:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.CHROME)

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.OPERA)

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)

必要な機能は辞書型で指定します。以下のように機能を設定することができます。:

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   desired_capabilities={'browserName': 'htmlunit',
                         'version': '2',
                        'javascriptEnabled': True})