【问题标题】:How to use watin with WebBrowser control?如何将 watin 与 WebBrowser 控件一起使用?
【发布时间】:2011-02-14 21:25:18
【问题描述】:

有什么方法可以让我从我的网络浏览器控件中使用 watin 的功能?只是我想在我的网络浏览器控件中使用 watin 我不希望我的应用程序打开一个新窗口,我需要在我的网络浏览器控件中使用它。

【问题讨论】:

    标签: .net winforms webbrowser-control watin


    【解决方案1】:

    (用于使 WatiN 的对话观察器机制与 webbrowser 控件一起使用而无需太多黑客攻击的复写帖子 :))

    如果你能够获得 webbrowser 控件的窗口句柄,则可以使嵌入式 webbrowser 控件与 WatiN 的 Dialog-handling 机制一起使用,如果你正在编写这应该是完全可能的包含它的表单代码 (1)

    您需要此窗口句柄的原因正是因为 WatiN 无法通过 IWebBrowser2.HWND 属性检索它 - 这是意料之中的。 (2)

    附带说明,即使在处理 Microsoft 的 IE 时,我也遇到了 IWebBrowser2.HWND 属性的问题和不稳定的行为 - 所以还有一个理由遵循下面概述的方法来解决此类 HWND 问题。

    一旦您掌握了 webbrowser 控件的窗口句柄,您就可以简单地创建一个代理类,它围绕嵌入式 web 浏览器的 IWebBrowser2 接口(HWND 除外)来解决该问题。把它们放在一起你现在可以写:

     Settings.AutoStartDialogWatcher = true;
     new IE(new ProxyForIWebBrowser2InterfaceToWorkaroundHWNDBugs((IWebBrowser2) webBrowser1.ActiveXInstance, webBrowser1.Handle), true);
    

    希望这会有所帮助。哦,这是您需要的代理类:

     using System;
     using SHDocVw;
    
     namespace WatiN.Core.Native.InternetExplorer
     {
    public class ProxyForIWebBrowser2InterfaceToWorkaroundHWNDBugs : IWebBrowser2
    {
        #region Implementation of IWebBrowser
        private readonly int _ExplicitHwndForIWebBrowser2;
        private readonly IWebBrowser2 _EmbeddedWebBrowserAsIWebBrowser2;
        public ProxyForIWebBrowser2InterfaceToWorkaroundHWNDBugs(IWebBrowser2 embeddedWebBrowserAsIWebBrowser2, IntPtr explicitHwnd)
        {
            _EmbeddedWebBrowserAsIWebBrowser2 = embeddedWebBrowserAsIWebBrowser2;
            _ExplicitHwndForIWebBrowser2 = (int)explicitHwnd;
        }
    
        void IWebBrowser.GoBack()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoBack();
        }
    
        void IWebBrowser2.GoForward()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoForward();
        }
    
        void IWebBrowser2.GoHome()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoHome();
        }
    
        void IWebBrowser2.GoSearch()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoSearch();
        }
    
        void IWebBrowser2.Navigate(string URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Navigate(URL, ref Flags, ref TargetFrameName, ref PostData, ref Headers);
        }
    
        void IWebBrowser2.Refresh()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh();
        }
    
        void IWebBrowser2.Refresh2(ref object Level)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh2(ref Level);
        }
    
        void IWebBrowser2.Stop()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Stop();
        }
    
        object IWebBrowser2.Application
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Application; }
        }
    
        object IWebBrowser2.Parent
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Parent; }
        }
    
        object IWebBrowser2.Container
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Container; }
        }
    
        object IWebBrowser2.Document
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Document; }
        }
    
        bool IWebBrowser2.TopLevelContainer
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.TopLevelContainer; }
        }
    
        string IWebBrowser2.Type
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Type; }
        }
    
        int IWebBrowser2.Left
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Left; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Left = value; }
        }
    
        int IWebBrowser2.Top
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Top; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Top = value; }
        }
    
        int IWebBrowser2.Width
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Width; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Width = value; }
        }
    
        int IWebBrowser2.Height
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Height; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Height = value; }
        }
    
        void IWebBrowser2.Quit()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Quit();
        }
    
        void IWebBrowser2.ClientToWindow(ref int pcx, ref int pcy)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.ClientToWindow(ref pcx, ref pcy);
        }
    
        void IWebBrowser2.PutProperty(string Property, object vtValue)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.PutProperty(Property, vtValue);
        }
    
        object IWebBrowser2.GetProperty(string Property)
        {
            return _EmbeddedWebBrowserAsIWebBrowser2.GetProperty(Property);
        }
    
        public void Navigate2(ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Navigate2(ref URL, ref Flags, ref TargetFrameName, ref PostData, ref Headers);
        }
    
        public OLECMDF QueryStatusWB(OLECMDID cmdID)
        {
            return _EmbeddedWebBrowserAsIWebBrowser2.QueryStatusWB(cmdID);
        }
    
        public void ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, ref object pvaIn, ref object pvaOut)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.ExecWB(cmdID, cmdexecopt, ref pvaIn, ref pvaOut);
        }
    
        public void ShowBrowserBar(ref object pvaClsid, ref object pvarShow, ref object pvarSize)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.ShowBrowserBar(ref pvaClsid, ref pvarShow, ref pvarSize);
        }
    
        void IWebBrowser2.GoBack()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoBack();
        }
    
        void IWebBrowserApp.GoForward()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoForward();
        }
    
        void IWebBrowserApp.GoHome()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoHome();
        }
    
        void IWebBrowserApp.GoSearch()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoSearch();
        }
    
        void IWebBrowserApp.Navigate(string URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Navigate(URL, ref Flags, ref TargetFrameName, ref PostData, ref Headers);
        }
    
        void IWebBrowserApp.Refresh()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh();
        }
    
        void IWebBrowserApp.Refresh2(ref object Level)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh2(ref Level);
        }
    
        void IWebBrowserApp.Stop()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Stop();
        }
    
        object IWebBrowserApp.Application
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Application; }
        }
    
        object IWebBrowserApp.Parent
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Parent; }
        }
    
        object IWebBrowserApp.Container
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Container; }
        }
    
        object IWebBrowserApp.Document
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Document; }
        }
    
        bool IWebBrowserApp.TopLevelContainer
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.TopLevelContainer; }
        }
    
        string IWebBrowserApp.Type
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Type; }
        }
    
        int IWebBrowserApp.Left
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Left; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Left = value; }
        }
    
        int IWebBrowserApp.Top
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Top; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Top = value; }
        }
    
        int IWebBrowserApp.Width
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Width; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Width = value; }
        }
    
        int IWebBrowserApp.Height
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Height; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Height = value; }
        }
    
        void IWebBrowserApp.Quit()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Quit();
        }
    
        void IWebBrowserApp.ClientToWindow(ref int pcx, ref int pcy)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.ClientToWindow(ref pcx, ref pcy);
        }
    
        void IWebBrowserApp.PutProperty(string Property, object vtValue)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.PutProperty(Property, vtValue);
        }
    
        object IWebBrowserApp.GetProperty(string Property)
        {
            return _EmbeddedWebBrowserAsIWebBrowser2.GetProperty(Property);
        }
    
        void IWebBrowserApp.GoBack()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoBack();
        }
    
        void IWebBrowser.GoForward()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoForward();
        }
    
        void IWebBrowser.GoHome()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoHome();
        }
    
        void IWebBrowser.GoSearch()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.GoSearch();
        }
    
        void IWebBrowser.Navigate(string URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Navigate(URL, ref Flags, ref TargetFrameName, ref PostData, ref Headers);
        }
    
        void IWebBrowser.Refresh()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh();
        }
    
        void IWebBrowser.Refresh2(ref object Level)
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Refresh2(ref Level);
        }
    
        void IWebBrowser.Stop()
        {
            _EmbeddedWebBrowserAsIWebBrowser2.Stop();
        }
    
        object IWebBrowser.Application
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Application; }
        }
    
        object IWebBrowser.Parent
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Parent; }
        }
    
        object IWebBrowser.Container
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Container; }
        }
    
        object IWebBrowser.Document
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Document; }
        }
    
        bool IWebBrowser.TopLevelContainer
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.TopLevelContainer; }
        }
    
        string IWebBrowser.Type
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Type; }
        }
    
        int IWebBrowser.Left
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Left; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Left = value; }
        }
    
        int IWebBrowser.Top
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Top; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Top = value; }
        }
    
        int IWebBrowser.Width
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Width; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Width = value; }
        }
    
        int IWebBrowser.Height
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Height; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Height = value; }
        }
    
        string IWebBrowser.LocationName
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationName; }
        }
    
        string IWebBrowser2.LocationURL
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationURL; }
        }
    
        bool IWebBrowser2.Busy
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Busy; }
        }
    
        string IWebBrowser2.Name
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Name; }
        }
    
        int IWebBrowser2.HWND
        {
            get { return _ExplicitHwndForIWebBrowser2; }
        }
    
        string IWebBrowser2.FullName
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.FullName; }
        }
    
        string IWebBrowser2.Path
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Path; }
        }
    
        bool IWebBrowser2.Visible
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Visible; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Visible = value; }
        }
    
        bool IWebBrowser2.StatusBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.StatusBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.StatusBar = value; }
        }
    
        string IWebBrowser2.StatusText
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.StatusText; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.StatusText = value; }
        }
    
        int IWebBrowser2.ToolBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.ToolBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.ToolBar = value; }
        }
    
        bool IWebBrowser2.MenuBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.MenuBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.MenuBar = value; }
        }
    
        bool IWebBrowser2.FullScreen
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.FullScreen; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.FullScreen = value; }
        }
    
        public tagREADYSTATE ReadyState
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.ReadyState; }
        }
    
        public bool Offline
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Offline; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Offline = value; }
        }
    
        public bool Silent
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Silent; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Silent = value; }
        }
    
        public bool RegisterAsBrowser
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.RegisterAsBrowser; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.RegisterAsBrowser = value; }
        }
    
        public bool RegisterAsDropTarget
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.RegisterAsDropTarget; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.RegisterAsDropTarget = value; }
        }
    
        public bool TheaterMode
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.TheaterMode; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.TheaterMode = value; }
        }
    
        public bool AddressBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.AddressBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.AddressBar = value; }
        }
    
        public bool Resizable
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Resizable; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Resizable = value; }
        }
    
        string IWebBrowser2.LocationName
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationName; }
        }
    
        string IWebBrowserApp.LocationURL
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationURL; }
        }
    
        bool IWebBrowserApp.Busy
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Busy; }
        }
    
        string IWebBrowserApp.Name
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Name; }
        }
    
        int IWebBrowserApp.HWND
        {
            get { return _ExplicitHwndForIWebBrowser2; }
        }
    
        string IWebBrowserApp.FullName
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.FullName; }
        }
    
        string IWebBrowserApp.Path
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Path; }
        }
    
        bool IWebBrowserApp.Visible
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Visible; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.Visible = value; }
        }
    
        bool IWebBrowserApp.StatusBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.StatusBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.StatusBar = value; }
        }
    
        string IWebBrowserApp.StatusText
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.StatusText; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.StatusText = value; }
        }
    
        int IWebBrowserApp.ToolBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.ToolBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.ToolBar = value; }
        }
    
        bool IWebBrowserApp.MenuBar
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.MenuBar; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.MenuBar = value; }
        }
    
        bool IWebBrowserApp.FullScreen
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.FullScreen; }
            set { _EmbeddedWebBrowserAsIWebBrowser2.FullScreen = value; }
        }
    
        string IWebBrowserApp.LocationName
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationName; }
        }
    
        string IWebBrowser.LocationURL
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.LocationURL; }
        }
    
        bool IWebBrowser.Busy
        {
            get { return _EmbeddedWebBrowserAsIWebBrowser2.Busy; }
        }
    
        #endregion
           }
       }
    

    1:即使您没有此类表单的源代码访问权限,例如,Webbrowser 控件位于您无权访问的第 3 方应用程序中,您也可以编写一个小实用程序函数来扫描所有windows,直到您偶然发现包含您所追求的 webbrowser 控件的 3rd-party 应用程序。您可以在 ShellWindows2.CollectInternetExplorerInstances() 中查看 WatiN 的源代码,了解如何实现这样的扫描功能。

    2:http://support.microsoft.com/kb/244310

    【讨论】:

      【解决方案2】:

      如果您使用.Net WebBrowser Control,您可以使用以下代码创建WatiN 的IE 对象:

      var ie = new IE(webBrowser.ActiveXInstance);
      

      但如果你在你的Form_Load 中这样做,ActiveXInstance 将是空的。如果你这样做,例如在某种button_Click 中,应用程序将在你使用后挂起,例如。 ie.GoTo。您需要启动新线程并在那里操作。例如:

      private void Form1_Load(object sender, EventArgs e)
      {
          var t = new Thread(() =>
          {
              Settings.AutoStartDialogWatcher = false;
              var ie = new IE(webBrowser1.ActiveXInstance);
              ie.GoTo("http://www.google.com");
          });
          t.SetApartmentState(ApartmentState.STA);
          t.Start();
      }
      

      您需要禁用对话观察器的自动启动,因为您不能使用内置的 WatiN 对话观察器。但是通过一点黑客攻击,您可以根据原始DialogWatcher 类创建自己的。也可以处理弹出窗口和创建新的网络浏览器控件。

      【讨论】:

      【解决方案3】:

      使用 Web 浏览器控件中的 WebBrowser2 界面创建 IE 对象,例如:

      var CurrentBrowser = new IE(WebBrowser2);
      

      重要的一点是确保在 WatiN 设置中将 AutoStartDialogWatcher 设置为 false。由于您不再实现 IE,因此您应对所有对话框负责。

      【讨论】:

        猜你喜欢
        • 2016-03-13
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        相关资源
        最近更新 更多