diff --git a/javascript/selenium-webdriver/bidi/partitionDescriptor.js b/javascript/selenium-webdriver/bidi/partitionDescriptor.js index 91132b2bdc5ea..87b366e3156c6 100644 --- a/javascript/selenium-webdriver/bidi/partitionDescriptor.js +++ b/javascript/selenium-webdriver/bidi/partitionDescriptor.js @@ -71,6 +71,7 @@ class StorageKeyPartitionDescriptor extends PartitionDescriptor { constructor() { super(Type.STORAGE_KEY) + this.#map.set('type', Type.STORAGE_KEY) } /** diff --git a/javascript/selenium-webdriver/bidi/storage.js b/javascript/selenium-webdriver/bidi/storage.js index 0289495ef7bec..6df231ee33b86 100644 --- a/javascript/selenium-webdriver/bidi/storage.js +++ b/javascript/selenium-webdriver/bidi/storage.js @@ -55,9 +55,11 @@ class Storage { if ( partition !== undefined && - !(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor)) + !(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor) ) { - throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`) + throw new Error( + `Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`, + ) } const command = { @@ -118,9 +120,11 @@ class Storage { if ( partition !== undefined && - !(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor)) + !(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor) ) { - throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`) + throw new Error( + `Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`, + ) } const command = { @@ -158,9 +162,11 @@ class Storage { if ( partition !== undefined && - !(partition instanceof (BrowsingContextPartitionDescriptor || StorageKeyPartitionDescriptor)) + !(partition instanceof BrowsingContextPartitionDescriptor || partition instanceof StorageKeyPartitionDescriptor) ) { - throw new Error(`Params must be an instance of PartitionDescriptor. Received:'${partition}'`) + throw new Error( + `Params must be an instance of BrowsingContextPartitionDescriptor or StorageKeyPartitionDescriptor. Received:'${partition}'`, + ) } const command = { diff --git a/javascript/selenium-webdriver/lib/test/fileserver.js b/javascript/selenium-webdriver/lib/test/fileserver.js index d215971f754a2..7023cd8d6fe3b 100644 --- a/javascript/selenium-webdriver/lib/test/fileserver.js +++ b/javascript/selenium-webdriver/lib/test/fileserver.js @@ -331,6 +331,15 @@ function sendIndex(request, response) { response.end(data) } +/** + * Detects the hostname. + * @return {string} The detected hostname or 'localhost' if not found. + */ +function getHostName() { + const hostnameFromEnv = process.env.HOSTNAME + return hostnameFromEnv ? hostnameFromEnv : 'localhost' +} + // PUBLIC application /** @@ -372,6 +381,8 @@ exports.whereIs = function (filePath) { return server.url(filePath) } +exports.getHostName = getHostName + exports.Pages = Pages if (require.main === module) { diff --git a/javascript/selenium-webdriver/test/bidi/storage_test.js b/javascript/selenium-webdriver/test/bidi/storage_test.js index 2e83219820571..c6ad92f207164 100644 --- a/javascript/selenium-webdriver/test/bidi/storage_test.js +++ b/javascript/selenium-webdriver/test/bidi/storage_test.js @@ -19,13 +19,19 @@ const assert = require('node:assert') require('../../lib/test/fileserver') -const { suite } = require('../../lib/test') +const { suite, ignore } = require('../../lib/test') const { Browser } = require('selenium-webdriver') const Storage = require('selenium-webdriver/bidi/storage') const fileserver = require('../../lib/test/fileserver') const { CookieFilter } = require('selenium-webdriver/bidi/cookieFilter') const { BytesValue, SameSite } = require('selenium-webdriver/bidi/networkTypes') -const { BrowsingContextPartitionDescriptor } = require('selenium-webdriver/bidi/partitionDescriptor') +const { + BrowsingContextPartitionDescriptor, + StorageKeyPartitionDescriptor, +} = require('selenium-webdriver/bidi/partitionDescriptor') +const BrowserBiDi = require('selenium-webdriver/bidi/browser') +const BrowsingContext = require('selenium-webdriver/bidi/browsingContext') +const { CreateContextParameters } = require('selenium-webdriver/bidi/createContextParameters') const { PartialCookie } = require('selenium-webdriver/bidi/partialCookie') suite( @@ -59,38 +65,101 @@ suite( assert.strictEqual(result.cookies[0].value.value, cookie.value) }) - xit('can get cookie in default user context', async function () { - const windowHandle = await driver.getWindowHandle() - const cookie = createCookieSpec() + ignore(env.browsers(Browser.CHROME, Browser.EDGE)).it( + 'can get cookie in default user context', + async function () { + const windowHandle = await driver.getWindowHandle() + const cookie = createCookieSpec() - await driver.manage().addCookie(cookie) + await driver.manage().addCookie(cookie) - const cookieFilter = new CookieFilter() - .name(cookie.name) - .value(new BytesValue(BytesValue.Type.STRING, cookie.value)) + const cookieFilter = new CookieFilter() + .name(cookie.name) + .value(new BytesValue(BytesValue.Type.STRING, cookie.value)) + + await driver.switchTo().newWindow('window') + + const descriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle()) + + const storage = await Storage(driver) + const resultAfterSwitchingContext = await storage.getCookies(cookieFilter, descriptor) - await driver.switchTo().newWindow('window') + assert.strictEqual(resultAfterSwitchingContext.cookies[0].value.value, cookie.value) - const descriptor = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle()) + await driver.switchTo().window(windowHandle) + + const descriptorAfterSwitchingBack = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle()) + + const result = await storage.getCookies(cookieFilter, descriptorAfterSwitchingBack) + + assert.strictEqual(result.cookies[0].value.value, cookie.value) + + const partitionKey = result.partitionKey + + assert.notEqual(partitionKey.userContext, null) + assert.notEqual(partitionKey.sourceOrigin, null) + assert.strictEqual(partitionKey.userContext, 'default') + }, + ) + + it('can get cookie in a user context', async function () { + const browser = await BrowserBiDi(driver) + const userContext = await browser.createUserContext() + const windowHandle = await driver.getWindowHandle() + + const cookie = { + name: getRandomString(), + value: 'set', + } + + const partitionDescriptor = new StorageKeyPartitionDescriptor().userContext(userContext) const storage = await Storage(driver) - const resultAfterSwitchingContext = await storage.getCookies(cookieFilter, descriptor) - assert.strictEqual(resultAfterSwitchingContext.cookies[0].value.value, cookie.value) + const cookieDomain = fileserver.getHostName() + const partialCookie = new PartialCookie( + cookie.name, + new BytesValue(BytesValue.Type.STRING, cookie.value), + cookieDomain, + ) + + await storage.setCookie(partialCookie, partitionDescriptor) - await driver.switchTo().window(windowHandle) + const cookieFilter = new CookieFilter().name(cookie.name).value(new BytesValue(BytesValue.Type.STRING, 'set')) + + // Create a new browsing context with the user context + const createParams = new CreateContextParameters().userContext(userContext) + + const browsingContext = await BrowsingContext(driver, { + type: 'tab', + createParameters: createParams, + }) + + await driver.switchTo().window(browsingContext.id) - const descriptorAfterSwitchingBack = new BrowsingContextPartitionDescriptor(await driver.getWindowHandle()) + const result = await storage.getCookies(cookieFilter, partitionDescriptor) - const result = await storage.getCookies(cookieFilter, descriptorAfterSwitchingBack) + assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie') + assert.strictEqual(result.cookies[0].value.value, cookie.value) + // Check if cookies were found + assert.strictEqual(result.cookies.length > 0, true, 'Expected at least one cookie') assert.strictEqual(result.cookies[0].value.value, cookie.value) - const partitionKey = result.partitionKey + // Check partitionKey if it exists + if (result.partitionKey) { + const partitionKey = result.partitionKey + assert.notEqual(partitionKey.userContext, null, 'Expected userContext to be non-null') + assert.strictEqual(partitionKey.userContext, userContext, 'Expected userContext to match') + } + + await driver.switchTo().window(windowHandle) + + const browsingContextPartitionDescriptor = new BrowsingContextPartitionDescriptor(windowHandle) + + const resultAfterSwitchingBack = await storage.getCookies(cookieFilter, browsingContextPartitionDescriptor) - assert.notEqual(partitionKey.userContext, null) - assert.notEqual(partitionKey.sourceOrigin, null) - assert.strictEqual(partitionKey.userContext, 'default') + assert.strictEqual(resultAfterSwitchingBack.cookies.length, 0) }) it('can add cookie', async function () { @@ -166,7 +235,7 @@ suite( assert.strictEqual(result.cookies[1].value.value, cookie2.value) }) - xit('can delete all cookies', async function () { + it('can delete all cookies', async function () { const cookie1 = createCookieSpec() const cookie2 = createCookieSpec() @@ -182,7 +251,7 @@ suite( assert.strictEqual(result.cookies.length, 0) }) - xit('can delete cookie by name', async function () { + it('can delete cookie by name', async function () { const cookie1 = createCookieSpec() const cookie2 = createCookieSpec()