// my-custom-environment const http = require('http') const getPort = require('get-port') const seleniumServer = require('selenium-standalone') const NodeEnvironment = require('jest-environment-node') const { BROWSER_NAME: browserName = 'chrome', SKIP_LOCAL_SELENIUM_SERVER, } = process.env const newTabPg = ` new tab Click me ` class CustomEnvironment extends NodeEnvironment { async setup() { await super.setup() // Since ie11 doesn't like dataURIs we have to spin up a // server to handle the new tab page this.server = http.createServer((req, res) => { res.statusCode = 200 res.end(newTabPg) }) const newTabPort = await getPort() await new Promise((resolve, reject) => { this.server.listen(newTabPort, err => { if (err) return reject(err) resolve() }) }) let seleniumServerPort if (browserName !== 'chrome' && SKIP_LOCAL_SELENIUM_SERVER !== 'true') { console.log('Installing selenium server') await new Promise((resolve, reject) => { seleniumServer.install(err => { if (err) return reject(err) resolve() }) }) console.log('Starting selenium server') await new Promise((resolve, reject) => { seleniumServer.start((err, child) => { if (err) return reject(err) this.seleniumServer = child resolve() }) }) console.log('Started selenium server') seleniumServerPort = 4444 } this.global.wd = null this.global._newTabPort = newTabPort this.global.browserName = browserName this.global.seleniumServerPort = seleniumServerPort this.global.browserStackLocalId = global.browserStackLocalId } async teardown() { await super.teardown() if (this.server) { this.server.close() } if (this.global.wd) { await this.global.wd.quit() } // must come after wd.quit() if (this.seleniumServer) { this.seleniumServer.kill() } } } module.exports = CustomEnvironment