Как вернуть результаты JavaScript обратно в C# с Awesomium?
Я создал новый проект 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 ответа
Относительно того, почему висит следующая строка:
webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();")
Это потому что ExecuteJavascriptWithResult
может возвращать только основные типы Javascript (либо String, Number, Boolean, Array, либо созданный пользователем объект). Вы пытаетесь вернуть собственный объектный элемент 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.Json для сериализации.)