2011-06-12 5 views
12

Je souhaite l'utiliser pour appeler certains scripts JS sur la page Web. J'ai ceci:Utilisation de WebBrowser dans une application console

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(); 
    } 

Question 1: Je reçois une exception « référence d'objet pas encore défini » lorsque je tente d'obtenir doc.ToString(). Pourquoi?

Question 2: Comment puis-je obtenir des données du document HTML dans le programme principal? WebBrowser nécessite un thread séparé, ce qui nécessite une méthode statique qui ne peut renvoyer aucune valeur. Comment puis-je retourner, par exemple, doc au Main() pour que je puisse faire quelque chose avec?

+0

Les méthodes statiques peuvent réellement renvoyer une valeur. Ce sont les threads qui ne peuvent pas. En outre, les threads * peuvent * utiliser une méthode non statique. – icktoofay

+0

Pourquoi cela est-il déprécié? – Amy

Répondre

10

Bonne idée, mauvaise exécution. Le WebBrowser.Navigate() indique seulement le navigateur Web à commencer naviguant vers la page Web que vous avez demandée. Cela prend du temps, des centaines de millisecondes en général. Internet Explorer démarre en interne les threads pour que le travail soit terminé. Il vous indique quand cela est fait en soulevant l'événement DocumentCompleted. Vous n'attendez pas cela, c'est d'abord la ville du crash.

Le problème suivant est que l'événement DocumentCompleted ne sera pas déclenché dans votre code. Vous devez honorer le contrat STA, il vous oblige à pomper une boucle de message. C'est la façon la plus puissante qu'un thread d'arrière-plan, comme celui utilisé par IE pour récupérer une page Web, indique à votre thread que le travail est terminé. Le code standard requis est disponible au this answer.

+0

Comment iriez-vous à propos des activités de chaînage? Vous souhaitez accéder à une page, puis entrer du texte dans une zone de texte, puis cliquer sur Rechercher ou sur OK. Avez-vous besoin de rendre l'objet WebBrowser global, puis d'enchaîner 4 méthodes, de naviguer, de naviguer dans le document terminé, d'entrer du texte et de cliquer sur go, entertextandhitgo's document completed event? – NathanTempelman

+1

Une machine d'état est la solution simple aux problèmes de programmation asynchrone. Il suffit de garder une trace de l'état avec un entier ou une énumération. –

+1

Juste une note: en essayant d'automatiser un contrôle WebBrowser sans interaction de l'utilisateur, vous rencontrerez de sérieux problèmes avec les popup-dialogs sauf si vous définissez 'webBrowser.ScriptErrorsSuppressed = true' * (qui, malgré son nom, supprime tous les dialogues , pas seulement les erreurs de script) *. [Voir aussi] (http://stackoverflow.com/a/20612526/238419). –

Questions connexes