blob: 664e6433ff62e2a6c25dfe2cf5f918fd13497432 [file] [log] [blame]
// 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] },
)