Actions クラスによるマウス・キーボード操作

1. 概要

Actions クラス(Java/C#)および ActionChains(Python)は、W3C WebDriver が定義する “複数入力デバイスのインタラクション” をラップした高水準 API です。低水準の PointerInput/KeyInput を意識せずに、マウスやキーボードのステップを ビルダー・パターン で連結し perform() 一括送信できます。

pgsql
new Actions(driver) // Java/C# .moveToElement(elem) // 操作をチェイン .click() .sendKeys("foo") .perform(); // サーバへ一括伝送

2. 基本構造とビルド‐実行フロー

手順 説明
① インスタンス生成 Actions actions = new Actions(driver);
② ステップを連結 actions.moveToElement(el).click() など
perform() 直列化された JSON が WebDriver に送信され、ブラウザが実行

Selenium 4 以降は build() を呼ぶ必要はなく、遅延評価で内部的にビルドされます(下位互換で build().perform() も可)。


3. マウス操作 API

主なメソッド 典型的用途 補足
click() / doubleClick() 単/ダブルクリック moveToElement() で座標補正可
contextClick() 右クリック Linux ではコンテキストメニューが OS にブロックされることあり
clickAndHold() / release() ドラッグ開始/終了 ドラッグ元要素がスクロールで外れると InvalidCoordinates
dragAndDrop(src, dst) HTML5 ドラッグ & ドロップ 不安定なときは clickAndHold→move→release 手動実装
moveToElement(el) / moveByOffset(x,y) ホバーやスライダー操作 要素外へのオフセットは viewport 座標で解釈
moveToLocation(x,y)
(Python Selenium 4.19+)
絶対座標移動 マルチデバイス実装向け

例:メニューにホバーしてサブメニューをクリック(C#)

csharp
var menu = driver.FindElement(By.CssSelector("#menu")); var sub = driver.FindElement(By.LinkText("設定")); new Actions(driver) .moveToElement(menu) .pause(TimeSpan.FromMilliseconds(500)) // アニメーション待ち .click(sub) .perform();

4. キーボード操作 API

メソッド 説明 使用例
sendKeys(CharSequence…) フォーカス中要素に文字列挿入 .sendKeys(Keys.ENTER)
keyDown(Keys) / keyUp(Keys) 修飾キーの押下/解放 keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL)
pause(Duration) 人的タイミング再現や JS 待機 ペースト系操作で有用

例:Ctrl + A → Ctrl + C → Ctrl + V(Python)

python
from selenium.webdriver import ActionChains, Keys ac = ActionChains(driver) ac.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL) \ .key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL) \ .click(target_input) \ .key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL) \ .perform()

5. 複合操作(マルチデバイス・シーケンス)

  • 複数入力デバイスを同一タイムラインに配置可能。

    java
    actions .keyDown(Keys.SHIFT) // 修飾キーを保持 .click(elem) // 同フレーム内でクリック .keyUp(Keys.SHIFT) .perform();
  • Selenium 4 では内部的に tick(100 ms)単位のタイムスライス に分割され、各入力ソースのステップが同期されます。


6. ベストプラクティス & 注意点

  1. 要素を画面内にスクロールしてから moveToElement する

    java
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", el);
  2. 明示的待機との併用
    アニメーション完了や DOM 更新後の安定待ちを WebDriverWait + ExpectedConditions で挟む。

  3. オフセット座標は相対位置
    高 DPI 環境やブラウザズーム率で誤差が出る。要素基準移動を優先。

  4. ネイティブ vs HTML5 ドラッグ
    HTML5 DnD はブラウザ実装差が大きい。難しい場合は JavaScript を注入して dispatchEvent("dragstart") を補助。

  5. プラットフォーム別キー
    macOS は Keys.COMMAND、Windows/Linux は Keys.CONTROL を使用。テスト基盤で分岐を持たせる。

  6. アクションチェーンの再利用不可
    perform() 後は内部状態がクリアされるため、同じインスタンスをループで使い回さず 毎回新規生成が安全。


7. まとめ

ActionsActionChains複雑な UI インタラクションを宣言的に組み立てる 強力なツールです。マウスとキーボード操作をシーケンス化し、1 回の perform() でブラウザに送信することで、⾃動化スクリプトの読みやすさと安定性を高められます。実装時は 要素の可視性・待機・座標誤差 といった環境依存要素を考慮し、テスト基盤に合わせてキーやタイミングを調整してください。

ChatGPT4o 生成日:2025/06/21