Selenium は、 Webアプリケーションをテストするためのポータブルフレームワークである。 Selenium は、テストスクリプト言語(Selenium IDE)を学ぶ必要なしに、機能テストを作成するための再生ツールを提供する。また、C#、Groovy、Java、Perl、PHP、Python、Ruby、Scala 等の一般的なプログラミング言語でテストを作成するためのテストドメイン固有言語(Selenese)も提供する。その後、テストはほとんどの最新のWebブラウザに対して実行できる。Selenium は、Windows、Linux、およびmacOSで動作する。これは、Apache License 2.0 の下でリリースされたオープンソースソフトウェアである。

## 歴史

Selenium は、2004年にJason Huggins によってThoughtWorks の内部ツールとして開発された。 Huggins は後に、ThoughtWorks の他のプログラマやテスタが参加し、Paul Hammant がチームに加わり、後に「Selenium Remote Control」(RC)となる2番目の操作モードの開発を進めた。ツールはその年オープンソース化された。

2005年、Dan Fabulich とNelson Sproul は、(Pat Lightbodyの助力を得て)Selenium-RC を最も有名なものに変える一連のパッチを受け入れることを申し出た。同じ会議で、プロジェクトとしてのSelenium の運営は委員会として継続され、Huggins とHammant がThoughtWorks の代表となった。

2007年、Huggins はGoogle に加わった。Jennifer Bevan のような他の人と共に、彼はSelenium RC の開発と安定化を続けた。同時に、ThoughtWorks のSimon Stewart は、WebDriver と呼ばれる優れたブラウザ自動化ツールを開発した。2009年、Google Test Automation Conference での開発者間の会議の後、2つのプロジェクトをマージし、新しいプロジェクトをSelenium WebDriver またはSelenium 2.0 と呼ぶことが決定した。

2008年、Philippe Hanrigou(当時はThoughtWorks)は「Selenium Grid」を作成した。これは、複数のローカルまたはリモートシステムで複数のSelenium テストを同時に実行できるハブを提供し、テストの実行時間を最小限に抑える。 グリッドは、オープンソースとして、Selenium RC の内部/プライベートGoogle クラウドと同様の機能を提供した。Pat Lightbody はすでに「HostedQA」のプライベートクラウドを作成しており、これをGomez、Inc. に販売した。

Selenium の名前は、メールでHuggins が作ったジョークに由来し、マーキュリーという競合他社をあざけって、Selenium(セレン)のサプリメントを摂取することで水銀中毒を治すことができると述べている。メールを受け取った他の人は名前を取り、それを採用した。

## コンポーネント

Selenium はいくつかのコンポーネントで構成され、それぞれがWeb アプリケーションのテスト自動化の開発を支援する特定の役割を果たす。

### Selenium IDE

Selenium IDE は、Selenium テスト用の完全な統合開発環境(IDE)である。これは、 FirefoxアドオンおよびChrome 拡張機能として実装される。機能テストの記録、編集、デバッグが可能である。 以前はSelenium Recorder として知られていた。Selenium IDE は、もともと笠谷真也によって作成され、2006年にSelenium プロジェクトに寄付された。Selenium IDE は以前はほとんどメンテナンスされていなかった。Selenium IDE は2018年に積極的にメンテナンスされ始め、SideeXが開発基礎とされた。

スクリプトは自動的に記録され、手動で編集されて、自動補完サポートとコマンドをすばやく移動する機能を提供する。スクリプトは、Selenium 用の特別なテストスクリプト言語であるSelenese で記録される。Selenese には、ブラウザでアクションを実行(リンクをクリックしてオプションを選択)するコマンド、および結果のページからデータを取得するコマンドが用意されている。

Firefox 用のSelenium IDE の2.xバージョンは、Firefox 55 のアップグレード後に機能しなくなり、Selenium IDE 3.x に置き換えられた。

公式のSelenium IDE プロジェクトに加えて、2つの代替Selenium IDE ブラウザ拡張機能が積極的に維持されている: Kantu(オープンソースGPLライセンス)とKatalon Recorder(クローズドソース)。

### Selenium クライアントAPI

Selenese でテストを作成する代わりに、テストをさまざまなプログラミング言語で作成することもできる。これらのテストは、Selenium クライアントAPIのメソッドを呼び出すことによってSelenium と通信する。Selenium は現在、Java、C#、Ruby、JavaScript、R、Python 用のクライアントAPIを提供している。

Selenium 2では、WebDriver を中心コンポーネントとして使用する新しいクライアントAPIが導入された。ただし、古いクラス(Selenium クラスを使用)は引き続きサポートされる。

### Selenium WebDriver

Selenium WebDriver は、Selenium RC の後継である。Selenium WebDriver は(Selenese で、またはクライアントAPIを介して送信される)コマンドを受け入れ、それらをブラウザに送信する。これは、ブラウザにコマンドを送信して結果を取得するブラウザ固有のブラウザ・ドライバを介して実装される。ほとんどのブラウザ・ドライバは、実際にブラウザアプリケーション(Firefox、Google Chrome、Internet Explorer、Safari、Microsoft Edge 等)を起動してアクセスする。ヘッドレスブラウザーHtmlUnitを使用してブラウザーをシミュレートするHtmlUnit ブラウザ・ドライバもある。

