À l'aide de WebBrowser dans une application console
Je veux l'utiliser pour invoquer certains scripts JS sur la page web. J'ai ceci:
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: j'obtiens un "objet de référence non définie" exception lorsque j'essaie d'obtenir doc.ToString()
. Pourquoi?
Question 2: Comment puis-je obtenir des données à partir d'un document HTML dans le programme principal? WebBrowser
nécessite un thread séparé, ce qui nécessite une méthode statique qui ne peut pas renvoyer une valeur. Comment puis-je retourner, disons, doc
à la Main()
si je peux faire quelque chose avec elle?
Méthodes statiques en fait peut retourner une valeur. C'est threads qui ne le peuvent pas. Aussi, les threads utiliser une non-méthode statique.
Pourquoi cela est-il downvoted?
Pourquoi cela est-il downvoted?
OriginalL'auteur Hui | 2011-06-12
Vous devez vous connecter pour publier un commentaire.
Bonne idée, mauvaise exécution. Le WebBrowser.Naviguer() dit seulement le navigateur web pour commencer la navigation vers la page web que vous avez demandé. Cela prend du temps, de plusieurs centaines de millisecondes. Internet Explorer en interne commence threads pour faire le travail. Il vous indique quand il est fait par le relèvement de la DocumentCompleted événement. Vous n'attendez pas que si c'est un crash de la ville en premier.
Problème suivant est que le DocumentCompleted événement ne sera pas soulevée dans votre code. Vous avez de l'honneur de la STA contrat, il vous oblige à pompe une boucle de message. C'est le tout-puissant, de manière qu'un thread d'arrière-plan, comme celui que IE utilise pour récupérer une page web, dit votre thread que le travail est fait.
Le code réutilisable, que vous avez besoin est disponible dans cette réponse.
Une machine d'état est la solution simple pour la programmation asynchrone problèmes. Il suffit de garder une trace de l'état avec un entier ou un enum.
Juste une note: lorsque vous essayez d'automatiser un contrôle WebBrowser sans interaction de l'utilisateur, vous serez confronté à des problèmes graves avec des pop-up boîtes de dialogue, sauf si vous définissez
webBrowser.ScriptErrorsSuppressed = true
(qui, malgré son nom, supprime toutes les boîtes de dialogue, pas seulement des erreurs de script). Voir aussi.OriginalL'auteur Hans Passant