@@ -96,11 +96,22 @@ const getSupportsClientHints = ({ browser, browser_version }) => {
9696 ) ;
9797} ;
9898
99- // 300000 ms = 5 minutes
100- const getDriverWithTimeout = ( capabilitiesRaw , { timeout = 300000 } = { } ) =>
99+ const getDriverOptions = ( browser ) => {
100+ const driverOptions = { ...BS_CAPABILITIES , ...browser } ;
101+
102+ const timezoneSupport = setTimezoneSupport ( browser ) ;
103+ if ( timezoneSupport ) {
104+ driverOptions [ "browserstack.timezone" ] = "Amsterdam" ;
105+ }
106+
107+ return driverOptions ;
108+ } ;
109+
110+ // 180000 ms = 3 minutes
111+ const getDriverWithTimeout = ( capabilitiesRaw , { timeout = 180000 } = { } ) =>
101112 new Promise ( ( resolve ) => {
102113 // Clean up capabilities
103- const capabilities = { ... capabilitiesRaw } ;
114+ const capabilities = getDriverOptions ( capabilitiesRaw ) ;
104115 delete capabilities . supportsSendBeacon ;
105116 delete capabilities . supportsPushState ;
106117 delete capabilities . supportsClientHints ;
@@ -109,7 +120,14 @@ const getDriverWithTimeout = (capabilitiesRaw, { timeout = 300000 } = {}) =>
109120 const start = Date . now ( ) ;
110121 let responded = false ;
111122
123+ log ( `getDriverWithTimeout start: ${ capabilities . name } ${ new Date ( ) } ` ) ;
124+
112125 const response = ( message ) => {
126+ log (
127+ `getDriverWithTimeout response: ${
128+ capabilities . name
129+ } (${ message } ) ${ new Date ( ) } `
130+ ) ;
113131 if ( message instanceof Error ) {
114132 log ( message ) ;
115133 return resolve ( message ) ;
@@ -177,6 +195,7 @@ const getDeviceName = ({
177195 . slice ( 0 , testLimit ) ;
178196
179197 log ( "Testing" , browsers . length , "browsers:" ) ;
198+
180199 browsers . map ( ( browser ) => {
181200 const name = getDeviceName ( browser ) ;
182201 const seleniumVersion = getSeleniumVersion ( browser ) ;
@@ -223,149 +242,161 @@ const getDeviceName = ({
223242 } )
224243 ) ;
225244
226- for ( const [ index , browser ] of browsers . entries ( ) ) {
227- const total = browsers . length ;
228- const testName = `Testing ${ browser . name } ( ${ index + 1 } / ${ total } )` ;
245+ const appendBrowserData = ( browser ) => {
246+ const selenium = getSeleniumVersion ( browser ) ;
247+ if ( selenium ) browser [ "browserstack.selenium_version" ] = selenium ;
229248
230- const test = async function ( ) {
231- const seleniumVersion = getSeleniumVersion ( browser ) ;
232- if ( seleniumVersion ) {
233- browser [ "browserstack.selenium_version" ] = seleniumVersion ;
234- }
249+ const appium = getAppiumVersion ( browser ) ;
250+ if ( appium ) browser [ "browserstack.appium_version" ] = appium ;
235251
236- const appiumVersion = getAppiumVersion ( browser ) ;
237- if ( appiumVersion ) {
238- browser [ "browserstack.appium_version" ] = appiumVersion ;
239- }
252+ browser . supportsSendBeacon = getSupportsSendBeacon ( browser ) ;
253+ browser . supportsPushState = getSupportsPushState ( browser ) ;
254+ browser . supportsClientHints = getSupportsClientHints ( browser ) ;
255+ browser . useLocalIp = browser . os === "ios" ;
240256
241- browser . supportsSendBeacon = getSupportsSendBeacon ( browser ) ;
242- browser . supportsPushState = getSupportsPushState ( browser ) ;
243- browser . supportsClientHints = getSupportsClientHints ( browser ) ;
244- browser . useLocalIp = browser . os === "ios" ;
257+ return browser ;
258+ } ;
245259
246- log ( `Waiting to get ${ browser . name } ...` ) ;
260+ let nextDriver = null ;
247261
248- const driverOptions = { ...BS_CAPABILITIES , ...browser } ;
262+ const test = async function ( browser , nextBrowser ) {
263+ browser = appendBrowserData ( browser ) ;
249264
250- const timezoneSupport = setTimezoneSupport ( browser ) ;
251- if ( timezoneSupport ) {
252- driverOptions [ "browserstack.timezone" ] = "Amsterdam" ;
253- }
265+ let driver , backgroundDriver ;
254266
255- let driver = await getDriverWithTimeout ( driverOptions , {
256- timeout : 180000 ,
257- } ) ;
267+ if ( nextBrowser ) {
268+ log ( `Getting in background: ${ nextBrowser . name } ...` ) ;
269+ nextBrowser = appendBrowserData ( nextBrowser ) ;
270+ backgroundDriver = getDriverWithTimeout ( nextBrowser ) ;
271+ }
258272
259- // Try again with new device when driver is not available
260- if ( typeof driver ?. get !== "function" ) {
261- log ( `Trying again` ) ;
262- driver = await getDriverWithTimeout ( driverOptions , { timeout : 300000 } ) ;
273+ if ( nextDriver ) {
274+ log ( `Reusing next driver...` ) ;
275+ driver = await nextDriver ;
276+ nextDriver = null ;
277+ } else {
278+ log ( `Waiting to get ${ browser . name } ...` ) ;
279+ driver = await getDriverWithTimeout ( browser ) ;
280+ }
263281
264- // Device seems unavailable so this test will fail
265- if ( typeof driver ?. get !== "function" ) {
266- expect ( true , `Getting driver for ${ browser . name } ` ) . to . be . false ;
267- return ;
268- }
269- }
282+ nextDriver = backgroundDriver ;
283+
284+ // Try again with new device when driver is not available
285+ if ( typeof driver ?. get !== "function" ) {
286+ log ( `Trying again` ) ;
287+ driver = await getDriverWithTimeout ( browser , { timeout : 300000 } ) ;
270288
271- let commands = [ ] ;
272-
273- if ( browser . supportsSendBeacon ) {
274- commands = [
275- {
276- script : "/latest/latest.js" ,
277- push : browser . supportsPushState ,
278- beacon : browser . supportsSendBeacon ,
279- allowparams : "project" ,
280- } ,
281- { wait : "/script.js" , amount : 1 } ,
282- { visit : "/empty" } , // Trigger sendBeacon
283- { wait : "/simple.gif" , amount : 3 } ,
284- { wait : "/append" } ,
285- ] ;
286- } else if ( browser . supportsPushState ) {
287- commands = [
288- {
289- script : "/latest/latest.js" ,
290- push : browser . supportsPushState ,
291- allowparams : "project" ,
292- } ,
293- { wait : "/script.js" , amount : 1 } ,
294- { wait : "/simple.gif" , amount : 3 } ,
295- ] ;
296- } else {
297- commands = [
298- { script : "/latest/latest.js" , allowparams : "project" } ,
299- { wait : "/script.js" , amount : 2 } ,
300- {
301- wait : "/simple.gif" ,
302- amount : 2 ,
303- params : { body : { type : "pageview" } } ,
304- timeout : browser . browser === "ie" ? 10000 : null ,
305- } ,
306- ] ;
289+ // Device seems unavailable so this test will fail
290+ if ( typeof driver ?. get !== "function" ) {
291+ expect ( true , `Getting driver for ${ browser . name } ` ) . to . be . false ;
292+ return ;
307293 }
294+ }
308295
309- // Empty global REQUESTS
310- global . REQUESTS = [ ] ;
296+ let commands = [ ] ;
311297
312- await navigate ( {
313- ...browser ,
314- commands,
315- driver,
316- } ) ;
298+ if ( browser . supportsSendBeacon ) {
299+ commands = [
300+ {
301+ script : "/latest/latest.js" ,
302+ push : browser . supportsPushState ,
303+ beacon : browser . supportsSendBeacon ,
304+ allowparams : "project" ,
305+ } ,
306+ { wait : "/script.js" , amount : 1 } ,
307+ { visit : "/empty" } , // Trigger sendBeacon
308+ { wait : "/simple.gif" , amount : 3 } ,
309+ { wait : "/append" } ,
310+ ] ;
311+ } else if ( browser . supportsPushState ) {
312+ commands = [
313+ {
314+ script : "/latest/latest.js" ,
315+ push : browser . supportsPushState ,
316+ allowparams : "project" ,
317+ } ,
318+ { wait : "/script.js" , amount : 1 } ,
319+ { wait : "/simple.gif" , amount : 3 } ,
320+ ] ;
321+ } else {
322+ commands = [
323+ { script : "/latest/latest.js" , allowparams : "project" } ,
324+ { wait : "/script.js" , amount : 2 } ,
325+ {
326+ wait : "/simple.gif" ,
327+ amount : 2 ,
328+ params : { body : { type : "pageview" } } ,
329+ timeout : browser . browser === "ie" ? 10000 : null ,
330+ } ,
331+ ] ;
332+ }
317333
318- // console.log(JSON.stringify(global.REQUESTS, null, 2));
334+ // Empty global REQUESTS
335+ global . REQUESTS = [ ] ;
319336
320- if ( browser . supportsSendBeacon ) {
321- log ( "Testing beacon" ) ;
322- await require ( "./test-beacon" ) ( browser ) ;
323- } else if ( browser . supportsPushState ) {
324- log ( "Testing one beacon" ) ;
325- await require ( "./test-one-beacon" ) ( browser ) ;
326- }
337+ await navigate ( {
338+ ...browser ,
339+ commands,
340+ driver,
341+ } ) ;
327342
328- if ( browser . supportsPushState ) {
329- log ( "Testing push state" ) ;
330- await require ( "./test-pushstate" ) ( browser ) ;
331- } else {
332- log ( "Testing no push state" ) ;
333- await require ( "./test-no-pushstate" ) ( browser ) ;
334- }
343+ // console.log(JSON.stringify(global.REQUESTS, null, 2));
335344
336- if ( browser . supportsClientHints ) {
337- log ( "We can't test client hints because they only work on https" ) ;
338- }
345+ if ( browser . supportsSendBeacon ) {
346+ log ( "Testing beacon" ) ;
347+ await require ( "./test-beacon" ) ( browser ) ;
348+ } else if ( browser . supportsPushState ) {
349+ log ( "Testing one beacon" ) ;
350+ await require ( "./test-one-beacon" ) ( browser ) ;
351+ }
352+
353+ if ( browser . supportsPushState ) {
354+ log ( "Testing push state" ) ;
355+ await require ( "./test-pushstate" ) ( browser ) ;
356+ } else {
357+ log ( "Testing no push state" ) ;
358+ await require ( "./test-no-pushstate" ) ( browser ) ;
359+ }
339360
340- log ( "Testing events" ) ;
361+ if ( browser . supportsClientHints ) {
362+ log ( "We can't test client hints because they only work on https" ) ;
363+ }
341364
342- // Empty global REQUESTS
343- global . REQUESTS = [ ] ;
365+ log ( "Testing events" ) ;
344366
345- commands = [
346- { script : "/latest/hello.js" , event : "-- event 123 &&" } ,
347- { wait : "/simple.gif" , params : { body : { type : "event" } } } ,
348- { script : "/latest/hello.js" , event : "function" } ,
349- { script : "/latest/hello.js" , event : "metadata" } ,
350- {
351- wait : "/simple.gif" ,
352- params : { body : { type : "event" } } ,
353- amount : 3 ,
354- } ,
355- ] ;
367+ // Empty global REQUESTS
368+ global . REQUESTS = [ ] ;
356369
357- await navigate ( {
358- ...browser ,
359- commands,
360- driver,
361- } ) ;
370+ commands = [
371+ { script : "/latest/hello.js" , event : "-- event 123 &&" } ,
372+ { wait : "/simple.gif" , params : { body : { type : "event" } } } ,
373+ { script : "/latest/hello.js" , event : "function" } ,
374+ { script : "/latest/hello.js" , event : "metadata" } ,
375+ {
376+ wait : "/simple.gif" ,
377+ params : { body : { type : "event" } } ,
378+ amount : 3 ,
379+ } ,
380+ ] ;
362381
363- await require ( "./test-events" ) ( browser ) ;
382+ await navigate ( {
383+ ...browser ,
384+ commands,
385+ driver,
386+ } ) ;
364387
365- await driver . quit ( ) ;
366- } ;
388+ await require ( "./test-events" ) ( browser ) ;
389+
390+ if ( driver ) await driver . quit ( ) ;
391+ } ;
367392
368- suiteInstance . addTest ( new Mocha . Test ( testName , test ) ) ;
393+ for ( const [ index , browser ] of browsers . entries ( ) ) {
394+ const total = browsers . length ;
395+ const testName = `Testing ${ browser . name } (${ index + 1 } /${ total } )` ;
396+ const nextBrowser = browsers [ index + 1 ] ;
397+ suiteInstance . addTest (
398+ new Mocha . Test ( testName , ( ) => test ( browser , nextBrowser ) )
399+ ) ;
369400 }
370401
371402 mochaInstance . run ( async ( amountFailures ) => {
0 commit comments