Chrome 如何将console.log重定向到 Delphi (TEdgeBrowser)

ar5n3qh5  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(198)

我使用的是集成到 Delphi 应用程序中的TEdgeBrowser。如何将浏览器的控制台输出重定向到 Delphi ?

ykejflvf

ykejflvf1#

为了在浏览器中接收console对象中使用console.log或其他方法创建的日志消息,您需要在一般启用Runtime域后订阅Runtime.consoleAPICalled事件。

// Call Console.enable in the DevTools Protocol to activate the Console domain
EdgeBrowser1.DefaultInterface.CallDevToolsProtocolMethod('Console.enable', '{}', nil);
// Subscribe to the Console.messageAdded event
EdgeBrowser1.SubscribeToCDPEvent('Console.messageAdded');

之后,您将通过TEdgeBrowser中的DevToolsProtocolEventReceived事件接收事件。

procedure TForm7.EdgeBrowser1DevToolsProtocolEventReceived(
  Sender: TCustomEdgeBrowser; const CDPEventName,
  AParameterObjectAsJson: string);
begin
   Memo1.Lines.Add('');
   Memo1.Lines.Add(CDPEventName);
   Memo1.Lines.Add('');
   Memo1.Lines.Add(AParameterObjectAsJson);
   Memo1.Lines.Add('');
   Memo1.Lines.Add('-------------------------');
end;

例如,下面的代码在浏览器中执行

let o = {a: 'x', b: 2}
console.log('Hello World', 42, o)

将产生以下输出:

Runtime.consoleAPICalled

{"args":[{"type":"string","value":"Hello World"},{"description":"42","type":"number","value":42},{"className":"Object","description":"Object","objectId":"-5844707573756168489.2.1","type":"object"}],"executionContextId":2,"stackTrace":{"callFrames":[{"columnNumber":12,"functionName":"","lineNumber":4,"scriptId":"8","url":"file:///D:/Downloads/Windows/A.html"}]},"timestamp":1.694601313014698e+12,"type":"log"}

备注:奇怪的是,这段代码不适用于那些自己捕获控制台日志输出的网站,比如jsfiddle或codepen。这似乎是微软自己的WebView2控件中的一个错误,因为在C#应用程序中使用Microsoft WebView2控件时也会发生同样的情况。
我已通过https://github.com/MicrosoftEdge/WebView2Feedback/issues/3784向Microsoft报告了此问题
为了不仅捕获由显式使用console.log等的文档创建的控制台消息,还捕获由浏览器创建的警告或错误消息,请在启用Log域后额外订阅Log.entryAdded事件。

EdgeBrowser1.DefaultInterface.CallDevToolsProtocolMethod('Log.enable', '{}', nil);
EdgeBrowser1.SubscribeToCDPEvent('Log.entryAdded');

这将导致如下输出:

Log.entryAdded

{"entry":{"level":"warning","source":"security","text":"Error with Feature-Policy header: Unrecognized feature:'speaker'.","timestamp":1.694602288718591e+12}}

请注意,尽管名称为Log.entryAdded,但此事件不是针对通过JavaScript通过console对象生成的输出生成的。

相关问题