tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルWebBrowserで確認ダイアログの操作
記事No11794
投稿日: 2017/01/28(Sat) 13:30
投稿者まつ
いつもおお世話になっております。

VB2015でWebBrowserのコードを作成していますが
ログイン処理後にダイアログが表示されることがあり
処理方法をネット検索したところ下記回答がありました。

http://hanatyan.sakura.ne.jp/patio/read.cgi?no=335

しかし参考用に掲載頂いていたファイルをダウンロード出来ません。
http://www.vb-user.net/junk/replySamples/2008.10.05.13.35/8274.zip

参考になるコードは無いでしょうか?

ちなみにダイアログには
説明文
チェックボックス
確認ボタン
が表記されており
チェックボックスをオンにして確認ボタンを押したいです。

[ツリー表示へ]
タイトルRe: WebBrowserで確認ダイアログの操作
記事No11795
投稿日: 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 側の
対処ではなく、環境設定の見直しが要求されるかもしれません。

[ツリー表示へ]
タイトルRe^2: WebBrowserで確認ダイアログの操作
記事No11796
投稿日: 2017/01/31(Tue) 06:40
投稿者まつ
魔界の仮面弁士さん

いつもお世話になっております。

たいへん詳しいご説明に感謝致します。

申し訳ありません。ちょっと目を通しましたが
知識不足で理解しきれておりません。

1週間ほど時間が取れない事情もあり
後日になりますが学習させて頂いた
結果を踏まえ返信させて頂きます。

[ツリー表示へ]