簡體   English   中英

如何使用C#(.Net 3.5)將JavaScript代碼發送到IE,運行它,然后從JS代碼獲取字符串返回值?

[英]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中,我們成功地使用了IHTMLDocument2execScript方法在活動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和腳本,則可以執行以下操作:

  • 執行javascript函數
  • 讓js函數將結果放置在html元素中
  • 等到函數完成運行
  • 使用document.getElementById檢索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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM