21
21
22
22
import org .openqa .selenium .bidi .log .BaseLogEntry ;
23
23
import org .openqa .selenium .bidi .log .ConsoleLogEntry ;
24
+ import org .openqa .selenium .bidi .log .FilterBy ;
24
25
import org .openqa .selenium .bidi .log .GenericLogEntry ;
25
26
import org .openqa .selenium .bidi .log .JavascriptLogEntry ;
26
27
import org .openqa .selenium .bidi .log .Log ;
27
28
import org .openqa .selenium .bidi .log .LogEntry ;
29
+ import org .openqa .selenium .bidi .log .LogLevel ;
28
30
import org .openqa .selenium .internal .Require ;
29
31
30
32
import java .util .Collections ;
31
33
import java .util .HashSet ;
32
- import java .util .LinkedList ;
33
- import java .util .List ;
34
34
import java .util .Set ;
35
+ import java .util .concurrent .atomic .AtomicReference ;
35
36
import java .util .function .Consumer ;
36
37
37
38
public class LogInspector implements AutoCloseable {
38
39
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 <>();
43
40
private final Set <String > browsingContextIds ;
44
41
45
42
private final BiDi bidi ;
@@ -62,62 +59,108 @@ public LogInspector(Set<String> browsingContextIds, WebDriver driver) {
62
59
63
60
this .bidi = ((HasBiDi ) driver ).getBiDi ();
64
61
this .browsingContextIds = browsingContextIds ;
65
- initializeLogListener ();
66
62
}
67
63
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 );
84
68
85
- logEntry .getGenericLogEntry ().ifPresent (
86
- genericLogEntry -> genericLogListeners .forEach (
87
- consumer -> consumer .accept (genericLogEntry )));
69
+ addLogEntryAddedListener (logEntryConsumer );
70
+ }
88
71
89
- };
72
+ public void onConsoleEntry (Consumer <ConsoleLogEntry > consumer ) {
73
+ Consumer <LogEntry > logEntryConsumer =
74
+ logEntry -> logEntry .getConsoleLogEntry ().ifPresent (consumer );
90
75
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 );
96
77
}
97
78
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
+ });
102
86
103
- public void onConsoleEntry (Consumer <ConsoleLogEntry > consumer ) {
104
- consoleLogListeners .add (consumer );
87
+ addLogEntryAddedListener (logEntryConsumer );
105
88
}
106
89
90
+
107
91
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 );
109
107
}
110
108
111
109
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 );
113
118
}
114
119
115
120
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 );
117
136
}
118
137
119
138
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
+ }
121
164
}
122
165
123
166
@ Override
0 commit comments