如何使用Awesomium将JavaScript结果返回到c#

本文关键字:返回 结果 JavaScript 何使用 Awesomium | 更新日期: 2023-09-27 18:14:03

我创建了一个新的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"然后是"function (a,b){…"}",现在我想起来了,这是错误的,但不管怎样,这是另一个问题。

一旦取消底部代码的注释,它就会发出"1"警报,然后挂起。为什么?我怎样才能获得关于页面上链接的一些信息?或者可靠地将一些信息传递回c# ?或者用c#访问DOM ?

编辑: jQuery只是一个包含jQuery 1.7代码的字符串。

如何使用Awesomium将JavaScript结果返回到c#

关于为什么下面的行挂起:

webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();")

这是因为ExecuteJavascriptWithResult只能返回基本的Javascript类型(字符串,数字,布尔值,数组或用户创建的对象)。您试图返回一个本机DOM元素对象,该对象不能映射到这些类型之一,因此请求失败。

返回复杂对象的简单方法是使用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可能是有利的。)