2011-12-26 2 views
0

я итерация очень большой список дивы с WatiN (около 3000), и я получаю сообщение об ошибке:Как исправить WatiN OutOfMemoryException

A first chance exception of type 'System.OutOfMemoryException' occurred in WatiN.Core.dll 
System.OutOfMemoryException: Insufficient memory to continue the execution of the program. 
    at WatiN.Core.UtilityClasses.UtilityClass.TryFuncFailOver[T](DoFunc`1 func, Int32 numberOfRetries, Int32 sleepTime) 
    at WatiN.Core.Native.InternetExplorer.IEElement.GetWithFailOver[T](DoFunc`1 func) 
    at WatiN.Core.Native.InternetExplorer.IEElement.GetAttributeValue(String attributeName) 
    at WatiN.Core.Element.GetAttributeValueImpl(String attributeName) 
    at WatiN.Core.Component.GetAttributeValue(String attributeName) 
    at WatiN.Core.Element.get_OuterHtml() 
    at WatiN.Core.Document.get_Html() 

При щелчке DIV затем получить HTML-код из браузер.

Кто-нибудь знает, как исправить проблему с памятью? Я надеюсь, что смогу использовать другую функцию или как-нибудь разбить страницу. Может быть, мне нужно будет использовать что-то другое, чем WatiN

Код:

foreach (Div d in browser.Divs) 
        { 

         try 
         { 
          d.Click(); // click div 

          System.Threading.Thread.Sleep(250); //wait for new data to load 

          string url = ""; 
          if (browser.Html.Contains("http://www.google.com/url?")) // check if an external link exists on the page - this causes the memory exception 
          { 

Спасибо за любую помощь

Chris

+0

Просьба заполнить полный метод, который содержит этот код .. так что вы можете понять, что, черт возьми, вы даже пытаетесь сделать .. например, d.Click(), какой код происходит там .. это выглядит довольно грязно в терминах логики кода – MethodMan

ответ

0

В этом случае проблема с Internet Explorer была связана с тем, что объем используемой памяти превысил 1 ГБ и предположительно ударил 32-битный предел объекта .net где-то.

В моем случае работа на 64-битной системе «исправлена» (или, скорее, отложена) проблема.

0

Сначала не спать нить пользователя, когда вы ждете страницы , у вас есть browser.WaitForComplete()

Если вы ищете проверку того, что ссылка приведет вас к определенной странице, вы можете прямо проверить URL-адрес браузера это: browser.Url.Contains ("address") ...

+0

Обратите внимание, что Крис мог ждать на AJax или подобных асинхронных вызовах, чтобы закончить с помощью Thread.Sleep(). Не лучший способ, но WaitForComplete не работает для загрузки AJax-y. – OCary

+0

Привет, как это бывает, я ждал ajax, который требует thread.sleep - я должен был выложить достаточно кода, чтобы это стало ясно. – chris

+0

А жаль пропустил это. – alonp