Ошибка при доступе к Frames в Watin новой версии 2.1

Ниже выдается ошибка при доступе к ie.Frames в новой версии Watin 2.1

Детали ошибки: COM-объект, который был отделен от базового RCW, не может быть использован.

    System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
   at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, Boolean& pfNeedsRelease)
   at mshtml.HTMLFrameElementClass.IHTMLElement_get_tagName()
   at WatiN.Core.Native.InternetExplorer.IEElement.get_TagName()
   at WatiN.Core.ElementTag.FromNativeElement(INativeElement nativeElement)
   at WatiN.Core.StaticElementFinder.CreateTagList(INativeElement nativeElement)
   at WatiN.Core.StaticElementFinder..ctor(DomContainer domcontainer, INativeElement nativeElement)
   at WatiN.Core.Element.InitElement(DomContainer domContainer, INativeElement nativeElement, ElementFinder elementFinder)
   at WatiN.Core.Element..ctor(DomContainer domContainer, INativeElement nativeElement)
   at WatiN.Core.Frame..ctor(DomContainer domContainer, INativeDocument frameDocument)
   at WatiN.Core.FrameCollection..ctor(DomContainer domContainer, INativeDocument htmlDocument)
   at WatiN.Core.Document.get_Frames()

Пожалуйста, помогите мне в решении этого.

4 ответа

Решение

Я изменил код для AllFramesProcessor, используя предложение Правина (см. Ниже).

Прежде чем я сделал это, я сделал обновление SVN на стволе Watin. Джероен сделал проверку 18.04.11, которая исправила проблему вокруг WaitForFramesToComplete, чтобы повторить / подождать загрузку основного документа. Одно только исправление Jeroen не решило проблему, но я полагаю, что именно сочетание этого кода и модифицированного AllFramesProcessor сделало Watin более устойчивым к проблеме Frames.

public AllFramesProcessor(HTMLDocument htmlDocument)
{
    Elements = new List<INativeDocument>();
    _htmlDocument = htmlDocument;

    // Bug fix, trying to revert back to previous version
    // http://stackru.com/questions/5882415/error-when-accessing-the-frames-in-watin-new-version-2-1
    //_iFrameElements = (IHTMLElementCollection)htmlDocument.all.tags("iframe");

    _iFrameElements = (IHTMLElementCollection)_htmlDocument.all.tags("frame");

    // If the current document doesn't contain FRAME elements, it then
    // might contain IFRAME elements.
    if (_iFrameElements.length == 0)
    {
        _iFrameElements = (IHTMLElementCollection)_htmlDocument.all.tags("iframe");
    }
}

Вы можете обойти это, зайдя ie.NativeDocument.Frames а затем прохождение ie и любой INativeElement возражает против WatiN.Core.Element конструктор:

   Element ElementFromFrames(string elementId, IList<INativeDocument> frames)
   { 
     foreach(var f in frames)
      {
        var e=f.Body.AllDescendants.GetElementsById(elementId).FirstOrDefault();
        if (e != null) return new Element(ie ,e);

        if (f.Frames.Count > 0) 
         { var ret = ElementFromFrames(elementId, f.Frames);
           if (ret != null) return ret;
         }
      }     

     return null;
   }

С https://sourceforge.net/tracker/?func=detail&aid=3290877&group_id=167632&atid=843727

Эта проблема, кажется, вызвана классом AllFramesProcessor. Конструктор для этого класса в Watin 1.3 выглядел так:

public AllFramesProcessor(DomContainer domContainer, HTMLDocument
htmlDocument)
{
elements = new ArrayList();

frameElements = (IHTMLElementCollection)
htmlDocument.all.tags(ElementsSupport.FrameTagName);

// If the current document doesn't contain FRAME elements, it then
// might contain IFRAME elements.
if (frameElements.length == 0)
{
frameElements = (IHTMLElementCollection)
htmlDocument.all.tags("IFRAME");
}

this._domContainer = domContainer;
this.htmlDocument = htmlDocument;
}

Конструктор в 2.1 выглядит так:

public AllFramesProcessor(HTMLDocument htmlDocument)
{
Elements = new List<INativeDocument>();
_htmlDocument = htmlDocument;

_iFrameElements =
(IHTMLElementCollection)htmlDocument.all.tags("iframe");
}

Изменяя "htmlDocument.all.tags("iframe")" быть"htmlDocument.all.tags("frame")" в соответствии с конструктором Watin 1.3 это, кажется, решает эту проблему. Не совсем уверен, почему конструктор был изменен, чтобы просто искать iFrames, хотя.

Недавно я также столкнулся с этой проблемой, и я начал с того, что следовал ответу Ричарда Гионса (принятому), и просто немного пояснил, что я сделал следующее:

svn co https://watin.svn.sourceforge.net/svnroot/watin watin 

а затем загрузил решение "Watin/trunk/src/WatiN.sln" и перекомпилировал src, а затем сослался на этот новый Watin.core.dll в моем проекте.

Низко и вот browser.Frame(Find.ByName("maincontent")); начал работать, и мне не нужно было вносить какие-либо другие изменения в код AllFrames. Поэтому я думаю, что источник SVN уже был обновлен, чтобы включить это изменение

Другие вопросы по тегам