59643
C#側からすでに開いているEdge画面を操作する方法についてご教示願います。

**やりたいこと**

①すでに開いているEdge（複数画面）から、一つの必要な画面を特定する  
②Edge画面のDOMを取得する  
③Edge画面の項目の値を検証し、間違ったら、該当項目に色を付ける  
④C#からEdge画面の遷移を発生させ、必要なデータを取得してから、  
元のEdge画面に戻る。  
⑤Edgeの画面でのボタン押下（Link 押下）イベントを検知し、  
押下するタイミングに合わせて、C#側で処理を行わせる

Selenium WebDriverから操作しようとしたが、既存Edge画面を一回閉じて  
WebDriverからEdgeプロセスを新規で起動して、必要な画面を開かなければならない。

（現在の調査では）WebDriverからは【やりたいこと①】を実現できませんでした。

**質問**

  1. SeleniumWebDriverから既存Edge画面を閉じずに、そのままキャッチして、  
DOMを取得し、更に、該当項目に背景色つけることは可能でしょうか？

  2. 他にネイティブ部品、もしくは、サードパーティ製の部品で、  
やりたいことを実現できる方法はあるでしょうか？

  3. セキュリティの側面からして、そもそも、EdgeはIE11（mshtml.dll、  
SHDocVw.InternetExplorer等で操作する）のように外部操作できないでしょうか？
CC BY-SA 4.0
2019-10-06T23:22:05.187
59517
2019-10-11T13:31:13.257
2019-10-07T03:53:24.573
3060
26610
question
c# dom
C#側からすでに開いているEdge画面を操作する方法についてご教示願います。
>   1. SeleniumWebDriverから既存Edge画面を閉じずに、そのままキャッチして、  
>  DOMを取得し、更に、該当項目に背景色つけることは可能でしょうか？
>

Seleniumの開発途中に実現できていた時もあったようですが、ブラウザ個別の特定モード/構成時のみなので、「実現不可能」状態のようです。  
[Can Selenium interact with an existing browser
session?](https://stackoverflow.com/q/8344776/9014308)  
[Allow webdriver to attach to a running browser
#18](https://github.com/seleniumhq/selenium-google-code-issue-
archive/issues/18)

その特定モードは、Chrome/Firefoxや次の?Edgeでは、デバッグポートを有効にして起動したブラウザと通信して操作が出来るという、これのことかも。  
[Microsoft Edge DevTools Protocol Clients](https://docs.microsoft.com/ja-
jp/microsoft-edge/devtools-protocol/0.2/clients?view=azurermps-5.0.0)  
[How to connect Selenium to an existing browser that was opened
manually?](https://cosmocode.io/how-to-connect-selenium-to-an-existing-
browser-that-was-opened-manually/)  
[デスクトップ版 Firefox
のデバッグを行う](https://developer.mozilla.org/ja/docs/Tools/Remote_Debugging/Debugging_Firefox_Desktop)

他に古い版数のSeleniumの機能に、こんなのがあるようです。  
[Selenium Remote-Control](https://www.seleniumhq.org/projects/remote-control/)
/ [Selenium 1 (Selenium RC) - Selenium
Documentation](https://www.seleniumhq.org/docs/05_selenium_rc.jsp)

>   2. 他にネイティブ部品、もしくは、サードパーティ製の部品で、 やりたいことを実現できる方法はあるでしょうか？
>
>   3. セキュリティの側面からして、そもそも、EdgeはIE11（mshtml.dll、  
>  SHDocVw.InternetExplorer等で操作する）のように外部操作できないでしょうか？
>
>

コメントで紹介した[【2017年8月版】起動中のMicrosoft EdgeからタイトルとURLを取得するC#コード](https://www.ka-
net.org/blog/?p=9085)の方法で、DOMのオブジェクト([IHTMLDocument2](https://docs.microsoft.com/en-
us/previous-versions/windows/internet-explorer/ie-developer/platform-
apis/aa752574\(v=vs.85\)), [IHTMLDocument3](https://docs.microsoft.com/en-
us/previous-versions/windows/internet-explorer/ie-developer/platform-
apis/aa752541\(v=vs.85\))等) が取得できましたし、単純なページで IHTMLDocument2::fgColor
により文字色を変えるとかが出来ました。

細かい要素の検索とか変更は、IHTMLDocument3のオブジェクトを取得して操作した方が良いのでしょう。  
C++での話ですが、こんな記事があります。  
[MSHTML / ドキュメントとエレメント -
EternalWindows](http://eternalwindows.jp/browser/mshtml/mshtml01.html)

IHTMLDocument3オブジェクト取得は、紹介先のIHTMLDocument2オブジェクト取得ルーチンの中で使っているGUIDをIHTMLDocument3のものに変えることで出来ます。  
GUIDは [open-watcom-v2/bld/w32api/lib/uuid.c](https://github.com/open-
watcom/open-watcom-v2/blob/master/bld/w32api/lib/uuid.c) とか
[mingw-w64/mingw-w64-crt/libsrc/mshtml-
uuid.c](https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/libsrc/mshtml-
uuid.c) から調べてください。

ただし、Edgeの１つのウィンドウに複数のタブがあって、表示してから時間が経過した場合、アクティブでないタブの情報は取れなくなっていました。  
1ウィンドウ1タブにするよう注意しておいた方が良いでしょう。

なお新しいEdgeは来年に出るそうで、しかも勝手にモードが切り替わるようなので、今上記のことが出来たとしても、何か不具合が起こる可能性は大きいですね。  
[Chromiumベースの「Microsoft Edge」には「IE
mode」あり](https://www.itmedia.co.jp/news/articles/1905/07/news050.html)  
[ChromiumベースのMicrosoft
Edge、2020年5月から切り替え開始か](https://news.mynavi.jp/article/20190718-860627/)
CC BY-SA 4.0
2019-10-11T09:54:54.110
59643
2019-10-11T13:31:13.257
2019-10-11T13:31:13.257
3060
26370
59517
answer