[英]How to send JavaScript code to IE using C# (.Net 3.5), run it, then get a string return value from the JS code?
我们正在开发一个需要与IE中的活动文档进行交互的应用程序。
上下文:该应用程序是C#.Net 3.5桌面应用程序。 目的是根据用户要求突出显示网页中的特定文本元素。 为此,我们需要检索和解释网页元素(需要返回值),然后通过另一个JS调用对它们进行操作。 网页中必须进行的操作不能同时完成,因此我们必须获得有趣文本元素的“快照”(我们在Mac版本的应用中通过返回包含这些元素的XML表示形式)。
在.Net中,我们成功地使用了IHTMLDocument2
的execScript
方法在活动IE文档中运行了一些JavaScript,但似乎找不到从调用中获取返回值的方法。 基于文档execScript返回执行成功/失败常量,这不是我们所需要的。
本质上,我们需要做的是将一些JavaScript从文本文件加载到字符串中,然后将其发送到IE进行执行。 然后,我们需要从被调用的脚本中获取一个字符串。
关于使用哪些对象的任何提示? 如何继续获得此功能?
提前致谢!
我的同事根据阿伦·哈福德的说法找到了解决方案:
string jsToRun = "function myTest() { return document.title; } myTest();";
mshtml.IHTMLDocument2 myIHTMLDocument2 = GetSelectedIEWindow();
IE ie = IE.AttachToIE(Find.ByUrl(myIHTMLDocument2.url));
string jsReturn = ie.Eval(jsToRun);
然后, jsReturn
包含从JavaScript中的myTest()
返回的字符串值。 请注意,脚本中的myTest()
函数调用之前没有return
!
如果您自己提供html和脚本,则可以执行以下操作:
我不确定是否有更简单的方法可以做到这一点。
看看WatiN代码库。 在那里,IE.Eval完全可以满足您的需求。
好吧,这很讨厌,但是可以做到的。
尝试这个:
[Guid("626FC520-A41E-11CF-A731-00A0C9082637"), InterfaceType(ComInterfaceType.InterfaceIsDual)] interface IHTMLDocument { void Script([Out, MarshalAs(UnmanagedType.Interface)] out object ppScript); } public object RunScript(InternetExplorer ie, string scriptText) { IHTMLDocument doc = (IHTMLDocument)ie.Document; object scriptObj; doc.Script(out scriptObj); Type t = scriptObj.GetType(); return t.InvokeMember("eval", System.Reflection.BindingFlags.InvokeMethod, null, scriptObj, new object[] { scriptText }); }
这将返回您在对象中的值(只需转换为您期望的任何类型)。 当然,.NET 4使这更加容易;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.