我最初尝试从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" });
它几乎完美地运行。它知道什么是 window
,alert
……唯一的问题是,它显然是在 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);
}
很遗憾,它不知道什么是alert
、window
、document
、console
等。除非我告诉它设置上下文参数。
还有什么其他的方法吗?也许我应该尝试一些无头浏览器,并使用Process
调用?