Компонент WatiN.Core.IE, выдающий тайм-аут при ошибке занятости Internet Explorer при открытии URL - PullRequest
15 голосов
/ 21 сентября 2010

Я использую компонент 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 ]

13 голосов
/ 04 октября 2010

Это может быть состояние гонки, попробуйте увеличить время ожидания ватина до инициализации объекта ie.

Как это:

   Settings.AttachToBrowserTimeOut = 240;
   Settings.WaitUntilExistsTimeOut = 240;
   Settings.WaitForCompleteTimeOut = 240;             
9 голосов
/ 22 сентября 2010

Возможно, экземпляр IE не удаляется должным образом.Вы захотите проверить диспетчер задач и посмотреть, сколько открытых процессов IEXPLORE.EXE у вас работает.Если у вас их больше двух, я бы предложил реализовать блок using и затем снова проверить диспетчер задач:

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"));
3 голосов
/ 07 октября 2010

Я использую этот класс для подключения к браузеру. И это отлично работает.

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;
        }
    }
}
1 голос
/ 28 июля 2012
Process[] processes = Process.GetProcessesByName("iexplore");

        foreach (Process process in processes)
        {
            process.Kill();
        }

Этот код решил мою проблему. Просто убивает IE при каждом запуске, потому что он все еще работает.

...