3. ナビゲート¶
WebDriverで最初にやりたいことは、リンクに移動することです。これを行う通常の方法は get メソッドを呼び出すことです:
driver.get("http://www.google.com")
WebDriverは、テストまたはスクリプトに制御を戻す前に、ページが完全にロードされる(つまり、onload イベントの発生)まで待機します。あなたのページが大量のAJAXを使用している場合、WebDriverは完全にロードされたかわかりません。そのようなページが完全にロードされていることを確認する必要がある場合は、waits を使用しましょう。
3.1. ページとのやりとり¶
正しい場所に行くことができることが重要ではありません。私たちが本当にやりたいことは、ページ、あるいは具体的にはページ内のHTML要素とやりとりすることです。まず、私たちはひとつの要素を見つける必要があります。WebDriverは、要素を見つけるためのさまざまな方法を提供します。例えば、以下のように定義された要素:
<input type="text" name="passwd" id="passwd-id" />
次のいずれかを使用して見つけることができます。:
element = driver.find_element_by_id("passwd-id")
element = driver.find_element_by_name("passwd")
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
テキストでリンクを探すこともできますが、注意してください!テキストは完全一致でなければなりません!WebDriverで XPATH を使用する際も注意が必要です。クエリに一致する要素が複数ある場合は、最初の要素だけが返されます。何も見つからない場合は、 NoSuchElementException
という例外が発生します。
WebDriverには「オブジェクトベース」のAPIがあります。同じインターフェースを使用して、すべてのタイプの要素を表します。つまり、IDEのオートコンプリートキーの組み合わせをヒットしたときに呼び出すことのできるメソッドがたくさんあるかもしれませんが、それらのすべてが意味をなさないか、有効であるとは限りません。心配しないでください!WebDriverは正しいことをしようとします。意味のないメソッド(例えば、 metaタグにsetSelected())を呼び出した場合、例外が発生します。
だから、あなたは要素を持っています。あなたはそれで何がしたいですか?まず、テキストフィールドにテキストを入力したいかもしれませんね。:
element.send_keys("some text")
「Key」クラスを使用して矢印キーを押すことをシミュレートすることができます。:
element.send_keys(" and some", Keys.ARROW_DOWN)
任意の要素に対して send_keys を呼び出すことができます。これにより、Gmailで使用されているようなキーボードショートカットをテストすることができます。これの副作用は、テキストフィールドに何かを入力しても自動的にクリアされないということです。代わりに、あなたが入力したものはすでに入力されたものに追記されます。テキストフィールドまたはテキストエリアの内容は clear メソッドで簡単にクリアすることができます:
element.clear()
3.2. フォームの記入¶
テキストエリアやテキストフィールドにテキストを入力する方法はすでに見てきましたが、他の要素についてはどうでしょうか?Seleniumはドロップダウンの状態を「切り替える」こともできます。また、「setSelected」を使用して、 OPTION タグのようなものを選択することもできます。SELECT タグを扱うことはそれほど難しくありません:
element = driver.find_element_by_xpath("//select[@name='name']")
all_options = element.find_elements_by_tag_name("option")
for option in all_options:
print("Value is: %s" % option.get_attribute("value"))
option.click()
これは、ページ上の最初の」SELECT」要素を見つけ出し、OPTIONを順番に見て回って、その値を出力し順番に選択します。:
ご覧のとおり、これはSELECT要素を処理する最も効率的な方法ではありません。WebDriverのサポートクラスには、「Select」と呼ばれるインタラクティブに作用する便利なメソッドがあります。:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_name('name'))
select.select_by_index(index)
select.select_by_visible_text("text")
select.select_by_value(value)
WebDriverには、選択したすべてのオプションの選択を解除する機能もあります。:
select = Select(driver.find_element_by_id('id'))
select.deselect_all()
これにより、ページの最初のSELECTからすべてのOPTIONが選択解除されます
テストで、すべてのデフォルト選択されたオプションのリストが必要であるとします。Selectクラスは、リストを返すプロパティメソッドを提供します。:
select = Select(driver.find_element_by_xpath("xpath"))
all_selected_options = select.all_selected_options
利用可能なすべてのオプションを取得するには:
options = select.options
フォームの記入が終わったら、おそらく送信したいでしょう。これを行う方法は、「Submit」ボタンを見つけてクリックすることです。:
# Assume the button has the ID "submit" :)
driver.find_element_by_id("submit").click()
あるいは、WebDriverには、すべての要素に対して「submit」する便利なメソッドがあります。これをフォーム内の要素で呼び出すと、WebDriverはフォームを見つけてそのフォームを呼び出すまでDOMを検索します。要素がフォームにない場合は、 NoSuchElementException が発生します。:
element.submit()
3.3. ドラッグアンドドロップ¶
特定の量で要素を移動するか、別の要素に移動するかのいずれかで、ドラッグアンドドロップを使用できます
element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")
from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()
3.4. ウィンドウとフレームの間を移動する¶
最新のWebアプリケーションはフレームを持たない、または単一のウィンドウに制約されることはまれです。WebDriverは、「switch_to_window」メソッドを使用して、名前付きウィンドウ間の移動をサポートしています。:
driver.switch_to_window("windowName")
driver へのすべての呼び出しは、特定のウィンドウに向けられたものとして解釈されます。しかし、どのようにしてウィンドウの名前をを知るでしょうか?ウィンドウを開いたjavascriptまたはリンクを見てみましょう。:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
「window handle」を 「switch_to_window()」メソッドに渡すこともできます。これを知っていると、開いているすべてのウィンドウを繰り返し処理することができます。:
for handle in driver.window_handles:
driver.switch_to_window(handle)
フレームからフレーム(またはiframeの中)に切り替えることもできます。:
driver.switch_to_frame("frameName")
ドットのパスで区切っているサブフレームにアクセスすることも可能です。インデックスでフレームを指定することもできます。:
driver.switch_to_frame("frameName.0.child")
「frameName」と呼ばれるフレームの最初のサブフレームの「child」という名前のフレームに移動します。すべてのフレームは、top からのように評価されます。
フレーム上での作業が終わったら、親フレームに戻ってくる必要があります。これは、以下を使用して行うことができます。:
driver.switch_to_default_content()
3.5. ポップアップダイアログ¶
Selenium WebDriverには、ポップアップダイアログボックスの処理が組み込まれています。ポップアップを開くアクションを実行したら、次のようにしてアラートにアクセスできます。:
alert = driver.switch_to_alert()
これにより、現在開いているアラートオブジェクトが返されます。このオブジェクトを使用すると、その内容を受け入れたり、却下したり、内容を読み込んだり、プロンプトに入力したりすることができます。このインターフェイスは、アラート、確認、プロンプトに対しても同様に機能します。詳細については、APIドキュメントを参照してください。
3.6. ナビゲーション: 履歴と場所¶
前に」get」コマンド (driver.get("http://www.example.com")
)を使用してページを移動する方法について説明しました。ページに移動するには、getメソッドを使用します。:
driver.get("http://www.example.com")
ブラウザの履歴の前後を移動するには:
driver.forward()
driver.back()
この機能は、基本となるドライバに完全に依存することに注意してください。あるブラウザの動作に慣れている場合、これらのメソッドを呼び出すと予期しないことが起こる可能性があります。
3.7. クッキー¶
これらの次のステップを終える前に、Cookieの使い方を理解したいかもしれません。最初にクッキーが有効になるドメイン上にいる必要があります。
# Go to the correct domain
driver.get("http://www.example.com")
# Now set the cookie. This one's valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# And now output all the available cookies for the current URL
driver.get_cookies()