blob: dca601b8d12151da063de299ec40937396df9fe7 [file]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
'use strict'
const assert = require('node:assert')
const { suite, ignore, Pages } = require('../../../lib/test')
const { Browser } = require('selenium-webdriver')
const { Log } = require('selenium-webdriver/bidi/generated/log')
suite(
function (env) {
let driver
let log
beforeEach(async function () {
driver = await env.builder().build()
log = await Log.create(driver)
})
afterEach(function () {
return driver.quit()
})
describe('onConsoleEntry', function () {
it('can listen to console.log', async function () {
let entry = null
await log.onConsoleEntry((params) => {
if (params.text === 'Hello, world!') {
entry = params
}
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'consoleLog' }).click()
await driver.wait(() => entry !== null, 5000)
assert.ok(entry, 'console log entry should have been captured')
assert.strictEqual(entry.type, 'console')
assert.strictEqual(entry.level, 'info')
assert.strictEqual(entry.method, 'log')
assert.strictEqual(entry.text, 'Hello, world!')
assert.ok(entry.source)
// Raw BiDi event params use source.realm (not source.realmId which is
// the hand-coded Source wrapper's getter)
assert.ok(entry.source.realm)
})
it('can listen to console.error', async function () {
let entry = null
await log.onConsoleEntry((params) => {
if (params.level === 'error' && params.text) {
entry = params
}
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'consoleError' }).click()
await driver.wait(() => entry !== null, 5000)
assert.ok(entry, 'console error entry should have been captured')
assert.strictEqual(entry.type, 'console')
assert.strictEqual(entry.level, 'error')
})
it('can listen to console.warn', async function () {
let entry = null
await log.onConsoleEntry((params) => {
if (params.level === 'warn' && params.text) {
entry = params
}
})
await driver.get(Pages.logEntryAdded)
// logEntryAdded.html has no warn button; trigger via script instead
await driver.executeScript('console.warn("test warn message")')
await driver.wait(() => entry !== null, 5000)
assert.ok(entry, 'console warn entry should have been captured')
assert.strictEqual(entry.level, 'warn')
})
it('captures args in console log entries', async function () {
let entry = null
await log.onConsoleEntry((params) => {
if (params.text === 'Hello, world!') {
entry = params
}
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'consoleLog' }).click()
await driver.wait(() => entry !== null, 5000)
assert.ok(entry)
assert.ok(Array.isArray(entry.args))
assert.ok(entry.args.length > 0)
})
})
describe('onJavascriptException', function () {
it('can listen to javascript exceptions', async function () {
let entry = null
await log.onJavascriptException((params) => {
entry = params
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'jsException' }).click()
await driver.wait(() => entry !== null, 5000)
assert.ok(entry, 'javascript exception entry should have been captured')
assert.strictEqual(entry.type, 'javascript')
assert.strictEqual(entry.level, 'error')
assert.ok(entry.text)
})
})
describe('onEntryAdded', function () {
it('receives all log entries including console', async function () {
const entries = []
await log.onEntryAdded((params) => {
entries.push(params)
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'consoleLog' }).click()
await driver.wait(() => entries.length > 0, 5000)
assert.ok(entries.length > 0, 'should have received at least one log entry')
})
it('can register multiple listeners', async function () {
let count1 = 0
let count2 = 0
await log.onConsoleEntry(() => {
count1++
})
await log.onConsoleEntry(() => {
count2++
})
await driver.get(Pages.logEntryAdded)
await driver.findElement({ id: 'consoleLog' }).click()
await driver.wait(() => count1 >= 1 && count2 >= 1, 5000)
assert.ok(count1 >= 1)
assert.ok(count2 >= 1)
})
})
describe('onJavascriptLog', function () {
it('can listen to javascript log entries', async function () {
const entries = []
await log.onJavascriptLog((params) => {
entries.push(params)
})
await driver.get(Pages.logEntryAdded)
// Trigger a JS error to produce a javascript log entry
await driver.findElement({ id: 'jsException' }).click()
await driver.wait(() => entries.length > 0, 5000)
assert.ok(entries.length > 0, 'onJavascriptLog should have received at least one entry')
assert.strictEqual(entries[0].type, 'javascript')
})
})
},
{ browsers: [Browser.CHROME, Browser.FIREFOX] },
)