我正在使用WATin IE组件浏览特定网站 在StartBrowsing按钮上单击事件我正在初始化WatiN.Core.IE的对象并传递用于打开网站的网站URL 如下面的代码片段所示: -
WatiN.Core.IE ie;
private void btnStartBrowsing_Click(object sender, EventArgs e)
{
ie = new IE(URLs.mainURL);
}
有时候或者说我应该说5/10次我收到此错误: - “Internet Explorer忙时超时”
如何解决这个问题?
答案 0 :(得分:13)
在初始化ie对象之前尝试增加watin超时可能是竞争条件。
像这样:
Settings.AttachToBrowserTimeOut = 240;
Settings.WaitUntilExistsTimeOut = 240;
Settings.WaitForCompleteTimeOut = 240;
答案 1 :(得分:9)
IE实例可能没有正确处理。您需要检查任务管理器,看看您运行了多少个打开的IEXPLORE.EXE进程。如果你有两个以上,我会建议实现一个使用块,然后再次检查任务管理器:
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))
{
...
}
}
<强>更新强> 由于您需要在会话期间访问浏览器,我强烈建议使用单例对象来容纳浏览器对象:
public sealed class BrowserIE
{
static readonly IE _Instance = new IE();
static BrowserIE()
{
}
BrowserIE()
{
}
public static IE Instance
{
get { return _Instance; }
}
}
浏览器只打开一次,您可以随时访问它,因为您不必手动实例化它。要使用它,只需在每次需要访问浏览器时调用Instance属性:
BrowserIE.Instance.GoTo(URLs.mainURL);
Divs headerDivs = BrowserIE.Instance.Divs.Filter(Find.ByClass("header"));
答案 2 :(得分:3)
我使用此类附加到浏览器。它工作正常。
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;
}
}
}
答案 3 :(得分:1)
Process[] processes = Process.GetProcessesByName("iexplore");
foreach (Process process in processes)
{
process.Kill();
}
上面的代码解决了我的问题。 只需在每次运行中杀死IE,因为它仍在运行。