Skip to content

Commit bdba7c8

Browse files
committed
[js][bidi] Add methods to listen to js logs and any type of logs
1 parent 9635345 commit bdba7c8

File tree

2 files changed

+124
-3
lines changed

2 files changed

+124
-3
lines changed

javascript/node/selenium-webdriver/bidi/logInspector.js

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
const { ConsoleLogEntry, JavascriptLogEntry } = require('./logEntries')
18+
const { ConsoleLogEntry, JavascriptLogEntry, GenericLogEntry } = require('./logEntries')
1919

2020
const LOG = {
2121
TYPE_CONSOLE : 'console',
22-
TYPE_JS_EXCEPTION: 'jsException'
22+
TYPE_JS_LOGS : 'jsLogs',
23+
TYPE_JS_EXCEPTION: 'jsException',
24+
TYPE_LOG : 'log'
2325
}
2426

2527
class LogInspector {
@@ -80,7 +82,36 @@ class LogInspector {
8082
}
8183

8284
/**
83-
* List to JS Exceptions
85+
* Listen to JS logs
86+
* @param callback
87+
* @returns {Promise<void>}
88+
*/
89+
async onJavascriptLog (callback) {
90+
this.ws = await this.bidi.socket
91+
let enabled = (LOG.TYPE_JS_LOGS in this.listener) || this.logListener(
92+
LOG.TYPE_JS_LOGS)
93+
this.listener[LOG.TYPE_JS_LOGS].push(callback)
94+
95+
if (enabled) {
96+
return
97+
}
98+
99+
this.ws.on('message', event => {
100+
const { params } = JSON.parse(Buffer.from(event.toString()))
101+
if ((params?.type === 'javascript')) {
102+
103+
let jsEntry = new JavascriptLogEntry(params.level, params.text,
104+
params.timestamp, params.type, params.stackTrace)
105+
106+
this.listener[LOG.TYPE_JS_LOGS].forEach(listener => {
107+
listener(jsEntry)
108+
})
109+
}
110+
})
111+
}
112+
113+
/**
114+
* Listen to JS Exceptions
84115
* @param callback
85116
* @returns {Promise<void>}
86117
*/
@@ -108,6 +139,58 @@ class LogInspector {
108139
})
109140
}
110141

142+
/**
143+
* Listen to any logs
144+
* @param callback
145+
* @returns {Promise<void>}
146+
*/
147+
async onLog (callback) {
148+
this.ws = await this.bidi.socket
149+
let enabled = (LOG.TYPE_LOG in this.listener) || this.logListener(
150+
LOG.TYPE_LOG)
151+
this.listener[LOG.TYPE_LOG].push(callback)
152+
153+
if (enabled) {
154+
return
155+
}
156+
157+
this.ws.on('message', event => {
158+
const { params } = JSON.parse(Buffer.from(event.toString()))
159+
if ((params?.type === 'javascript')) {
160+
161+
let jsEntry = new JavascriptLogEntry(params.level, params.text,
162+
params.timestamp, params.type, params.stackTrace)
163+
164+
this.listener[LOG.TYPE_LOG].forEach(listener => {
165+
listener(jsEntry)
166+
})
167+
return
168+
}
169+
170+
if ((params?.type === 'console')) {
171+
172+
let consoleEntry = new ConsoleLogEntry(params.level, params.text,
173+
params.timestamp, params.type, params.method, params.realm,
174+
params.args, params.stackTrace)
175+
176+
this.listener[LOG.TYPE_LOG].forEach(listener => {
177+
listener(consoleEntry)
178+
})
179+
return
180+
}
181+
182+
if (params != undefined && !['console', 'javascript'].includes(params?.type)) {
183+
let genericEntry = new GenericLogEntry(params.level, params.text,
184+
params.timestamp, params.type, params.stackTrace)
185+
186+
this.listener[LOG.TYPE_LOG].forEach(listener => {
187+
listener(genericEntry)
188+
})
189+
}
190+
})
191+
}
192+
193+
111194
/**
112195
* Unsubscribe to log event
113196
* @returns {Promise<void>}

javascript/node/selenium-webdriver/test/bidi/bidi_test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,23 @@ suite(
7272
await inspector.close()
7373
})
7474

75+
it('can listen to javascript log', async function () {
76+
let logEntry = null
77+
const inspector = await logInspector(driver)
78+
await inspector.onJavascriptLog(function (log) {
79+
logEntry = log
80+
})
81+
82+
await driver.get(Pages.logEntryAdded)
83+
await driver.findElement({ id: 'jsException' }).click()
84+
85+
assert.equal(logEntry.text, 'Error: Not working')
86+
assert.equal(logEntry.type, 'javascript')
87+
assert.equal(logEntry.level, 'error')
88+
89+
await inspector.close()
90+
})
91+
7592
it('can listen to javascript error log', async function () {
7693
let logEntry = null
7794
const inspector = await logInspector(driver)
@@ -105,6 +122,27 @@ suite(
105122

106123
await inspector.close()
107124
})
125+
126+
it('can listen to any log', async function () {
127+
let logEntry = null
128+
const inspector = await logInspector(driver)
129+
await inspector.onLog(function (log) {
130+
logEntry = log
131+
})
132+
133+
await driver.get(Pages.logEntryAdded)
134+
await driver.findElement({ id: 'consoleLog' }).click()
135+
136+
assert.equal(logEntry.text, 'Hello, world!')
137+
assert.equal(logEntry.realm, null)
138+
assert.equal(logEntry.type, 'console')
139+
assert.equal(logEntry.level, 'info')
140+
assert.equal(logEntry.method, 'log')
141+
assert.equal(logEntry.stackTrace, null)
142+
assert.equal(logEntry.args.length, 1)
143+
144+
await inspector.close()
145+
})
108146
})
109147

110148
describe('Browsing Context', function () {

0 commit comments

Comments
 (0)