2010-08-18 2 views
7

J'utiliseExécution d'une fonction JavaScript dans une instance d'Internet Explorer

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 

pour contrôler/automatiser une instance d'Internet Explorer. Sur certaines pages, je voudrais exécuter une fonction JavaScript (init()). Il semble que la meilleure façon de le faire est d'utiliser une méthode de InvokeScriptHtmlDocument et je l'ai essayé ce qui suit à pas de chance:

void ie_DocumentComplete(object pDisp, ref object URL) 
{ 
    System.Windows.Forms.HtmlDocument doc = ie.Document; 
    doc.InvokeScript("init"); 
} 

qui échoue parce que doc est nulle. Je ne peux pas sembler obtenir un System.Windows.Forms.HtmlDocument de ie.Document. En plus d'essayer ce qui précède, j'ai aussi essayé:

System.Windows.Forms.HtmlDocument doc2 = (System.Windows.Forms.HtmlDocument)ie.Document; 

et

System.Windows.Forms.HtmlDocument doc2 = ie.Document as System.Windows.Forms.HtmlDocument; 

Toutes les idées sur la façon dont je peux obtenir ce travail - ou une meilleure façon d'exécuter des scripts sur la page?

Merci!

EDIT:

Une autre façon d'exécuter une fonction JavaScript semble être:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 
mshtml.HTMLDocument doc = ie.Document; 
mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 
win.execScript("init();", "javascript"); 

Mais la ligne

mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 

génère une erreur qu'il est une distribution non valide (InvalidCastException) - même si IntelliSense (et MSDN) disent doc.parentWindow est un IHTMLWindow2. Des idées? (Aussi je me suis assuré d'une page a été complètement chargée avant d'exécuter ce code)

Répondre

6

Le problème avait à voir avec filetage - j'ai perdu beaucoup de temps avec des problèmes de STA vous penseriez que je serais apprendre maintenant :).

De toute façon j'ai trouvé un moyen d'obtenir le deuxième bit de code que j'ai posté fonctionnant et exécutant des fonctions javascript dans la fenêtre IE! Voici le code:

this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => 
       { 

         mshtml.HTMLDocument doc = ie.Document; 

         mshtml.IHTMLWindow2 win = doc.parentWindow as IHTMLWindow2; 
         win.execScript("init();", "javascript"); 


       })); 

Espérons que ça aide quelqu'un!

+0

Votre réponse serait plus susceptible de vous aider si vous expliquiez précisément ce que vous avez fait pour résoudre le problème de threading. :-) – EricLaw

0

Le SHDocVw.InternetExplorer.Document est de type mshtmlHTMLDocumentClass, vous devez donc faire référence Microsoft.mshtml

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 

IE L'objet doit également naviguer quelque part pour que le document ait une valeur. tels que

object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 

initialisation Total:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer(); 
object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 
+0

Merci pour votre réponse, mais je vais avoir du mal à obtenir cette ligne de travail. Il donne l'erreur de compilateur suivante: "Intersh type 'mshtml.HTMLDocumentClass' ne peut pas être incorporé.Utilisez l'interface applicable à la place." Des idées? – Evan

+0

(par cette ligne je veux dire "mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass) ie.Document;" – Evan

+0

Avez-vous ajouté une référence à Microsoft.mshtml dans vos références? (Pas l'Interop) Il est sous la liste de .net –

1

Vous devez accéder à document.parentWindow dans un thread STA. Cela peut vous aider:

private WebBrowser _webBrowser; //initialize this somewhere 

    private void ExecuteJavaScript() 
    { 
    Thread aThread = new Thread(ExecuteJavaScriptWorker); 
    aThread.SetApartmentState(ApartmentState.STA); 
    aThread.Start(); 
    } 

    private void ExecuteJavaScriptWorker() 
    { 
     HTMLDocument _document = _webBrowser.Document; 
     _document.parentWindow.execScript("alert('Arbitrary javascript code')", "javascript"); 
    } 
1

Ceci est un exemple de la façon d'obtenir Document d'une page.Il est proche des exemples présentés ci-dessus avec la petite (mais importante) différence - j'utilise la méthode Navigate2 - celle-ci fonctionne correctement.

public static mshtml.HTMLDocument NavigateTo(String anUrl) { 
    object locEmpty = 0; 
    object locUrl = anUrl; 
    SHDocVw.InternetExplorer _ie = new SHDocVw.InternetExplorer(); 
    _ie.Visible = true; 
    _ie.Navigate2(locUrl, ref locEmpty, ref locEmpty, ref locEmpty, ref locEmpty); 
    return(_ie.Document); 
} 

Cet exemple fonctionnera pour toutes les pages ouvertes par IE dans la fenêtre Regular (Not Modal). Pour les fenêtres modales (ou les boîtes de dialogue modales), cet exemple ne fonctionne pas.

0

vous pouvez simplement faire:

ie.Navigate("javascript:" + jsScript); 

où est-à-dire votre instance de internetexplorer

+1

Très limité! en termes de code que vous pouvez exécuter! –

Questions connexes