// 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 fs = require('node:fs') const os = require('node:os') const path = require('node:path') const { Browser } = require('selenium-webdriver/index') const { Environment } = require('selenium-webdriver/testing') const chrome = require('selenium-webdriver/chrome') const firefox = require('selenium-webdriver/firefox') const { runfiles } = require('@bazel/runfiles') function GetBrowserForTests() { let browser = process.env.SELENIUM_BROWSER // If we have no browser set, fail the build if (!browser) { throw new Error('SELENIUM_BROWSER env var not set') } if (browser.indexOf(',') !== -1) { throw new Error('SELENIUM_BROWSER env var must only be a single browser') } /** @type !TargetBrowser */ const targetBrowser = { name: browser, capabilities: undefined } const builder = new Environment(targetBrowser).builder() builder.disableEnvironmentOverrides() let binary = process.env.BROWSER_BINARY let driverBinary = process.env.DRIVER_BINARY let resolvedBinary = binary ? runfiles.resolve(driverBinary) : undefined let resolvedDriver = driverBinary ? runfiles.resolve(binary) : undefined // Create a temporary directory we can use as a home dir // process.env["USER"] = "nobody" process.env['HOME'] = fs.mkdtempSync(path.join(os.tmpdir(), 'jasmine-test')) switch (browser) { case 'chrome': builder.forBrowser(Browser.CHROME) if (resolvedDriver) { let sb = new chrome.ServiceBuilder(resolvedDriver) sb.enableVerboseLogging() sb.setStdio('inherit') builder.setChromeService(sb) } if (resolvedBinary) { let options = new chrome.Options() options.setChromeBinaryPath(resolvedBinary) options.setAcceptInsecureCerts(true) options.addArguments('disable-infobars', 'disable-breakpad', 'disable-dev-shm-usage', 'no-sandbox') builder.setChromeOptions(options) } break // case 'edge': // builder = builder.forBrowser(webdriver.Browser.EDGE) // break // case 'firefox': builder.forBrowser(Browser.FIREFOX) if (resolvedDriver) { let sb = new firefox.ServiceBuilder(resolvedDriver) sb.enableVerboseLogging(true) sb.setStdio('inherit') builder.setFirefoxService(sb) } if (resolvedBinary) { let options = new firefox.Options() options.setBinary(resolvedBinary) options.enableDebugger() builder.setFirefoxOptions(options) } break case 'safari': builder.forBrowser(Browser.SAFARI) break default: throw new Error('SELENIUM_BROWSER does not list a supported browser') } return builder.build() } module.exports = { GetBrowserForTests, }