itemengine-cypress-automation 1.0.113 → 1.0.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/figOverImageCanvasComponent.js +1 -1
- 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/dragAndDropIntoCategoriesPage.js +3 -3
- 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
- package/scripts/sorry-cypress.mjs +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(), {
|