A-A+

去除WebBrowser提示对话框

2014年09月10日 技术 暂无评论 阅读 3,738 次

如果使用WebBrowser做自动化测试或者数据采集,难以避免会遇到脚本错误提示、提示对话框等问题,所以如何去除错误提示,保证程序能够正常运行就成了不可避免的课题。我搜集了一些方法,可以处理不同的情况。

1.去除脚本错误提示:当Javascript等脚本出现错误时,会提示是否继续运行,虽然不会阻塞WebBrowser继续加载,但看起来难免美中不足,可以使用以下方法来消除:

  1. //设置属性,不再显示脚本错误信息
  2. myWebBrowser1.ScriptErrorsSuppressed = true;

2.页面一加载就有弹出框,可以使用以下方法来消除(未经亲自验证,可以尝试):

  1. private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
  2. {
  3.    //自动点击弹出确认或弹出提示
  4.    IHTMLDocument2 vDocument = (IHTMLDocument2)webBrowser1.Document.DomDocument;
  5.    //弹出确认
  6.    vDocument.parentWindow.execScript("function confirm(str){return true;} ""javascript");
  7.    //弹出提示
  8.    vDocument.parentWindow.execScript("function alert(str){return true;} ""javaScript");
  9. }

3.WebBrowser页面加载完毕之后,在页面中进行一些自动化操作的时候弹出框的自动点击(未经亲自验证,可以尝试):

  1. private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  2. {
  3.    //自动点击弹出确认或弹出提示
  4.    IHTMLDocument2 vDocument = (IHTMLDocument2)webBrowser1.Document.DomDocument;
  5.    //弹出确认
  6.    vDocument.parentWindow.execScript("function confirm(str){return true;} ""javascript");
  7.    //弹出提示
  8.    vDocument.parentWindow.execScript("function alert(str){return true;} ""javaScript");
  9.    //下面是你的执行操作代码
  10. }

4.重写Alert方法(未经亲自验证,可以尝试):

  1. private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
  2. {
  3.     IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
  4.     string s = @"window.alert=null;";
  5.     win.execScript(s, "javascript");
  6. }

5.实现IDocHostShowUI接口,重新构造自己的WebBrowser,这种方法最干脆,而且可行:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Runtime.InteropServices;
  10. using System.Runtime.CompilerServices;
  11. namespace WindowsFormsApplication7
  12. {
  13.   public partial class Form1 : Form
  14.   {
  15.     public Form1()
  16.     {
  17.       InitializeComponent();
  18.     }
  19.     MyWebBrowser MyWebBrowser1 = new MyWebBrowser();
  20.     private void Form1_Load(object sender, EventArgs e)
  21.     {
  22.       this.Controls.Add(MyWebBrowser1);
  23.       MyWebBrowser1.Visible = true;
  24.       MyWebBrowser1.Navigate("about:blank");
  25.       MyWebBrowser1.Document.Write("<script>alert('我就是确定按钮啊')</script>");
  26.     }
  27.   }
  28.   //自定义WebBrowser,并实现IDocHostShowUI接口
  29.   public class MyWebBrowser : WebBrowser
  30.   {
  31.     #region ExtendedWebBrowserSite
  32.     class ExtendedWebBrowserSite : WebBrowser.WebBrowserSite, UnsafeNativeMethods.IDocHostShowUI
  33.     {
  34.       public ExtendedWebBrowserSite(WebBrowser host)
  35.         : base(host)
  36.       {
  37.       }
  38.       void UnsafeNativeMethods.IDocHostShowUI.ShowMessage(ref UnsafeNativeMethods._RemotableHandle hwnd, string lpstrText, string lpstrCaption, uint dwType, string lpstrHelpFile, uint dwHelpContext, out int plResult)
  39.       {
  40.         plResult = 0;
  41.          //屏蔽符合条件的提示对话框
  42.         if (lpstrText == "我就是确定按钮啊")
  43.         {
  44.           if (MessageBox.Show("是否要屏蔽Alert对话框""提示", MessageBoxButtons.YesNo) == DialogResult.No)
  45.           {
  46.             MessageBox.Show(lpstrText, lpstrCaption);
  47.           }
  48.         }
  49.       }
  50.       void UnsafeNativeMethods.IDocHostShowUI.ShowHelp(ref UnsafeNativeMethods._RemotableHandle hwnd, string pszHelpFile, uint uCommand, uint dwData, UnsafeNativeMethods.tagPOINT ptMouse, object pDispatchObjectHit)
  51.       {
  52.       }
  53.     }
  54.     protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
  55.     {
  56.       return new ExtendedWebBrowserSite(this);
  57.     }
  58.     #endregion
  59.   }
  60.   public class UnsafeNativeMethods
  61.   {
  62.     #region IDocHostShowUI
  63.     [StructLayout(LayoutKind.Explicit, Pack = 4)]
  64.     public struct __MIDL_IWinTypes_0009
  65.     {
  66.       // Fields 
  67.       [FieldOffset(0)]
  68.       public int hInproc;
  69.       [FieldOffset(0)]
  70.       public int hRemote;
  71.     }
  72.     [StructLayout(LayoutKind.Sequential, Pack = 4)]
  73.     public struct _RemotableHandle
  74.     {
  75.       public int fContext;
  76.       public __MIDL_IWinTypes_0009 u;
  77.     }
  78.     [StructLayout(LayoutKind.Sequential, Pack = 4)]
  79.     public struct tagPOINT
  80.     {
  81.       public int x;
  82.       public int y;
  83.     }
  84.     [ComImport, Guid("C4D244B0-D43E-11CF-893B-00AA00BDCE1A"), InterfaceType((short)1)]
  85.     public interface IDocHostShowUI
  86.     {
  87.       [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
  88.       void ShowMessage([In, ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.wireHWND")] ref _RemotableHandle hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrText, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrCaption, [In] uint dwType, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrHelpFile, [In] uint dwHelpContext, [ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.LONG_PTR")] out int plResult);
  89.       [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
  90.       void ShowHelp([In, ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.wireHWND")] ref _RemotableHandle hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string pszHelpFile, [In] uint uCommand, [In] uint dwData, [In] tagPOINT ptMouse, [Out, MarshalAs(UnmanagedType.IDispatch)] object pDispatchObjectHit);
  91.     }
  92.     #endregion
  93.   }
  94. }

可以参考以下资料:

WebBrowser屏蔽alert消息框

C# 禁止 Webbrowser 控件的弹出脚本错误对话框

经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: