C# WatiN.Core.IE组件在Internet Explorer忙时超时打开URL时出错
我使用watinie组件浏览特定网站 在开始浏览按钮单击事件时,我正在初始化WatiN.Core.IE的对象,并传递打开网站的网站URL 如下面的代码段所示:-C# WatiN.Core.IE组件在Internet Explorer忙时超时打开URL时出错,c#,watin,C#,Watin,我使用watinie组件浏览特定网站 在开始浏览按钮单击事件时,我正在初始化WatiN.Core.IE的对象,并传递打开网站的网站URL 如下面的代码段所示:- WatiN.Core.IE ie; private void btnStartBrowsing_Click(object sender, EventArgs e) { ie = new IE(URLs.mainURL); } 有时,或者更确切地说,我应该说有5/10次我遇到这样的错误:-“Internet
WatiN.Core.IE ie;
private void btnStartBrowsing_Click(object sender, EventArgs e)
{
ie = new IE(URLs.mainURL);
}
有时,或者更确切地说,我应该说有5/10次我遇到这样的错误:-“Internet Explorer忙时超时”
如何解决这个问题???可能是IE实例没有被正确处理。您需要检查任务管理器,并查看有多少打开的IEXPLORE.EXE进程正在运行。如果您有两个以上的任务,我建议您实现一个using块,然后再次检查Task Manager:
using (IE ie = new IE(URLs.mainURL)
{
...
}
更好的解决方案是在初始化“主”浏览器实例变量后使用AttachTo方法:
private IE ie = new IE();
public void btnStartBrowsing_Click(object sender, EventArgs e)
{
using ie2 = ie.AttachTo<IE>(Find.ByUrl(URLs.mainURL))
{
...
}
}
浏览器只打开一次,您可以随时访问它,因为您不必手动实例化它。要使用它,只需在每次需要访问浏览器时调用实例属性:
BrowserIE.Instance.GoTo(URLs.mainURL);
Divs headerDivs = BrowserIE.Instance.Divs.Filter(Find.ByClass("header"));
在初始化ie对象之前,尝试增加watin超时可能是一种竞争条件 像这样:
Settings.AttachToBrowserTimeOut = 240;
Settings.WaitUntilExistsTimeOut = 240;
Settings.WaitForCompleteTimeOut = 240;
我使用此类附加到浏览器。而且效果很好
public class StaticIE : IDisposable
{
private IE _ie;
private int _ieThread;
private string _ieHwnd;
private int _processId;
public StaticIE(IE aBrowser)
{
SetBrowser(aBrowser);
}
public IE Browser
{
get
{
var currentThreadId = GetCurrentThreadId();
_ie = Browser.AttachTo<IE>(Find.By("hwnd", _ieHwnd), 1);
if (currentThreadId != _ieThread)
{
_ieThread = currentThreadId;
}
return _ie;
}
}
private void SetBrowser(IE aBrowser)
{
_ie = aBrowser;
_ieHwnd = _ie.hWnd.ToString();
_ieThread = GetCurrentThreadId();
_processId = _ie.ProcessID;
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
public void Dispose()
{
if (_ie != null)
{
Process.GetProcessById(_processId).Kill();
_ie = null;
}
}
}
公共类静态:IDisposable
{
私家侦探(IE),;
私有内部线程;
专用字符串_ieHwnd;
私有int_processId;
公共统计(即aBrowser)
{
收割机(aBrowser);
}
公共IE浏览器
{
得到
{
var currentThreadId=GetCurrentThreadId();
_ie=Browser.AttachTo(Find.By(“hwnd”),1);
如果(currentThreadId!=\u ieThread)
{
_ieThread=currentThreadId;
}
返回(ie),;
}
}
私人旅行社(即aBrowser)
{
_ie=aBrowser;
_ieHwnd=_ie.hWnd.ToString();
_ieThread=GetCurrentThreadId();
_processId=_ie.processId;
}
私有int GetCurrentThreadId()
{
返回Thread.CurrentThread.GetHashCode();
}
公共空间处置()
{
如果(_ie!=null)
{
Process.GetProcessById(_processId.Kill();
_ie=null;
}
}
}
上面的代码解决了我的问题。
每次跑步都会杀死IE,这是因为ie仍在运行。很抱歉这么晚才回复Neil T,但我正在考虑使用各种架构,但仍然出现了错误……。此外,我需要在整个应用程序运行期间使用该实例…………请各位在这个问题上帮我+1,对我有效。但是宁可杀死“iexplore”而不是“iexplorer”:-)opps,修复了,谢谢你指出拼写错误>
public class StaticIE : IDisposable
{
private IE _ie;
private int _ieThread;
private string _ieHwnd;
private int _processId;
public StaticIE(IE aBrowser)
{
SetBrowser(aBrowser);
}
public IE Browser
{
get
{
var currentThreadId = GetCurrentThreadId();
_ie = Browser.AttachTo<IE>(Find.By("hwnd", _ieHwnd), 1);
if (currentThreadId != _ieThread)
{
_ieThread = currentThreadId;
}
return _ie;
}
}
private void SetBrowser(IE aBrowser)
{
_ie = aBrowser;
_ieHwnd = _ie.hWnd.ToString();
_ieThread = GetCurrentThreadId();
_processId = _ie.ProcessID;
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
public void Dispose()
{
if (_ie != null)
{
Process.GetProcessById(_processId).Kill();
_ie = null;
}
}
}
Process[] processes = Process.GetProcessesByName("iexplore");
foreach (Process process in processes)
{
process.Kill();
}