我创建了一个新的WPF项目,并为其添加了Awesomium 1.6.3 WebControl。
然后,我将此代码添加到MainWindow.xaml.cs
:
private void webControl1_Loaded(object sender, RoutedEventArgs e)
{
webControl1.LoadURL("https://www.google.com/");
}
private void webControl1_DomReady(object sender, EventArgs e)
{
var wc = new WebClient();
webControl1.ExecuteJavascript(jQuery);
webControl1.ExecuteJavascript(@"var __jq = jQuery.noConflict();");
webControl1.ExecuteJavascript(@"alert(__jq);");
using(var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return 1; })();"))
{
MessageBox.Show(result.ToString());
}
//using (var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();"))
//{
// MessageBox.Show(result.ToString());
//}
}
它警告“1”,然后是“功能(a,b){...}”,这是不正常的,现在我想到了它,但无论如何,这是另一个问题。
一旦取消注释底部代码,它就会发出“1”警告然后挂起。为什么?我怎样才能获得有关页面链接的一些信息?或者可靠地将一些信息传递回C#?或者使用C#访问DOM?
编辑: jQuery
只是一个包含jQuery 1.7代码的字符串。
答案 0 :(得分:5)
关于为什么以下行挂起:
webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();")
这是因为ExecuteJavascriptWithResult
只能返回基本的Javascript类型(String,Number,Boolean,Array或用户创建的Object)。您尝试返回无法映射到其中一种类型的本机DOM元素对象,因此请求失败。
答案 1 :(得分:1)
返回复杂对象的简单方法是使用JSON.stringify()
转换为字符串,然后在C#托管代码中解析。
例如:
JSValue rawToken = browser.ExecuteJavascriptWithResult(@"JSON.stringify(someTokenObjectHere);");
if (rawToken.IsString)
{
// For generic objects:
JObject payload = JObject.Parse(rawToken.ToString());
// For typed objects:
MyCustomTokenObject payload = JsonConvert.DeserializeObject<MyCustomTokenObject>(rawToken.ToString());
}
(为序列化内容包含Newtonsoft.Json可能更有利。)