2010-08-18 5 views
7

sto usandoEsecuzione di una funzione JavaScript in un'istanza di Internet Explorer

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 

per controllare/automatizzare un'istanza di Internet Explorer. Su alcune pagine mi piacerebbe eseguire una funzione JavaScript (init()). Sembra che il modo migliore per farlo è quello di utilizzare il metodo 's un HtmlDocumentInvokeScript e ho cercato il seguente senza fortuna:

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

Il che non riesce a causa doc è nullo. Non riesco a ottenere uno System.Windows.Forms.HtmlDocument da ie.Document. Oltre a cercare quanto sopra, ho anche provato:

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

e

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

Tutte le idee su come posso arrivare a questo lavoro - o un modo ancora migliore per eseguire gli script nella pagina?

Grazie !!

EDIT:

Un altro modo per eseguire una funzione JavaScript sembra essere:

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

Ma la linea

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

genera un errore che si tratta di un cast non valido (InvalidCastException) - anche se IntelliSense (e MSDN) dicono che doc.parentWindow è un IHTMLWindow2. Qualche idea? (Anche io ho fatto in modo che una pagina è stata completamente caricato prima di eseguire il codice)

risposta

6

Il problema aveva a che fare con la filettatura - ho sprecato così tanto tempo con problemi STA si potrebbe pensare che avrei imparato ormai :).

In ogni caso, ho trovato un modo per ottenere il secondo bit di codice che ho postato funzionante e che esegue funzioni javascript nella finestra di IE! Ecco il codice:

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

         mshtml.HTMLDocument doc = ie.Document; 

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


       })); 

Spero che aiuti qualcuno!

+0

La tua risposta sarà più probabile che ti aiuti se hai spiegato in modo specifico cosa hai fatto per risolvere il problema del threading. :-) – EricLaw

0

Lo SHDocVw.InternetExplorer.Document è di tipo mshtmlHTMLDocumentClass, quindi è necessario fare riferimento Microsoft.mshtml

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

L'IE l'oggetto deve anche navigare da qualche parte in modo che il documento abbia un valore. come ad esempio

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

init Totale:

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

Grazie per la risposta, ma sto avendo difficoltà a raggiungere quella linea di lavoro. Si tratta del seguente errore del compilatore: "Non è possibile incorporare il tipo di interoperabilità" mshtml.HTMLDocumentClass ". Utilizza invece l'interfaccia applicabile." Qualche idea? – Evan

+0

(da quella riga intendo "mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass) ie.Document;" – Evan

+0

Hai aggiunto un riferimento a Microsoft.mshtml nei tuoi riferimenti? (Non all'interop) È sotto l'elenco di .net riferimenti –

1

È necessario accedere a document.parentWindow in un thread STA. Questo può aiutare:

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

Questo è un esempio di come ottenere documento di qualche pagina.È vicino agli esempi mostrati sopra con la piccola (ma importante) differenza - sto usando il metodo Navigate2 - questo funziona correttamente.

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

Questo esempio funziona per tutte le pagine aperte da Internet Explorer in finestra normale (non modale). Per le finestre modali (o le finestre di dialogo modali), questo esempio non funziona.

0

è possibile semplice fai:

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

dove cioè è l'istanza di InternetExplorer

+1

Molto limitato! in termini di quale codice è possibile eseguire! –