30年以上前に最初にリリースされたMicrosoft Windowsは、今日、デスクトップオペレーティングシステムの中で議論の余地のないリーダーです。 Webアプリケーションを開発するとき、これは単に無視できません。 この記事では、WindowsでSeleniumを使用するいくつかの機能について説明し、人生を大幅に簡素化するシンプルで現場で実証済みのソリューションを提供したいと思います。
WindowsとLinuxの違い
以前の記事( first 、 second 、 third )で、スケーラブルなSeleniumクラスターを編成するためのオープンソースのアプローチとツールについて説明しました。 また、同じツールを使用して開発者のマシンでテストを効果的に実行する方法についても話しました。 すべての記事は、オペレーティングシステムとしてLinuxを使用しました。 Seleniumに関して、WindowsはLinuxとどのように違いますか?
- 他のプラットフォームには存在しないブラウザーの存在。 バージョンに応じて、WindowsにはInternet Explorer(IE)またはMicrosoft Edgeがプリロードされています。 一度にインストールできるのは、各ブラウザーの1つのバージョンのみです。 両方のブラウザーには、Windows API呼び出しを使用してブラウザーを起動および制御するWebドライバー用の既製の実行可能ファイル(それぞれIEDriverServerおよびEdgeDriver)があります。 この点で、WindowsブラウザーはLinuxブラウザーと違いはありません。
- グラフィカルインターフェイスがオペレーティングシステムに組み込まれています。 Windowsのほとんどのバージョン(Windows Serverの最新バージョンを除く)には、無効にすることも別のグラフィックサーバーに置き換えることもできない組み込みのグラフィカルインターフェイスがあります。 インターフェイスはオペレーティングシステムで自動的に起動し、常にリソースを消費します。 さらに、Windows GUIは、デフォルトで、同じデスクトップ内のすべてのオープン可能なウィンドウ(ブラウザーウィンドウを含む)を表示し、これらのウィンドウのうち1つだけが特定の時点でフォーカスできるようになります。 このため、複数のIEまたはEdgeを並行して実行しようとすると、多くの場合、ウィンドウのフォーカスに関するさまざまな問題が発生します。たとえば、異なるCSSスタイル(リンク上でホバリングするときなど)、トリガーされないDOMイベントなどです。 この問題は非常に干渉します。
- Dockerサポートのほぼ完全な欠如。 Windows Serverの最近のバージョンは、ほとんどのDocker機能をネイティブにサポートしていますが、関心のあるデスクトップバージョンではそのようなサポートはありません。 したがって、これらのバージョンでDockerを実行する唯一の方法は、DockerがインストールされているLinux仮想マシンを使用することです。
ご覧のとおり、Seleniumを使用する際の多くの最新のアプローチ:モニターなしでXサーバーを使用し、コンテナーでブラウザーを起動することはWindowsでは機能しません。 しかし、Linuxと同様のパフォーマンスを達成し、Windowsの既知の制限をバイパスすることは可能ですか? はい、それはあなたが思っているよりも簡単です! 次のセクションでは、これを行う方法を説明します。
カオスから秩序を作り出す
私たちは目標に向かって一歩ずつ進みます。 開始するには、できるだけ簡単に決定してください。 ご存じのとおり、WindowsでのSeleniumの一般的なインストールスキームは次のようになります。
このスキームは、Java仮想マシン(JRE)を使用して起動されたSeleniumサーバー、IEDriverServerまたはEdgeDriver実行可能ファイル、最後にブラウザー自体(IEまたはEdge)で構成されます。 このチェーンには少なくとも1つの脆弱なリンクがあります-SeleniumサーバーとJava。 これは、Seleniumが単純なプロキシサーバーとして機能し、ランダムポートでドライバープロセスを開始してから、すべての要求をこのポートに送信するためです。 主な作業はオペレーティングシステムのネットワークサブシステムによって実行されるため、ネットワークトラフィックのプロキシは、プログラミング言語で最も簡単なタスクです。 Java(50 MB以上)をインストールし、単純なプロキシ用にSeleniumサーバー(20 MB以上)をダウンロードするのは、非常に面倒なソリューションのように見えるのはそのためです。 さらに、Seleniumサーバーは負荷がかかるとうまく機能しません。
- メモリを大量に消費し、フローすることもあります。
- プロキシは「手動」で実行されます。HTTPクライアントの新しいインスタンスが各リクエストに対して作成され、着信リクエストがそれにコピーされます。 このアプローチは非常に非効率的であり、場合によってはプロキシ中に奇妙なタイムアウトを引き起こします。
重いSeleniumサーバーを軽量のSelenoidに置き換えるだけで、状況を大幅に改善できます。
SeleniumサーバーをSelenoidに置き換える方法
SelenoidはGoで書かれた軽量のSeleniumサーバーの代替品です。 Selenoidは1つの小さな(約7 MB)実行可能ファイルとして提供され、外部依存関係はありません。 開始するには、このファイルをダウンロードして実行するだけです。 以前の記事では、SelenoidがDockerコンテナーでブラウザーを起動するのにどれほど便利かを簡単に説明しました-その主な目的。 2番目にサポートされているモードは、コンテナーの代わりに実行可能ファイルを実行し、その中のネットワークトラフィックをプロキシすることです-SeleniumサーバーがIEDriverServerおよびEdgeDriverでこれを行うように。 SeleniumサーバーをSelenoidに置き換えるのは非常に簡単です。 たとえば、Selenoidを使用してInternet Explorerを起動します。
- リリースページからSelenoid実行可能ファイルをダウンロードします 。 実行可能ファイルは通常、32ビットWindowsの場合は
selenoid_windows_amd64.exe
、Windows 64ビットの場合はselenoid_windows_386.exe
と呼ばれます。 私の知る限り、Windowsのデスクトップバージョンには、ファイルをダウンロードするための組み込みのコンソールプログラムがありません。 ただし、 Cygwinとcurlがインストールされている場合は、次のようにファイルをダウンロードできます。
$ curl -o selenoid.exe https://github.com/aerokube/selenoid/releases/download/1.2.1/selenoid_windows_386.exe
- Seleniumダウンロードページから
IEDriverServer.exe
アーカイブをダウンロードして解凍します。 たとえば、IEDriverServer.exe
をC:\
保存します。 - wikiの説明に従ってInternet Explorerを構成します 。
- Selenoidの単純な構成ファイルbrowsers.jsonを作成し
browsers.json
。
{ "internet explorer": { "default": "11", "versions": { "11": { "image": ["C:\\IEDriverServer.exe"] } } } }
selenoid.bat
ファイルを使用して、Seleniumサーバーの代わりにSelenoidを起動します(ポート4444は空いている必要があります)。
C:\selenoid.exe -conf C:\browsers.json -disable-docker -limit 4 > C:\selenoid.log 2>&1
ここでは、前の手順のすべてのファイルが
C:\
保存されていると想定しています。 セレノイドログはC:\selenoid.log
保存されます。-limit
パラメーターに注意してください--limit
に開始できるセッションの数を決定します。 指定されたセッション数が開始されると、新しいリクエストはSeleniumサーバーとまったく同じ方法でキューに入れられます。
- できた! 同じURLでテストを実行できます。
http://localhost:4444/wd/hub
- 軽量を維持するため、Selenoidにはグラフィカルインターフェイスが組み込まれていません。 銃口は、 Selenoid UIという別個の実行可能ファイルとして作成されます。 リリースページからコンパイル済みファイルをダウンロードして実行し、ブラウザで
http://localhost:8080/
を開きhttp://localhost:8080/
。
複数のデスクトップでテストを実行する
SeleniumサーバーをSelenoidに置き換えると、メモリとCPUの消費が大幅に削減されます。 この簡単な手順により、より多くのブラウザを並行して実行できるようになる場合もあります。 ただし、単純な交換では、複数のブラウザーウィンドウを同時に開く問題を解決することはできません。 Windowsは引き続き同じデスクトップに表示され、引き続きフォーカスを失います。 この障害を回避するには、別のデスクトップでブラウザーを実行する方法を学ぶ必要があります。 良いニュースは、デスクトップバージョンでも内部Windows APIが仮想デスクトップをサポートしていることです。デスクトップを切り替えて、これらのデスクトップのウィンドウを互いに独立して起動できます。 しかし、良いニュースがあります-Seleniumのこの動作を得るためにWindowsの内部に飛び込む必要はありません-必要な機能は、 headless-selenium-for-winプロジェクトで既に実装されています。 リリースをダウンロードした後、2つの実行可能ファイルであるアーカイブを取得します: desktop_utils.exe
およびheadless_ie_selenium.exe
。
1つ目は、デスクトップを手動で切り替えるためのコンソールユーティリティです。 コマンドは次のようになります。
C:> desktop_utils.exe -s desktop1
Seleniumを使用するには、2番目のユーティリティheadless_ie_selenium.exe
が必要です。 IEDriverServer.exe
アドオンであり、セッション要求を処理し、新しいデスクトップでIEDriverServer.exe
を自動的に起動します。 IEDriverServer.exe
と同じディレクトリになければなりません。 Selenoidでユーティリティを使用するには、 browsers.json
の実行可能ファイルを置き換えてSelenoidを再起動するだけです。
{ "internet explorer": { "default": "11", "versions": { "11": { "image": ["C:\\headless_ie_selenium.exe"] } } } }
これで、ウィンドウのフォーカスに関するすべての問題が解消されます。
Selenium機能を使用したちょっとした魔法
SeleniumをSelenoidに、 IEDriverServer.exe
をheadless_ie_selenium.exeに置き換えるだけで、WindowsでのSeleniumの最も深刻な問題を解決しました。 テストでいくつかの便利な機能を設定して、ダイヤモンドからダイヤモンドを作りましょう。
デフォルトでは、Internet ExplorerはHTTPプロキシシステム設定を使用します。 これは、あるセッションで設定されたプロキシ設定が他のセッションに「クロール」するという事実につながります。 これを修正するには、次を設定します。
ie.usePerProcessProxy = true
Webアプリケーションは、 Cookieを使用して機密情報を保存する場合があります。 Windowsでは、これらのファイルはユーザーごとに個別に保存され、デフォルトの動作では、並列セッション間で設定されたCookieが再利用されます。 これにより、フローティングテストが発生する可能性があります。 Cookieの再利用を回避するには、匿名モードでIEを起動できます。
ie.browserCommandLineSwitches = "-private"
設定することも忘れないでください:
ie.ensureCleanSession = true
- ウィンドウのフォーカスに関する奇妙なエラーを回避するために、以下に示す機能が設定されていないか、偽であることも確認してください。
requireWindowFocus = false
おわりに
この記事では、WindowsでSeleniumテストを実行するときに発生する可能性のある主な問題について簡単に説明し、簡単な解決策を提案しました。 私は、Seleniumでのテストは苦痛ではないと主張し続けています。 あなたはちょうどそれを正しく調理できるようにする必要があります。