Pregunta obtener WPF WebBrowser HTML


Estoy usando Wpf WebBrowser para acceder a una página determinada. Necesito obtener su contenido HTML. No puedo usar Webclient o WebReques, etc. porque necesito ejecutar JS en esas páginas. También probé Awesomium y Wf WebBrowser (ambos mal).

    dynamic doc=browser.Document;
    var text=doc.InnerHtml//or something like this

El código anterior no funciona para mí, muestra una referencia nula. ¿Alguien puede decirme cómo ir a buscarlo? Estuve buscando esto durante semanas y no encontré nada realmente funcional: /. Por favor, responda como el idiota más grande que pueda imaginar: D. A veces me sucede que las personas me envían un código y no tengo ni idea de cómo usarlo ... Quiero decir, por favor, hagan que sus publicaciones parezcan terminar con

     string HTML=some_stuff;

O si conoce algún navegador alternativo que no tenga errores y pueda acceder a HTML o algo que me permita ejecutar JS en el HTML cargado con efectos como cookies y cambios en la fuente HTML, también es una buena respuesta. Estaré agradecido por cualquier ayuda.


5
2017-08-28 20:29


origen


Respuestas:


Hice algo así una vez. Fue horrible, pero funciona.

Necesita agregar una referencia a Microsoft.mshtml.

Entonces puedes usar IHTMLDocument2. ¿Por qué 2? Buena pregunta ... de todos modos, escribí un par de funciones auxiliares como esta:

public static void FillField(object doc, string id, string value)
{
    var element = findElementByID(doc, id);
    element.setAttribute("value", value);
}

public static void ClickButton(object doc, string id)
{
    var element = findElementByID(doc, id);
    element.click();
}

private static IHTMLElement findElementByID(object doc, string id)
{
    IHTMLDocument2 thisDoc;
    if (!(doc is IHTMLDocument2))
        return null;
    else
        thisDoc = (IHTMLDocument2)doc;

    var element = thisDoc.all.OfType<IHTMLElement>()
        .Where(n => n != null && n.id != null)
        .Where(e => e.id == id).First();
    return element;
}

Ejecutando js

private static void ExecuteScript(object doc, string js)
{
    IHTMLDocument2 thisDoc;
    if (!(doc is IHTMLDocument2))
        return;
    else
        thisDoc = (IHTMLDocument2)doc;
    thisDoc.parentWindow.execScript(js);
}

Los llamo así ...

HtmlDocumentHelper.FillField(webBrowser.Document, <id>, <value>);
HtmlDocumentHelper.FillField(webBrowser.Document, <id>, <value>);
HtmlDocumentHelper.ClickButton(webBrowser.Document, <id>);
HtmlDocumentHelper.ExecuteScript(webBrowser.Document, "alert(1);");

8
2017-08-28 20:40



Yeeeaaaah! Lo hice. Es tan simple:

    string HTML = (browser.Document as mshtml.IHTMLDocument2).body.outerHTML;

8
2017-08-29 12:31



¿Intentó el método wpf WebBrowser llamado InvokeScript ()?
 

http://msdn.microsoft.com/en-us/library/cc491132(v=vs.110).aspx

string HTML = webBrowser.InvokeScript(@"document.getElementsByTagName ('html')[0].innerHTML").ToString();

0
2017-08-29 06:15



Cuando probé el código de @Gray o @czubehead body Siempre fue nulo. El siguiente código, sin embargo, funcionó para mí:

dynamic webBrowserDocument = webBrowser.Document;
string html = webBrowserDocument?.documentElement?.InnerHtml;

Y asegúrate de que esto debe entrar en LoadCompleted o después. Al usar esto en Navigated La fuente no está completa o incluso null.


0
2017-10-27 19:53