Компонент 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 при каждом запуске, из-за того, что он все еще работает.