@@ -4,10 +4,51 @@ const browserStackLog = (message) => {
44 if ( ! Cypress . env ( 'BROWSERSTACK_LOGS' ) ) return ;
55 cy . task ( 'browserstack_log' , message ) ;
66}
7-
8- const commandsToWrap = [ 'visit' , 'click' , 'type' , 'request' , 'dblclick' , 'rightclick' , 'clear' , 'check' , 'uncheck' , 'select' , 'trigger' , 'selectFile' , 'scrollIntoView' , 'scroll' , 'scrollTo' , 'blur' , 'focus' , 'go' , 'reload' , 'submit' , 'viewport' , 'origin' ] ;
9- // scroll is not a default function in cypress.
10- const commandToOverwrite = [ 'visit' , 'click' , 'type' , 'request' , 'dblclick' , 'rightclick' , 'clear' , 'check' , 'uncheck' , 'select' , 'trigger' , 'selectFile' , 'scrollIntoView' , 'scrollTo' , 'blur' , 'focus' , 'go' , 'reload' , 'submit' , 'viewport' , 'origin' ] ;
7+
8+ // Default commands (fallback)
9+ const defaultCommandsToWrap = [ 'visit' , 'click' , 'type' , 'request' , 'dblclick' , 'rightclick' , 'clear' , 'check' , 'uncheck' , 'select' , 'trigger' , 'selectFile' , 'scrollIntoView' , 'scroll' , 'scrollTo' , 'blur' , 'focus' , 'go' , 'reload' , 'submit' , 'viewport' , 'origin' ] ;
10+
11+ // Determine effective commands based on server response
12+ let effectiveCommandsToWrap = defaultCommandsToWrap ;
13+ let isBuildEndOnlyMode = false ;
14+
15+ // Check if server provided specific commands via environment variables
16+ if ( Cypress . env ( 'ACCESSIBILITY_BUILD_END_ONLY' ) === 'true' ) {
17+ // Server explicitly wants build-end-only scanning
18+ effectiveCommandsToWrap = [ ] ;
19+ isBuildEndOnlyMode = true ;
20+ browserStackLog ( '[A11Y] Server enabled build-end-only mode - disabling all command scanning' ) ;
21+ } else if ( Cypress . env ( 'ACCESSIBILITY_COMMANDS_TO_WRAP' ) ) {
22+ try {
23+ const serverCommands = JSON . parse ( Cypress . env ( 'ACCESSIBILITY_COMMANDS_TO_WRAP' ) ) ;
24+
25+ if ( Array . isArray ( serverCommands ) ) {
26+ if ( serverCommands . length === 0 ) {
27+ // Empty array = build-end only
28+ effectiveCommandsToWrap = [ ] ;
29+ isBuildEndOnlyMode = true ;
30+ browserStackLog ( '[A11Y] Server provided empty commands - enabling build-end-only mode' ) ;
31+ } else {
32+ // Use server-provided command list
33+ effectiveCommandsToWrap = serverCommands . map ( cmd => cmd . name || cmd ) ;
34+ isBuildEndOnlyMode = false ;
35+ browserStackLog ( `[A11Y] Using server commands: ${ effectiveCommandsToWrap . join ( ', ' ) } ` ) ;
36+ }
37+ }
38+ } catch ( error ) {
39+ browserStackLog ( `[A11Y] Error parsing server commands, using defaults: ${ error . message } ` ) ;
40+ }
41+ } else {
42+ browserStackLog ( '[A11Y] No server commands provided, using default command list' ) ;
43+ }
44+
45+ // Filter to only include valid Cypress commands
46+ const commandToOverwrite = defaultCommandsToWrap . filter ( cmd =>
47+ effectiveCommandsToWrap . includes ( cmd )
48+ ) ;
49+
50+ browserStackLog ( `[A11Y] Commands to wrap: ${ commandToOverwrite . length } out of ${ defaultCommandsToWrap . length } ` ) ;
51+ browserStackLog ( `[A11Y] Build-end-only mode: ${ isBuildEndOnlyMode } ` ) ;
1152
1253/*
1354 Overrriding the cypress commands to perform Accessibility Scan before Each command
@@ -50,6 +91,8 @@ new Promise(async (resolve, reject) => {
5091 return resolve ( ) ;
5192 }
5293
94+ const isBuildEndOnly = Cypress . env ( 'ACCESSIBILITY_BUILD_END_ONLY' ) === 'true' ;
95+
5396 function findAccessibilityAutomationElement ( ) {
5497 return win . document . querySelector ( "#accessibility-automation-element" ) ;
5598 }
@@ -82,8 +125,24 @@ new Promise(async (resolve, reject) => {
82125 }
83126
84127 win . addEventListener ( "A11Y_SCAN_FINISHED" , onScanComplete ) ;
85- const e = new CustomEvent ( "A11Y_SCAN" , { detail : payloadToSend } ) ;
86- win . dispatchEvent ( e ) ;
128+
129+ // Enhanced event with mode information and server scripts
130+ const scanEvent = new CustomEvent ( "A11Y_SCAN" , {
131+ detail : {
132+ ...payloadToSend ,
133+ scanMode : isBuildEndOnlyMode ? "comprehensive-build-end" : "incremental" ,
134+ timestamp : Date . now ( ) ,
135+ serverScripts : Cypress . env ( 'ACCESSIBILITY_SCRIPTS' ) || null
136+ }
137+ } ) ;
138+
139+ if ( isBuildEndOnlyMode ) {
140+ browserStackLog ( `[A11Y] Starting comprehensive build-end scan` ) ;
141+ } else {
142+ browserStackLog ( `[A11Y] Starting incremental scan` ) ;
143+ }
144+
145+ win . dispatchEvent ( scanEvent ) ;
87146 }
88147
89148 if ( findAccessibilityAutomationElement ( ) ) {
@@ -299,29 +358,45 @@ const shouldScanForAccessibility = (attributes) => {
299358 return shouldScanTestForAccessibility ;
300359}
301360
302- commandToOverwrite . forEach ( ( command ) => {
303- Cypress . Commands . overwrite ( command , ( originalFn , ...args ) => {
304- const attributes = Cypress . mocha . getRunner ( ) . suite . ctx . currentTest || Cypress . mocha . getRunner ( ) . suite . ctx . _runnable ;
305- const shouldScanTestForAccessibility = shouldScanForAccessibility ( attributes ) ;
306- const state = cy . state ( 'current' ) , Subject = 'getSubjectFromChain' in cy ;
307- const stateName = state === null || state === void 0 ? void 0 : state . get ( 'name' ) ;
308- let stateType = null ;
309- if ( ! shouldScanTestForAccessibility || ( stateName && stateName !== command ) ) {
310- return originalFn ( ...args ) ;
311- }
312- if ( state !== null && state !== void 0 ) {
313- stateType = state . get ( 'type' ) ;
314- }
315- performModifiedScan ( originalFn , Subject , stateType , ...args ) ;
316- } ) ;
317- } ) ;
361+ // Only wrap commands if not in build-end-only mode and we have commands to wrap
362+ if ( ! isBuildEndOnlyMode && commandToOverwrite . length > 0 ) {
363+ browserStackLog ( `[A11Y] Wrapping ${ commandToOverwrite . length } commands for accessibility scanning` ) ;
364+
365+ commandToOverwrite . forEach ( ( command ) => {
366+ Cypress . Commands . overwrite ( command , ( originalFn , ...args ) => {
367+ const attributes = Cypress . mocha . getRunner ( ) . suite . ctx . currentTest || Cypress . mocha . getRunner ( ) . suite . ctx . _runnable ;
368+ const shouldScanTestForAccessibility = shouldScanForAccessibility ( attributes ) ;
369+ const state = cy . state ( 'current' ) , Subject = 'getSubjectFromChain' in cy ;
370+ const stateName = state === null || state === void 0 ? void 0 : state . get ( 'name' ) ;
371+ let stateType = null ;
372+ if ( ! shouldScanTestForAccessibility || ( stateName && stateName !== command ) ) {
373+ return originalFn ( ...args ) ;
374+ }
375+ if ( state !== null && state !== void 0 ) {
376+ stateType = state . get ( 'type' ) ;
377+ }
378+
379+ browserStackLog ( `[A11Y] Performing command-level scan for: ${ command } ` ) ;
380+ performModifiedScan ( originalFn , Subject , stateType , ...args ) ;
381+ } ) ;
382+ } ) ;
383+
384+ browserStackLog ( `[A11Y] Successfully wrapped ${ commandToOverwrite . length } commands for accessibility scanning` ) ;
385+ } else {
386+ browserStackLog ( `[A11Y] Command wrapping disabled - using build-end-only scanning mode` ) ;
387+ }
318388
319389afterEach ( ( ) => {
320390 const attributes = Cypress . mocha . getRunner ( ) . suite . ctx . currentTest ;
321391 cy . window ( ) . then ( async ( win ) => {
322392 let shouldScanTestForAccessibility = shouldScanForAccessibility ( attributes ) ;
323393 if ( ! shouldScanTestForAccessibility ) return cy . wrap ( { } ) ;
324394
395+ // Determine current scanning mode
396+ const currentMode = isBuildEndOnlyMode ? 'build-end-only' : 'command-plus-end' ;
397+ browserStackLog ( `[A11Y] Starting final scan in ${ currentMode } mode` ) ;
398+
399+ // Perform final scan (this happens regardless of mode)
325400 cy . wrap ( performScan ( win ) , { timeout : 30000 } ) . then ( ( ) => {
326401 try {
327402 let os_data ;
@@ -347,13 +422,17 @@ afterEach(() => {
347422 const payloadToSend = {
348423 "thTestRunUuid" : testRunUuid ,
349424 "thBuildUuid" : Cypress . env ( "BROWSERSTACK_TESTHUB_UUID" ) ,
350- "thJwtToken" : Cypress . env ( "BROWSERSTACK_TESTHUB_JWT" )
425+ "thJwtToken" : Cypress . env ( "BROWSERSTACK_TESTHUB_JWT" ) ,
426+ "scanMode" : currentMode ,
427+ "buildEndOnly" : isBuildEndOnlyMode
351428 } ;
352- browserStackLog ( `Payload to send: ${ JSON . stringify ( payloadToSend ) } ` ) ;
429+
430+ browserStackLog ( `[A11Y] Saving results for ${ currentMode } mode` ) ;
431+ browserStackLog ( `[A11Y] Payload: ${ JSON . stringify ( payloadToSend ) } ` ) ;
353432
354433 return cy . wrap ( saveTestResults ( win , payloadToSend ) , { timeout : 30000 } ) ;
355434 } ) . then ( ( ) => {
356- browserStackLog ( `Saved accessibility test results` ) ;
435+ browserStackLog ( `[A11Y] Successfully completed ${ currentMode } accessibility scanning and saved results` ) ;
357436 } )
358437
359438 } catch ( er ) {
0 commit comments