Skip to content

Commit 182e95c

Browse files
author
brnbs
authored
Introduce InitAction in browser constructor (#1871)
1 parent 3325a5b commit 182e95c

File tree

8 files changed

+105
-51
lines changed

8 files changed

+105
-51
lines changed

docfx_project/examples/LodCDP.md

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# How to log messages between Puppeteer-Sharp and Chromium
2+
3+
_Contributors: [Darío Kondratiuk](https://www.hardkoded.com/), [Barnabas Szenasi](https://outisnemo.com/)_
4+
5+
## Problem
6+
7+
You want to log the messages sent by your app to Chromium and the messages received by Chromium. Below you can find two solutions for the most common logging frameworks.
8+
9+
## Log CDP messages to files using Serilog
10+
11+
Add [Serilog.Extensions.Logging.File](https://www.nuget.org/packages/Serilog.Extensions.Logging.File/) Nuget package.
12+
13+
First we need to create an `ILoggerFactory`
14+
15+
```cs
16+
private static ILoggerFactory GetLoggerFactory(string file)
17+
{
18+
var factory = new LoggerFactory();
19+
var filter = new FilterLoggerSettings
20+
{
21+
{ "Connection", LogLevel.Trace }
22+
};
23+
24+
factory.WithFilter(filter).AddFile(file, LogLevel.Trace);
25+
26+
return factory;
27+
}
28+
```
29+
30+
Now we can use `GetLoggerFactory` to inject a logger into Puppeteer.
31+
32+
```cs
33+
using (var browser = await Puppeteer.LaunchAsync(browserOptions, GetLoggerFactory(fileName)))
34+
{
35+
//Some code
36+
}
37+
```
38+
39+
## Log CDP messages to console using Microsoft.Extensions.Logging
40+
41+
Add [Microsoft.Extensions.Logging.Console](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Console) Nuget package.
42+
43+
First we need to create an `ILoggerFactory`
44+
45+
```cs
46+
private static ILoggerFactory GetLoggerFactory()
47+
{
48+
var loggerFactory = Microsoft.Extensions.Logging.LoggerFactory.Create(builder =>
49+
{
50+
builder
51+
.AddConsole(options => options.Format = ConsoleLoggerFormat.Systemd)
52+
.SetMinimumLevel(LogLevel.Trace);
53+
});
54+
55+
return loggerFactory;
56+
}
57+
```
58+
59+
Now we can use `GetLoggerFactory` to inject a logger into Puppeteer.LaunchAsync or Puppeteer.ConnectAsync method.
60+
61+
```cs
62+
using (var browser = await Puppeteer.LaunchAsync(browserOptions, GetLoggerFactory()))
63+
{
64+
//Some code
65+
}
66+
```

docfx_project/examples/toc.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717
- name: Advanced
1818
items:
1919
- name: How to log CDP communication
20-
href: LogCDP.md
20+
href: LogCDPCommunication.md

lib/PuppeteerSharp.Tests/LauncherTests/PuppeteerConnectTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,25 @@ public async Task ShouldSupportTargetFilter()
120120
}
121121
}
122122

123+
[PuppeteerFact]
124+
public async Task ShouldBeAbleToSetBrowserPropertiesUsingConnectOptions()
125+
{
126+
var initActionExecuted = false;
127+
var options = new ConnectOptions
128+
{
129+
BrowserWSEndpoint = Browser.WebSocketEndpoint,
130+
InitAction = brw =>
131+
{
132+
initActionExecuted = true;
133+
}
134+
};
135+
var browser = await Puppeteer.ConnectAsync(options, TestConstants.LoggerFactory);
136+
137+
Assert.True(initActionExecuted);
138+
139+
await browser.CloseAsync();
140+
}
141+
123142
[PuppeteerTest("launcher.spec.ts", "Puppeteer.connect", "should be able to reconnect to a disconnected browser")]
124143
[SkipBrowserFact(skipFirefox: true)]
125144
public async Task ShouldBeAbleToReconnectToADisconnectedBrowser()

lib/PuppeteerSharp/Browser.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,14 @@ internal static async Task<Browser> CreateAsync(
520520
string[] contextIds,
521521
bool ignoreHTTPSErrors,
522522
ViewPortOptions defaultViewPort,
523-
LauncherBase launcher,
524-
Func<TargetInfo, bool> targetFilter)
523+
LauncherBase launcher,
524+
Func<TargetInfo, bool> targetFilter,
525+
Action<Browser> initAction = null)
525526
{
526527
var browser = new Browser(connection, contextIds, ignoreHTTPSErrors, defaultViewPort, launcher, targetFilter);
528+
529+
initAction?.Invoke(browser);
530+
527531
await connection.SendAsync("Target.setDiscoverTargets", new TargetSetDiscoverTargetsRequest
528532
{
529533
Discover = true

lib/PuppeteerSharp/ConnectOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,10 @@ public class ConnectOptions : IBrowserOptions, IConnectionOptions
9090
/// Callback to decide if Puppeteer should connect to a given target or not.
9191
/// </summary>
9292
public Func<TargetInfo, bool> TargetFilter { get; set; }
93+
94+
/// <summary>
95+
/// Optional callback to initialize properties as soon as the <see cref="Browser"/> instance is created, i.e., set up event handlers.
96+
/// </summary>
97+
public Action<Browser> InitAction { get; set; }
9398
}
9499
}

lib/PuppeteerSharp/Connection.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,12 @@ internal Connection(string url, int delay, bool enqueueAsyncMessages, IConnectio
103103

104104
internal Task RawSendASync(int id, string method, object args, string sessionId = null)
105105
{
106-
_logger.LogTrace("Send ► {Id} Method {Method} Params {@Params}", id, method, args);
107-
return Transport.SendAsync(JsonConvert.SerializeObject(
108-
new ConnectionRequest
109-
{
110-
Id = id,
111-
Method = method,
112-
Params = args,
113-
SessionId = sessionId
114-
},
115-
JsonHelper.DefaultJsonSerializerSettings));
106+
var message = JsonConvert.SerializeObject(
107+
new ConnectionRequest { Id = id, Method = method, Params = args, SessionId = sessionId },
108+
JsonHelper.DefaultJsonSerializerSettings);
109+
_logger.LogTrace("Send ► {Message}", message);
110+
111+
return Transport.SendAsync(message);
116112
}
117113

118114
internal async Task<JObject> SendAsync(string method, object args = null, bool waitForCallback = true)

lib/PuppeteerSharp/Launcher.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ public async Task<Browser> ConnectAsync(ConnectOptions options)
126126
options.IgnoreHTTPSErrors,
127127
options.DefaultViewport,
128128
null,
129-
options.TargetFilter)
129+
options.TargetFilter,
130+
options.InitAction)
130131
.ConfigureAwait(false);
131132
}
132133
catch (Exception ex)

0 commit comments

Comments
 (0)