| // 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 fs = require('node:fs') |
| const chrome = require('selenium-webdriver/chrome') |
| const symbols = require('selenium-webdriver/lib/symbols') |
| const test = require('../../lib/test') |
| const { locate } = require('../../lib/test/resources') |
| |
| const WEBEXTENSION_CRX = locate('common/extensions/webextensions-selenium-example.crx') |
| |
| describe('chrome.Options', function () { |
| describe('addArguments', function () { |
| it('takes var_args', function () { |
| let options = new chrome.Options() |
| assert.deepStrictEqual(options[symbols.serialize](), { |
| browserName: 'chrome', |
| 'goog:chromeOptions': {}, |
| }) |
| |
| options.addArguments('a', 'b') |
| assert.deepStrictEqual(options[symbols.serialize](), { |
| browserName: 'chrome', |
| 'goog:chromeOptions': { |
| args: ['a', 'b'], |
| }, |
| }) |
| }) |
| |
| it('flattens input arrays', function () { |
| let options = new chrome.Options() |
| assert.deepStrictEqual(options[symbols.serialize](), { |
| browserName: 'chrome', |
| 'goog:chromeOptions': {}, |
| }) |
| |
| options.addArguments(['a', 'b'], 'c', [1, 2], 3) |
| assert.deepStrictEqual(options[symbols.serialize](), { |
| browserName: 'chrome', |
| 'goog:chromeOptions': { |
| args: ['a', 'b', 'c', 1, 2, 3], |
| }, |
| }) |
| }) |
| }) |
| |
| describe('addExtensions', function () { |
| it('takes var_args', function () { |
| let options = new chrome.Options() |
| assert.strictEqual(options.options_.extensions, undefined) |
| |
| options.addExtensions('a', 'b') |
| assert.deepStrictEqual(options.options_.extensions.extensions, ['a', 'b']) |
| }) |
| |
| it('flattens input arrays', function () { |
| let options = new chrome.Options() |
| assert.strictEqual(options.options_.extensions, undefined) |
| |
| options.addExtensions(['a', 'b'], 'c', [1, 2], 3) |
| assert.deepStrictEqual(options.options_.extensions.extensions, ['a', 'b', 'c', 1, 2, 3]) |
| }) |
| }) |
| |
| describe('serialize', function () { |
| it('base64 encodes extensions', async function () { |
| let expected = fs.readFileSync(WEBEXTENSION_CRX, 'base64') |
| let wire = new chrome.Options().addExtensions(WEBEXTENSION_CRX)[symbols.serialize]() |
| |
| let extensions = wire['goog:chromeOptions'].extensions[symbols.serialize]() |
| assert.strictEqual(extensions.length, 1) |
| assert.strictEqual(await extensions[0], expected) |
| }) |
| }) |
| |
| describe('windowTypes', function () { |
| it('takes var_args', function () { |
| let options = new chrome.Options() |
| assert.strictEqual(options.options_.windowTypes, undefined) |
| |
| options.windowTypes('a', 'b') |
| assert.deepStrictEqual(options.options_.windowTypes, ['a', 'b']) |
| }) |
| |
| it('flattens input arrays', function () { |
| let options = new chrome.Options() |
| assert.strictEqual(options.options_.windowTypes, undefined) |
| |
| options.windowTypes(['a', 'b'], 'c', [1, 2], 3) |
| assert.deepStrictEqual(options.options_.windowTypes, ['a', 'b', 'c', 1, 2, 3]) |
| }) |
| }) |
| }) |
| |
| test.suite( |
| function (env) { |
| var driver |
| |
| beforeEach(function () { |
| driver = null |
| }) |
| |
| afterEach(function () { |
| return driver && driver.quit() |
| }) |
| |
| describe('Chrome options', function () { |
| it('can start Chrome with custom args', async function () { |
| const options = env.builder().getChromeOptions() || new chrome.Options() |
| options.addArguments('user-agent=foo;bar') |
| |
| driver = await env.builder().setChromeOptions(options).build() |
| |
| await driver.get(test.Pages.ajaxyPage) |
| |
| const userAgent = await driver.executeScript('return window.navigator.userAgent') |
| assert.strictEqual(userAgent, 'foo;bar') |
| }) |
| |
| it('can start chromium with network conditions set', async function () { |
| driver = await env.builder().build() |
| await driver.get(test.Pages.ajaxyPage) |
| await driver.setNetworkConditions({ |
| offline: true, |
| latency: 0, |
| download_throughput: 0, |
| upload_throughput: 0, |
| }) |
| assert.deepStrictEqual(await driver.getNetworkConditions(), { |
| download_throughput: 0, |
| latency: 0, |
| offline: true, |
| upload_throughput: 0, |
| }) |
| await driver.deleteNetworkConditions() |
| }) |
| |
| it('can install an extension from path', async function () { |
| let options = env.builder().getChromeOptions() || new chrome.Options() |
| options.addExtensions(WEBEXTENSION_CRX) |
| |
| driver = await env.builder().forBrowser('chrome').setChromeOptions(options).build() |
| |
| await driver.get(test.Pages.echoPage) |
| await verifyWebExtensionWasInstalled() |
| }) |
| |
| it('can install an extension from Buffer', async function () { |
| let options = env.builder().getChromeOptions() || new chrome.Options() |
| options.addExtensions(fs.readFileSync(WEBEXTENSION_CRX)) |
| |
| driver = await env.builder().forBrowser('chrome').setChromeOptions(options).build() |
| |
| await driver.get(test.Pages.echoPage) |
| await verifyWebExtensionWasInstalled() |
| }) |
| |
| async function verifyWebExtensionWasInstalled() { |
| let footer = await driver.findElement({ |
| id: 'webextensions-selenium-example', |
| }) |
| let text = await footer.getText() |
| assert.strictEqual(text, 'Content injected by webextensions-selenium-example') |
| } |
| }) |
| }, |
| { browsers: ['chrome'] }, |
| ) |