Ошибка при доступе к Frames in Watin новой версии 2.1 - PullRequest
4 голосов
/ 04 мая 2011

Ниже выдается ошибка при доступе к 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 ]

4 голосов
/ 12 мая 2011

Я изменил код для 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
    // /7647990/oshibka-pri-dostupe-k-frames-in-watin-novoi-versii-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");
    }
}
2 голосов
/ 09 мая 2011

из 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.

2 голосов
/ 07 мая 2011

Вы можете обойти эту проблему, открыв 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;
   }
0 голосов
/ 13 декабря 2011

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

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 уже был обновлен, чтобы включить это изменение

...