【selenium】ブラウザを無理やり非表示にしてみる

2023年6月17日

なぜ非表示なのか

Selenium Chromeで画面を非表示にしたまま操作したい場合、通常ではHeadless Chromeを使用していたのですが、Headlessモードのままだと表示できないサイトがあることに気付いたのでWinAPIを使用して無理やり非表示にしてみます。
大抵の場合、Headless Chromeで大丈夫だと思います。こんな変なことをしなくて良い作りにするのがベストだと思います。

実装方法

使用するAPIはShowWindowです。
使い方のリンクも一応貼っておきます。

ウィンドウハンドルとnCmdShowパラメータを渡せば表示関連の操作が可能になります。
ただSeleniumでは表示しているブラウザのウィンドウハンドルの取得ができません。(なぜ...?)

正確にはserviceからブラウザを立ち上げる前のコンソールのハンドルは取得できます。
子にあたるブラウザのハンドルは取得できないんですね。

そこで、プロセスIDから親子関係を調べてブラウザのハンドルを取ってくることにしました。

ソースコード

serviceのインスタンスが存在する場所でGetWindowHandleをコールすれば、ハンドルが返ります。
ハンドルが見つからない場合は、IntPtr型で0が返ります。後の判定に使ってください。

「System.Management」が必須なので、クラスが見つからないって方は参照の追加から追加してあげてください。フレームワークの場所にあります。

        private IntPtr GetWindowHandle()
        {
            return Process.GetProcesses().FirstOrDefault(x => (uint)ParentProcessIdSearch(x.Id) == service.ProcessId).MainWindowHandle;
        }

        private object ParentProcessIdSearch(int Pid)
        {
            using (var search = new ManagementObjectSearcher(@"root\CIMV2", $"SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {Pid}"))

            using (var result = search.Get().GetEnumerator())
            {
                if (!result.MoveNext())
                    throw new ApplicationException("ParentProcessIdの取得に失敗");

                return result.Current["ParentProcessId"];
            }
        }

 

C#,chrome,selenium,メモ

Posted by marimo