如何将 watin 与 WebBrowser 控件一起使用?
有什么方法可以让我从我的网络浏览器控件中使用 watin 的功能吗?只是我想在我的网络浏览器控件中使用 watin 我不希望我的应用程序打开一个新窗口,我需要它在我的网络浏览器控件中。
Is there any way which would allow me to use watin's functionalities from my web browser control? simply i want to use watin with my web browser control i don't want my application to open a new window ,i need it in my web browser control.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您使用 .Net WebBrowser Control,您可以使用以下代码创建 WatiN 的
IE
对象:但是如果您在
Form_Load
内执行此操作,ActiveXInstance
将为空。如果您在某种button_Click
中执行此操作,则应用程序将在您使用后挂起,例如。ie.GoTo
。您需要启动新线程并在那里进行操作。例如:您需要禁用对话框观察程序的自动启动,因为您无法使用内置的 WatiN 对话框观察程序。但是,通过一些技巧,您可以根据原始的 DialogWatcher 类创建自己的类。处理弹出窗口和创建新的网络浏览器控件也是可能的。
If you are using .Net WebBrowser Control you can create WatiN's
IE
object by using following code:But if you do that inside your
Form_Load
ActiveXInstance
will be null. And if you do that for example inside some kind ofbutton_Click
the application will hang after you use eg.ie.GoTo
. You need to start new thread and operate there. For example:You need to disable auto start of dialog watcher, because you cannot use built in WatiN dialog watcher. But with a little bit of hacking you can create your own based on original
DialogWatcher
class. Handling popups and creating new web browser controls are also possible.(使 WatiN 的对话框观察器机制与 Web 浏览器控件一起工作而无需太多黑客攻击的抄袭帖子 :) )
如果您能够获取窗口,则可以使嵌入式 Web 浏览器控件与 WatiN 的对话框处理机制一起工作 Web浏览器控件的句柄,如果您正在编写包含该控件的窗体的代码,那么这应该是完全可能的。 (1)
您需要此窗口句柄的原因正是因为 WatiN 无法通过 IWebBrowser2 检索它。 HWND 属性 - 这是可以预料到的。 (2)
顺便说一句,即使在处理 Microsoft 的 IE 时,我也遇到过 IWebBrowser2.HWND 属性出现问题且不稳定的行为 - 因此,这是遵循下面概述的方法来解决此类 HWND 问题的又一个原因。
一旦您掌握了 Web 浏览器控件的窗口句柄,您就可以简单地创建一个代理类来包装嵌入式 Web 浏览器的 IWebBrowser2 接口(HWND 除外),从而解决该问题。把它们放在一起,你现在可以写:
希望这有帮助。哦,这是您需要的代理类:
1:即使您没有此类表单的源代码访问权限,因为 Web 浏览器控件位于您无权访问的第 3 方应用程序中,您可以编写一个小实用程序函数来扫描所有窗口,直到您偶然发现包含您想要的网络浏览器控件的第 3 方应用程序。您可以查看 ShellWindows2.CollectInternetExplorerInstances() 内部的 WatiN 源代码,了解如何实现此类扫描功能。
2:http://support.microsoft.com/kb/244310
( Carbon-copy post for making WatiN's dialog-watcher mechanics work with webbrowser control without much hacking :) )
It is possible to make an embedded webbrowser control to work with WatiN's Dialog-handling mechanism if you are able to get the window handle of the webbrowser control, which should be fully possible if you are writing the code of the form that contains it (1)
The reason you need this window handle is exactly because WatiN fails to retrieve it by means of IWebBrowser2.HWND property - this is to be expected. (2)
As a side-note, I have experienced problematic and erratic behavior by IWebBrowser2.HWND property even when dealing with Microsoft's IE - so one more reason to follow the method outlined below to workaround such HWND issues.
Once you get your hands on the window handle of the webbrowser control you can simply make a proxy class that wraps around the IWebBrowser2 interface of the embedded web-browser (with the exception of HWND) so as to workaround the problem. Putting it all together you can now write:
Hope this helps. Oh, and here's the proxy class you'll need:
1: Even if you don't you have source-code access to such a form because, say, webbrowser control is in a 3rd party app that you have no access to, you can write a small utility function to scan all windows till you stumble upon the 3rd-party app that contains the webbrowser control you are after. You can have a look in WatiN's source code, inside ShellWindows2.CollectInternetExplorerInstances() to get an idea on how you can implement such a scan-function.
2: http://support.microsoft.com/kb/244310
使用 Web 浏览器控件中的 WebBrowser2 界面创建 IE 对象,如下所示:
重要的一点是确保在 WatiN 设置中将
AutoStartDialogWatcher
设置为 false。由于您不再实现 IE,因此您负责所有对话框。Create your IE object using a WebBrowser2 interface from your web browser control, something like:
One important point is to be sure to set
AutoStartDialogWatcher
to false in WatiN settings. Since you are not implementing IE anymore, you are responsible for all dialogs.