Eva*_*van 7 c# internet-explorer automation
我正在使用
SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer()
Run Code Online (Sandbox Code Playgroud)
控制/自动化Internet Explorer的实例.在某些页面上,我想运行一个JavaScript函数(init()
).看来要做到这一点的最好办法是使用HtmlDocument
的InvokeScript
方法,我一直在努力,没有运气如下:
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.HtmlDocument
从ie.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
.有任何想法吗?(此外,我确保在运行该代码之前已完全加载页面)
问题与线程有关 - 我浪费了很多时间与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)
希望它可以帮到某人!
您必须在 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)