Going Atomic: How

これは、私の技術的な投稿の 2 回目です。繰り返しますが、Selenium 2 の内部構造に興味がある場合は、すぐに他のものにスキップしてください。

これは、私の技術的な投稿の 2 回目です。繰り返しますが、Selenium 2 の内部構造に興味がある場合は、すぐに他のものにスキップしてください。プロジェクトに関する技術的な決定がどのように、そしてなぜ行われたかに興味がある場合は、読み続けてください…。

勇敢なヒーローたちは窮地に立たされました。さまざまな WebDriver 実装と Selenium Core で使用されるコードの共有ライブラリを作成することにしましたが、これを行うための要件は、実際に実現することとは矛盾しているように思われました。

幸いなことに、私たちがこの道を進み始めたのとほぼ同時期に、Google は Closure Compiler をオープンソース化しました。これは、JavaScript ファイルのセットを入力として受け取り、JavaScript を出力する JavaScript コンパイラです。コードをそのまま単一のファイルに渡すように構成することも、スクリプトを積極的にコンパイルし、未使用のコードパスを削除し、出力を可能な限り最小化することもできます。Closure Compiler は多くの Google 製品で使用されているため、信頼性と一貫性があることがわかっています。

Closure Compiler を最大限に活用するために、私たちは Closure Library を使用して atoms を記述しています。これは、他の JS ライブラリほどよく知られていませんが、堅牢で、十分にテストされており、活発に開発されています。また、JsUnit の使いやすい拡張機能も備えており、テストの作成がこれまで以上に簡単なタスクになっています。また、コードをモジュール化するための使いやすいメカニズムも備えています。

したがって、単一の JavaScript 関数 (およびその依存関係) をコンパイルして、JS の最小化されたフラグメントにできることがわかっていれば、すべて準備完了ですよね? そうでもありません。

問題は、atoms が世界観の異なる 2 つのフレームワークから抽出されていることです。例として、Selenium 1 の getAttribute (http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#getAttribute(java.lang.String)) メソッドは特定のアトリビュートの値のみを返しますが、WebDriver の getAttribute (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html#getAttribute(java.lang.String)) メソッドは、プロパティまたはアトリビュートのいずれかの値を返します (要素のアトリビュートまたはプロパティのどちらであるかを覚えておくのが難しい場合があるため)。

コンピュータサイエンスにおけるすべての問題と同様に、この問題を解決するために、追加のレベルの間接参照が使用されます。

私たちは、atoms の上で WebDriverSelenium の両方の API の期待される動作を実装するのに忙殺されています。

もちろん、この注意深く圧縮された JS をドライバーにどのように取り込むかという、明白な疑問があります。 1 つのオプションは、生の JavaScript を各言語バインディングのファイルとして含め、必要に応じてそれらを取り込むことです。それは可能ですが、各言語バインディングが肥大化し、多くの重複が発生します。別の方法は、atoms を可能な限りドライバーにプッシュすることです。これが私たちが行うことです。 WebDriver のビルドプロセスの一部として、圧縮された JS を取得し、特定のドライバーで使用できる形式に変換します。たとえば、IE ドライバーの場合、C ヘッダーファイルの定数に変換します。これらの定数は、ドライバーから参照して、"executeScript" で使用されるメカニズムと同じメカニズムで実行できるスクリプトに変換できます。

この一見すると複雑なアプローチから何が得られるのでしょうか? ドライバー間で同じコードを共有できる能力以外に? 多くのことがあります。 1 か所でバグを修正し、その修正がすべてのドライバーで拾われるようにすることができるため、メンテナンスのコストが劇的に低下します。純粋な JS で作業し、DOM をクエリするだけなので、コードを開発中にブラウザでユニットテストを実行できます。これにより、非常に緊密なフィードバックサイクルが実現します。また、コードに慣れていない開発者が私たちのやり方を簡単に確認して、パッチを送ってくれるようになります (いつも感謝しています!)。最後に、結果の一貫性を確保できます。

はい、何か質問はありますか?

最終更新日: 2024年4月5日: Broken Links (#1612)[deploy site] (c73064b0d9b)