「https://portableapps.com/apps/internet/firefox_portable」
ここからポータブル版のFirefoxをダウンロードする。
「https://portableapps.com/de/apps/internet/google_chrome_portable」
Chromeはコチラから。
インストールされているChromeやFirefoxを使う方法を試したが、パージョンUpが頻繁で、作成したアプリが動かくなくなる可能性も高い。そのたびにDriverを更新する仕組みを提供するのも大変。なので、ポータブル版にして、提供するツールにバンドルするようにした。これなら、ブラウザとそのドライバをセットで提供できるから、更新しなくても比較的長い間安定して動く。
ダウンロードしたポータブル版のexeを解凍し、適当なディレクトリに配置して、Seleniumからそこを参照するようにする。
ChromeOptions options = new ChromeOptions();
options.BinaryLocation = "C:\\GoogleChromePortable\\GoogleChromePortable.exe";
しかし、次のようなエラーが表示されて実行できない。
「次の場所から拡張機能を読み込むことができませんでした:C:\Program Files (x86)\Google\Chrome\Application\xxxx. マニフェストファイルが見つからないか読み取れません」
(manifest file is missing or unreadable) ← 英語版ならこんな感じのエラー。
そして、最終的には、
(unknown error: DevToolsActivePort file doesn’t exist)
(The process started from chrome location C:\GoogleChromePortable64\GoogleChromePortable.exe is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
が表示されて、起動に失敗します。
いろいろ試した結果、以下のオプションを付ければ起動に成功しました。
ChromeOptions options = new ChromeOptions();
options.AddArgument("--no-sandbox");
options.AddArgument("--disable-infobars");
options.AddArgument("--disable-dev-shm-usage");
options.AddArgument("--disable-extensions");
options.AddArgument("--disable-gpu");
options.AddArgument("--user-data-dir=" + "C:\\MyDownload\\GoogleChromePortable64\\Data\\profile");
//options.BinaryLocation = "C:\\MyDownload\\GoogleChromePortable64\\GoogleChromePortable.exe";
options.BinaryLocation = "C:\\MyDownload\\GoogleChromePortable64\\App\\Chrome-bin\\chrome.exe";
海外のフォーラムでは、no-sandboxやdisable-infobarsなどのオプションが効いていたようですが、私の場合は結局、一番最後のchromeのexeの場所を、Potrable.exeではなく、その下のchrome.exeにして、profileの場所を指定したのが奏功しました。