[英]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.