Доступ к полному источнику страницы в WatiN - PullRequest
3 голосов
/ 11 сентября 2009

Я ищу способ пропустить мои веб-страницы через валидатор DTD в рамках моих тестов WatiN, но я пока не нашел чистого способа доступа к необработанному HTML. Есть ли встроенный способ сделать это?

Я думаю, что мог бы получить доступ к свойству IE.InternetExplorer и QueryInterface для интерфейса IPersistStreamInit и сериализовать документ в IStream, но кажется, что большая работа для того, что, я думаю, должна быть довольно распространенной задача.

Я упускаю что-то очевидное в WatiN? Или кто-то может придумать лучшее решение, чем приведенное выше? Это решение очень специфично для IE.

Ответы [ 5 ]

1 голос
/ 04 мая 2012

string html = browser.Body.Parent.OuterHtml;

1 голос
/ 24 марта 2011

Вот как вы получаете доступ к исходному коду:

browser.ActiveElement.Parent.OuterHtml
0 голосов
/ 03 мая 2012

Я нашел:

browser.ActiveElement.Parent.OuterHtml

не всегда получит все, что зависит от вашего 'ActiveElement', поэтому:

browser.Body.Parent.OuterHtml

кажется, работает лучше. (browser является вашим экземпляром IE)

Хотя я считаю, что Йохан Левин прав, говоря, что DOM сериализуется обратно в текстовый формат. Поэтому было бы проще просто получить документ по его URL (без использования WatiN) для его проверки.

0 голосов
/ 27 июля 2011

Мысль о том, чтобы пропустить несколько строк, чтобы помочь любому, кто борется за то, чтобы получить первозданный HTML-источник веб-страницы через WatiN, однако не исправляя WatiN - это просто вопрос вкуса.

Итак, воспользовавшись патчем Йохана Левина, я собрал следующее. Будьте в безопасности и надеюсь, что вы найдете это полезным.

    private static TextVariant GetWebPageSource(IE browser)
    {
    IHTMLDocument2 htmlDocument = ((IEDocument)(browser.DomContainer.NativeDocument)).HtmlDocument;
    Encoding encoding = Encoding.GetEncoding(htmlDocument.charset);
        IPersistStreamInit persistStream = (IPersistStreamInit)htmlDocument;
        MinimalIStream stream = new MinimalIStream();
        persistStream.Save(stream, false);
        return new TextVariant(encoding.GetString(stream.ToArray()));
    }

    [Guid("7FD52380-4E07-101B-AE2D-08002B2EC713")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPersistStreamInit
    {
        void GetClassID(out Guid pClassID);
        int IsDirty();
        void Load(IStream pStm);
        void Save(IStream pStm, bool fClearDirty);
        void GetSizeMax(out long pcbSize);
        void InitNew();
    }

    // http://stackoverflow.com/questions/6601355/passing-an-fstream-or-equivalent-from-c-to-c-through-cli
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class MinimalIStream : MemoryStream, IStream
    {
        public MinimalIStream() { }

        public MinimalIStream(byte[] data) : base(data) { }

        #region IStream Members
        public void Write(byte[] pv, int cb, IntPtr pcbWritten)
        {
            base.Write(pv, 0, cb);
            if (pcbWritten != IntPtr.Zero)
                Marshal.WriteInt64(pcbWritten, (long)cb);
        }

        public void Stat(out STATSTG pstatstg, int grfStatFlag)
        {
            pstatstg = new STATSTG();
            pstatstg.cbSize = base.Length;
        }

        public void Read(byte[] pv, int cb, IntPtr pcbRead)
        {
            long bytes_read = base.Read(pv, 0, cb);
            if (pcbRead != IntPtr.Zero) Marshal.WriteInt64(pcbRead, bytes_read);
        }

        public void Seek(long dlibMove, int dwOrigin, IntPtr plibNewPosition)
        {
            long pos = base.Seek(dlibMove, (SeekOrigin)dwOrigin);
            if (plibNewPosition != IntPtr.Zero) Marshal.WriteInt64(plibNewPosition, pos);
        }

        public void Clone(out IStream ppstm)
        {
            ppstm = null;
        }

        public void Commit(int grfCommitFlags)
        {
        }

        public void CopyTo(IStream pstm, long cb, IntPtr pcbRead, IntPtr pcbWritten)
        {
        }

        public void LockRegion(long libOffset, long cb, int dwLockType)
        {
        }

        public void SetSize(long libNewSize)
        {
        }

        public void Revert()
        {
        }

        public void UnlockRegion(long libOffset, long cb, int dwLockType)
        {
        }
        #endregion
    }
0 голосов
/ 13 сентября 2009

Кажется, нет лучшего способа. Я отправил запрос функции и вместо этого отправил патч на трекер Sourceforge WatiN.

...