タイトル | : Re: WebBrowserで確認ダイアログの操作 |
記事No | : 11795 |
投稿日 | : 2017/01/30(Mon) 12:05 |
投稿者 | : 魔界の仮面弁士 |
> しかし参考用に掲載頂いていたファイルをダウンロード出来ません。 > http://www.vb-user.net/junk/replySamples/2008.10.05.13.35/8274.zip
年末年始で契約サーバーを変更した関係で、ご迷惑をおかけしています。
blog 再構築が進んでいないので半放置状態でしたが、ひとまず サンプルファイル群のみ復旧させましたので、再度ダウンロードしてみてください。
[VB 8.0 向け] http://www.vb-user.net/junk/replySamples/2008.10.05.13.35/8274.zip
上記は IDocHostShowUI インターフェイスを用いたサンプルです。 WebBrowser 上で [F1] キーを押したときには ShowHelp が呼び出されますし、 スクリプトからの alert や confirm (あるいは VBScript の MsgBox) に対しては ShowMessage が呼び出されますので、その引数情報をもって、 * 自作のダイアログに差し替える * 標準のダイアログをそのまま呼び出す * ダイアログを抑制し、戻り値を自動応答する などの処置を行えます。
ただし現状のサンプルでは以下の問題があります。 (いずれ更新版を再アップいたしますが、いつになることやら…)
(注1)「Inherits Control」は冗長なので削除しておいてください。 (注2)イベント引数クラスは「Inherits EventArgs」しておくべきです。
参考情報として、[C# 4.0 向け]のファイルも置いておきます。 こちらは上記の問題を修正しています。 http://www.vb-user.net/junk/replySamples/2013.10.04.23.50/WebBrowserMessageSample.zip
いずれのサンプルでも confirm を呼び出すために、えじさんの Tag index を 利用していますが、WebBrowser の既定の設定では、掲載広告が原因で スクリプトエラーが表示される可能性がありますのでご注意ください。
> VB2015でWebBrowserのコードを作成していますが > ログイン処理後にダイアログが表示されることがあり
「ログイン処理後のダイアログ」とは、何によって表示されたダイアログでしょうか。
HTTP認証(RFC2617)だとしたら、AxWebBrower あるいは WebBrowser.ActiveXInstance への Navigate2 メソッドに Authorization ヘッダーを含めることで対応できそうですが、 ログイン完了後ということなので、今回は除外。
alert 等であれば、先の URL の処理で抑制できますが、今回はそれですらなさそうです。
> ちなみにダイアログには > 説明文 > チェックボックス > 確認ボタン > が表記されており > チェックボックスをオンにして確認ボタンを押したいです。
実際のページを見てみないと分かりませんが、それは恐らく (1) window.open メソッド (2) window.showModalDialog メソッド (3) jQuerty UI の dialog メソッド (4) jQuerty UI プラグインの Colorbox メソッド のいずれかであろうかと予想しています。 たとえば WebBrowser の NewWindow イベントが発生するなら、1 または 2 です。
これらのダイアログだとすると、先の IDocHostShowUI では対応できませんが、 ページ遷移にあわせて Document プロパティを用いて HTML DOM (マネージ版または COM 版)を操作することで対応できるかと思います。
ただし 1 と 2 の場合、そのままだと WebBrowser.Document を拾えないため、 NewWindow2 という COM 版イベントの ppDisp 引数を通じて別ダイアログを自己管理するか、 あるいは WM_HTML_GETOBJECT を使って、開かれたウィンドウから IHTMLDocument2 を 入手するといった手間が発生します。
一方、3 や 4 の場合は別ウィンドウとして開かれるのではなく、ページ内にダイアログが 表示されるので、そうした面倒なく WebBrowser.Document で対処できます。
ただいずれにせよ、これらは HTML の内容がページの作りによって異なりますので IDocHostShowUI のような汎用的なコードにはなりません。
ひとまず、(3) の一例を掲載しておきます。
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Shown Me.WebBrowser1.Navigate("https://jqueryui.com/resources/demos/dialog/default.html") End Sub
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted '<div id="dialog"> を捜索 Dim divDialog As HtmlElement = WebBrowser1.Document.GetElementById("dialog") If divDialog Is Nothing OrElse divDialog.TagName <> "DIV" Then Return End If
'「$("#dialog" ).dialog();」で生成される兄要素を取得 Dim previousSibling As HtmlElement = divDialog.Parent.Children.OfType(Of HtmlElement)().FirstOrDefault(Function(elm) elm.NextSibling = divDialog) If previousSibling Is Nothing Then Return End If
'閉じるボタンを探す Dim closeButton = previousSibling.All.OfType(Of HtmlElement)().FirstOrDefault(Function(elm) elm.TagName = "BUTTON" AndAlso Split(elm.GetAttribute("className")).Contains("ui-dialog-titlebar-close")) If closeButton Is Nothing Then Return End If
'ようやく本題 If MessageBox.Show("×ボタンを押しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then closeButton.InvokeMember("click") End If End Sub
End Class
一口に「ダイアログ」といっても、上記以外にも様々なものがあり、 何によって表示されたものなのかで、対処方法が異なってきます。
たとえばスクリプトエラーの類だとしたら、ScriptErrorsSuppressed プロパティを True にすることで対応できるかもしれませんし、Web サイトが古い IE に 対応していないのが要因なら、FEATURE_BROWSER_EMULATION モードの変更を 試みるのも手かと思います。
あるいは Flash 確認や Microsoft EMET 通知、セキュリティソフトなど ActiveX コンポーネントや外部要因で表示されるものだとすると、WebBrowser 側の 対処ではなく、環境設定の見直しが要求されるかもしれません。
|