HOWTO · Python
Selenium Python のアクション チェーン
このチュートリアルでは、Selenium と Python のアクション チェーンについて説明します。
このページの内容
Selenium は、自動化に利用される独立した Web ベースのツールです。誰でも利用できるオープンソースのツールです。
Python と組み合わせると、このツールはテストに利用できます。アクションチェーンは Selenium の基本的な機能の 1 つであり、キー入力、マウス移動、マウスボタンの操作、コンテキストメニューとのやり取りなど、低レベルのインタラクションを管理する方法を提供します。
このチュートリアルでは、Python で Selenium のアクションチェーンを実装する方法を説明します。
通常、アクションチェーンは、要素をクリックまたはドラッグする必要がある高度なスクリプトを自動化するときに使用します。
Python では、ActionChains クラスがアクションチェーンを実装します。ActionChains オブジェクトはすべてのアクションをキューに保存し、perform() メソッドを呼び出して保存された操作を実行するまで、ブラウザには何も送信されません。
Selenium Python で ActionChains オブジェクトを作成する
ActionChains オブジェクトは、必要なモジュールをインポートし、Python コードでいくつかの値を渡して作成できます。実行する前に、selenium パッケージと、使用するブラウザに対応するブラウザドライバー(Firefox の場合は geckodriver など)がインストールされていることを確認してください。
次のコードは、単純な ActionChains オブジェクトを作成します。インポートガードは selenium パッケージが見つからない場合に失敗する代わりにインストール案内を表示するため、スクリプトは常に正常終了します。完全にセットアップされた環境では else ブロックが実行され、オブジェクトが構築されます。コード例と出力内の英語のコメントやメッセージは、そのまま英語で表示されます。
このセクションのコードと表示されるラベルや出力は英語のままです。
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
action = ActionChains(driver)
driver.quit()
selenium is not installed; install it with: pip install selenium
ActionChainsクラスはtryブロック内でselenium.webdriver.common.action_chainsモジュールからインポートされます。パッケージがない場合は、ModuleNotFoundError分岐が上に示したインストール案内を出力します。- 次に、Firefox を起動して
driverを定義します。 - この
driverがActionChainsコンストラクターの主要な引数として渡されます。 ActionChainsオブジェクトが作成され、実行可能な操作を保存できる状態になります。
新しい ActionChains オブジェクトには、まだキューに入ったアクションがありません。click や move_to_element などのメソッド呼び出しは、そのキューにアクションを追加するだけで、perform() が順番に実行するまでブラウザは反応しません。この「保存してから実行する」パターンは、数行の通常の Python コードで確認できます。
次の例を実行します。
queue = []
def move_to_element(target):
queue.append("move to " + target)
def click(target):
queue.append("click " + target)
def perform():
for step in queue:
print(step)
move_to_element("profile menu")
click("TUTORIALS link")
perform()
move to profile menu
click TUTORIALS link
両方の呼び出しは最初に保存され、perform() によってまとめて再生されます。これは、ActionChains のキューの動作そのものです。
Selenium Python でアクションチェーンを実装する
これをより分かりやすく説明するために、ウェブサイト https://www.delftstack.com/ を例に取り、Python コードで試してみます。
次のコード例では、最初に https://www.delftstack.com/ を開き、次にヘッダー内の TUTORIALS リンクをクリックします。これにより、ブラウザは https://www.delftstack.com/tutorial/ へ自動的に移動します。
このセクションのコードと表示されるラベルや出力は英語のままです。
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
driver.get("https://www.delftstack.com/")
clicker1 = driver.find_element(By.LINK_TEXT, "TUTORIALS")
action = ActionChains(driver)
action.click(on_element=clicker1)
action.perform()
driver.quit()
selenium is not installed; install it with: pip install selenium
完全にセットアップされた環境では、スクリプトはまずウェブサイトのホームページ https://www.delftstack.com/ を開きます。
次に、上記コードでキューに入れたクリックの結果、https://www.delftstack.com/tutorial/ の Web ページへ自動的にリダイレクトされます。
ActionChainsクラスはselenium.webdriver.common.action_chainsモジュールからインポートされます。また、要素検索のためにByがselenium.webdriver.common.byからインポートされます。- 次に
driverが定義され、get()がウェブサイトhttps://www.delftstack.com/を読み込みます。 - 次に、ウェブサイトのヘッダーにある
TUTORIALSリンクである要素clicker1をdriver.find_element(By.LINK_TEXT, "TUTORIALS")で特定します。古いfind_element_by_link_text呼び出しは Selenium 4 で削除されたため、By.LINK_TEXT形式が必要です。 - この
driverがActionChainsコンストラクターの主要な引数として渡されます。 - 次に
action.click()を呼び出し、前に定義したclicker1要素をon_element引数として渡します。この時点ではクリックがキューに追加されるだけで、ブラウザはまだ何もクリックしていません。 - 最後に
perform()を呼び出してキューに入ったクリックを実行し、実際にページ遷移を発生させます。
これらの例は実際のブラウザを操作するため、ブラウザとそのドライバーがインストールされた環境で実行する必要があります。そのような環境では else ブロックはコンソールに何も出力せず、目に見える結果は上のスクリーンショットに示したページ遷移です。selenium パッケージがない環境では、出力ブロックに示した英語のインストール案内が表示されます。
1 つのシーケンスに複数のアクションを連鎖させる
1 つの ActionChains オブジェクトでは、1 回の perform() 呼び出しの前に複数のアクションをキューに入れられます。これが、このクラスの中心となるキューパターンです。各メソッドは同じシーケンスにアクションを追加し、perform() がそれを順番に再生します。典型的な使用例は、メニュー内の項目をクリックする前に、そのメニュー上にマウスを移動してサブメニューを表示することです。
このセクションのコードと表示されるラベルや出力は英語のままです。
try:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
except ModuleNotFoundError:
print("selenium is not installed; install it with: pip install selenium")
else:
driver = webdriver.Firefox()
driver.get("https://www.delftstack.com/")
menu = driver.find_element(By.LINK_TEXT, "TUTORIALS")
action = ActionChains(driver)
action.move_to_element(menu)
action.pause(1)
action.click(menu)
action.perform()
driver.quit()
selenium is not installed; install it with: pip install selenium
ここでは、move_to_element がリンク上にマウスを配置し、pause がページが反応できるように 1 秒待機し、click がリンクをクリックします。これらはすべて最後の 1 回の perform() で実行されます。これらの各メソッドは同じ ActionChains オブジェクトを返すため、同じシーケンスは action.move_to_element(menu).pause(1).click(menu).perform() のようにメソッドチェーンで記述することもできます。
release と click_and_hold は押下を 2 つのステップに分けるため、単純な click では表現できないドラッグ操作を長いシーケンス内で構成するのに役立ちます。
ActionChains メソッドリファレンス
Selenium でアクションチェーンを実装するだけでは十分ではありません。ActionChains オブジェクトを作成した後に利用できる ActionChains メソッドも知っておく必要があります。重要なメソッドをいくつか以下に説明します。
click- 要素をクリックするメソッドです。click_and_hold- 指定した要素上でマウスの左ボタンを押したままにするメソッドです。double_click- 要素をダブルクリックするメソッドです。drag_and_drop- 要素上でマウスの左ボタンを押したままターゲットまでドラッグし、その後でボタンを離します。move_to_element- マウスを要素の中心へ移動します。perform-ActionChainsオブジェクトに保存されているすべてのアクションを実行します。pause- すべての入力を指定した秒数だけ一時停止します。release- マウスボタンが押されたままになっている場合に、そのボタンを離します。