原子化:なぜ?
カテゴリー
これは、Selenium WebDriver の内部構造に関する私の技術ブログシリーズの第 1 回です。技術的な詳細に興味がない場合は、ここで離れても構いません。
まだ読んでいますか? 素晴らしい。
Selenium と WebDriver プロジェクトが統合される直前まで遡ってみましょう。非常に明白なことに、2 つの別々のコードベースが存在しました。より詳しく見て、少し異なる視点で見ると、それ以上のものがありました。webdriver のテストスイートを使用して、複数の、ほぼ独立したドライバコードベースの動作を定義しました。IE ドライバは C で記述され、HtmlUnit ドライバは Java で、Firefox ドライバは主に Javascript で記述されています。
これは、「同等のコード」、つまり同じ機能を実行するが、異なる方法で実装されたコードが多数存在することを意味します。この自然な結果として、ドライバ間で動作が異なる可能性がありました。さらに悪いことに、バグが見つかった場合、すべてのブラウザで確認する必要があり、個人が実際にコードを修正できるとは限りませんでした。結局のところ、誰もがプロジェクトで使用しているすべての言語での記述に慣れているわけでも、すべてのテクノロジーに精通しているわけでもありません。Selenium のようなオープンソースプロジェクトの場合、これは大きな問題です。比較的小規模な主要開発者の中核グループが、はるかに大規模な個人チームによる小さな変更や修正の提出によって支えられています。開発コミュニティとして効果的に機能することを困難にするものはすべて悪いことです。
そこで、私たちは島からの脱出方法、つまりさまざまなドライバと selenium コアの間でコードを簡単に共有できるようにし、1 か所でのみバグを修正し、その修正がこのメカニズムを利用するすべてのドライバに波及するようにするメカニズムを求めていました。さらに重要なことに、使いやすく、多くの言語やテクノロジーに精通していない人がすぐに始められる必要がありました。
このメカニズムはどのようなものになるでしょうか? これにはいくつかの要素が関係していますが、最も重要な要素は、マージすることを考えているコードの大部分がブラウザの状態(「要素を見つける」、「この属性の値を取得する」)をクエリすることであり、Jason Huggins が私に指摘するように、ブラウザの状態をクエリするための自然言語は Javascript です。Javascript の良い点の 1 つは、Javascript で優れた高速開発サイクルを実現できることです。テストを変更し、保存して、ブラウザで「更新」をクリックするだけです。それはある意味魅力的です。さらに良いことに、Javascript に精通している開発者はたくさんいます。
そこで、Javascript を使用することにしました。
この共有コードは、ブラウザの自動化に必要な最小限の有用な機能の断片で構成されるため、それらを「ブラウザ自動化アトム」、または略して「アトム」と呼ぶことにしました。最初から記述するのではなく、最も簡単な方法は既存のコードから抽出することでした。これは実戦でテスト済みのものなので、堅牢であることがわかっています。
1 つ非常に明らかな欠点がありました。すべてのドライバが Javascript で記述されているわけではありません。すべてのブラウザで JS を実行するためのメカニズム (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html
) が利用可能ですが、DOM をクエリするたびにブラウザの JS エンジンに大量のコードをダンプするのは非常に非効率です。結局のところ、コードのほとんどは不要であり、すべての JS エンジンが平等に作成されているわけではありません。驚くほど高速なものもあれば、そうでないものもあります。
また、コードを単一のモノリシックファイルにするのではなく、管理しやすいサイズのモジュールに分割することも望ましいでしょう。それは、何らかの巧妙な「モジュールローディング」機能を意味します。ただし、このコードは、追加のスクリプトをロードするために「script」タグを記述することが可能な環境内で常に実行されるとは限りません。Firefox 拡張機能の内部ではそれはできませんが、他の方法でファイルをロードすることはできます。ただし、モジュールをどのように結び付けるかは、それに対処する必要があります。
ああ! これらの相反する要件:使用したい機能を含む小さなモジュール、余分なコードなし、および追加モジュールのロードの手間を最小限に抑えるために、すべてを単一のファイルに収めること。それはあまり互換性のあるリストのようには聞こえません。これらの違いをどのように解決したかが、私の次の投稿のトピックです…。