// 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 { Browser } = require('selenium-webdriver') const { Pages, suite, ignore } = require('../../lib/test') const { Network, CacheBehavior } = require('selenium-webdriver/bidi/network') const BrowsingContext = require('selenium-webdriver/bidi/browsingContext') const until = require('selenium-webdriver/lib/until') suite( function (env) { let driver let network beforeEach(async function () { driver = await env.builder().build() network = await Network(driver) }) afterEach(async function () { await network.close() await driver.quit() }) describe('Network network', function () { it('can listen to event before request is sent', async function () { let beforeRequestEvent = null await network.beforeRequestSent(function (event) { if (event.request.url.includes('empty')) { beforeRequestEvent = event } }) await driver.get(Pages.emptyPage) assert.equal(beforeRequestEvent.request.method, 'GET') const url = beforeRequestEvent.request.url assert.equal(url, await driver.getCurrentUrl()) }) it('can request cookies', async function () { let beforeRequestEvent = null await network.beforeRequestSent(function (event) { beforeRequestEvent = event }) await driver.get(Pages.emptyText) await driver.manage().addCookie({ name: 'north', value: 'biryani', }) await driver.navigate().refresh() assert.equal(beforeRequestEvent.request.method, 'GET') await driver.wait(() => beforeRequestEvent.request.cookies.length > 0, 2000) assert.equal(beforeRequestEvent.request.cookies[0].name, 'north') assert.equal(beforeRequestEvent.request.cookies[0].value.value, 'biryani') const url = beforeRequestEvent.request.url assert.equal(url, await driver.getCurrentUrl()) await driver.manage().addCookie({ name: 'south', value: 'dosa', }) await driver.navigate().refresh() await driver.wait(() => beforeRequestEvent.request.cookies.length > 1, 2000) assert.equal(beforeRequestEvent.request.cookies[1].name, 'south') assert.equal(beforeRequestEvent.request.cookies[1].value.value, 'dosa') }) ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can redirect http equiv', async function () { let beforeRequestEvent = [] await network.beforeRequestSent(function (event) { beforeRequestEvent.push(event) }) await driver.get(Pages.redirectedHttpEquiv) await driver.wait(until.urlContains('redirected.html'), 1000) assert.equal(beforeRequestEvent[0].request.method, 'GET') assert(beforeRequestEvent[0].request.url.includes('redirected_http_equiv.html')) assert.equal(beforeRequestEvent[1].request.method, 'GET') assert(beforeRequestEvent[1].request.url.includes('redirected.html')) }) it('can subscribe to response started', async function () { let onResponseStarted = [] await network.responseStarted(function (event) { onResponseStarted.push(event) }) await driver.get(Pages.emptyText) assert.equal(onResponseStarted[0].request.method, 'GET') assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl()) assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl()) assert.equal(onResponseStarted[0].response.fromCache, false) assert(onResponseStarted[0].response.mimeType.includes('text/plain')) assert.equal(onResponseStarted[0].response.status, 200) assert.equal(onResponseStarted[0].response.statusText, 'OK') }) it('test response started mime type', async function () { let onResponseStarted = [] await network.responseStarted(function (event) { onResponseStarted.push(event) }) // Checking mime type for 'html' text await driver.get(Pages.emptyPage) assert.equal(onResponseStarted[0].request.method, 'GET') assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl()) assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl()) assert(onResponseStarted[0].response.mimeType.includes('text/html')) // Checking mime type for 'plain' text onResponseStarted = [] await driver.get(Pages.emptyText) assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl()) assert(onResponseStarted[0].response.mimeType.includes('text/plain')) }) it('can subscribe to response completed', async function () { let onResponseCompleted = [] await network.responseCompleted(function (event) { onResponseCompleted.push(event) }) await driver.get(Pages.emptyPage) assert.equal(onResponseCompleted[0].request.method, 'GET') assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl()) assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl()) assert.equal(onResponseCompleted[0].response.fromCache, false) assert(onResponseCompleted[0].response.mimeType.includes('text/html')) assert.equal(onResponseCompleted[0].response.status, 200) assert.equal(onResponseCompleted[0].response.statusText, 'OK') assert.equal(onResponseCompleted[0].redirectCount, 0) }) ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can listen to auth required event', async function () { let authRequiredEvent = null await network.authRequired(function (event) { authRequiredEvent = event }) await driver.get(Pages.basicAuth) const url = authRequiredEvent.request.url assert.equal(authRequiredEvent.id, await driver.getWindowHandle()) assert.equal(authRequiredEvent.request.method, 'GET') assert.equal(url.includes('basicAuth'), true) assert.equal(authRequiredEvent.response.status, 401) assert.equal(authRequiredEvent.response.headers.length > 1, true) assert.equal(authRequiredEvent.response.url.includes('basicAuth'), true) }) it('can listen to fetch error event', async function () { let fetchErrorEvent = null await network.fetchError(function (event) { fetchErrorEvent = event }) try { await driver.get('https://not_a_valid_url.test/') /*eslint no-unused-vars: "off"*/ } catch (e) { // ignore } const url = fetchErrorEvent.request.url assert.equal(fetchErrorEvent.id, await driver.getWindowHandle()) assert.equal(fetchErrorEvent.request.method, 'GET') assert.equal(url.includes('valid_url'), true) assert.equal(fetchErrorEvent.request.headers.length > 1, true) assert.notEqual(fetchErrorEvent.errorText, null) }) it('test response completed mime type', async function () { let onResponseCompleted = [] await network.responseCompleted(function (event) { onResponseCompleted.push(event) }) // Checking mime type for 'html' text await driver.get(Pages.emptyPage) assert.equal(onResponseCompleted[0].request.method, 'GET') assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl()) assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl()) assert(onResponseCompleted[0].response.mimeType.includes('text/html')) // Checking mime type for 'plain' text onResponseCompleted = [] await driver.get(Pages.emptyText) assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl()) assert(onResponseCompleted[0].response.mimeType.includes('text/plain')) }) }) describe('setCacheBehavior', function () { it('can set cache behavior to bypass for a context', async function () { await driver.get(Pages.emptyPage) const browsingContext = await BrowsingContext(driver, { type: 'tab', }) const contextId = browsingContext.id await network.setCacheBehavior(CacheBehavior.BYPASS, [contextId]) }) it('can set cache behavior to default for a context', async function () { await driver.get(Pages.emptyPage) const browsingContext = await BrowsingContext(driver, { type: 'tab', }) const contextId = browsingContext.id await network.setCacheBehavior(CacheBehavior.DEFAULT, [contextId]) }) it('can set cache behavior to default/bypass with no context id', async function () { await driver.get(Pages.emptyPage) await network.setCacheBehavior(CacheBehavior.DEFAULT) await network.setCacheBehavior(CacheBehavior.BYPASS) }) it('throws error for invalid cache behavior', async function () { await driver.get(Pages.emptyPage) await assert.rejects( async () => await network.setCacheBehavior('invalid'), /Cache behavior must be either "default" or "bypass"/, ) }) it('throws error for invalid context id types', async function () { await driver.get(Pages.emptyPage) await assert.rejects( async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ''), /Contexts must be an array of non-empty strings/, ) await assert.rejects( async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ['', ' ']), /Contexts must be an array of non-empty strings/, ) }) }) }, { browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] }, )