diff --git a/javascript/node/selenium-webdriver/bidi/browser.js b/javascript/node/selenium-webdriver/bidi/browser.js new file mode 100644 index 0000000000000..3ea5920b2b8e6 --- /dev/null +++ b/javascript/node/selenium-webdriver/bidi/browser.js @@ -0,0 +1,80 @@ +// 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. + +const {WebElement} = require('../lib/webdriver') + +class Browser { + constructor(driver) { + this._driver = driver + } + + async init() { + if (!(await this._driver.getCapabilities()).get('webSocketUrl')) { + throw Error('WebDriver instance must support BiDi protocol') + } + + this.bidi = await this._driver.getBidi() + } + + async createUserContext() { + const command = { + method: 'browser.createUserContext', + params: {}, + } + + let response = await this.bidi.send(command) + + return response.result.userContext + } + + async getUserContexts() { + const command = { + method: 'browser.getUserContexts', + params: {}, + } + + let response = await this.bidi.send(command) + + let userContexts = [] + + let userContextsArray = response.result.userContexts + + for (let userContextJson of userContextsArray) { + userContexts.push(userContextJson.userContext) + } + + return userContexts + } + + async removeUserContext(userContext) { + const command = { + method: 'browser.removeUserContext', + params: { userContext: userContext }, + } + + await this.bidi.send(command) + } + +} + +async function getBrowserInstance(driver) { + let instance = new Browser(driver) + await instance.init() + return instance +} + +module.exports = getBrowserInstance diff --git a/javascript/node/selenium-webdriver/test/bidi/browser_test.js b/javascript/node/selenium-webdriver/test/bidi/browser_test.js new file mode 100644 index 0000000000000..aef5d11309a15 --- /dev/null +++ b/javascript/node/selenium-webdriver/test/bidi/browser_test.js @@ -0,0 +1,86 @@ +// 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('assert') +const fileServer = require('../../lib/test/fileserver') +const firefox = require('../../firefox') +const {ignore, Pages, suite} = require('../../lib/test') +const {Browser, By, until} = require('../..') +const BrowserBiDi = require('../../bidi/browser') + +suite( + function (env) { + describe('BiDi Browser', function () { + let driver + + beforeEach(async function () { + driver = await env.builder().setFirefoxOptions(new firefox.Options().enableBidi()).build() + }) + + afterEach(function () { + return driver.quit() + }) + + xit('can create a user context', async function () { + const browser = await BrowserBiDi(driver) + + const userContext = await browser.createUserContext() + + assert.notEqual(userContext, null) + + await browser.removeUserContext(userContext) + }) + + xit('can get user contexts', async function () { + const browser = await BrowserBiDi(driver) + + const userContext1 = await browser.createUserContext() + const userContext2 = await browser.createUserContext() + + const userContexts = await browser.getUserContexts() + + assert.strictEqual(userContexts.length >= 2, true) + + await browser.removeUserContext(userContext1) + await browser.removeUserContext(userContext2) + }) + + xit('can remove user context', async function () { + const browser = await BrowserBiDi(driver) + + const userContext1 = await browser.createUserContext() + const userContext2 = await browser.createUserContext() + + const userContexts = await browser.getUserContexts() + + assert.strictEqual(userContexts.length >= 2, true) + + await browser.removeUserContext(userContext2) + + const updatedUserContexts = await browser.getUserContexts() + + assert.strictEqual(updatedUserContexts.includes(userContext1), true) + assert.strictEqual(updatedUserContexts.includes(userContext2), false) + + await browser.removeUserContext(userContext1) + }) + }) + }, + {browsers: [Browser.FIREFOX]}, +)