Сильно использовать Watin, IE оставаться открытой проблемой - PullRequest
5 голосов
/ 04 марта 2010

Я использую консольное приложение Watin в C # для сканирования сайтов, одновременно запущено пять консольных приложений. Причина, по которой я частично использую Watin в качестве сканера, заключается в том, что некоторые веб-сайты используют javascript (или ajax) для настройки содержимого страницы.

Ниже приведен пример кода для подсчета комментариев на странице:

        Settings.Instance.MakeNewIeInstanceVisible = false;
        using (var browser = new IE(commentLink, true))
        {
            browser.Link(Find.ByUrl(commentLink)).WaitUntilExists(20);

            Span commentSpan = browser.Span("COUNT_TOTAL");

            if (commentSpan.Exists)
            {
                int commentCount;
                if (Int32.TryParse(commentSpan.InnerHtml, out commentCount))
                {
                    return commentCount;
                }
            }
        }

Моя проблема в том, что после запуска этих 5 консольных приложений некоторое время (90 минут), многие экземпляры IE остаются открытыми (из-за таймаута или ошибки или IE занят), поэтому система работает довольно медленно и требует перезагрузки .

Как мне изменить свой код, чтобы предотвратить это и сделать мои приложения эффективными?

1 Ответ

7 голосов
/ 10 марта 2010

Я думаю, что в вашем примере кода есть только один момент, когда IE не будет близко. Поскольку вы находитесь внутри using, даже если исключение внутри этого using произойдет, браузер будет удален, поэтому все в порядке.

Но в момент создания браузера:

new IE(commentLink, true)

вы не внутри using, и нет магии try...catch. Попробуйте это, и дайте мне знать, если это помогло:

Settings.Instance.MakeNewIeInstanceVisible = false;
using (var browser = new IE(true))
{
    browser.GoTo(commentLink);

    browser.Link(Find.ByUrl(commentLink)).WaitUntilExists(20);

    Span commentSpan = browser.Span("COUNT_TOTAL");

    if (commentSpan.Exists)
    {
        int commentCount;
        if (Int32.TryParse(commentSpan.InnerHtml, out commentCount))
        {
            return commentCount;
        }
    }
}
...