WatiN.Core.IE组件在打开URL时出现Internet Explorer繁忙时出现超时

时间:2010-09-21 10:53:04

标签: c# watin

我正在使用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忙时超时”

如何解决这个问题?

4 个答案:

答案 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,因为它仍在运行。