Как использовать watin с контролем WebBrowser?

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

3 ответа

Если вы используете.Net WebBrowser Control, вы можете создавать WatiN's IE объект с помощью следующего кода:

var ie = new IE(webBrowser.ActiveXInstance);

Но если вы делаете это внутри вашего Form_LoadActiveXInstance будет нулевым И если вы делаете это, например, в какой-то 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 учебный класс. Обработка всплывающих окон и создание новых элементов управления веб-браузера также возможны.

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

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

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

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

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

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

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

var CurrentBrowser = new IE(WebBrowser2);

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

Другие вопросы по тегам