2121
2222import org .openqa .selenium .bidi .log .BaseLogEntry ;
2323import org .openqa .selenium .bidi .log .ConsoleLogEntry ;
24+ import org .openqa .selenium .bidi .log .FilterBy ;
2425import org .openqa .selenium .bidi .log .GenericLogEntry ;
2526import org .openqa .selenium .bidi .log .JavascriptLogEntry ;
2627import org .openqa .selenium .bidi .log .Log ;
2728import org .openqa .selenium .bidi .log .LogEntry ;
29+ import org .openqa .selenium .bidi .log .LogLevel ;
2830import org .openqa .selenium .internal .Require ;
2931
3032import java .util .Collections ;
3133import java .util .HashSet ;
32- import java .util .LinkedList ;
33- import java .util .List ;
3434import java .util .Set ;
35+ import java .util .concurrent .atomic .AtomicReference ;
3536import java .util .function .Consumer ;
3637
3738public class LogInspector implements AutoCloseable {
3839
39- private final List <Consumer <ConsoleLogEntry >> consoleLogListeners = new LinkedList <>();
40- private final List <Consumer <JavascriptLogEntry >> jsExceptionLogListeners = new LinkedList <>();
41- private final List <Consumer <JavascriptLogEntry >> jsLogListeners = new LinkedList <>();
42- private final List <Consumer <GenericLogEntry >> genericLogListeners = new LinkedList <>();
4340 private final Set <String > browsingContextIds ;
4441
4542 private final BiDi bidi ;
@@ -62,62 +59,108 @@ public LogInspector(Set<String> browsingContextIds, WebDriver driver) {
6259
6360 this .bidi = ((HasBiDi ) driver ).getBiDi ();
6461 this .browsingContextIds = browsingContextIds ;
65- initializeLogListener ();
6662 }
6763
68- private void initializeLogListener () {
69- Consumer <LogEntry > logEntryConsumer = logEntry -> {
70- logEntry .getConsoleLogEntry ().ifPresent (
71- consoleLogEntry -> consoleLogListeners .forEach (
72- consumer -> consumer .accept (consoleLogEntry )));
73-
74- logEntry .getJavascriptLogEntry ().ifPresent (
75- jsLogEntry -> {
76- if (jsLogEntry .getLevel () == BaseLogEntry .LogLevel .ERROR ) {
77- jsExceptionLogListeners .forEach (
78- consumer -> consumer .accept (jsLogEntry ));
79- }
80- jsLogListeners .forEach (
81- consumer -> consumer .accept (jsLogEntry ));
82- }
83- );
64+ @ Deprecated
65+ public void onConsoleLog (Consumer <ConsoleLogEntry > consumer ) {
66+ Consumer <LogEntry > logEntryConsumer =
67+ logEntry -> logEntry .getConsoleLogEntry ().ifPresent (consumer );
8468
85- logEntry .getGenericLogEntry ().ifPresent (
86- genericLogEntry -> genericLogListeners .forEach (
87- consumer -> consumer .accept (genericLogEntry )));
69+ addLogEntryAddedListener (logEntryConsumer );
70+ }
8871
89- };
72+ public void onConsoleEntry (Consumer <ConsoleLogEntry > consumer ) {
73+ Consumer <LogEntry > logEntryConsumer =
74+ logEntry -> logEntry .getConsoleLogEntry ().ifPresent (consumer );
9075
91- if (browsingContextIds .isEmpty ()) {
92- this .bidi .addListener (Log .entryAdded (), logEntryConsumer );
93- } else {
94- this .bidi .addListener (browsingContextIds , Log .entryAdded (), logEntryConsumer );
95- }
76+ addLogEntryAddedListener (logEntryConsumer );
9677 }
9778
98- @ Deprecated
99- public void onConsoleLog (Consumer <ConsoleLogEntry > consumer ) {
100- consoleLogListeners .add (consumer );
101- }
79+ public void onConsoleEntry (Consumer <ConsoleLogEntry > consumer , FilterBy filter ) {
80+ Consumer <LogEntry > logEntryConsumer =
81+ logEntry -> logEntry .getConsoleLogEntry ().ifPresent (entry -> {
82+ if (filter .getLevel () != null && entry .getLevel () == filter .getLevel ()) {
83+ consumer .accept (entry );
84+ }
85+ });
10286
103- public void onConsoleEntry (Consumer <ConsoleLogEntry > consumer ) {
104- consoleLogListeners .add (consumer );
87+ addLogEntryAddedListener (logEntryConsumer );
10588 }
10689
90+
10791 public void onJavaScriptLog (Consumer <JavascriptLogEntry > consumer ) {
108- jsLogListeners .add (consumer );
92+ Consumer <LogEntry > logEntryConsumer =
93+ logEntry -> logEntry .getJavascriptLogEntry ().ifPresent (consumer );
94+
95+ addLogEntryAddedListener (logEntryConsumer );
96+ }
97+
98+ public void onJavaScriptLog (Consumer <JavascriptLogEntry > consumer , FilterBy filter ) {
99+ Consumer <LogEntry > logEntryConsumer =
100+ logEntry -> logEntry .getJavascriptLogEntry ().ifPresent (entry -> {
101+ if (filter .getLevel () != null && entry .getLevel () == filter .getLevel ()) {
102+ consumer .accept (entry );
103+ }
104+ });
105+
106+ addLogEntryAddedListener (logEntryConsumer );
109107 }
110108
111109 public void onJavaScriptException (Consumer <JavascriptLogEntry > consumer ) {
112- jsExceptionLogListeners .add (consumer );
110+ Consumer <LogEntry > logEntryConsumer =
111+ logEntry -> logEntry .getJavascriptLogEntry ().ifPresent (entry -> {
112+ if (entry .getLevel () == LogLevel .ERROR ) {
113+ consumer .accept (entry );
114+ }
115+ });
116+
117+ addLogEntryAddedListener (logEntryConsumer );
113118 }
114119
115120 public void onGenericLog (Consumer <GenericLogEntry > consumer ) {
116- genericLogListeners .add (consumer );
121+ Consumer <LogEntry > logEntryConsumer =
122+ logEntry -> logEntry .getGenericLogEntry ().ifPresent (consumer );
123+
124+ addLogEntryAddedListener (logEntryConsumer );
125+ }
126+
127+ public void onGenericLog (Consumer <GenericLogEntry > consumer , FilterBy filter ) {
128+ Consumer <LogEntry > logEntryConsumer =
129+ logEntry -> logEntry .getGenericLogEntry ().ifPresent (entry -> {
130+ if (filter .getLevel () != null && entry .getLevel () == filter .getLevel ()) {
131+ consumer .accept (entry );
132+ }
133+ });
134+
135+ addLogEntryAddedListener (logEntryConsumer );
117136 }
118137
119138 public void onLog (Consumer <LogEntry > consumer ) {
120- this .bidi .addListener (Log .entryAdded (), consumer );
139+ addLogEntryAddedListener (consumer );
140+ }
141+
142+ public void onLog (Consumer <LogEntry > consumer , FilterBy filter ) {
143+ Consumer <LogEntry > logEntryConsumer = logEntry -> {
144+ AtomicReference <BaseLogEntry > baseLogEntry = new AtomicReference <>();
145+
146+ logEntry .getGenericLogEntry ().ifPresent (baseLogEntry ::set );
147+ logEntry .getConsoleLogEntry ().ifPresent (baseLogEntry ::set );
148+ logEntry .getJavascriptLogEntry ().ifPresent (baseLogEntry ::set );
149+
150+ if (filter .getLevel () != null && baseLogEntry .get ().getLevel () == filter .getLevel ()) {
151+ consumer .accept (logEntry );
152+ }
153+ };
154+
155+ addLogEntryAddedListener (logEntryConsumer );
156+ }
157+
158+ private void addLogEntryAddedListener (Consumer <LogEntry > consumer ) {
159+ if (browsingContextIds .isEmpty ()) {
160+ this .bidi .addListener (Log .entryAdded (), consumer );
161+ } else {
162+ this .bidi .addListener (browsingContextIds , Log .entryAdded (), consumer );
163+ }
121164 }
122165
123166 @ Override
0 commit comments