Path: blob/trunk/javascript/selenium-webdriver/test/bidi/network_test.js
3220 views
// Licensed to the Software Freedom Conservancy (SFC) under one1// or more contributor license agreements. See the NOTICE file2// distributed with this work for additional information3// regarding copyright ownership. The SFC licenses this file4// to you under the Apache License, Version 2.0 (the5// "License"); you may not use this file except in compliance6// with the License. You may obtain a copy of the License at7//8// http://www.apache.org/licenses/LICENSE-2.09//10// Unless required by applicable law or agreed to in writing,11// software distributed under the License is distributed on an12// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13// KIND, either express or implied. See the License for the14// specific language governing permissions and limitations15// under the License.1617'use strict'1819const assert = require('node:assert')20const { Browser } = require('selenium-webdriver')21const { Pages, suite, ignore } = require('../../lib/test')22const { Network, CacheBehavior } = require('selenium-webdriver/bidi/network')23const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')24const until = require('selenium-webdriver/lib/until')2526suite(27function (env) {28let driver29let network3031beforeEach(async function () {32driver = await env.builder().build()33network = await Network(driver)34})3536afterEach(async function () {37await network.close()38await driver.quit()39})4041describe('Network network', function () {42it('can listen to event before request is sent', async function () {43let beforeRequestEvent = null44await network.beforeRequestSent(function (event) {45if (event.request.url.includes('empty')) {46beforeRequestEvent = event47}48})4950await driver.get(Pages.emptyPage)5152assert.equal(beforeRequestEvent.request.method, 'GET')53const url = beforeRequestEvent.request.url54assert.equal(url, await driver.getCurrentUrl())55})5657it('can request cookies', async function () {58let beforeRequestEvent = null59await network.beforeRequestSent(function (event) {60beforeRequestEvent = event61})6263await driver.get(Pages.emptyText)64await driver.manage().addCookie({65name: 'north',66value: 'biryani',67})68await driver.navigate().refresh()6970assert.equal(beforeRequestEvent.request.method, 'GET')71await driver.wait(() => beforeRequestEvent.request.cookies.length > 0, 2000)72assert.equal(beforeRequestEvent.request.cookies[0].name, 'north')73assert.equal(beforeRequestEvent.request.cookies[0].value.value, 'biryani')74const url = beforeRequestEvent.request.url75assert.equal(url, await driver.getCurrentUrl())7677await driver.manage().addCookie({78name: 'south',79value: 'dosa',80})81await driver.navigate().refresh()8283await driver.wait(() => beforeRequestEvent.request.cookies.length > 1, 2000)84assert.equal(beforeRequestEvent.request.cookies[1].name, 'south')85assert.equal(beforeRequestEvent.request.cookies[1].value.value, 'dosa')86})8788ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can redirect http equiv', async function () {89let beforeRequestEvent = []90await network.beforeRequestSent(function (event) {91beforeRequestEvent.push(event)92})9394await driver.get(Pages.redirectedHttpEquiv)95await driver.wait(until.urlContains('redirected.html'), 1000)9697assert.equal(beforeRequestEvent[0].request.method, 'GET')98assert(beforeRequestEvent[0].request.url.includes('redirected_http_equiv.html'))99assert.equal(beforeRequestEvent[2].request.method, 'GET')100assert(beforeRequestEvent[2].request.url.includes('redirected.html'))101})102103it('can subscribe to response started', async function () {104let onResponseStarted = []105await network.responseStarted(function (event) {106onResponseStarted.push(event)107})108109await driver.get(Pages.emptyText)110111assert.equal(onResponseStarted[0].request.method, 'GET')112assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl())113assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())114assert.equal(onResponseStarted[0].response.fromCache, false)115assert(onResponseStarted[0].response.mimeType.includes('text/plain'))116assert.equal(onResponseStarted[0].response.status, 200)117assert.equal(onResponseStarted[0].response.statusText, 'OK')118})119120it('test response started mime type', async function () {121let onResponseStarted = []122await network.responseStarted(function (event) {123onResponseStarted.push(event)124})125126// Checking mime type for 'html' text127await driver.get(Pages.emptyPage)128assert.equal(onResponseStarted[0].request.method, 'GET')129assert.equal(onResponseStarted[0].request.url, await driver.getCurrentUrl())130assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())131assert(onResponseStarted[0].response.mimeType.includes('text/html'))132133// Checking mime type for 'plain' text134onResponseStarted = []135await driver.get(Pages.emptyText)136assert.equal(onResponseStarted[0].response.url, await driver.getCurrentUrl())137assert(onResponseStarted[0].response.mimeType.includes('text/plain'))138})139140it('can subscribe to response completed', async function () {141let onResponseCompleted = []142await network.responseCompleted(function (event) {143onResponseCompleted.push(event)144})145146await driver.get(Pages.emptyPage)147148assert.equal(onResponseCompleted[0].request.method, 'GET')149assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl())150assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())151assert.equal(onResponseCompleted[0].response.fromCache, false)152assert(onResponseCompleted[0].response.mimeType.includes('text/html'))153assert.equal(onResponseCompleted[0].response.status, 200)154assert.equal(onResponseCompleted[0].response.statusText, 'OK')155assert.equal(onResponseCompleted[0].redirectCount, 0)156})157158ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it('can listen to auth required event', async function () {159let authRequiredEvent = null160await network.authRequired(function (event) {161authRequiredEvent = event162})163164await driver.get(Pages.basicAuth)165166const url = authRequiredEvent.request.url167assert.equal(authRequiredEvent.id, await driver.getWindowHandle())168assert.equal(authRequiredEvent.request.method, 'GET')169assert.equal(url.includes('basicAuth'), true)170171assert.equal(authRequiredEvent.response.status, 401)172assert.equal(authRequiredEvent.response.headers.length > 1, true)173assert.equal(authRequiredEvent.response.url.includes('basicAuth'), true)174})175176it('can listen to fetch error event', async function () {177let fetchErrorEvent = null178await network.fetchError(function (event) {179fetchErrorEvent = event180})181182try {183await driver.get('https://not_a_valid_url.test/')184/*eslint no-unused-vars: "off"*/185} catch (e) {186// ignore187}188189const url = fetchErrorEvent.request.url190assert.equal(fetchErrorEvent.id, await driver.getWindowHandle())191assert.equal(fetchErrorEvent.request.method, 'GET')192assert.equal(url.includes('valid_url'), true)193assert.equal(fetchErrorEvent.request.headers.length > 1, true)194assert.notEqual(fetchErrorEvent.errorText, null)195})196197it('test response completed mime type', async function () {198let onResponseCompleted = []199await network.responseCompleted(function (event) {200onResponseCompleted.push(event)201})202203// Checking mime type for 'html' text204await driver.get(Pages.emptyPage)205assert.equal(onResponseCompleted[0].request.method, 'GET')206assert.equal(onResponseCompleted[0].request.url, await driver.getCurrentUrl())207assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())208assert(onResponseCompleted[0].response.mimeType.includes('text/html'))209210// Checking mime type for 'plain' text211onResponseCompleted = []212await driver.get(Pages.emptyText)213assert.equal(onResponseCompleted[0].response.url, await driver.getCurrentUrl())214assert(onResponseCompleted[0].response.mimeType.includes('text/plain'))215})216})217218describe('setCacheBehavior', function () {219it('can set cache behavior to bypass for a context', async function () {220await driver.get(Pages.emptyPage)221const browsingContext = await BrowsingContext(driver, {222type: 'tab',223})224const contextId = browsingContext.id225await network.setCacheBehavior(CacheBehavior.BYPASS, [contextId])226})227228it('can set cache behavior to default for a context', async function () {229await driver.get(Pages.emptyPage)230const browsingContext = await BrowsingContext(driver, {231type: 'tab',232})233const contextId = browsingContext.id234await network.setCacheBehavior(CacheBehavior.DEFAULT, [contextId])235})236237it('can set cache behavior to default/bypass with no context id', async function () {238await driver.get(Pages.emptyPage)239await network.setCacheBehavior(CacheBehavior.DEFAULT)240await network.setCacheBehavior(CacheBehavior.BYPASS)241})242243it('throws error for invalid cache behavior', async function () {244await driver.get(Pages.emptyPage)245await assert.rejects(246async () => await network.setCacheBehavior('invalid'),247/Cache behavior must be either "default" or "bypass"/,248)249})250251it('throws error for invalid context id types', async function () {252await driver.get(Pages.emptyPage)253await assert.rejects(254async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ''),255/Contexts must be an array of non-empty strings/,256)257await assert.rejects(258async () => await network.setCacheBehavior(CacheBehavior.BYPASS, ['', ' ']),259/Contexts must be an array of non-empty strings/,260)261})262})263},264{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },265)266267268