Когда я выполняю js в CEFSharp с помощью EvaluateScriptAsync(), я могу возвращать примитивные типы, такие как строка или массив. Например, работает следующее:

var result = await Browser.EvaluateScriptAsync("Array.from(document.getElementsByTagName('input')).map(element => element.value)");
if (result.Success && result.Result != null)
{
    dynamic values = result.Result;
    foreach (dynamic value in values)
    {
        MessageBox.Show($"Value is: {value}");
    }
}

Но как только я пытаюсь получить элемент DOM, один или список, я получаю null:

var result = await Browser.EvaluateScriptAsync("Array.from(document.getElementsByTagName('input'))");
// `result.Success` is `true`, `result.Result` is `null`

Я думал, что CEFSharp умеет маршалировать только примитивные типы, но объектные литералы тоже работают:

var result = await Browser.EvaluateScriptAsync("({ a: 1, b: 'hello' })");
if (result.Success && result.Result != null)
{
    dynamic obj = result.Result;
    MessageBox.Show($"{{ a: {obj.a}, b: {obj.b} }}");
}

Получается, что CEFSharp не знает только, как маршалировать объекты DOM.

Почему? Есть ли решение или обходной путь?

-2
Chayim Friedman 16 Окт 2020 в 06:44

1 ответ

Лучший ответ

Во-первых, важно понимать, что Javascript выполняется в процессе рендеринга. Результатом EvaluateScriptAsync фактически является DTO, мы создаем объект, который представляет результат выполнения скрипта.

В настоящее время невозможно вернуть HTMLElement или любой объект, который имеет циклическую ссылку.

Если мы рассмотрим `HTMLElement как конкретный пример, у него будет parentElement / parentNode, а у родителя есть дочерние элементы, которые включают сам узел. Вы также в конечном итоге проходите по всему дереву DOM.

CEF имеет очень ограниченную поддержку типов для этого типа CefV8Value, поэтому сложно сделать что-то слишком сложное. См. это.

Мы могли бы потенциально добавить метод расширения, который обертывает пользовательский сценарий в IIFE и выполняет некоторую проверку типа стиля instanceof HTMLElement, чтобы вернуть урезанное представление HTML-элемента. См.

Shayan Shafiq 15 Янв 2021 в 05:32