2019-03-29 16:05:53 +01:00
|
|
|
// my-custom-environment
|
|
|
|
const http = require('http')
|
|
|
|
const getPort = require('get-port')
|
2019-12-26 21:01:22 +01:00
|
|
|
const seleniumServer = require('selenium-standalone')
|
2019-03-29 16:05:53 +01:00
|
|
|
const NodeEnvironment = require('jest-environment-node')
|
|
|
|
|
2020-01-28 20:04:00 +01:00
|
|
|
const {
|
|
|
|
BROWSER_NAME: browserName = 'chrome',
|
|
|
|
SKIP_LOCAL_SELENIUM_SERVER,
|
|
|
|
} = process.env
|
2019-03-29 16:05:53 +01:00
|
|
|
|
|
|
|
const newTabPg = `
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<title>new tab</title>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<a href="about:blank" target="_blank" id="new">Click me</a>
|
|
|
|
</body>
|
|
|
|
</html>
|
|
|
|
`
|
|
|
|
|
|
|
|
class CustomEnvironment extends NodeEnvironment {
|
2019-12-26 21:01:22 +01:00
|
|
|
async setup() {
|
|
|
|
await super.setup()
|
2019-11-25 19:19:45 +01:00
|
|
|
// 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)
|
|
|
|
})
|
2019-12-26 21:01:22 +01:00
|
|
|
const newTabPort = await getPort()
|
|
|
|
|
2019-11-25 19:19:45 +01:00
|
|
|
await new Promise((resolve, reject) => {
|
2019-12-26 21:01:22 +01:00
|
|
|
this.server.listen(newTabPort, err => {
|
2019-11-25 19:19:45 +01:00
|
|
|
if (err) return reject(err)
|
|
|
|
resolve()
|
2019-03-29 16:05:53 +01:00
|
|
|
})
|
2019-11-25 19:19:45 +01:00
|
|
|
})
|
2019-03-29 16:05:53 +01:00
|
|
|
|
2019-12-26 21:01:22 +01:00
|
|
|
let seleniumServerPort
|
2019-03-29 16:05:53 +01:00
|
|
|
|
2020-01-28 20:04:00 +01:00
|
|
|
if (browserName !== 'chrome' && SKIP_LOCAL_SELENIUM_SERVER !== 'true') {
|
2019-12-26 21:01:22 +01:00
|
|
|
console.log('Installing selenium server')
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
seleniumServer.install(err => {
|
2019-03-29 16:05:53 +01:00
|
|
|
if (err) return reject(err)
|
2019-12-26 21:01:22 +01:00
|
|
|
resolve()
|
2019-03-29 16:05:53 +01:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2019-12-26 21:01:22 +01:00
|
|
|
console.log('Starting selenium server')
|
|
|
|
await new Promise((resolve, reject) => {
|
|
|
|
seleniumServer.start((err, child) => {
|
|
|
|
if (err) return reject(err)
|
|
|
|
this.seleniumServer = child
|
|
|
|
resolve()
|
2019-03-29 16:05:53 +01:00
|
|
|
})
|
2019-12-26 21:01:22 +01:00
|
|
|
})
|
|
|
|
console.log('Started selenium server')
|
|
|
|
seleniumServerPort = 4444
|
2019-03-29 16:05:53 +01:00
|
|
|
}
|
|
|
|
|
2019-12-26 21:01:22 +01:00
|
|
|
this.global.wd = null
|
|
|
|
this.global._newTabPort = newTabPort
|
|
|
|
this.global.browserName = browserName
|
|
|
|
this.global.seleniumServerPort = seleniumServerPort
|
|
|
|
this.global.browserStackLocalId = global.browserStackLocalId
|
2019-03-29 16:05:53 +01:00
|
|
|
}
|
|
|
|
|
2019-11-11 04:24:53 +01:00
|
|
|
async teardown() {
|
2019-03-29 16:05:53 +01:00
|
|
|
await super.teardown()
|
2019-12-26 21:01:22 +01:00
|
|
|
|
|
|
|
if (this.server) {
|
|
|
|
this.server.close()
|
|
|
|
}
|
|
|
|
if (this.global.wd) {
|
2020-02-20 22:39:57 +01:00
|
|
|
try {
|
|
|
|
await this.global.wd.quit()
|
|
|
|
} catch (err) {
|
|
|
|
console.log(`Failed to quit webdriver instance`, err)
|
|
|
|
}
|
2019-12-26 21:01:22 +01:00
|
|
|
}
|
|
|
|
// must come after wd.quit()
|
|
|
|
if (this.seleniumServer) {
|
|
|
|
this.seleniumServer.kill()
|
2019-11-25 19:19:45 +01:00
|
|
|
}
|
2019-03-29 16:05:53 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = CustomEnvironment
|