Portable版のChromeを使ってseleniumで起動する際のエラー回避

「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の場所を指定したのが奏功しました。