首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebView2 DevToolsProtocolEvent不提高

WebView2 DevToolsProtocolEvent不提高
EN

Stack Overflow用户
提问于 2021-02-21 14:24:31
回答 2查看 1.4K关注 0票数 6

我正在尝试创建一个使用WebView2 WPF组件的应用程序。目前,我正在使用console.log()记录由网站的javascript代码编写的消息和错误。

这就是我现在拥有的:

代码语言:javascript
复制
public partial class WebView2BrowserControl : WebView2
{
    private async void OnWebViewLoaded(object sender, RoutedEventArgs e)
    {
        await EnsureCoreWebView2Async();
        if (showDeveloperTools)
        {
            CoreWebView2.GetDevToolsProtocolEventReceiver("Log.entryAdded").DevToolsProtocolEventReceived += OnConsoleMessage;
            CoreWebView2.OpenDevToolsWindow();
        }
        else
        {
            CoreWebView2.Settings.AreDevToolsEnabled = false;
        }
    }

    private void OnConsoleMessage(object sender, CoreWebView2DevToolsProtocolEventReceivedEventArgs e)
    {
        if (e != null && e.ParameterObjectAsJson != null)
        {
            Trace.WriteLine("WebView2:" + e.ParameterObjectAsJson);
        }
    }
}

如您所见,我正在使用GetDevToolsProtocolEventReceiver方法订阅DevTools中的事件。这些文件规定如下:

事件名称:String-事件的全名为{domain}.{ event }格式。有关DevToolsProtocol事件描述和事件args的详细信息,请导航到DevTools协议查看器。

...And与DevTools协议查看器对应,我正在寻找的事件是Log.entryAdded

现在的问题是,虽然GetDevToolsProtocolEventReceiver("Log.entryAdded")调用不会抛出任何异常,但不会引发事件,即使我可以看到DevTools中记录的内容。我甚至尝试在DevTools窗口中编写自己的DevTools调用。

我尝试过的其他事情:

  • 使用常绿独立安装程序在机器上安装WebView2,或者使用固定版本( 87和88版本),后者基本上是WebView2的便携版本
  • 使用来自NuGet的最新稳定版本( 1.0.705.50 )和最新的预发布版本
  • 同时使用Log.entryAdded事件和Console.messageAdded (不推荐)
  • 在打开DevTools窗口后订阅该事件

那我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-22 00:13:22

你快到了!

结果是,您必须启用协议事件,否则将调用而不是

添加事件侦听器后,只需enable它,如下所示:

代码语言:javascript
复制
CoreWebView2.GetDevToolsProtocolEventReceiver("Log.entryAdded").DevToolsProtocolEventReceived += ConsoleMessage;
await CoreWebView2.CallDevToolsProtocolMethodAsync("Log.enable", "{}");

现在您应该在跟踪中得到消息。

Alternative for Windows (在您在窗体上安装和删除WebView2之后):

代码语言:javascript
复制
private async void Form1_Load(object sender, EventArgs e)
{
    await webView21.EnsureCoreWebView2Async();
}

private async void WebView21_CoreWebView2InitializationCompleted(object sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    webView21.CoreWebView2.GetDevToolsProtocolEventReceiver("Log.entryAdded").DevToolsProtocolEventReceived += ConsoleMessage;
    await webView21.CoreWebView2.CallDevToolsProtocolMethodAsync("Log.enable", "{}");
    webView21.CoreWebView2.OpenDevToolsWindow();
    webView21.CoreWebView2.Navigate("https://stackoverflow.com");

}

private void ConsoleMessage(object sender, Microsoft.Web.WebView2.Core.CoreWebView2DevToolsProtocolEventReceivedEventArgs e)
{
    if (e != null && e.ParameterObjectAsJson != null)
    {
        Console.WriteLine("WebView2:" + e.ParameterObjectAsJson);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2022-06-30 18:09:28

接受的答案对我没有用。

它正在使用日志域,以使其工作,这是铬日志消息。

我不得不使用运行时域,这允许我访问console.log。

主要代码:

代码语言:javascript
复制
        async void InitializeAsync()
        {
            await webView.EnsureCoreWebView2Async(null);
            DevToolsProtocolHelper helper = webView.CoreWebView2.GetDevToolsProtocolHelper();
            await helper.Runtime.EnableAsync();
            helper.Runtime.ConsoleAPICalled += Runtime_ConsoleAPICalled;
        }

        private void Runtime_ConsoleAPICalled(object sender, Runtime.ConsoleAPICalledEventArgs e)
        {
            String test = e.Args[0].Value.ToString();
            Trace.WriteLine(test);
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66303305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档