Path: blob/trunk/javascript/selenium-webdriver/test/bidi/storage_test.js
2885 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')20require('../../lib/test/fileserver')21const { suite, ignore } = require('../../lib/test')22const { Browser } = require('selenium-webdriver')23const Storage = require('selenium-webdriver/bidi/storage')24const fileserver = require('../../lib/test/fileserver')25const { CookieFilter } = require('selenium-webdriver/bidi/cookieFilter')26const { BytesValue, SameSite } = require('selenium-webdriver/bidi/networkTypes')27const {28BrowsingContextPartitionDescriptor,29StorageKeyPartitionDescriptor,30} = require('selenium-webdriver/bidi/partitionDescriptor')31const BrowserBiDi = require('selenium-webdriver/bidi/browser')32const BrowsingContext = require('selenium-webdriver/bidi/browsingContext')33const { CreateContextParameters } = require('selenium-webdriver/bidi/createContextParameters')34const { PartialCookie } = require('selenium-webdriver/bidi/partialCookie')3536suite(37function (env) {38describe('BiDi Storage', function () {39let driver4041beforeEach(async function () {42driver = await env.builder().build()43await driver.get(fileserver.Pages.ajaxyPage)44await driver.manage().deleteAllCookies()45return assertHasCookies()46})4748afterEach(function () {49return driver.quit()50})5152it('can get cookie by name', async function () {53const cookie = createCookieSpec()5455await driver.manage().addCookie(cookie)5657const cookieFilter = new CookieFilter()58.name(cookie.name)59.value(new BytesValue(BytesValue.Type.STRING, cookie.value))6061const storage = await Storage(driver)62const result = await storage.getCookies(cookieFilter)6364assert.strictEqual(result.cookies[0].value.value, cookie.value)65})6667ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it(68'can get cookie in default user context',69async function () {70const windowHandle = await driver.getWindowHandle()71const cookie = createCookieSpec()7273await driver.manage().addCookie(cookie)7475const cookieFilter = new CookieFilter()76.name(cookie.name)77.value(new BytesValue(BytesValue.Type.STRING, cookie.value))7879await driver.switchTo().newWindow('window')8081const descriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())8283const storage = await Storage(driver)84const resultAfterSwitchingContext = await storage.getCookies(cookieFilter, descriptor)8586assert.strictEqual(resultAfterSwitchingContext.cookies[0].value.value, cookie.value)8788await driver.switchTo().window(windowHandle)8990const descriptorAfterSwitchingBack = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())9192const result = await storage.getCookies(cookieFilter, descriptorAfterSwitchingBack)9394assert.strictEqual(result.cookies[0].value.value, cookie.value)9596const partitionKey = result.partitionKey9798assert.notEqual(partitionKey.userContext, null)99assert.notEqual(partitionKey.sourceOrigin, null)100assert.strictEqual(partitionKey.userContext, 'default')101},102)103104it('can get cookie in a user context', async function () {105const browser = await BrowserBiDi(driver)106const userContext = await browser.createUserContext()107const windowHandle = await driver.getWindowHandle()108109const cookie = {110name: getRandomString(),111value: 'set',112}113114const partitionDescriptor = new StorageKeyPartitionDescriptor().userContext(userContext)115116const storage = await Storage(driver)117118const cookieDomain = fileserver.getHostName()119const partialCookie = new PartialCookie(120cookie.name,121new BytesValue(BytesValue.Type.STRING, cookie.value),122cookieDomain,123)124125await storage.setCookie(partialCookie, partitionDescriptor)126127const cookieFilter = new CookieFilter().name(cookie.name).value(new BytesValue(BytesValue.Type.STRING, 'set'))128129// Create a new browsing context with the user context130const createParams = new CreateContextParameters().userContext(userContext)131132const browsingContext = await BrowsingContext(driver, {133type: 'tab',134createParameters: createParams,135})136137await driver.switchTo().window(browsingContext.id)138139const result = await storage.getCookies(cookieFilter, partitionDescriptor)140141assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie')142assert.strictEqual(result.cookies[0].value.value, cookie.value)143144// Check if cookies were found145assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie')146assert.strictEqual(result.cookies[0].value.value, cookie.value)147148// Check partitionKey if it exists149if (result.partitionKey) {150const partitionKey = result.partitionKey151assert.notEqual(partitionKey.userContext, null, 'Expected userContext to be non-null')152assert.strictEqual(partitionKey.userContext, userContext, 'Expected userContext to match')153}154155await driver.switchTo().window(windowHandle)156157const browsingContextPartitionDescriptor = new BrowsingContextPartitionDescriptor(windowHandle)158159const resultAfterSwitchingBack = await storage.getCookies(cookieFilter, browsingContextPartitionDescriptor)160161assert.strictEqual(resultAfterSwitchingBack.cookies.length, 0)162})163164it('can add cookie', async function () {165const cookie = createCookieSpec()166167const storage = await Storage(driver)168169await storage.setCookie(170new PartialCookie(cookie.name, new BytesValue(BytesValue.Type.STRING, cookie.value), fileserver.whereIs('/')),171)172173const cookieFilter = new CookieFilter()174.name(cookie.name)175.value(new BytesValue(BytesValue.Type.STRING, cookie.value))176177const result = await storage.getCookies(cookieFilter)178179assert.strictEqual(result.cookies[0].value.value, cookie.value)180})181182it('can add and get cookie with all parameters', async function () {183const cookie = createCookieSpec()184185const storage = await Storage(driver)186187const now = Date.now()188const oneHourInMillis = 3600 * 1000189const expiry = now + oneHourInMillis190191const partitionDescriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle())192193await storage.setCookie(194new PartialCookie(cookie.name, new BytesValue(BytesValue.Type.STRING, cookie.value), fileserver.whereIs('/'))195.path('/ajaxy_page.html')196.size(100)197.httpOnly(true)198.secure(false)199.sameSite(SameSite.LAX)200.expiry(expiry),201partitionDescriptor,202)203204const cookieFilter = new CookieFilter()205.name(cookie.name)206.value(new BytesValue(BytesValue.Type.STRING, cookie.value))207208const result = await storage.getCookies(cookieFilter)209210const resultCookie = result.cookies[0]211212assert.strictEqual(resultCookie.name, cookie.name)213assert.strictEqual(resultCookie.value.value, cookie.value)214assert.strictEqual(resultCookie.domain.includes('http'), true)215assert.strictEqual(resultCookie.path, '/ajaxy_page.html')216assert.strictEqual(resultCookie.size > 0, true)217assert.strictEqual(resultCookie.httpOnly, true)218assert.strictEqual(resultCookie.secure, false)219assert.strictEqual(resultCookie.sameSite, SameSite.LAX)220assert.notEqual(resultCookie.expires, null)221})222223it('can get all cookies', async function () {224const cookie1 = createCookieSpec()225const cookie2 = createCookieSpec()226227await driver.manage().addCookie(cookie1)228await driver.manage().addCookie(cookie2)229230const storage = await Storage(driver)231const result = await storage.getCookies()232233assert.strictEqual(result.cookies[0].value.value, cookie1.value)234assert.strictEqual(result.cookies[1].value.value, cookie2.value)235})236237it('can delete all cookies', async function () {238const cookie1 = createCookieSpec()239const cookie2 = createCookieSpec()240241await driver.manage().addCookie(cookie1)242await driver.manage().addCookie(cookie2)243244const storage = await Storage(driver)245246await storage.deleteCookies(new CookieFilter())247248const result = await storage.getCookies()249250assert.strictEqual(result.cookies.length, 0)251})252253it('can delete cookie by name', async function () {254const cookie1 = createCookieSpec()255const cookie2 = createCookieSpec()256257const storage = await Storage(driver)258259await driver.manage().addCookie(cookie1)260await driver.manage().addCookie(cookie2)261262const result1 = await storage.getCookies(new CookieFilter())263assert.strictEqual(result1.cookies.length, 2)264265await storage.deleteCookies(new CookieFilter().name(cookie1.name))266267const result = await storage.getCookies(new CookieFilter())268269assert.strictEqual(result.cookies.length, 1)270})271272function createCookieSpec(opt_options) {273let spec = {274name: getRandomString(),275value: getRandomString(),276}277if (opt_options) {278spec = Object.assign(spec, opt_options)279}280return spec281}282283function assertHasCookies(...expected) {284return driver285.manage()286.getCookies()287.then(function (cookies) {288assert.strictEqual(289cookies.length,290expected.length,291'Wrong # of cookies.' +292'\n Expected: ' +293JSON.stringify(expected) +294'\n Was : ' +295JSON.stringify(cookies),296)297298const map = buildCookieMap(cookies)299for (let i = 0; i < expected.length; ++i) {300assert.strictEqual(expected[i].value, map[expected[i].name].value)301}302})303}304305function buildCookieMap(cookies) {306const map = {}307cookies.forEach(function (cookie) {308map[cookie.name] = cookie309})310return map311}312313function getRandomString() {314const x = 1234567890315return Math.floor(Math.random() * x).toString(36)316}317})318},319{ browsers: [Browser.FIREFOX, Browser.CHROME, Browser.EDGE] },320)321322323