繁体   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