2021-03-24 13:04:30 +00:00
const puppeteer = require ( 'puppeteer' )
2022-01-17 10:04:55 +00:00
const browserTests = async (
{
logWarnings = false ,
serverPort = 38000 ,
keepServerRunning = false ,
puppeteerOptions = {
headless : false ,
devtools : true
}
} ) => {
2021-03-24 13:04:30 +00:00
const server = require ( './server.js' ) . server
await server . init ( )
await server . listen ( serverPort )
const browser = await puppeteer . launch ( puppeteerOptions )
2022-01-17 10:04:55 +00:00
const page = ( await browser . pages ( ) ) [ 0 ]
2021-03-24 13:04:30 +00:00
page . on ( 'console' , function ( message ) {
let ignore = message . type ( ) === 'warning' && ! logWarnings
if ( message . type ( ) === 'error' && message . location ( ) ) {
if ( message . location ( ) . url . includes ( 'favicon.ico' ) ) {
ignore = true
}
}
if ( ignore ) return
let text = ( message . args ( ) . length > 0 ) ? message . args ( ) [ 0 ] . _remoteObject . value : message . text ( )
const args = [ ]
if ( message . args ( ) !== undefined && message . args ( ) . length > 1 ) {
for ( let i = 1 ; i < message . args ( ) . length ; i ++ ) {
args . push ( message . args ( ) [ i ] . _remoteObject . value )
}
}
if ( message . type ( ) === 'error' && message . location ( ) ) {
text = ` ${ message . location ( ) . url } : ${ text } `
}
let consoleType = 'log'
switch ( message . type ( ) ) {
case 'error' :
consoleType = 'error'
break
case 'warning' :
consoleType = 'warn'
break
default :
break
}
console [ consoleType ] ( text , ... args )
} )
2022-01-17 10:04:55 +00:00
2021-03-24 13:04:30 +00:00
page . on ( 'error' , function ( err ) { page . emit ( new Error ( err ) ) } )
2022-01-17 10:04:55 +00:00
page . on ( 'close' , async ( ) => {
await close ( )
} )
page . goto ( 'http://localhost:38000/' ) . then ( async ( ) => {
const watchDog = page . waitForFunction ( '_mocha.state === \'stopped\'' , { timeout : 0 } )
await watchDog . catch ( async ( reason ) => {
console . error ( reason )
} )
if ( puppeteerOptions . headless === true ) {
await close ( )
}
} ) . catch ( async ( reason ) => {
console . error ( reason )
} )
2021-03-24 13:04:30 +00:00
2022-01-17 10:04:55 +00:00
async function close ( ) {
console . log ( 'Closing browser tests...' )
await browser . close ( ) . catch ( ( ) => { } )
if ( keepServerRunning !== true ) {
await server . close ( ) . catch ( ( ) => { } )
}
2021-03-24 13:04:30 +00:00
}
}
const opts = {
// puppeteer options
puppeteerOptions : {
2022-01-17 10:04:55 +00:00
headless : false ,
devtools : true
2021-03-24 13:04:30 +00:00
// slowMo: 100,
// timeout: 10000
} ,
2022-01-17 10:04:55 +00:00
logWarnings : false , // log warnings in Node console (usually not needed)
2021-03-24 13:04:30 +00:00
keepServerRunning : false , // keep server running until manually closed with ctrl-c. In combination with puppeteerOptions.headless (or just connecting any browser to the test page) allows debugging in browser
serverPort : 38000
}
2022-01-17 10:04:55 +00:00
const args = process . argv . slice ( 2 )
if ( args [ 0 ] === 'headless' ) {
opts . puppeteerOptions . headless = true
}
2021-03-24 13:04:30 +00:00
browserTests ( opts )