Webアプリの自動化にチャレンジしたことがある人なら、一度は「Seleniumでテストを書いてボタンを押したのに、なぜか何も起きない…」という経験があるはず。よく見たらボタンが画面の外にあったり、スクロール中に商品がまだ読み込まれていたり。これが、無限スクロールや動的読み込みを使ったWebページのやっかいなところです。実際のユーザーと同じようにテストを動かすには、スクロール操作のコントロールが欠かせません。自分も長年Web自動化をやってきて、Seleniumでのスクロール制御がテストの信頼性を大きく左右することを何度も実感しています。
この記事では、なぜSeleniumでのスクロールが重要なのか、遅延読み込みリストや固定ヘッダーなど色々なケースへの対応方法、さらにのようなツールを使って作業効率を上げるコツまで、実際のコード例やブラウザごとの注意点、現場で得たノウハウを交えて紹介します。テストの失敗に悩む日々から卒業して、信頼できる自動化を実現しましょう。
Seleniumでのスクロールの基本を押さえよう
「Seleniumでのスクロール」とは、ブラウザの表示領域(ビューポート)をプログラムで上下左右、または特定の要素まで動かして、操作したいコンテンツを画面内に表示させること。Selenium WebDriverは、標準では自動でスクロールしてくれません。画面外の要素をクリックしようとすると、ElementNotInteractableException()が出ることも。だからこそ、意図的なスクロール操作がUIテスト自動化の信頼性を高めるカギになります。
Seleniumでよく使うスクロール操作はこんな感じです:
- 縦スクロール:ページを上下に動かしてコンテンツを表示
- 横スクロール:横長のテーブルやカルーセルで活躍
- 要素までスクロール:
scrollIntoViewで特定要素を画面内に表示 - ピクセル単位のスクロール:細かい位置調整や段階的なスクロールに便利
- ページ最上部/最下部へのジャンプ:一気にページ端まで移動
なぜこれが大事なのか?今のWebページは、無限スクロールや「もっと見る」ボタン、固定ヘッダー、遅延読み込み画像など動的な要素が盛りだくさん。テストがスクロールできなければ、UIの半分も検証できません。その結果、バグの見逃しやテストの誤検知が増えてしまいます()。
よくある落とし穴:
- 要素を見つけても、画面内に表示されているとは限らない
.click()や.sendKeys()は自動でスクロールしない- 固定ヘッダーが要素を隠してしまうことがある
- 無限スクロールページは、何度もスクロールして全コンテンツを読み込む必要がある
要素を画面内に表示するJavaの例:
1((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
これで「要素が操作できない」エラーを回避できます。
なぜSeleniumでの効率的なスクロールがWebテストに必須なのか
今どきのWebアプリは、スクロールしないと表示されない動的コンテンツがほとんど。最近の調査では、しているそうで、実際はもっと多いはず。Seleniumテストでスクロールしなければ、アプリの大部分を見落とすことになります。
スクロールが必要な場面:
- 無限/遅延読み込みリスト:SNSフィード、商品一覧、ダッシュボードなど
- 「もっと見る」ボタン:ECサイト、ニュース、ディレクトリ系
- 隠れたボタンやリンク:スクロール後に現れる要素
- 固定ヘッダー:要素が隠れるため、位置調整が必要
- 大きなテーブルやカルーセル:横スクロールやコンテナ内スクロールが必要
| テストシナリオ | なぜスクロールが必要か |
|---|---|
| 無限コンテンツフィード(例:SNS) | スクロールするたびに新しい投稿が読み込まれる。すべて検証するには繰り返しスクロールが必要。 |
| 「もっと見る」ページネーション | スクロールやクリックしないと追加要素がDOMに現れない。 |
| 遅延読み込み画像 | スクロールして初めて画像が読み込まれる。すべての画像表示を検証するにはスクロールが必須。 |
| 固定ヘッダーがコンテンツに重なる | 要素がヘッダーの下に隠れる場合があるため、位置調整が必要。 |
| 大きなテーブルやカルーセル | 一度に全内容が見えないため、スクロールして全行・全アイテムを検証する必要がある。 |
メリット:
- テスト網羅性アップ:初期表示以外のUI要素も全部チェックできる
- 手作業の削減:テスト分割や手動操作が不要に
- 自動化の信頼性向上:「要素が見つからない」「操作できない」などの誤検知が減る
例えば、100商品あるECサイトで20件ずつしか表示されない場合、スクロールしないテストだと20%しか検証できません。効率的なスクロールで、見落としを防ぎましょう。

Seleniumで使えるスクロール手法の比較
Seleniumには「scrollDown()」みたいな単純なコマンドはありませんが、いくつかの方法でスクロールができます。主な手法をまとめました:
| 方法 | 対応ブラウザ | 難易度 | 主な用途 |
|---|---|---|---|
| Actions API(Wheel入力) | Chrome, Edge(Selenium 4) | 中 | ネイティブで精密な要素・オフセットスクロール |
| JavaScriptExecutor | 全ブラウザ | 易 | 要素・ピクセル・ページ端へのスクロール |
| キーボード操作(PageDown等) | 全ブラウザ | 易 | ユーザーのキー操作を模擬 |
| 要素内スクロール | 全ブラウザ | 中 | テーブルやカルーセルなどコンテナ内のスクロール |
要素へのスクロール・ピクセル単位スクロール
要素までスクロール:
特定要素を確実に表示したいときに最適。
1js.executeScript("arguments[0].scrollIntoView();", webElement);
Selenium 4のActions API(Chrome/Edge)なら:
1new Actions(driver).scrollToElement(element).perform();
ピクセル単位のスクロール:
段階的な読み込みや細かい位置調整に便利。
1js.executeScript("window.scrollBy(0, 350)", "");
正の値で下方向、負の値で上方向にスクロールします。
使い分けのコツ:
- 精度・信頼性重視なら要素までスクロール
- 段階的な読み込みやユーザーっぽい動きが必要ならピクセル単位
ページ端へのスクロール・無限スクロール対応
最下部までスクロール:
1js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
最上部までスクロール:
1js.executeScript("window.scrollTo(0, 0)");
無限スクロール対応:
ループでスクロール→新規コンテンツ読み込み→終了判定を繰り返します。
1long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
2while (true) {
3 js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
4 Thread.sleep(2000); // 実際のテストでは明示的な待機を!
5 long newHeight = (Long) js.executeScript("return document.body.scrollHeight");
6 if (newHeight == lastHeight) break;
7 lastHeight = newHeight;
8}
このパターンで、ユーザーと同じように全コンテンツを読み込めます()。
Seleniumでのカスタムスクロール:execute_scriptの活用
もっと細かい制御が必要なときは、JavaScriptのexecute_scriptが頼りになります。例えば:
- 段階的なスクロールで自然な動きを再現
- 各スクロール後にコンテンツの読み込みを待機
- テーブルやカルーセルなど特定コンテナ内のスクロール
- 固定ヘッダーや動的要素などの特殊ケース対応
例:スムーズな段階的スクロール
1for i in range(10):
2 driver.execute_script("window.scrollBy(0, 500);")
3 time.sleep(0.5)
例:スクロール後のコンテンツ待機
1js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
2WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
3wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("new_element")));
ベストプラクティス:
- スクロール後は必ず明示的な待機で新規コンテンツを確認
scrollIntoViewの{block: "center"}で見やすさアップも- 固定のsleepは避け、実際のDOM変化に基づく待機を
- コンテナ内は
element.scrollTop = ...やelement.scrollBy(...)をJSで実行
ブラウザごとのSeleniumスクロール最適化
ここは意外と大事なポイント。ブラウザによってスクロールの挙動が違います:
- Chrome/Edge:Actions API・JSともにフル対応
- Firefox:JSは良好、Actions APIは一部制限あり。スムーズスクロールには調整が必要な場合も
- Safari:Actions API非対応。JSのみ利用可()
- ヘッドレスモード:ウィンドウサイズを明示的に指定しないとスクロール挙動が不安定になることも
ポイント:
- 早い段階で全ターゲットブラウザでスクロールロジックを検証
- JSによるスクロールを汎用的なフォールバックとして活用
- 固定ヘッダー対策には数ピクセル余分にスクロール、またはカスタムJSを
- ヘッドレス時は
driver.manage().window().setSize(...)でウィンドウサイズを明示
ThunderbitでSeleniumテスト開発を加速
ここでおすすめしたいのが。Seleniumでブラウザ操作を自動化するだけでなく、スクロールや動的コンテンツが多いページからデータを抽出したいときにめちゃくちゃ便利です。
ThunderbitがSeleniumを補完するポイント:
- 無限スクロールページも一括抽出:ThunderbitのAIが自動でスクロール・ページネーションし、商品名や価格、画像など構造化データを数クリックで取得
- テスト用リファレンスデータ生成:ThunderbitでUIの期待値データをサクッと集めて、Seleniumテストで画面と突き合わせて検証
- テスト開発の効率化:「AIフィールド提案」機能でセレクタや構造を自動抽出し、Seleniumのロケータ作成も簡単に
活用例:
- Thunderbitで動的ECページの商品データを全件スクレイピング(自動でスクロール&抽出)
- データをGoogleスプレッドシートやCSVにエクスポート
- Seleniumテストでページをスクロールし、画面上の商品情報を集めてThunderbitのデータセットと比較
- すべての商品が正しく表示・読み込みされているか検証
この組み合わせなら、壊れやすいスクレイピングコードに悩まず、本当に大事なUI検証に集中できます。Thunderbitのや定期スクレイピング機能も、大規模・動的サイトで特に便利です。
実践例:現場で役立つSeleniumスクロールテスト
ここからは、実際の現場で使えるシナリオとコード例を紹介します。
1. 大きなテーブルのスクロール
独自のスクロールバーを持つデータグリッドの場合:
1WebElement table = driver.findElement(By.id("data-table"));
2js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", table);
テーブルの最下部までスクロール。各行ごとに検証したい場合は段階的にループもOK。
2. 無限スクロールフィードの操作
1prev_count = 0
2while True:
3 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
4 time.sleep(2)
5 posts = driver.find_elements(By.CSS_SELECTOR, ".post")
6 if len(posts) == prev_count:
7 break
8 prev_count = len(posts)
新しい投稿が現れなくなるまで全件読み込み。
3. 遅延読み込み画像の検証
1List<WebElement> images = driver.findElements(By.tagName("img"));
2for (WebElement img : images) {
3 if ("lazy".equals(img.getAttribute("loading"))) {
4 js.executeScript("arguments[0].scrollIntoView(true);", img);
5 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
6 wait.until(d -> (Boolean) ((JavascriptExecutor)d).executeScript("return arguments[0].complete && arguments[0].naturalWidth > 0;", img));
7 Assert.assertTrue((Integer) js.executeScript("return arguments[0].naturalWidth;", img) > 0);
8 }
9}
各画像を画面内に表示し、正しく読み込まれたか検証。
4. カルーセルの横スクロール
1WebElement carousel = driver.findElement(By.className("carousel"));
2js.executeScript("arguments[0].scrollBy(300, 0);", carousel);
カルーセルを右に300pxスクロール。
5. コンテンツ読み込み失敗の検知
各スクロール後に明示的な待機で新規要素やローディングスピナーを確認。タイムアウト時は状態を記録し、失敗として扱う。
ステップバイステップ:Seleniumで効率的なスクロールを実装する手順
実践的なチェックリストはこちら:
- スクロールが必要か判断:隠れた要素、遅延読み込み、ページネーションの有無を確認
- 要素の存在確認:明示的な待機でDOM上に要素があるかチェック
- 適切なスクロール手法を選択:
- 精度重視なら要素までスクロール
- 段階的読み込みならピクセル単位
- 無限スクロールならループ
- スクロール実装:JSやActions APIを使い分け
- 各スクロール後に同期:新規コンテンツの読み込みを待機(固定sleepは避ける)
- コンテンツ検証:要素が表示・読み込み・操作可能かアサート
- ブラウザ最適化:全ターゲットブラウザで検証、JSをフォールバックに
- Thunderbit連携:大量データの事前取得や検証に活用
- 不要なスクロールは最小限に:必要な分だけ動かす
- ロジックのドキュメント化:なぜその手法を選んだかコメントを残す
| ステップ | 主なアクション |
|---|---|
| 必要性の判断 | このシナリオでスクロールが必要か? |
| 要素の存在確認 | DOM上に要素があるか待機 |
| 手法の選択 | 要素・ピクセル・ループ・コンテナ内など |
| 実装 | JS/Actions/キー操作を使い分け |
| 同期 | 各スクロール後に新規コンテンツを待機 |
| 検証 | 表示・正しさ・操作性をアサート |
| ブラウザ最適化 | Chrome/Firefox/Edge/Safariで検証 |
| Thunderbit連携 | データ抽出・検証に活用 |
| 最小化 | 無駄なスクロールを避ける |
| ドキュメント化 | 手法選択理由をコメントで明記 |
まとめ・重要ポイント
Seleniumでの効率的なスクロールは、今のWebテスト自動化の基盤です。動的コンテンツや無限スクロールが当たり前の今、実ユーザーと同じようにスクロールできてこそ、UIの本質的な検証ができます。特に大事なのは:
- 目的を持ってスクロール:どこで・なぜスクロールが必要かを見極める
- 適切な手法を選ぶ:精度重視なら要素まで、柔軟性ならJS、ネイティブ挙動ならActions API(対応ブラウザで)
- 同期と検証を徹底:スクロール後は必ずコンテンツの読み込み・表示を確認
- 全ブラウザで最適化:どこでも動くロジックを目指し、JSを汎用手段に
- Thunderbitの活用:Seleniumとを組み合わせれば、スクロールが多い動的ページでもデータ抽出・検証がスムーズ
Seleniumテストをさらに進化させたい人は、Thunderbitのもぜひ試してみてください。さらに自動化ノウハウを深めたい人はもチェック!
快適なスクロール自動化で、テストが本当に検証すべき内容をしっかりカバーしましょう。
よくある質問
1. SeleniumでDOM上に要素があっても操作できないのはなぜ?
Seleniumは自動で要素を画面内にスクロールしません。画面外の要素はElementNotInteractableExceptionが出ることも。操作前にスクロールで表示させましょう。
2. 無限スクロールページはどう対応すればいい?
ループで最下部までスクロール→新規コンテンツの読み込みを待機→変化がなくなったら終了、という流れが基本です。固定sleepではなく、実際のコンテンツ変化に基づく明示的な待機を使いましょう。
3. すべてのブラウザで動くスクロールコードのコツは?
JavaScriptのexecute_scriptが一番汎用的です。Actions APIはChrome/Edgeで有効ですが、Safariや古いFirefoxでは非対応の場合も。必ず全ターゲットブラウザで動作確認を。
4. ページ全体だけでなく、テーブルやコンテナ内もスクロールできる?
はい、JavaScriptでscrollTopやscrollByを使えば、特定の要素内も自在にスクロールできます。例:js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", tableElement);
5. ThunderbitはSelenium自動化にどう役立つ?
ThunderbitのAIウェブスクレイパーは、動的・無限スクロールページから全データを抽出し、Seleniumテスト用のリファレンスデータとして活用できます。UI検証の効率化や開発スピード向上に最適です。
SeleniumやWebスクレイピング、自動化のベストプラクティスはでも紹介しています。