在Internet Explorer实例中运行JavaScript函数

Eva*_*van 7 c# internet-explorer automation

我正在使用

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer()
Run Code Online (Sandbox Code Playgroud)

控制/自动化Internet Explorer的实例.在某些页面上,我想运行一个JavaScript函数(init()).看来要做到这一点的最好办法是使用HtmlDocumentInvokeScript方法,我一直在努力,没有运气如下:

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

哪个失败,因为doc是null.我似乎无法得到System.Windows.Forms.HtmlDocumentie.Document.除了尝试上述内容外,我还尝试过:

System.Windows.Forms.HtmlDocument doc2 = (System.Windows.Forms.HtmlDocument)ie.Document;
Run Code Online (Sandbox Code Playgroud)

System.Windows.Forms.HtmlDocument doc2 = ie.Document as System.Windows.Forms.HtmlDocument;
Run Code Online (Sandbox Code Playgroud)

有关如何使其工作的任何想法 - 或者更好的方式在页面上运行脚本?

谢谢!!

编辑:

另一种运行JavaScript函数的方法似乎是:

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

但行

mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;
Run Code Online (Sandbox Code Playgroud)

抛出一个错误,它是一个无效的cast(InvalidCastException) - 即使IntelliSense(和MSDN)说doc.parentWindow是一个IHTMLWindow2.有任何想法吗?(此外,我确保在运行该代码之前已完全加载页面)

Eva*_*van 6

问题与线程有关 - 我浪费了很多时间与STA问题,你认为我现在已经学习了:).

无论如何,我找到了一种方法来获取我在IE窗口中发布工作和运行javascript函数的第二段代码!这是代码:

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

                        mshtml.HTMLDocument doc = ie.Document;

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


                }));
Run Code Online (Sandbox Code Playgroud)

希望它可以帮到某人!


Jac*_*bak 5

您必须在 STA 线程中访问 document.parentWindow。这可能会帮助您:

  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");
  }
Run Code Online (Sandbox Code Playgroud)