1+ const fs = require ( "fs" )
2+
3+ const LambdatestLog = ( message ) => {
4+ if ( ! Cypress . env ( 'LAMBDATEST_LOGS' ) ) return ;
5+ cy . task ( 'lambdatest_log' , message ) ;
6+ }
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+
10+ const setScanConfig = ( win , payload ) =>
11+ new Promise ( async ( resolve , reject ) => {
12+ const isHttpOrHttps = / ^ ( h t t p | h t t p s ) : $ / . test ( win . location . protocol ) ;
13+ if ( ! isHttpOrHttps ) {
14+ resolve ( ) ;
15+ }
16+
17+ function startScan ( ) {
18+ console . log ( 'log' , "Accessibility setting scan config" )
19+ function onScanComplete ( event ) {
20+ win . document . removeEventListener ( "automation-custom-event" , onScanComplete ) ;
21+ console . log ( 'log' , "Recieved scan config data " + event . detail )
22+ resolve ( event . detail ) ;
23+ }
24+
25+ win . document . addEventListener ( "automation-custom-event" , onScanComplete ) ;
26+ const e = new CustomEvent ( "accessibility-extension-custom-event" , { detail : payload } ) ;
27+ win . document . dispatchEvent ( e ) ;
28+
29+ // add timeout of 4 sec
30+
31+ setTimeout ( ( ) => {
32+ reject ( new Error ( 'automation-custom-event not received within timeout' ) ) ;
33+ } , 9000 ) ; // Adding a custom timeout for the event
34+ }
35+ startScan ( ) ;
36+
37+ } )
38+
39+ const getScanData = ( win , payload ) =>
40+ new Promise ( async ( resolve , reject ) => {
41+ const isHttpOrHttps = / ^ ( h t t p | h t t p s ) : $ / . test ( window . location . protocol ) ;
42+ if ( ! isHttpOrHttps ) {
43+ resolve ( ) ;
44+ }
45+
46+
47+ function getSummary ( ) {
48+ function onReceiveSummary ( event ) {
49+
50+ win . document . removeEventListener ( "automation-custom-event" , onReceiveSummary ) ;
51+ resolve ( event . detail ) ;
52+ }
53+
54+
55+ win . document . addEventListener ( "automation-custom-event" , onReceiveSummary ) ;
56+ const e = new CustomEvent ( "accessibility-extension-custom-event" , { detail : payload } ) ;
57+ win . document . dispatchEvent ( e ) ;
58+
59+ setTimeout ( ( ) => {
60+ reject ( new Error ( 'automation-custom-event not received within timeout' ) ) ;
61+ } , 9000 ) ; // Adding a custom timeout for the event
62+
63+ }
64+
65+
66+ getSummary ( ) ;
67+
68+ } )
69+
70+ const shouldScanForAccessibility = ( attributes ) => {
71+ if ( Cypress . env ( "IS_ACCESSIBILITY_EXTENSION_LOADED" ) !== "true" ) return false ;
72+
73+ const extensionPath = Cypress . env ( "ACCESSIBILITY_EXTENSION_PATH" ) ;
74+ const isHeaded = Cypress . browser . isHeaded ;
75+
76+ if ( ! isHeaded || ( extensionPath === undefined ) ) return false ;
77+
78+ let shouldScanTestForAccessibility = true ;
79+
80+ if ( Cypress . env ( "INCLUDE_TAGS_FOR_ACCESSIBILITY" ) || Cypress . env ( "EXCLUDE_TAGS_FOR_ACCESSIBILITY" ) ) {
81+ try {
82+ let includeTagArray = [ ] ;
83+ let excludeTagArray = [ ] ;
84+ if ( Cypress . env ( "INCLUDE_TAGS_FOR_ACCESSIBILITY" ) ) {
85+ includeTagArray = Cypress . env ( "INCLUDE_TAGS_FOR_ACCESSIBILITY" ) . split ( ";" )
86+ }
87+ if ( Cypress . env ( "EXCLUDE_TAGS_FOR_ACCESSIBILITY" ) ) {
88+ excludeTagArray = Cypress . env ( "EXCLUDE_TAGS_FOR_ACCESSIBILITY" ) . split ( ";" )
89+ }
90+
91+ const fullTestName = attributes . title ;
92+ const excluded = excludeTagArray . some ( ( exclude ) => fullTestName . includes ( exclude ) ) ;
93+ const included = includeTagArray . length === 0 || includeTags . some ( ( include ) => fullTestName . includes ( include ) ) ;
94+ shouldScanTestForAccessibility = ! excluded && included ;
95+ } catch ( error ) {
96+ LambdatestLog ( "Error while validating test case for accessibility before scanning. Error : " , error ) ;
97+ }
98+ }
99+
100+ return shouldScanTestForAccessibility ;
101+ }
102+
103+ Cypress . on ( 'command:start' , async ( command ) => {
104+ if ( ! command || ! command . attributes ) return ;
105+ if ( command . attributes . name == 'window' || command . attributes . name == 'then' || command . attributes . name == 'wrap' || command . attributes . name == 'wait' ) {
106+ return ;
107+ }
108+
109+ if ( ! commandsToWrap . includes ( command . attributes . name ) ) return ;
110+
111+ // const attributes = Cypress.mocha.getRunner().suite.ctx.currentTest || Cypress.mocha.getRunner().suite.ctx._runnable;
112+
113+ // let shouldScanTestForAccessibility = shouldScanForAccessibility(attributes);
114+ // if (!shouldScanTestForAccessibility) return;
115+ // console.log('log', "debugging scan form command " + command.attributes.name);
116+ console . log ( 'log' , "debugging scan form command " + command . attributes . name ) ;
117+ cy . window ( ) . then ( ( win ) => {
118+ // LambdatestLog('Performing scan form command ' + command.attributes.name);
119+ let wcagCriteriaValue = Cypress . env ( "WCAG_CRITERIA" ) || "wcag21a" ;
120+ let bestPracticeValue = Cypress . env ( "BEST_PRACTICE" ) || false ;
121+ let needsReviewValue = Cypress . env ( "NEEDS_REVIEW" ) || true ;
122+
123+ const payloadToSend = {
124+ message : 'SET_CONFIG' ,
125+ wcagCriteria : wcagCriteriaValue ,
126+ bestPractice : bestPracticeValue ,
127+ needsReview : needsReviewValue
128+ }
129+ let testId = Cypress . env ( "TEST_ID" ) || ""
130+ const filePath = 'cypress/reports/accessibilityReport_' + testId + '.json' ;
131+
132+ cy . wrap ( setScanConfig ( win , payloadToSend ) , { timeout : 30000 } ) . then ( ( res ) => {
133+ // LambdatestLog('log', "logging report **************")
134+ console . log ( 'logging config reponse' , res ) ;
135+
136+ const payload = {
137+ message : 'GET_LATEST_SCAN_DATA' ,
138+ }
139+ // cy.wait(5000);
140+ cy . wrap ( getScanData ( win , payload ) , { timeout : 30000 } ) . then ( ( res ) => {
141+ LambdatestLog ( 'log' , "logging report **************" )
142+
143+
144+ cy . task ( 'initializeFile' , filePath ) . then ( ( filePath ) => {
145+ cy . readFile ( filePath , { log : true , timeout : 30000 } ) . then ( ( fileContent ) => {
146+ let resultsArray = [ { } ] ;
147+ console . log ( 'logging report' , res ) ;
148+ // If the file is not empty, parse the existing content
149+ if ( fileContent ) {
150+ try {
151+ resultsArray = JSON . parse ( JSON . stringify ( fileContent ) ) ;
152+ } catch ( e ) {
153+ console . log ( "parsing error for content " , fileContent )
154+ console . log ( 'Error parsing JSON file:' , e ) ;
155+ return ;
156+ }
157+ }
158+ console . log ( 'debugging res' , res . message ) ;
159+ if ( res . message == "GET_LATEST_SCAN_DATA" ) {
160+ // Append the new result
161+ resultsArray . push ( res ) ;
162+ console . log ( 'resultsarray logging' , resultsArray ) ;
163+ }
164+
165+ // Write the updated content back to the file
166+ cy . writeFile ( filePath , resultsArray , { log : true , timeout : 30000 } ) ;
167+ } ) ;
168+ } ) ;
169+ } ) ;
170+
171+ } ) ;
172+ } )
173+ } )
174+
175+
176+ Cypress . on ( 'command:end' , ( command ) => {
177+
178+ // console.log('log', "debugging scan form command end " + command.attributes.name);
179+ return ;
180+ } )
0 commit comments