Как использовать watin с контролем WebBrowser? - PullRequest
3 голосов
/ 03 мая 2010

Есть ли способ, который позволил бы мне использовать функциональные возможности watin из моего веб-браузера? просто я хочу использовать watin с моим контролем через веб-браузер. Я не хочу, чтобы мое приложение открывало новое окно, мне это нужно в моем управлении через веб-браузер.

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

Если вы используете .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. Обработка всплывающих окон и создание новых элементов управления веб-браузера также возможны.

2 голосов
/ 14 октября 2011

(Копия для того, чтобы заставить механику наблюдателя диалогов WatiN работать с веб-браузером без особого взлома :))

Можно сделать встроенный веб-браузер для работы с механизмом обработки диалогов WatiN , если вы можете получить дескриптор окна веб-браузера , что должно быть полностью возможно, если вы пишете код формы, в которой он содержится (1)

Причина, по которой вам нужен этот дескриптор окна, заключается именно в том, что WatiN не может получить его с помощью свойства IWebBrowser2.HWND - этого следует ожидать. (2)

В качестве дополнительного примечания я столкнулся с проблемным и нестабильным поведением свойства IWebBrowser2.HWND даже при работе с Microsoft IE - так что это еще одна причина, чтобы следовать методу, описанному ниже, для обхода таких проблем HWND.

Как только вы получите в свои руки дескриптор окна элемента управления webbrowser, вы можете просто создать прокси-класс, который оборачивается вокруг интерфейса 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: Даже если у вас нет доступа к исходной форме для такой формы, потому что, скажем, элемент управления веб-браузером находится в стороннем приложении, к которому у вас нет доступа, вы можете написать небольшую служебную функцию для сканирования всех Windows, пока вы не наткнетесь на стороннее приложение, которое содержит элемент управления веб-браузера, который вы ищете. Вы можете заглянуть в исходный код WatiN, внутри ShellWindows2.CollectInternetExplorerInstances (), чтобы получить представление о том, как реализовать такую ​​функцию сканирования.

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

0 голосов
/ 03 мая 2010

Создайте свой объект IE с помощью интерфейса WebBrowser2 из элемента управления веб-браузера, например:

var CurrentBrowser = new IE(WebBrowser2);

Один важный момент - обязательно установите AutoStartDialogWatcher в false в настройках WatiN. Поскольку вы больше не используете IE, вы отвечаете за все диалоги.

...