2011-06-12 11 views
12

Quiero usarlo para invocar algunos scripts JS en la página web. Tengo esto:Uso de WebBrowser en una aplicación de consola

static void Stuff() 
    { 
     WebBrowser browser = new WebBrowser(); 
     browser.Navigate("http://www.iana.org/domains/example/"); 
     HtmlDocument doc = browser.Document; 
     //doc.InvokeScript("someScript"); 
     Console.WriteLine(doc.ToString()); 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("hi"); 
     var t = new Thread(Stuff); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

Pregunta 1: Tengo una "referencia a objeto no establecida" excepción al intentar obtener doc.ToString(). ¿Por qué?

Pregunta 2: ¿Cómo obtengo algunos datos del documento HTML en el programa principal? WebBrowser requiere un hilo separado, que requiere un método estático que no puede devolver ningún valor. ¿Cómo devuelvo, digamos, doc al Main() para que pueda hacer algo con él?

+0

Los métodos estáticos en realidad pueden devolver un valor. Son hilos que no pueden. Además, los hilos * pueden * usar un método no estático. – icktoofay

+0

¿Por qué está esto downvoted? – Amy

Respuesta

10

idea correcta, ejecución incorrecta. WebBrowser.Navigate() solo le dice al navegador web iniciar la navegación a la página web que solicitó. Eso lleva tiempo, cientos de milisegundos por lo general. Internet Explorer internamente inicia subprocesos para realizar el trabajo. Te dice cuándo se hace al generar el evento DocumentCompleted. No esperas eso, así que primero es la ciudad de choque.

El siguiente problema es que el evento DocumentCompleted no se generará en su código. Debe cumplir con el contrato de STA, requiere que active un ciclo de mensajes. Esa es la poderosa forma en que un hilo de fondo, como el que IE usa para recuperar una página web, le dice a su hilo que el trabajo está hecho.

El código estándar que necesita está disponible en this answer.

+0

¿Cómo harías para encadenar actividades? Desea navegar a alguna página, luego ingresar texto en un cuadro de texto y hacer clic en buscar, o ir. ¿Necesita simplemente hacer que el objeto WebBrowser sea global y luego encadenar 4 métodos, navegar, desplazarse por el documento completado, ingresar texto y pulsar ir, entertextandhitgo y completar el documento? – NathanTempelman

+1

Una máquina de estado es la solución simple para problemas de programación asíncrona. Simplemente haga un seguimiento del estado con un entero o una enumeración. –

+1

Solo una nota al margen: al intentar automatizar un control WebBrowser sin interacción del usuario, se encontrará con serios problemas con los cuadros de diálogo emergentes a menos que configure 'webBrowser.ScriptErrorsSuppressed = true' * (que, a pesar de su nombre, suprime todos los cuadros de diálogo , no solo errores de script) *. [Ver también] (http://stackoverflow.com/a/20612526/238419). –

Cuestiones relacionadas