Как вернуть результаты JavaScript обратно в C # с Awesomium? - PullRequest
4 голосов
/ 11 ноября 2011

Я создал новый проект 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 #? Или получить доступ к DOM с помощью C #?

Редактировать: jQuery - это просто строка, содержащая код jQuery 1.7.

Ответы [ 2 ]

5 голосов
/ 11 ноября 2011

Относительно того, почему висит следующая строка:

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

Это потому, что ExecuteJavascriptWithResult может возвращать только базовые типы Javascript (либо String, Number, Boolean, Array, либо созданный пользователем объект). Вы пытаетесь вернуть собственный объектный элемент DOM, который не может быть сопоставлен ни с одним из этих типов, поэтому запрос не выполнен.

1 голос
/ 05 декабря 2015

Простой способ вернуть сложные объекты - преобразовать в строку, используя 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 для сериализации.)

...