1. 概要
Actions クラス(Java/C#)および ActionChains(Python)は、W3C WebDriver が定義する “複数入力デバイスのインタラクション” をラップした高水準 API です。低水準の PointerInput/KeyInput を意識せずに、マウスやキーボードのステップを ビルダー・パターン で連結し 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#)
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)
5. 複合操作(マルチデバイス・シーケンス)
-
複数入力デバイスを同一タイムラインに配置可能。
-
Selenium 4 では内部的に tick(100 ms)単位のタイムスライス に分割され、各入力ソースのステップが同期されます。
6. ベストプラクティス & 注意点
-
要素を画面内にスクロールしてから
moveToElementする -
明示的待機との併用
アニメーション完了や DOM 更新後の安定待ちをWebDriverWait+ ExpectedConditions で挟む。 -
オフセット座標は相対位置
高 DPI 環境やブラウザズーム率で誤差が出る。要素基準移動を優先。 -
ネイティブ vs HTML5 ドラッグ
HTML5 DnD はブラウザ実装差が大きい。難しい場合は JavaScript を注入してdispatchEvent("dragstart")を補助。 -
プラットフォーム別キー
macOS はKeys.COMMAND、Windows/Linux はKeys.CONTROLを使用。テスト基盤で分岐を持たせる。 -
アクションチェーンの再利用不可
perform()後は内部状態がクリアされるため、同じインスタンスをループで使い回さず 毎回新規生成が安全。
7. まとめ
Actions/ActionChains は 複雑な UI インタラクションを宣言的に組み立てる 強力なツールです。マウスとキーボード操作をシーケンス化し、1 回の perform() でブラウザに送信することで、⾃動化スクリプトの読みやすさと安定性を高められます。実装時は 要素の可視性・待機・座標誤差 といった環境依存要素を考慮し、テスト基盤に合わせてキーやタイミングを調整してください。
ChatGPT4o 生成日:2025/06/21