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