Не выполняется JS скрипт (return) при работе с WebView2 C#
Есть код, который при нажатии кнопки (WPF) записывает действия в браузере через драйвер webView с помощью JS. Далее действия парсятся в методе GetActionsAsync. По какой-то причине result там всегда null, при return JS скрипта:
string result = await webView.CoreWebView2.ExecuteScriptAsync("return window.actionsLog");
Хотя в JS рабочий на 100%. C# тоже функционирует точно, передаёт всё как надо. Буду рад услышать замечания.
Сам код:
public async Task RecordActionsAsync(WebView2 webView)
{
StartProcess();
string script = @"
(function() {
window.actionsLog = window.actionsLog || [];
function initLogger() {
if (window.loggerInit) return;
window.loggerInit = true;
function logAction(type, data) {
var timeStamp = new Date().toISOString();
window.actionsLog.push({ type: type, data: data, time: timeStamp });
}
// Отслеживание кликов
document.addEventListener('click', function(event) {
var element = event.target;
logAction('click', element.tagName + ' - ' + element.outerHTML);
}, true);
// Отслеживание ввода текста
document.addEventListener('input', function(event) {
var element = event.target;
if (element.isContentEditable) {
logAction('input', element.tagName + ' (contenteditable) - ' + element.outerHTML + ' | Content: ' + element.innerHTML);
} else {
logAction('input', element.tagName + ' (' + (element.type || 'N/A') + ') - ' + element.outerHTML + ' | Value: ' + element.value);
}
}, true);
// Отслеживание изменения URL
function logUrlChange() {
logAction('urlChange', window.location.href);
}
window.addEventListener('popstate', logUrlChange);
window.addEventListener('hashchange', logUrlChange);
// Переопределение методов pushState и replaceState для их отслеживания
(function(history) {
logUrlChange(); // лог первого URL
var pushState = history.pushState;
var replaceState = history.replaceState;
history.pushState = function() {
var result = pushState.apply(history, arguments);
logUrlChange();
return result;
};
history.replaceState = function() {
var result = replaceState.apply(history, arguments);
logUrlChange();
return result;
};
})(window.history);
}
// Begin initial logger
initLogger();
})();
";
await webView.CoreWebView2.ExecuteScriptAsync(script);
// Ожидание отмены
try
{
await WaitForCancellationAsync(_cts.Token);
}
catch (TaskCanceledException)
{
// Процесс был отменен
}
GetActionsAsync(webView);
}
private async Task<List<Action>> GetActionsAsync(WebView2 webView)
{
string result = await webView.CoreWebView2.ExecuteScriptAsync("return window.actionsLog"); // ПРОБЛЕМА
// Далее парсинг
}
public async Task FinishRecordActionsAsync(WebView2 webView)
{
StopProcess();
}
private void StartProcess()
{
// Создаем новый CancellationTokenSource для управления процессом
_cts = new CancellationTokenSource();
}
private void StopProcess()
{
// Останавливаем процесс, отменяя токен
_cts?.Cancel();
_cts = null;
}
private async Task WaitForCancellationAsync(CancellationToken token)
{
// Этот метод будет завершен, когда токен будет отменен
var tcs = new TaskCompletionSource();
using (token.Register(s => ((TaskCompletionSource)s).SetResult(), tcs))
{
await tcs.Task;
}
}
Ответы (1 шт):
Автор решения: Qwertiy
→ Ссылка
string result = await webView.CoreWebView2.ExecuteScriptAsync("return window.actionsLog");
Из документации:
If the script that was run throws an unhandled exception, then the result is also null.
Скорее всего надо
string result = await webView.CoreWebView2.ExecuteScriptAsync("window.actionsLog");