Как использовать watin с контролем WebBrowser?
Есть ли способ, который позволил бы мне использовать функциональные возможности watin из моего веб-браузера? просто я хочу использовать watin с моим управлением через веб-браузер. Я не хочу, чтобы мое приложение открывало новое окно, мне это нужно в моем управлении через веб-браузер.
3 ответа
Если вы используете.Net WebBrowser Control, вы можете создавать WatiN's 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
учебный класс. Обработка всплывающих окон и создание новых элементов управления веб-браузера также возможны.
(Копия сообщения о том, как заставить механику наблюдателя диалогов 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(), чтобы получить представление о том, как реализовать такую функцию сканирования.
Создайте свой объект IE с помощью интерфейса WebBrowser2 из элемента управления веб-браузера, например:
var CurrentBrowser = new IE(WebBrowser2);
Одним из важных моментов является необходимость установить AutoStartDialogWatcher
false в настройках WatiN. Поскольку вы больше не используете IE, вы отвечаете за все диалоги.