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

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

Как обойти эту проблему?

Ответы

Ответ 1

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

using (IE ie = new IE(URLs.mainURL)
{
    ...
}

Еще лучше было бы использовать метод AttachTo, как только вы инициализировали переменную экземпляра "master" браузера:

private IE ie = new IE();

public void btnStartBrowsing_Click(object sender, EventArgs e)
{
    using ie2 = ie.AttachTo<IE>(Find.ByUrl(URLs.mainURL))
    {
        ...
    }
}

UPDATE: Поскольку вам нужен доступ к браузеру в течение всего сеанса, я бы настоятельно предложил использовать объект singleton для размещения объекта браузера:

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

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

Вот так:

   Settings.AttachToBrowserTimeOut = 240;
   Settings.WaitUntilExistsTimeOut = 240;
   Settings.WaitForCompleteTimeOut = 240;             

Ответ 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;
        }
    }
}

Ответ 4

Process[] processes = Process.GetProcessesByName("iexplore");

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

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