Seleniumの面接では2つのことが試されます。安定したUIテストを書けるか(待機、ロケーター、ページオブジェクト)、そしてチームが使い続けられるフレームワークを設計できるか(構造、データ、レポート、CIでの実行)です。最も頻繁に話題に上がるのはフレーキーテストです。Seleniumを使ったことがある人なら誰もが、その対処に苦労してきたからです。
以下は24問の質問と回答です。コードが役立つ場面ではJavaとPythonの構文を使っていますが、考え方はどの言語にも当てはまります。
基礎
1. Seleniumとは何ですか?またその構成要素は?
Seleniumは、Webブラウザを自動化するためのオープンソースのスイートです。Selenium WebDriverはドライバーを通じてブラウザを操作するもので、一般に「Selenium」と言えばこれを指します。Selenium Gridは、多数のマシンとブラウザでテストを並列実行します。Selenium IDEは、記録と再生を行う拡張機能です。Seleniumはデスクトップアプリや組み込みのテストレポート機能を扱わないため、テストフレームワークと組み合わせて使います。
2. WebDriverはどのように動作しますか?
テストはW3C WebDriverプロトコルを使ってHTTP経由でChromeDriverやGeckoDriverなどのブラウザドライバーにコマンドを送り、ドライバーがブラウザを操作して結果を返します。最近のSeleniumにはSelenium Managerが含まれており、適切なドライバーを見つけてダウンロードしてくれます。
3. Seleniumがサポートするロケーターにはどのようなものがあり、どれを好みますか?
ID、name、class name、tag name、link text、partial link text、CSSセレクター、XPathがあります。安定したIDやdata-testidのような専用のテスト属性を優先し、次にCSSを使います。ツリーを上にたどる必要がある場合やテキストで一致させたい場合はXPathを使います。/html/body/div[3]/div[2]のような、位置に基づく長いパスは避けましょう。レイアウトが変わると壊れてしまいます。
4. findElementとfindElementsの違いは何ですか?
findElementは最初に一致した要素を返し、見つからなければNoSuchElementExceptionをスローします。findElementsはリストを返し、一致するものがなければ空のリストになるので、要素が存在しないことを確認するのに便利です。
5. driver.close()とdriver.quit()の違いは何ですか?
close()は現在のウィンドウを閉じます。quit()はすべてのウィンドウを閉じてセッションを終了します。ブラウザのプロセスを残さないよう、teardownではquit()を使いましょう。
待機とフレーキーテスト
6. 待機にはどのような種類がありますか?
| 待機 | 仕組み |
|---|---|
| 暗黙的待機 | 要素を探すためのグローバルなタイムアウト |
| 明示的待機 | 特定の要素に対する特定の条件を待つ |
| Fluent待機 | ポーリング間隔と無視する例外をカスタマイズできる明示的待機 |
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
明示的待機を優先しましょう。暗黙的待機と明示的待機を混在させると、予測できない遅延が発生することがあります。
7. なぜThread.sleepを使ってはいけないのですか?
常に指定した時間だけ待つためスイート全体が遅くなり、しかも遅い日にはそれでも足りません。条件ベースの待機なら、条件が満たされた時点ですぐに次へ進み、満たされなければ明確なメッセージとともに失敗します。
8. フレーキーテストの原因は何で、どう修正しますか?
よくある原因と対処法:
- タイミング:sleepではなく、正確な条件に対する明示的待機を使う。
- データの共有や残留:テストごとにテストデータを作成し、後始末をする。
- テスト間の依存:各テストを独立させ、単独でも実行できるようにする。
- 不安定なロケーター:テストIDを追加し、位置に基づくパスを避ける。
- アニメーションとオーバーレイ:オーバーレイが消えるのを待つか、テスト環境でアニメーションを無効にする。
- 環境の問題:テスト環境を安定させ、ネットワークやサードパーティの呼び出しを確認する。
- 並列実行の干渉:スレッドごとに状態を分離する。
フレーキーテストは、全員の足を引っ張らないよう隔離(quarantine)してから、きちんと修正しましょう。あちこちにリトライを追加するだけでは、本当のバグを隠してしまいます。
9. StaleElementReferenceExceptionとは何ですか?
取得した要素がページから切り離された状態で、通常はページが再レンダリングされたことが原因です。長期間参照を保持するのではなく、使用直前に要素を再取得するか、新しい要素を待つことで修正します。
10. クリックできない要素(ElementClickInterceptedException)にはどう対処しますか?
バナーやローディングオーバーレイなど、何かが要素を覆っています。オーバーレイが消えるのを待つ、要素を表示領域までスクロールする、バナーを閉じるなどの対処をします。JavaScriptによるクリックは最後の手段にすべきです。実際のユーザーはクリックできないわけで、テストが本当のバグを隠してしまうからです。
ページ機能の扱い
11. ドロップダウン、アラート、フレーム、ウィンドウはどのように扱いますか?
- ドロップダウン:標準のselect要素にはSelectクラスを使い、カスタムドロップダウンにはクリック操作を組み合わせます。
- アラート:driver.switchTo().alert()で承認、却下、または内容の読み取りを行います。
- フレーム:switchTo().frame(...)で切り替え、defaultContent()で戻ります。
- ウィンドウとタブ:ウィンドウハンドルを取得し、新しいものに切り替えて、また戻します。
12. ファイルのアップロードとダウンロードはどのように扱いますか?
アップロードでは、input type="file"要素にsendKeysでファイルパスを送ります。ダウンロードでは、オプションでブラウザのダウンロードディレクトリを設定し、ファイルが現れるのを待ってから、その名前と内容を確認します。
13. SeleniumでJavaScriptを実行するにはどうしますか?
JavascriptExecutor.executeScriptを通じて行います。たとえばスクロールしたり、APIでは取得できない値を読み取ったりする場合です。使用は控えめにしましょう。
14. ヘッドレスモードとは何ですか?
ブラウザが表示ウィンドウなしで動作するモードで、より高速で、サーバーやCIでも動作します。デバッグ時は表示ありで実行して確認し、レイアウトが異なる場合があるためビューポートサイズも確認しましょう。
フレームワーク設計
15. Page Object Modelとは何ですか?
各ページやコンポーネントを、そのロケーターと操作を保持するクラスにします。テストはloginPage.loginAs(user)のようなメソッドを呼び出し、ロケーターに直接触れません。UIが変わったときは、多くのテストではなく1つのクラスを修正すれば済みます。
class LoginPage:
def __init__(self, driver):
self.driver = driver
def login_as(self, user, password):
self.driver.find_element(By.ID, "user").send_keys(user)
self.driver.find_element(By.ID, "pass").send_keys(password)
self.driver.find_element(By.ID, "submit").click()
16. 優れたテストフレームワークには何が含まれますか?
テストランナー(TestNG、JUnit、pytest)、ページオブジェクト、異なるブラウザ用のドライバーファクトリ、環境ごとの設定、テストデータ管理、待機用のヘルパー、レポート、ログ、失敗時のスクリーンショット、CI連携です。
17. テストデータはどのように管理しますか?
テストが必要とするデータは、UI経由ではなく、開始時にAPIやデータベースのセットアップを通じて作成し、終了後に削除します。データはテストにハードコードせずファイルやビルダーに保持し、別のテストが残したデータに依存するテストは避けます。
18. テストを並列で実行するにはどうしますか?
ランナーの並列機能を使い、各スレッドに独自のドライバーを持たせ(たとえばThreadLocalで)、テストを独立させ、Selenium Gridやクラウドブラウザサービス上で実行してブラウザ間でスケールさせます。
19. Selenium Gridとは何ですか?
ハブとノード(またはGrid 4の分散構成)を持つシステムで、異なるブラウザやOS上でテストを並列実行します。総実行時間を短縮し、より多くのブラウザをカバーできます。
戦略とシナリオ
20. Seleniumで自動化すべきもの、すべきでないものは何ですか?
ログイン、チェックアウト、重要なリグレッションパスなど、安定していて価値が高く、繰り返し可能なフローを自動化します。単発の確認、頻繁に変わるUI、より下位層でテストする方が適したものは自動化しません。健全なスイートは、多くのユニットテストとAPIテスト、より少ないUIテスト、そして少数のエンドツーエンドフローで構成されます。
21. captchaや二要素ログインがあるアプリケーションをどのようにテストしますか?
テストでそれらを突破しようとはしません。無効化されているテスト環境、固定コードやバイパスフラグを持つテストアカウント、またはセッションを作成するテストAPIを使います。
22. テストはローカルでは通るのにCIで失敗します。何を確認しますか?
ブラウザとドライバーのバージョン、画面サイズとヘッドレスの違い、遅いマシンでのタイミング、環境データ、ネットワークアクセス、タイムゾーンとロケール、データを共有する並列実行を確認します。失敗時にスクリーンショット、ページソース、ログを取得して比較します。
23. Selenium、Playwright、Cypressのどれを選ぶかはどう判断しますか?
Seleniumは多くの言語とブラウザをサポートし、巨大なエコシステムがあります。PlaywrightとCypressは待機が組み込まれ、セットアップが簡単で、優れたデバッグツールを備えており、新規プロジェクトにより適している場合があります。適切な選択は、言語、ブラウザの要件、チームのスキルに依存します。ブランドの好みではなく、理由を述べましょう。
24. チェックアウトフローの自動化について説明してください。
「API経由でユーザーと商品を作成し、UI経由でログインするかセッションを再利用します。各ステップ(検索、商品、カート、支払い)にページオブジェクトを用意します。テスト用の支払い方法を使い、確認要素を待ち、UIとAPIの両方で注文を検証し、失敗時にはスクリーンショットを撮ります。テストは自身の注文をクリーンアップし、並列で実行し、マージのたびにパイプラインで実行します。」
準備の方法
ページオブジェクト、明示的な待機、失敗時のスクリーンショット、CI実行を備えた小さなスイートをデモサイト向けに書きましょう。フレーキーなテストをどう修正したかを、原因と変更点とともに説明する練習をしましょう。ロケーターと待機をその場でコーディングできるようにしておきましょう。練習ルーティンについてはコーディング面接アシスタントガイドを、ソフトスキル面接については行動面接ガイドをご覧ください。
答えは声に出して言い、「とりあえず待機を追加する」といった曖昧な部分は文字起こしを読んで確認しましょう。ライブ面接では、AIツールに関する雇用主のルールに従ってください。
YesToTheOfferでSelenium面接の回答を練習しましょう
模擬技術面接を実行し、フレームワークを声に出して説明し、後で文字起こしを確認します。30分無料、サブスクリプションなし。