テストを実行するためにSelenium サーバが必要であったSelenium 1とは異なり、Selenium WebDriver はテストを実行するために特別なサーバを必要としない。代わりに、WebDriver は直接ブラウザインスタンスを起動して制御する。ただし、Selenium Grid をWebDriver と共に使用して、リモートシステムでテストを実行できる(以下参照)。可能な場合、WebDriver はブラウザベースのJavaScript コマンドではなく、ネイティブのオペレーティングシステムレベルの機能を使用してブラウザを駆動する。これにより、セキュリティ制限等、ネイティブコマンドとJavaScript コマンドの微妙な違いに関する問題が回避される。

実際には、これはSelenium 2.0 API の呼び出しがSelenium 1.0 API の呼び出しよりも大幅に少ないことを意味する。Selenium 1.0は、さまざまなブラウザ操作に豊富なインターフェースを提供しようとしたが、Selenium 2.0は、開発者が独自のドメイン固有言語を作成できる基本的なビルディングブロックのセットを提供することを目的としている。そのようなDSL の1つは既に存在する。Ruby 言語のWatir プロジェクトには、優れた設計の豊富な歴史がある。 Watir-webdriver は、Ruby のSelenium-Webdriver のラッパーとしてWatir API を実装している。 Watir-Webdriverは、WebDriver 仕様とHTML 仕様に基づいて、完全に自動的に作成される。

2012年の初めに、当時Google に、現在はFacebook にいたSimon Stewart(WebDriver の発明者)とMozilla のDavid Burns は、WebDriver をインターネット標準にするためにW3Cと交渉している。2012年7月にワーキングドラフトがリリースされ、2018年6月に勧告が行われた。Selenium-Webdriver(Selenium 2.0)は、Python、Ruby、Java、およびC#で完全に実装およびサポートされている。

### Selenium リモートコントロール

Selenium Remote Control(RC)は、Java で記述されたサーバであり、HTTP経由でブラウザのコマンドを受け入れる。 RCを使用すると、任意のプログラミング言語でWeb アプリケーションの自動テストを作成できる。これにより、Selenium を既存の単体テストフレームワークに適切に統合できる。テストの記述を簡単にするために、Selenium プロジェクトは現在、PHP、Python、Ruby、.NET、Perl、Java 等のクライアント・ドライバを提供している。 Java ドライバはRhino エンジン経由でJavaScript でも使用できる。HTML テストケースを起動するには、Selenium RC サーバのインスタンスが必要である。つまり、並列実行ごとにポートが異なる必要がある。ただし、Java/PHP テストケースでは、1つのSelenium RC インスタンスのみを継続的に実行する必要がある。

Selenium Remote Controlは、Paul Hammant によって設計されたDriven Selenium またはSelenium B のリファクタリングであり、Selenium の共同作成者としてJason 氏と称された。 元のバージョンは、Java、.NET、Python またはRuby のテスト言語から、問題のブラウザのプロセスを直接起動した。Wire protocol(当時は「Selenese」と呼ばれていた)は、各言語ポートで再実装された。 Dan Fabulich とNelson Sproul によるリファクタリングの後(Pat Lightbody の助力を得て)、ドライビング・テスト・スクリプトとブラウザの間に中間デーモンプロセスがあった。利点には、リモートブラウザを駆動する機能と、コードのすべての行をますます成長する言語のセットに移植する必要性の減少が含まれる。Selenium Remote Control は、2006年にDriven Selenium コードラインから完全に引き継がれた。'Driven' / 'B' および 'RC' のブラウザパターンは応答/要求だったが、後にCometと呼ばれるようになった。

Selenium 2 のリリースに伴い、Selenium RC はSelenium WebDriver を支持して正式に非推奨になった。

### Selenium Grid

Selenium Grid は、リモートマシンで実行されているWeb ブラウザインスタンスをテストで使用できるようにするサーバである。Selenium Grid では、1つのサーバがハブとして機能する。 テストはハブに接続して、ブラウザインスタンスへのアクセスを取得する。ハブには、ブラウザインスタンス(WebDriver ノード)へのアクセスを提供するサーバのリストがあり、テストでこれらのインスタンスを使用できる。Selenium Grid を使用すると、複数のマシンで並行してテストを実行し、さまざまなブラウザのバージョンとブラウザの構成を、個別のテストではなく、集中管理できる。

リモートブラウザインスタンスでテストを実行する機能は、テストの負荷を複数のマシンに分散し、異なるプラットフォームまたはオペレーティングシステムで実行されているブラウザでテストを実行するのに役立つ。後者は、テストに使用されるすべてのブラウザが同じプラットフォームで実行できない場合に特に役立つ。

## 参考

- 受け入れ試験
- カピバラ(ソフトウェア)
- Given-When-Then
- Webテストツールのリスト
- MediaWiki Selenium拡張
- MediaWiki Selenium Framework拡張
- 回帰試験
- ロボットフレームワーク