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
  1. ActionChains クラスは try ブロック内で selenium.webdriver.common.action_chains モジュールからインポートされます。パッケージがない場合は、ModuleNotFoundError 分岐が上に示したインストール案内を出力します。
  2. 次に、Firefox を起動して driver を定義します。
  3. この driver が ActionChains コンストラクターの主要な引数として渡されます。
  4. 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/ を開きます。

アクションチェーンの実行前にブラウザに読み込まれた DelftStack ホームページ

次に、上記コードでキューに入れたクリックの結果、https://www.delftstack.com/tutorial/ の Web ページへ自動的にリダイレクトされます。

連鎖したクリックによってブラウザが移動した後の DelftStack チュートリアルページ

  1. ActionChains クラスは selenium.webdriver.common.action_chains モジュールからインポートされます。また、要素検索のために By が selenium.webdriver.common.by からインポートされます。
  2. 次に driver が定義され、get() がウェブサイト https://www.delftstack.com/ を読み込みます。
  3. 次に、ウェブサイトのヘッダーにある TUTORIALS リンクである要素 clicker1 を driver.find_element(By.LINK_TEXT, "TUTORIALS") で特定します。古い find_element_by_link_text 呼び出しは Selenium 4 で削除されたため、By.LINK_TEXT 形式が必要です。
  4. この driver が ActionChains コンストラクターの主要な引数として渡されます。
  5. 次に action.click() を呼び出し、前に定義した clicker1 要素を on_element 引数として渡します。この時点ではクリックがキューに追加されるだけで、ブラウザはまだ何もクリックしていません。
  6. 最後に 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 メソッドも知っておく必要があります。重要なメソッドをいくつか以下に説明します。

  1. click - 要素をクリックするメソッドです。
  2. click_and_hold - 指定した要素上でマウスの左ボタンを押したままにするメソッドです。
  3. double_click - 要素をダブルクリックするメソッドです。
  4. drag_and_drop - 要素上でマウスの左ボタンを押したままターゲットまでドラッグし、その後でボタンを離します。
  5. move_to_element - マウスを要素の中心へ移動します。
  6. perform - ActionChains オブジェクトに保存されているすべてのアクションを実行します。
  7. pause - すべての入力を指定した秒数だけ一時停止します。
  8. release - マウスボタンが押されたままになっている場合に、そのボタンを離します。