在C#中运行Javascript的最可靠方法是什么?

3

我最初尝试从WebBrowser控件运行。

WebBrowser webBrowser1 = new WebBrowser();
webBrowser1.Visible = false;
webBrowser1.Navigate("about:blank");
webBrowser1.Document.Write("<html><head></head><body></body></html>");

HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
dynamic scriptEl = webBrowser1.Document.CreateElement("script");

scriptEl.DomElement.text = "function test(fn) { try{ window[fn](); } catch(ex) { return 'abc     '.trim(); } }"
    + "function sayHello() { alert('ha'); throw 'error with spaces     '; }";
head.AppendChild(scriptEl);

var result = webBrowser1.Document.InvokeScript("test", new object[] { "sayHello" });

它几乎完美地运行。它知道什么是 windowalert……唯一的问题是,它显然是在 ECMA3 上运行的,所以当我测试 "abc ".trim() 时无法执行。

我的第二次尝试是Javascript .NET

using (JavascriptContext context = new JavascriptContext())
{

    // Setting external parameters for the context
    //context.SetParameter("console", new SystemConsole());
    context.SetParameter("message", "Hello World !           ");

    // Script
    string script = @"
        alert(message.trim());
    ";

    // Running the script
    context.Run(script);
}

很遗憾,它不知道什么是alertwindowdocumentconsole等。除非我告诉它设置上下文参数。

还有什么其他的方法吗?也许我应该尝试一些无头浏览器,并使用Process调用?


1
你想做什么或者最终想要实现什么目标?通常情况下,Javascript 是一种客户端语言,不在服务器上执行。 - Steven V
我只需要知道执行该函数是否会抛出异常。我的目标是完成这个 http://i.imgur.com/ucJeuXe.jpg - BrunoLM
TypeScript是一种编译成Javascript的语言。为了运行测试,我需要运行编译后的Javascript。这就是为什么我需要执行Javascript的原因。 - BrunoLM
@minitech 没有任何问题。它不应该抛出异常,因为它是有效的JavaScript代码。 - BrunoLM
@BrunoLM:在浏览器中是有效的。你是想进行无头浏览器测试,就像Cameron提到的PhantomJS吗? - Ry-
显示剩余3条评论
2个回答

2
如果您想在服务器端运行JavaScript,我建议使用PhantomJS。它允许您使用JavaScript和命令行参数从命令行运行完整的WebKit浏览器。

2

JavaScript不再仅限于客户端脚本。正如Cameron所说,如果您需要DOM,PhantomJS非常出色。如果您不需要它,那么NodeJS是明智的选择,并提供丰富的库。


-1,这个问题是关于从C#运行JavaScript,而不是在服务器端运行JavaScript。 - Arseni Mourzenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接