itemengine-cypress-automation 1.0.113 → 1.0.114
Sign up to get free protection for your applications and to get access to all the features.
- package/cypress/e2e/ILC/AudioResponseNew/barRecorderStyle.js +489 -0
- package/cypress/e2e/ILC/AudioResponseNew/compactRecorderStyle.js +482 -0
- package/cypress/e2e/ILC/AudioResponseNew/customizePlaybackControls.js +488 -0
- package/cypress/e2e/ILC/AudioResponseNew/editAndPreviewTabScoringSection.js +92 -0
- package/cypress/e2e/ILC/AudioResponseNew/editTabBasicSection.js +229 -0
- package/cypress/e2e/ILC/AudioResponseNew/gradingViewAndCorrectAnswerViewContents.smoke.js +1 -1
- package/cypress/e2e/ILC/AudioResponseNew/headerSection.js +67 -0
- package/cypress/e2e/ILC/AudioResponseNew/previewContentsForAllViews.smoke.js +1 -1
- package/cypress/e2e/ILC/AudioResponseNew/standardRecorderStyle.js +11 -11
- package/cypress/e2e/ILC/AudioResponseNew/studentViewSettings.js +529 -0
- package/cypress/e2e/ILC/EssayResponse/essayResponseCustomizeFormattingOptions1.smoke.js +108 -190
- package/cypress/e2e/ILC/EssayResponse/essayResponseCustomizeFormattingOptions2.js +83 -155
- package/cypress/e2e/ILC/EssayResponse/essayResponseCustomizeFormattingOptions3.js +104 -315
- package/cypress/e2e/ILC/EssayResponseBasic/essayResponseBasicCustomizeFormattingOptions.js +121 -135
- package/cypress/e2e/ILC/EssayResponseMath/createItem.js +17 -0
- package/cypress/e2e/ILC/EssayResponseMath/mathCharacters.js +203 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/manuallyAndNonScored.js +121 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/partialDifferentWeightsAlternativePointsGreaterThanCorrectPoints.js +236 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/partialDifferentWeightsBasic.js +255 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/partialDifferentWeightsWithCorrectPointsEqualToAlternativePoints.js +237 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/partialDifferentWeightsWithCorrectPointsGreaterThanAlternativePoints.js +236 -0
- package/cypress/e2e/ILC/FillInTheGapsOverImageDropdownNew/Scoring/partialEqualWeightsWithAlternativePointsGreaterThanCorrectPoints.js +2 -2
- package/cypress/e2e/ILC/ShortTextResponseNew/additionalSettings.js +43 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/allOrNothingBasicForAllViews.smoke.js +187 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/allOrNothingWithAlternativeAnswer.js +245 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/checkAnswerFunctionalityForAllViews.smoke.js +99 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/editTabScoringSection.js +97 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/headerSection.js +74 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/manuallyAndNonScoredScoring.js +83 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/previewContentsForAllViews.smoke.js +109 -0
- package/cypress/e2e/ILC/ShortTextResponseNew/specifyCorrectAnswerSection.js +66 -0
- package/cypress/e2e/ILC/TextEntryMath/allOrNothingBasicForAllViews.smoke.js +326 -0
- package/cypress/e2e/ILC/TextEntryMath/checkAnswerFunctionalityForAllViews.smoke.js +163 -0
- package/cypress/e2e/ILC/TextEntryMath/evaluationMethodEquivalentStructures.js +8 -8
- package/cypress/e2e/ILC/TextEntryMath/evaluationMethodValueIsEquivalent.js +3 -3
- package/cypress/e2e/ILC/TextEntryMath/previewContentsForAllViews.smoke.js +154 -0
- package/cypress/pages/audioResponsePage.js +523 -66
- package/cypress/pages/components/autoScoredScoringPreviewTab.js +2 -0
- package/cypress/pages/components/autoScoredSpecifyCorrectAnswerSection.js +6 -5
- package/cypress/pages/components/equationEditorFlyout.js +11 -0
- package/cypress/pages/components/essayResponseCommonComponents.js +290 -19
- package/cypress/pages/components/maximumRecorderLengthComponent.js +32 -15
- package/cypress/pages/components/playbackControlsBaseComponent.js +9 -1
- package/cypress/pages/components/questionInputFieldComponent.js +0 -7
- package/cypress/pages/essayResponseBasicPage.js +1 -26
- package/cypress/pages/essayResponsePage.js +21 -284
- package/cypress/pages/shortTextResponsePage.js +142 -103
- package/cypress/pages/textEntryMathPage.js +58 -7
- package/package.json +1 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
import utilities from "../support/helpers/utilities";
|
2
|
-
import { createQuestionBasePage, questionInstructionsComponent, scoringSectionBaseEditTab, maximumRecorderLengthComponent, commonComponents, playbackControlsBaseComponent } from "./components"
|
2
|
+
import { createQuestionBasePage, questionInstructionsComponent, scoringSectionBaseEditTab, maximumRecorderLengthComponent, commonComponents, playbackControlsBaseComponent, autoScoredScoringPreviewTab, studentViewSettingsLabelComponent } from "./components"
|
3
3
|
import { dialogBoxBase } from "./dialogBoxBase";
|
4
4
|
const css = Cypress.env('css');
|
5
5
|
|
@@ -10,8 +10,11 @@ const selectors = {
|
|
10
10
|
...questionInstructionsComponent,
|
11
11
|
...maximumRecorderLengthComponent,
|
12
12
|
...playbackControlsBaseComponent,
|
13
|
+
...studentViewSettingsLabelComponent,
|
13
14
|
recordedResponseHelpText: () => cy.get('[class*="preview-help-text"]'),
|
14
15
|
playbackWaveform: () => cy.get('.audio-wave-form'),
|
16
|
+
playbackWaveformTotalWidth: () => cy.get('.audio-wave-form wave wave canvas'),
|
17
|
+
playbackWaveformCurrentPositionWidth: () => cy.get('.audio-wave-form wave wave'),
|
15
18
|
//standard style
|
16
19
|
standardPreviewStartRecordingButton: () => cy.get('.standard-audio-recorder-mic [role="button"]'),
|
17
20
|
standardPreviewStopRecordingButton: () => cy.get('.standard-recorder-stop-btn'),
|
@@ -42,25 +45,68 @@ const selectors = {
|
|
42
45
|
waveformCursor: () => cy.get('.audio-wave-form-cursor-div'),
|
43
46
|
standardRecorderStyleButton: () => cy.get('[data-ngie-testid="standard-toggle-button"]'),
|
44
47
|
barRecorderStyleButton: () => cy.get('[data-ngie-testid="bar-toggle-button"]'),
|
45
|
-
|
46
|
-
//
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
48
|
+
compactRecorderStyleButton: () => cy.get('[data-ngie-testid="compact-toggle-button"]'),
|
49
|
+
//compact style
|
50
|
+
compactPreviewRecordButton: () => cy.get('.recorder-buttons-wrapper .record-button'),
|
51
|
+
compactPreviewPauseRecordingButton: () => cy.get('.recorder-buttons-wrapper .pause-button'),
|
52
|
+
compactPreviewStopRecordingButton: () => cy.get('.recorder-buttons-wrapper .stop-button'),
|
53
|
+
compactPreviewResumeRecordingButton: () => cy.get('.recorder-buttons-wrapper .record-button'),
|
54
|
+
compactPreviewRetakeButton: () => cy.get('.play-back-btn-wrapper .record-button'),
|
55
|
+
compactPreviewPlayPlaybackButton: () => cy.get('.play-back-btn-wrapper .play-back-button'),
|
56
|
+
compactPreviewPausePlaybackButton: () => cy.get('.play-back-btn-wrapper .play-back-button'),
|
57
|
+
compactPreviewRecordingHelpText: () => cy.get('.minimal-recording-text'),
|
58
|
+
compactPreviewRecorderHelpText: () => cy.get('.response-recorded'),
|
59
|
+
compactPreviewRecordingTimer: () => cy.get('.minimal-recording-timer'),
|
60
|
+
compactPreviewVolumeMeter: () => cy.get('.audio-volume-meter-wrapper'),
|
61
|
+
compactPreviewPlaybackPlayButton: () => cy.get('.play-back-button'),
|
62
|
+
compactPreviewPlaybackTime: () => cy.get('.minimal-playback-timer'),
|
60
63
|
//Retake dialogue box
|
61
64
|
confirmRetakeButton: () => cy.get('.action-btn-wrapper button').eq(1),
|
62
65
|
cancelRetakeButton: () => cy.get('.action-btn-wrapper button').eq(0),
|
63
|
-
retakePopupContent: () => cy.get('.retake-popup-content')
|
66
|
+
retakePopupContent: () => cy.get('.retake-popup-content'),
|
67
|
+
customizePlaybackControlsAccordion: () => cy.get('.customize-accordion .ngie-accordion-summary'),
|
68
|
+
controlsForPlaybackLabel: () => cy.get('.response-playback-title').eq(0),
|
69
|
+
controlsForPlaybackPlayButton: () => cy.get('[data-ngie-testid="play-toggle-button"]'),
|
70
|
+
controlsForPlaybackPlayButtonLabel: () => cy.get('.customize-accordion [class*="CustomizeToolbarSelectionstyles__Label"]').eq(0),
|
71
|
+
controlsForPlaybackPauseButton: () => cy.get('[data-ngie-testid="pause-toggle-button"]'),
|
72
|
+
controlsForPlaybackPauseButtonLabel: () => cy.get('.customize-accordion [class*="CustomizeToolbarSelectionstyles__Label"]').eq(1),
|
73
|
+
controlsForPlaybackSeekButton: () => cy.get('[data-ngie-testid="seek-toggle-button"]'),
|
74
|
+
controlsForPlaybackSeekButtonLabel: () => cy.get('.customize-accordion [class*="CustomizeToolbarSelectionstyles__Label"]').eq(2),
|
75
|
+
controlsForPlaybackVolumeButton: () => cy.get('[data-ngie-testid="volume-toggle-button"]'),
|
76
|
+
controlsForPlaybackVolumeButtonLabel: () => cy.get('.customize-accordion [class*="CustomizeToolbarSelectionstyles__Label"]').eq(3),
|
77
|
+
controlsForPlaybackPlaybackSpeedButton: () => cy.get('[data-ngie-testid="playback-speed-toggle-button"]'),
|
78
|
+
controlsForPlaybackPlaybackSpeedButtonLabel: () => cy.get('.customize-accordion [class*="CustomizeToolbarSelectionstyles__Label"]').eq(4),
|
79
|
+
//Audio indicators
|
80
|
+
audioIndicatorsProgressIndicatorButton: () => cy.get('[data-ngie-testid="progress-indicator-toggle-button"]'),
|
81
|
+
audioIndicatorsProgressIndicatorButtonLabel: () => cy.get('.audio-indicator .control-footer').eq(0),
|
82
|
+
audioIndicatorsAudioWaveButton: () => cy.get('[data-ngie-testid="audio-wave-toggle-button"]'),
|
83
|
+
audioIndicatorsAudioWaveButtonLabel: () => cy.get('.audio-indicator .control-footer').eq(1),
|
84
|
+
audioIndicatorsTimerButton: () => cy.get('[data-ngie-testid="timer-toggle-button"]'),
|
85
|
+
audioIndicatorsTimerButtonLabel: () => cy.get('.audio-indicator .control-footer').eq(2),
|
86
|
+
audioIndicatorsVolumeMeterButton: () => cy.get('[data-ngie-testid="volume-meter-toggle-button"]'),
|
87
|
+
audioIndicatorsVolumeMeterButtonLabel: () => cy.get('.audio-indicator .control-footer').eq(3),
|
88
|
+
audioIndicatorsLabel: () => cy.get('.audio-indicator .response-playback-title'),
|
89
|
+
audioRecorderStyleLabel: () => cy.get('.recorder-style-label'),
|
90
|
+
stopRecordingIfSilenceIsDetectedLabel: () => cy.get('.stop-recording-length-label'),
|
91
|
+
stopRecordingIfSilenceIsDetectedInputField: () => cy.get('.stop-recording-input-wrapper input'),
|
92
|
+
stopRecordingIfSilenceIsDetectedSecsToggleButton: () => cy.get('.stop-recording-input-wrapper [data-ngie-testid="secs-toggle-button"]'),
|
93
|
+
stopRecordingIfSilenceIsDetectedMinsToggleButton: () => cy.get('.stop-recording-input-wrapper [data-ngie-testid="mins-toggle-button"]'),
|
94
|
+
limitNumberOfRetakeCheckboxLabel: () => cy.get('[data-ngie-testid="limit-number-of-retake-checkbox"] .MuiFormControlLabel-label'),
|
95
|
+
limitNumberOfRetakeCheckbox: () => cy.get('[data-ngie-testid="limit-number-of-retake-checkbox"] input'),
|
96
|
+
//bar recorder style
|
97
|
+
//Reminder: post a bug for selectors being the same as standard recorder style
|
98
|
+
barPreviewRecordTime: () => cy.get('.standard-record-timer'),
|
99
|
+
barPreviewPlaybackTime: () => cy.get('.standard-record-timer-wrapper'),
|
100
|
+
barPreviewStartRecordingButton: () => cy.get('.rec-button'),
|
101
|
+
barPreviewStopRecordingButton: () => cy.get('.standard-recorder-stop-btn'),
|
102
|
+
barPreviewPauseRecordingButton: () => cy.get('.standard-recorder-pause-btn'),
|
103
|
+
barPreviewResumeRecordingButton: () => cy.get('.standard-recorder-resume-btn'),
|
104
|
+
barPreviewRetakeButton: () => cy.get('.standard-recorder-retake-btn'),
|
105
|
+
showStudentsTheRetakeLimitsOnTooltipCheckbox: () => cy.get('[data-ngie-testid="show-students-the-retake-limits-on-tooltip-checkbox"] input'),
|
106
|
+
showStudentsTheRetakeLimitsOnTooltipCheckboxLabel: () => cy.get('[data-ngie-testid="show-students-the-retake-limits-on-tooltip-checkbox"] .MuiFormControlLabel-label'),
|
107
|
+
retakeLimitLabel: () => cy.get('.retake-limit-label'),
|
108
|
+
retakeLimitInputField: () => cy.get('.retake-limit-wrapper input'),
|
109
|
+
barPreviewPlaybackWrapper: () => cy.get('.audio-response-wrapper')
|
64
110
|
}
|
65
111
|
|
66
112
|
const steps = {
|
@@ -160,7 +206,7 @@ const steps = {
|
|
160
206
|
.click();
|
161
207
|
},
|
162
208
|
|
163
|
-
|
209
|
+
waitForPlaybackToBeginStandardPreview: () => {
|
164
210
|
audioResponsePage.standardPreviewPlaybackTime()
|
165
211
|
.should('contain', '00:01/')
|
166
212
|
},
|
@@ -181,21 +227,26 @@ const steps = {
|
|
181
227
|
/**
|
182
228
|
* Verifies the playback elapsed time displayed on the audio response page.
|
183
229
|
* @param {number} time - The expected elapsed time in seconds.
|
184
|
-
* @param {("Standard" | "
|
230
|
+
* @param {("Standard" | "Compact")} recorderStyle - The style of the recorder ('Standard' or 'Compact').
|
185
231
|
* @throws {Error} Will throw an error if the provided recorder style is invalid.
|
186
232
|
* @returns {void}
|
187
233
|
*/
|
188
234
|
verifyPlaybackElapsedTime: (time, recorderStyle) => {
|
189
235
|
let playbackTimeElement;
|
190
236
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
237
|
+
switch (recorderStyle) {
|
238
|
+
case 'Standard':
|
239
|
+
playbackTimeElement = audioResponsePage.standardPreviewPlaybackTime();
|
240
|
+
break;
|
241
|
+
case 'Bar':
|
242
|
+
playbackTimeElement = audioResponsePage.barPreviewPlaybackTime();
|
243
|
+
break;
|
244
|
+
case 'Compact':
|
245
|
+
playbackTimeElement = audioResponsePage.compactPreviewPlaybackTime();
|
246
|
+
break;
|
247
|
+
default:
|
248
|
+
throw new Error('Invalid recorder style');
|
249
|
+
};
|
199
250
|
playbackTimeElement
|
200
251
|
.invoke('text')
|
201
252
|
.then(text => {
|
@@ -203,13 +254,13 @@ const steps = {
|
|
203
254
|
let currentElapsedTimerMinutes = Number(elapsedTime.split(':')[0]);
|
204
255
|
let currentElapsedTimerSeconds = Number(elapsedTime.split(':')[1]);
|
205
256
|
let currentTotalElapsedTimerSeconds = currentElapsedTimerMinutes * 60 + currentElapsedTimerSeconds;
|
206
|
-
expect(currentTotalElapsedTimerSeconds).to.
|
257
|
+
expect(currentTotalElapsedTimerSeconds).to.closeTo(time, 1);
|
207
258
|
});
|
208
259
|
},
|
209
260
|
|
210
261
|
/**
|
211
262
|
* Selects the audio recorder style based on the provided style.
|
212
|
-
* @param {('Standard' | 'Bar' | '
|
263
|
+
* @param {('Standard' | 'Bar' | 'Compact')} recorderStyle - The style of the audio recorder to select.
|
213
264
|
* @throws {Error} Will throw an error if an invalid recorder style is provided.
|
214
265
|
*/
|
215
266
|
selectAudioRecorderStyle: (recorderStyle) => {
|
@@ -224,8 +275,8 @@ const steps = {
|
|
224
275
|
.click()
|
225
276
|
.should('have.class', 'ngie-toggle-button-selected');
|
226
277
|
break;
|
227
|
-
case '
|
228
|
-
audioResponsePage.
|
278
|
+
case 'Compact':
|
279
|
+
audioResponsePage.compactRecorderStyleButton()
|
229
280
|
.click()
|
230
281
|
.should('have.class', 'ngie-toggle-button-selected');
|
231
282
|
break;
|
@@ -234,18 +285,18 @@ const steps = {
|
|
234
285
|
}
|
235
286
|
},
|
236
287
|
|
237
|
-
|
238
|
-
audioResponsePage.
|
288
|
+
startRecordingCompactPreview: () => {
|
289
|
+
audioResponsePage.compactPreviewRecordButton()
|
239
290
|
.click();
|
240
291
|
},
|
241
292
|
|
242
|
-
|
243
|
-
audioResponsePage.
|
293
|
+
stopRecordingCompactPreview: () => {
|
294
|
+
audioResponsePage.compactPreviewStopRecordingButton()
|
244
295
|
.click();
|
245
296
|
},
|
246
297
|
|
247
|
-
|
248
|
-
audioResponsePage.
|
298
|
+
waitForRecordingToStartCompactPreview: () => {
|
299
|
+
audioResponsePage.compactPreviewRecordingTimer()
|
249
300
|
.should('contain', '00:01 /')
|
250
301
|
},
|
251
302
|
|
@@ -260,37 +311,37 @@ const steps = {
|
|
260
311
|
},
|
261
312
|
|
262
313
|
/**
|
263
|
-
* Verifies the recorded time displayed in the
|
314
|
+
* Verifies the recorded time displayed in the compact preview player on the audio response page.
|
264
315
|
* @param {string} recordingTime - The current recorded time in the format 'mm:ss'.
|
265
316
|
* @param {string} totalTime - The total duration of the audio in the format 'mm:ss'.
|
266
317
|
* @returns {undefined}
|
267
318
|
*/
|
268
|
-
|
269
|
-
utilities.verifyTextContent(audioResponsePage.
|
319
|
+
verifyRecordingTimeCompactPreview: (recordingTime, totalTime) => {
|
320
|
+
utilities.verifyTextContent(audioResponsePage.compactPreviewRecordingTimer(), `${recordingTime} / ${totalTime}`)
|
270
321
|
},
|
271
322
|
|
272
323
|
/**
|
273
|
-
* Verifies the playback time displayed in the
|
324
|
+
* Verifies the playback time displayed in the compact preview player on the audio response page.
|
274
325
|
* @param {string} playbackTime - The current playback time in the format 'mm:ss'.
|
275
326
|
* @param {string} totalTime - The total duration of the audio in the format 'mm:ss'.
|
276
327
|
* @returns {undefined}
|
277
328
|
*/
|
278
|
-
|
279
|
-
utilities.verifyTextContent(audioResponsePage.
|
329
|
+
verifyPlaybackTimeCompactPreview: (playbackTime, totalTime) => {
|
330
|
+
utilities.verifyTextContent(audioResponsePage.compactPreviewPlaybackTime(), `${playbackTime}/${totalTime}`);
|
280
331
|
},
|
281
332
|
|
282
|
-
|
283
|
-
audioResponsePage.
|
333
|
+
pauseRecordingCompactPreview: () => {
|
334
|
+
audioResponsePage.compactPreviewPauseRecordingButton()
|
284
335
|
.click();
|
285
336
|
},
|
286
337
|
|
287
|
-
|
288
|
-
audioResponsePage.
|
338
|
+
resumeRecordingCompactPreview: () => {
|
339
|
+
audioResponsePage.compactPreviewResumeRecordingButton()
|
289
340
|
.click();
|
290
341
|
},
|
291
342
|
|
292
|
-
|
293
|
-
audioResponsePage.
|
343
|
+
verifyRecordingLengthAfterResumingCompactPreview: () => {
|
344
|
+
audioResponsePage.compactPreviewRecordingTimer()
|
294
345
|
.invoke('text')
|
295
346
|
.then(($timer) => {
|
296
347
|
const currentTimer = $timer.split(' / ')[0];
|
@@ -299,8 +350,8 @@ const steps = {
|
|
299
350
|
});
|
300
351
|
},
|
301
352
|
|
302
|
-
|
303
|
-
audioResponsePage.
|
353
|
+
stopRecordingCompactPreview: () => {
|
354
|
+
audioResponsePage.compactPreviewStopRecordingButton()
|
304
355
|
.click();
|
305
356
|
},
|
306
357
|
|
@@ -310,15 +361,15 @@ const steps = {
|
|
310
361
|
},
|
311
362
|
|
312
363
|
/**
|
313
|
-
* Records and saves audio during the
|
364
|
+
* Records and saves audio during the compact preview recording process.
|
314
365
|
* @param {number} time - The duration (in milliseconds) to record audio before saving.
|
315
366
|
* @throws {Error} Throws an error if there is an issue during the recording and saving process.
|
316
367
|
*/
|
317
|
-
|
318
|
-
audioResponsePage.steps.
|
319
|
-
audioResponsePage.steps.
|
368
|
+
recordAndSaveAudioCompactPreview: (time) => {
|
369
|
+
audioResponsePage.steps.startRecordingCompactPreview();
|
370
|
+
audioResponsePage.steps.waitForRecordingToStartCompactPreview();
|
320
371
|
audioResponsePage.steps.addWaitToRecordAudio(time - 1000);
|
321
|
-
audioResponsePage.steps.
|
372
|
+
audioResponsePage.steps.stopRecordingCompactPreview();
|
322
373
|
},
|
323
374
|
|
324
375
|
cancelRetake: () => {
|
@@ -331,18 +382,18 @@ const steps = {
|
|
331
382
|
.click();
|
332
383
|
},
|
333
384
|
|
334
|
-
|
335
|
-
audioResponsePage.
|
385
|
+
startPlaybackCompactPreview: () => {
|
386
|
+
audioResponsePage.compactPreviewPlayPlaybackButton()
|
336
387
|
.click();
|
337
388
|
},
|
338
389
|
|
339
|
-
|
340
|
-
audioResponsePage.
|
390
|
+
waitForPlaybackToBeginCompactPreview: () => {
|
391
|
+
audioResponsePage.compactPreviewPlaybackTime()
|
341
392
|
.should('contain', '00:01/')
|
342
393
|
},
|
343
394
|
|
344
|
-
|
345
|
-
audioResponsePage.
|
395
|
+
pausePlaybackCompactPreview: () => {
|
396
|
+
audioResponsePage.compactPreviewPausePlaybackButton()
|
346
397
|
.click();
|
347
398
|
},
|
348
399
|
|
@@ -354,18 +405,18 @@ const steps = {
|
|
354
405
|
utilities.verifyElementVisibilityState(audioResponsePage.cancelRetakeButton(), 'visible');
|
355
406
|
},
|
356
407
|
|
357
|
-
|
358
|
-
audioResponsePage.
|
408
|
+
retakeRecordingCompactPreview: () => {
|
409
|
+
audioResponsePage.compactPreviewRetakeButton()
|
359
410
|
.click();
|
360
411
|
},
|
361
412
|
|
362
|
-
|
413
|
+
pauseAndVerifyProgressBarSliderPositionCompactPreview: () => {
|
363
414
|
let initialWidthProgressBar
|
364
415
|
playbackControlsBaseComponent.progressBarSlider()
|
365
416
|
.then(($currWidth) => {
|
366
417
|
initialWidthProgressBar = $currWidth[0].valueAsNumber
|
367
418
|
});
|
368
|
-
audioResponsePage.steps.
|
419
|
+
audioResponsePage.steps.pausePlaybackCompactPreview();
|
369
420
|
playbackControlsBaseComponent.progressBarSlider()
|
370
421
|
.then(($finalWidth) => {
|
371
422
|
cy.log('The assertion is verifying the value synchronously i.e in real time')
|
@@ -373,6 +424,410 @@ const steps = {
|
|
373
424
|
expect(finalWidth).to.closeTo(initialWidthProgressBar, 5)
|
374
425
|
});
|
375
426
|
},
|
427
|
+
|
428
|
+
verifyCustomizePlaybackControlsAccordionCollapsedState: () => {
|
429
|
+
audioResponsePage.customizePlaybackControlsAccordion()
|
430
|
+
.should('have.attr', 'aria-expanded', 'false');
|
431
|
+
},
|
432
|
+
|
433
|
+
expandCustomizePlaybackControlsAccordion: () => {
|
434
|
+
audioResponsePage.customizePlaybackControlsAccordion()
|
435
|
+
.click()
|
436
|
+
.should('have.attr', 'aria-expanded', 'true');
|
437
|
+
},
|
438
|
+
|
439
|
+
collapseCustomizePlaybackControlsAccordion: () => {
|
440
|
+
audioResponsePage.customizePlaybackControlsAccordion()
|
441
|
+
.click()
|
442
|
+
.should('have.attr', 'aria-expanded', 'false');
|
443
|
+
},
|
444
|
+
|
445
|
+
verifyControlsForPlaybackPlayButtonSelectedState: () => {
|
446
|
+
audioResponsePage.controlsForPlaybackPlayButton()
|
447
|
+
.within(() => {
|
448
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'visible');
|
449
|
+
});
|
450
|
+
},
|
451
|
+
|
452
|
+
verifyControlsForPlaybackPauseButtonSelectedState: () => {
|
453
|
+
audioResponsePage.controlsForPlaybackPauseButton()
|
454
|
+
.within(() => {
|
455
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'visible');
|
456
|
+
});
|
457
|
+
},
|
458
|
+
|
459
|
+
verifyControlsForPlaybackSeekButtonSelectedState: () => {
|
460
|
+
audioResponsePage.controlsForPlaybackSeekButton()
|
461
|
+
.within(() => {
|
462
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'visible');
|
463
|
+
});
|
464
|
+
},
|
465
|
+
|
466
|
+
verifyControlsForPlaybackVolumeButtonSelectedState: () => {
|
467
|
+
audioResponsePage.controlsForPlaybackVolumeButton()
|
468
|
+
.within(() => {
|
469
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'visible');
|
470
|
+
});
|
471
|
+
},
|
472
|
+
|
473
|
+
verifyControlsForPlaybackPlaybackSpeedButtonSelectedState: () => {
|
474
|
+
audioResponsePage.controlsForPlaybackPlaybackSpeedButton()
|
475
|
+
.within(() => {
|
476
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'visible');
|
477
|
+
});
|
478
|
+
},
|
479
|
+
|
480
|
+
deselectControlsForPlaybackPlayButton: () => {
|
481
|
+
audioResponsePage.controlsForPlaybackPlayButton()
|
482
|
+
.click()
|
483
|
+
.should('have.class', 'ngie-toggle-button-not-selected')
|
484
|
+
},
|
485
|
+
|
486
|
+
selectControlsForPlaybackPlayButton: () => {
|
487
|
+
audioResponsePage.controlsForPlaybackPlayButton()
|
488
|
+
.click()
|
489
|
+
.should('have.class', 'ngie-toggle-button-selected')
|
490
|
+
},
|
491
|
+
|
492
|
+
deselectControlsForPlaybackPauseButton: () => {
|
493
|
+
audioResponsePage.controlsForPlaybackPauseButton()
|
494
|
+
.click()
|
495
|
+
.should('have.class', 'ngie-toggle-button-not-selected')
|
496
|
+
},
|
497
|
+
|
498
|
+
deselectControlsForPlaybackSeekButton: () => {
|
499
|
+
audioResponsePage.controlsForPlaybackSeekButton()
|
500
|
+
.click()
|
501
|
+
.should('have.class', 'ngie-toggle-button-not-selected')
|
502
|
+
},
|
503
|
+
|
504
|
+
selectControlsForPlaybackSeekButton: () => {
|
505
|
+
audioResponsePage.controlsForPlaybackSeekButton()
|
506
|
+
.click()
|
507
|
+
.should('have.class', 'ngie-toggle-button-selected')
|
508
|
+
},
|
509
|
+
|
510
|
+
selectControlsForPlaybackPauseButton: () => {
|
511
|
+
audioResponsePage.controlsForPlaybackPauseButton()
|
512
|
+
.click()
|
513
|
+
.should('have.class', 'ngie-toggle-button-selected')
|
514
|
+
},
|
515
|
+
|
516
|
+
verifyPausePlaybackButtonEnabledState: () => {
|
517
|
+
utilities.verifyElementNotDisabled(audioResponsePage.previewPausePlaybackButton())
|
518
|
+
},
|
519
|
+
|
520
|
+
verifyPausePlaybackButtonEnabledStateCompactPreview: () => {
|
521
|
+
utilities.verifyElementNotDisabled(audioResponsePage.compactPreviewPausePlaybackButton())
|
522
|
+
},
|
523
|
+
|
524
|
+
selectControlsForPlaybackVolumeButton: () => {
|
525
|
+
audioResponsePage.controlsForPlaybackVolumeButton()
|
526
|
+
.click()
|
527
|
+
.should('have.class', 'ngie-toggle-button-selected')
|
528
|
+
},
|
529
|
+
|
530
|
+
deselectControlsForPlaybackVolumeButton: () => {
|
531
|
+
audioResponsePage.controlsForPlaybackVolumeButton()
|
532
|
+
.click()
|
533
|
+
.should('have.class', 'ngie-toggle-button-not-selected')
|
534
|
+
},
|
535
|
+
|
536
|
+
deselectControlsForPlaybackPlaybackSpeedButton: () => {
|
537
|
+
audioResponsePage.controlsForPlaybackPlaybackSpeedButton()
|
538
|
+
.click()
|
539
|
+
.should('have.class', 'ngie-toggle-button-not-selected')
|
540
|
+
},
|
541
|
+
|
542
|
+
selectControlsForPlaybackPlaybackSpeedButton: () => {
|
543
|
+
audioResponsePage.controlsForPlaybackPlaybackSpeedButton()
|
544
|
+
.click()
|
545
|
+
.should('have.class', 'ngie-toggle-button-selected')
|
546
|
+
},
|
547
|
+
|
548
|
+
verifyAudioIndicatorsProgressIndicatorButtonDeselectedState: () => {
|
549
|
+
audioResponsePage.audioIndicatorsProgressIndicatorButton()
|
550
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
551
|
+
},
|
552
|
+
|
553
|
+
verifyAudioIndicatorsAudioWaveformButtonDeselectedState: () => {
|
554
|
+
audioResponsePage.audioIndicatorsAudioWaveButton()
|
555
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
556
|
+
},
|
557
|
+
|
558
|
+
selectAudioIndicatorsProgressIndicatorButton: () => {
|
559
|
+
audioResponsePage.audioIndicatorsProgressIndicatorButton()
|
560
|
+
.click()
|
561
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
562
|
+
},
|
563
|
+
|
564
|
+
verifyAudioWaveformProgressPosition: (actualAudioSeekedInPercent) => {
|
565
|
+
audioResponsePage.playbackWaveform()
|
566
|
+
.then(($totalWidth) => {
|
567
|
+
const totalWidth = $totalWidth[0].clientWidth
|
568
|
+
audioResponsePage.playbackWaveformCurrentPositionWidth()
|
569
|
+
.then(($currWidth) => {
|
570
|
+
const currentWaveFormWidth = $currWidth[0].clientWidth
|
571
|
+
const currentWaveFormWidthInPercent = (currentWaveFormWidth / totalWidth) * 100
|
572
|
+
expect(currentWaveFormWidthInPercent).to.be.closeTo(actualAudioSeekedInPercent, 5)
|
573
|
+
});
|
574
|
+
});
|
575
|
+
|
576
|
+
},
|
577
|
+
|
578
|
+
seekPlaybackWaveformTo75Percent: () => {
|
579
|
+
audioResponsePage.playbackWaveform()
|
580
|
+
.then(($waveformDimensions) => {
|
581
|
+
const x = $waveformDimensions[0].clientWidth - ($waveformDimensions[0].clientWidth) / 4
|
582
|
+
const y = ($waveformDimensions[0].clientHeight) / 2
|
583
|
+
audioResponsePage.playbackWaveform()
|
584
|
+
.click(x, y);
|
585
|
+
});
|
586
|
+
},
|
587
|
+
|
588
|
+
verifyStandardRecorderStyleToggleButtonSelectedState: () => {
|
589
|
+
audioResponsePage.standardRecorderStyleButton()
|
590
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
591
|
+
},
|
592
|
+
|
593
|
+
verifyAudioIndicatorsTimeButtonSelectedState: () => {
|
594
|
+
audioResponsePage.audioIndicatorsTimerButton()
|
595
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
596
|
+
},
|
597
|
+
|
598
|
+
verifyAudioIndicatorsProgressIndicatorButtonSelectedState: () => {
|
599
|
+
audioResponsePage.audioIndicatorsProgressIndicatorButton()
|
600
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
601
|
+
},
|
602
|
+
|
603
|
+
verifyAudioIndicatorsAudioWaveButtonSelectedState: () => {
|
604
|
+
audioResponsePage.audioIndicatorsAudioWaveButton()
|
605
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
606
|
+
},
|
607
|
+
|
608
|
+
verifyAudioIndicatorsVolumeMeterButtonSelectedState: () => {
|
609
|
+
audioResponsePage.audioIndicatorsVolumeMeterButton()
|
610
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
611
|
+
},
|
612
|
+
|
613
|
+
verifyAudioIndicatorsAudioWaveButtonSelectedState: () => {
|
614
|
+
audioResponsePage.audioIndicatorsAudioWaveButton()
|
615
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
616
|
+
},
|
617
|
+
|
618
|
+
/**
|
619
|
+
* Verifies the value of the input field for stopping recording if silence is detected.
|
620
|
+
* @param {string} value - The expected value of the input field.
|
621
|
+
*/
|
622
|
+
verifyStopRecordingIfSilenceIsDetectedInputFieldValue: (value) => {
|
623
|
+
audioResponsePage.stopRecordingIfSilenceIsDetectedInputField()
|
624
|
+
.should('have.attr', 'value', value)
|
625
|
+
},
|
626
|
+
|
627
|
+
verifyStopRecordingIfSilenceIsDetectedSecsToggleButtonSelectedState: () => {
|
628
|
+
audioResponsePage.stopRecordingIfSilenceIsDetectedSecsToggleButton()
|
629
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
630
|
+
},
|
631
|
+
|
632
|
+
/**
|
633
|
+
* Sets the duration after which recording should stop if silence is detected.
|
634
|
+
* @param {string} value - The duration after which recording should stop if silence is detected.
|
635
|
+
*/
|
636
|
+
setStopRecordingIfSilenceIsDetectedAfter: (value) => {
|
637
|
+
audioResponsePage.stopRecordingIfSilenceIsDetectedInputField()
|
638
|
+
.type(value)
|
639
|
+
},
|
640
|
+
|
641
|
+
focusInStopRecordingIfSilenceIsDetectedInputField: () => {
|
642
|
+
audioResponsePage.stopRecordingIfSilenceIsDetectedInputField()
|
643
|
+
.clear()
|
644
|
+
.blur();
|
645
|
+
},
|
646
|
+
|
647
|
+
limitNumberOfRetakeCheckboxUncheckedState: () => {
|
648
|
+
audioResponsePage.limitNumberOfRetakeCheckbox()
|
649
|
+
.should('not.be.checked');
|
650
|
+
},
|
651
|
+
|
652
|
+
deselectAudioIndicatorsTimerButton: () => {
|
653
|
+
audioResponsePage.audioIndicatorsTimerButton()
|
654
|
+
.click()
|
655
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
656
|
+
audioResponsePage.audioIndicatorsTimerButton()
|
657
|
+
.within(() => {
|
658
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'hidden');
|
659
|
+
});
|
660
|
+
},
|
661
|
+
|
662
|
+
startRecordingBarPreview: () => {
|
663
|
+
audioResponsePage.barPreviewStartRecordingButton()
|
664
|
+
.click();
|
665
|
+
},
|
666
|
+
|
667
|
+
waitForRecordingToStartBarPreview: () => {
|
668
|
+
audioResponsePage.barPreviewRecordTime()
|
669
|
+
.should('contain', '00:01 /')
|
670
|
+
},
|
671
|
+
|
672
|
+
stopRecordingBarPreview: () => {
|
673
|
+
audioResponsePage.barPreviewStopRecordingButton()
|
674
|
+
.click();
|
675
|
+
},
|
676
|
+
|
677
|
+
selectAudioIndicatorsTimerButton: () => {
|
678
|
+
audioResponsePage.audioIndicatorsTimerButton()
|
679
|
+
.click()
|
680
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
681
|
+
},
|
682
|
+
|
683
|
+
deselectAudioIndicatorsPlaybackIndicatorButton: () => {
|
684
|
+
audioResponsePage.audioIndicatorsProgressIndicatorButton()
|
685
|
+
.click()
|
686
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
687
|
+
audioResponsePage.audioIndicatorsProgressIndicatorButton()
|
688
|
+
.within(() => {
|
689
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'hidden');
|
690
|
+
});
|
691
|
+
},
|
692
|
+
|
693
|
+
deselectAudioIndicatorsAudioWaveButton: () => {
|
694
|
+
audioResponsePage.audioIndicatorsAudioWaveButton()
|
695
|
+
.click()
|
696
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
697
|
+
audioResponsePage.audioIndicatorsAudioWaveButton()
|
698
|
+
.within(() => {
|
699
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'hidden');
|
700
|
+
});
|
701
|
+
},
|
702
|
+
|
703
|
+
deselectAudioIndicatorsVolumeMeterButton: () => {
|
704
|
+
audioResponsePage.audioIndicatorsVolumeMeterButton()
|
705
|
+
.click()
|
706
|
+
.should('have.class', 'ngie-toggle-button-not-selected');
|
707
|
+
audioResponsePage.audioIndicatorsVolumeMeterButton()
|
708
|
+
.within(() => {
|
709
|
+
utilities.verifyElementVisibilityState(commonComponents.tickIconForOptionButtons(), 'hidden');
|
710
|
+
});
|
711
|
+
},
|
712
|
+
|
713
|
+
selectAudioIndicatorsVolumeMeterButton: () => {
|
714
|
+
audioResponsePage.audioIndicatorsVolumeMeterButton()
|
715
|
+
.click()
|
716
|
+
.should('have.class', 'ngie-toggle-button-selected');
|
717
|
+
},
|
718
|
+
|
719
|
+
verifyShowStudentsTheRetakeLimitsOnTooltipCheckboxUncheckedState: () => {
|
720
|
+
audioResponsePage.showStudentsTheRetakeLimitsOnTooltipCheckbox()
|
721
|
+
.should('not.be.checked');
|
722
|
+
},
|
723
|
+
|
724
|
+
checkLimitNumberOfRetakeCheckbox: () => {
|
725
|
+
audioResponsePage.limitNumberOfRetakeCheckbox()
|
726
|
+
.click()
|
727
|
+
.should('be.checked');
|
728
|
+
},
|
729
|
+
|
730
|
+
/**
|
731
|
+
* Verifies the value of the retake limit input field.
|
732
|
+
* @param {string} value - The expected value of the retake limit input field.
|
733
|
+
*/
|
734
|
+
verifyRetakeLimitInputFieldValue: (value) => {
|
735
|
+
audioResponsePage.retakeLimitInputField()
|
736
|
+
.should('have.attr', 'value', value)
|
737
|
+
},
|
738
|
+
|
739
|
+
/**
|
740
|
+
* Sets the retake limit value.
|
741
|
+
* @param {string} value - The value to set as the retake limit.
|
742
|
+
*/
|
743
|
+
setRetakeLimit: (value) => {
|
744
|
+
audioResponsePage.retakeLimitInputField()
|
745
|
+
.clear()
|
746
|
+
.type(value)
|
747
|
+
.should('have.attr', 'value', value)
|
748
|
+
},
|
749
|
+
|
750
|
+
/**
|
751
|
+
* Verifies the recorded time displayed in the bar preview player on the audio response page.
|
752
|
+
* @param {string} recordingTime - The current recorded time in the format 'mm:ss'.
|
753
|
+
* @param {string} totalTime - The total duration of the audio in the format 'mm:ss'.
|
754
|
+
*/
|
755
|
+
verifyRecordingTimeBarPreview: (recordingTime, totalTime) => {
|
756
|
+
utilities.verifyTextContent(audioResponsePage.barPreviewRecordTime(), `${recordingTime} / ${totalTime}`)
|
757
|
+
},
|
758
|
+
|
759
|
+
pauseRecordingBarPreview: () => {
|
760
|
+
audioResponsePage.barPreviewPauseRecordingButton()
|
761
|
+
.click();
|
762
|
+
},
|
763
|
+
|
764
|
+
resumeRecordingBarPreview: () => {
|
765
|
+
audioResponsePage.barPreviewResumeRecordingButton()
|
766
|
+
.click();
|
767
|
+
},
|
768
|
+
|
769
|
+
/**
|
770
|
+
* Verifies the playback time displayed in the bar preview player on the audio response page.
|
771
|
+
* @param {string} playbackTime - The current playback time in the format 'mm:ss'.
|
772
|
+
* @param {string} totalTime - The total duration of the audio in the format 'mm:ss'.
|
773
|
+
* @returns {undefined}
|
774
|
+
*/
|
775
|
+
verifyPlaybackTimeBarPreview: (playbackTime, totalTime) => {
|
776
|
+
utilities.verifyTextContent(audioResponsePage.barPreviewPlaybackTime(), `${playbackTime}/${totalTime}`);
|
777
|
+
},
|
778
|
+
|
779
|
+
/**
|
780
|
+
* Records and saves audio during the bar preview recording process.
|
781
|
+
* @param {number} time - The duration (in milliseconds) to record audio before saving.
|
782
|
+
* @throws {Error} Throws an error if there is an issue during the recording and saving process.
|
783
|
+
*/
|
784
|
+
recordAndSaveAudioBarPreview: (time) => {
|
785
|
+
audioResponsePage.steps.startRecordingBarPreview();
|
786
|
+
audioResponsePage.steps.waitForRecordingToStartBarPreview();
|
787
|
+
audioResponsePage.steps.addWaitToRecordAudio(time - 1000);
|
788
|
+
audioResponsePage.steps.stopRecordingBarPreview();
|
789
|
+
},
|
790
|
+
|
791
|
+
waitForPlaybackToBeginBarPreview: () => {
|
792
|
+
audioResponsePage.barPreviewPlaybackTime()
|
793
|
+
.should('contain', '00:01/')
|
794
|
+
},
|
795
|
+
|
796
|
+
verifyRecordingLengthAfterResumingBarPreview: () => {
|
797
|
+
audioResponsePage.barPreviewRecordTime()
|
798
|
+
.invoke('text')
|
799
|
+
.then(($timer) => {
|
800
|
+
const currentTimer = $timer.split(' / ')[0];
|
801
|
+
const currentSeconds = parseInt(currentTimer.split(':')[1], 10);
|
802
|
+
expect(currentSeconds).to.be.gte(3);
|
803
|
+
});
|
804
|
+
},
|
805
|
+
|
806
|
+
retakeRecordingBarPreview: () => {
|
807
|
+
audioResponsePage.barPreviewRetakeButton()
|
808
|
+
.click();
|
809
|
+
},
|
810
|
+
|
811
|
+
verifyResponseIsRecordedHelpText: () => {
|
812
|
+
utilities.verifyInnerText(audioResponsePage.recordedResponseHelpText(), 'Your response has been recorded.');
|
813
|
+
},
|
814
|
+
|
815
|
+
checkShowStudentsTheRetakeLimitsOnTooltipCheckbox: () => {
|
816
|
+
audioResponsePage.showStudentsTheRetakeLimitsOnTooltipCheckbox()
|
817
|
+
.click()
|
818
|
+
.should('be.checked');
|
819
|
+
},
|
820
|
+
|
821
|
+
uncheckShowStudentsTheRetakeLimitsOnTooltipCheckbox: () => {
|
822
|
+
audioResponsePage.showStudentsTheRetakeLimitsOnTooltipCheckbox()
|
823
|
+
.click()
|
824
|
+
.should('not.be.checked');
|
825
|
+
},
|
826
|
+
|
827
|
+
clearRetakeLimitInputField: () => {
|
828
|
+
audioResponsePage.retakeLimitInputField()
|
829
|
+
.clear();
|
830
|
+
}
|
376
831
|
}
|
377
832
|
|
378
833
|
const tests = {
|
@@ -381,6 +836,8 @@ const tests = {
|
|
381
836
|
...scoringSectionBaseEditTab.tests,
|
382
837
|
...maximumRecorderLengthComponent.tests,
|
383
838
|
...playbackControlsBaseComponent.tests,
|
839
|
+
...autoScoredScoringPreviewTab.tests,
|
840
|
+
...studentViewSettingsLabelComponent.tests,
|
384
841
|
verifyRetakePopupCSSAndA11y: () => {
|
385
842
|
it('CSS of \'Retake\' popup', { tags: 'css' }, () => {
|
386
843
|
utilities.verifyCSS(dialogBoxBase.dialogBox(), {
|