Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WatiN.Core.IE组件在Internet Explorer忙时超时打开URL时出错_C#_Watin - Fatal编程技术网

C# WatiN.Core.IE组件在Internet Explorer忙时超时打开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

我使用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 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();
        }