@camunda/e2e-test-suite 0.0.548 → 0.0.550

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.
@@ -73,12 +73,16 @@ class ModelerHomePage {
73
73
  await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.createNewProjectButton, {
74
74
  totalTimeout: 30000,
75
75
  });
76
- // The WhatsNew modal renders lazily after page load and intercepts clicks.
77
- // Wait up to 5s for its dismiss button; click it if it appears, then proceed.
76
+ // Modals (WhatsNew, "BPMN conditional events", etc.) render lazily after
77
+ // page load and intercept clicks on the button underneath. Dismiss them.
78
78
  await this.closeButton
79
79
  .waitFor({ state: 'visible', timeout: 5000 })
80
80
  .then(() => this.closeButton.click())
81
81
  .catch(() => { });
82
+ await this.modalCloseButton
83
+ .waitFor({ state: 'visible', timeout: 2000 })
84
+ .then(() => this.modalCloseButton.click())
85
+ .catch(() => { });
82
86
  await this.createNewProjectButton.click();
83
87
  }
84
88
  async enterNewProjectName(name) {
@@ -24,18 +24,12 @@ class OperateProcessesPage {
24
24
  this.page = page;
25
25
  this.processResultCount = page.getByTestId('result-count');
26
26
  this.processesTabLink = page.getByRole('link', { name: 'Processes' });
27
- this.processActiveCheckbox = page
28
- .locator('label')
29
- .filter({ hasText: 'Active' });
30
- this.processCompletedCheckbox = page
31
- .locator('label')
32
- .filter({ hasText: 'Completed' });
27
+ this.processActiveCheckbox = page.locator('input#active');
28
+ this.processCompletedCheckbox = page.locator('input#completed');
33
29
  this.processRunningInstancesCheckbox = page
34
- .locator('label')
35
- .filter({ hasText: 'Running Instances' });
36
- this.processIncidentsCheckbox = page
37
- .locator('label')
38
- .filter({ hasText: 'Incidents' });
30
+ .getByTestId('filter-running-instances')
31
+ .getByRole('checkbox');
32
+ this.processIncidentsCheckbox = page.locator('input#incidents');
39
33
  this.processPageHeading = page
40
34
  .getByTestId('expanded-panel')
41
35
  .getByRole('heading', { name: 'Process' });
@@ -53,22 +47,22 @@ class OperateProcessesPage {
53
47
  this.gotItButton = page.getByRole('button', { name: 'Got it' });
54
48
  }
55
49
  async checkCheckbox(checkbox) {
56
- await checkbox.waitFor({ state: 'visible', timeout: constants_1._1_SECOND_IN_MS * 10 });
50
+ await checkbox.waitFor({ state: 'attached', timeout: constants_1._1_SECOND_IN_MS * 10 });
57
51
  if (!(await checkbox.isChecked())) {
58
- await checkbox.click();
52
+ await checkbox.check({ force: true, timeout: constants_1._1_SECOND_IN_MS * 30 });
59
53
  await (0, test_1.expect)(checkbox).toBeChecked({
60
54
  checked: true,
61
- timeout: constants_1._1_SECOND_IN_MS * 2,
55
+ timeout: constants_1._1_SECOND_IN_MS * 30,
62
56
  });
63
57
  }
64
58
  }
65
59
  async uncheckCheckbox(checkbox) {
66
- await checkbox.waitFor({ state: 'visible', timeout: constants_1._1_SECOND_IN_MS * 10 });
60
+ await checkbox.waitFor({ state: 'attached', timeout: constants_1._1_SECOND_IN_MS * 10 });
67
61
  if (await checkbox.isChecked()) {
68
- await checkbox.click();
62
+ await checkbox.uncheck({ force: true, timeout: constants_1._1_SECOND_IN_MS * 30 });
69
63
  await (0, test_1.expect)(checkbox).toBeChecked({
70
64
  checked: false,
71
- timeout: constants_1._1_SECOND_IN_MS * 2,
65
+ timeout: constants_1._1_SECOND_IN_MS * 30,
72
66
  });
73
67
  }
74
68
  }
@@ -82,7 +76,7 @@ class OperateProcessesPage {
82
76
  await this.uncheckCompletedCheckbox();
83
77
  await this.clickProcessIncidentsCheckbox();
84
78
  await this.processActiveCheckbox.waitFor({
85
- state: 'visible',
79
+ state: 'attached',
86
80
  timeout: constants_1._1_SECOND_IN_MS * 10,
87
81
  });
88
82
  if (await this.processActiveCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
@@ -98,7 +92,7 @@ class OperateProcessesPage {
98
92
  await this.uncheckActiveCheckbox();
99
93
  await this.clickProcessIncidentsCheckbox();
100
94
  await this.processCompletedCheckbox.waitFor({
101
- state: 'visible',
95
+ state: 'attached',
102
96
  timeout: constants_1._1_SECOND_IN_MS * 10,
103
97
  });
104
98
  if (await this.processCompletedCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
@@ -142,11 +136,11 @@ class OperateProcessesPage {
142
136
  }
143
137
  async clickProcessActiveCheckbox() {
144
138
  await this.processActiveCheckbox.waitFor({
145
- state: 'visible',
139
+ state: 'attached',
146
140
  timeout: constants_1._1_SECOND_IN_MS * 10,
147
141
  });
148
- if (!(await this.processActiveCheckbox.isChecked({ timeout: 60000 }))) {
149
- await this.processActiveCheckbox.click({ timeout: 120000 });
142
+ if (!(await this.processActiveCheckbox.isChecked())) {
143
+ await this.processActiveCheckbox.check({ force: true, timeout: 120000 });
150
144
  await (0, test_1.expect)(this.processActiveCheckbox).toBeChecked({
151
145
  checked: true,
152
146
  timeout: constants_1._1_SECOND_IN_MS * 5,
@@ -155,11 +149,11 @@ class OperateProcessesPage {
155
149
  }
156
150
  async clickProcessCompletedCheckbox() {
157
151
  await this.processCompletedCheckbox.waitFor({
158
- state: 'visible',
152
+ state: 'attached',
159
153
  timeout: constants_1._1_SECOND_IN_MS * 10,
160
154
  });
161
- if (!(await this.processCompletedCheckbox.isChecked({ timeout: 60000 }))) {
162
- await this.processCompletedCheckbox.click({ timeout: 120000 });
155
+ if (!(await this.processCompletedCheckbox.isChecked())) {
156
+ await this.processCompletedCheckbox.check({ force: true, timeout: 120000 });
163
157
  await (0, test_1.expect)(this.processCompletedCheckbox).toBeChecked({
164
158
  checked: true,
165
159
  timeout: constants_1._1_SECOND_IN_MS * 5,
@@ -168,11 +162,19 @@ class OperateProcessesPage {
168
162
  }
169
163
  async clickProcessIncidentsCheckbox() {
170
164
  await this.processIncidentsCheckbox.waitFor({
171
- state: 'visible',
165
+ state: 'attached',
172
166
  timeout: constants_1._1_SECOND_IN_MS * 10,
173
167
  });
174
168
  const wasChecked = await this.processIncidentsCheckbox.isChecked();
175
- await this.processIncidentsCheckbox.click({ timeout: 90000 });
169
+ if (wasChecked) {
170
+ await this.processIncidentsCheckbox.uncheck({
171
+ force: true,
172
+ timeout: 90000,
173
+ });
174
+ }
175
+ else {
176
+ await this.processIncidentsCheckbox.check({ force: true, timeout: 90000 });
177
+ }
176
178
  await (0, test_1.expect)(this.processIncidentsCheckbox).toBeChecked({
177
179
  checked: !wasChecked,
178
180
  timeout: constants_1._1_SECOND_IN_MS * 5,
@@ -180,11 +182,22 @@ class OperateProcessesPage {
180
182
  }
181
183
  async clickRunningProcessInstancesCheckbox() {
182
184
  await this.processRunningInstancesCheckbox.waitFor({
183
- state: 'visible',
185
+ state: 'attached',
184
186
  timeout: constants_1._1_SECOND_IN_MS * 10,
185
187
  });
186
188
  const wasChecked = await this.processRunningInstancesCheckbox.isChecked();
187
- await this.processRunningInstancesCheckbox.click({ timeout: 90000 });
189
+ if (wasChecked) {
190
+ await this.processRunningInstancesCheckbox.uncheck({
191
+ force: true,
192
+ timeout: 90000,
193
+ });
194
+ }
195
+ else {
196
+ await this.processRunningInstancesCheckbox.check({
197
+ force: true,
198
+ timeout: 90000,
199
+ });
200
+ }
188
201
  await (0, test_1.expect)(this.processRunningInstancesCheckbox).toBeChecked({
189
202
  checked: !wasChecked,
190
203
  timeout: constants_1._1_SECOND_IN_MS * 5,
@@ -23,6 +23,7 @@ declare class ModelerHomePage {
23
23
  readonly uploadFilesButton: Locator;
24
24
  readonly messageBanner: Locator;
25
25
  readonly closeButton: Locator;
26
+ readonly modalCloseButton: Locator;
26
27
  readonly idpTemplateOption: Locator;
27
28
  readonly idpApplicationNameInput: Locator;
28
29
  readonly dialog: Locator;
@@ -28,6 +28,7 @@ class ModelerHomePage {
28
28
  uploadFilesButton;
29
29
  messageBanner;
30
30
  closeButton;
31
+ modalCloseButton;
31
32
  idpTemplateOption;
32
33
  idpApplicationNameInput;
33
34
  dialog;
@@ -71,6 +72,7 @@ class ModelerHomePage {
71
72
  this.uploadFilesButton = page.getByRole('menuitem', { name: 'Upload files' });
72
73
  this.messageBanner = page.locator('[data-test="close-top-banner"]');
73
74
  this.closeButton = page.getByRole('button', { name: 'Got it - Dismiss' });
75
+ this.modalCloseButton = page.locator('.cds--modal.is-visible .cds--modal-close');
74
76
  this.idpTemplateOption = page
75
77
  .locator('[data-test="create-idp-application"]')
76
78
  .getByText('IDP Application');
@@ -85,6 +87,16 @@ class ModelerHomePage {
85
87
  await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.createNewProjectButton, {
86
88
  totalTimeout: 30000,
87
89
  });
90
+ // Modals (WhatsNew, "BPMN conditional events", etc.) render lazily after
91
+ // page load and intercept clicks on the button underneath. Dismiss them.
92
+ await this.closeButton
93
+ .waitFor({ state: 'visible', timeout: 5000 })
94
+ .then(() => this.closeButton.click())
95
+ .catch(() => { });
96
+ await this.modalCloseButton
97
+ .waitFor({ state: 'visible', timeout: 2000 })
98
+ .then(() => this.modalCloseButton.click())
99
+ .catch(() => { });
88
100
  await this.createNewProjectButton.click();
89
101
  }
90
102
  async enterNewProjectName(name) {
@@ -177,10 +189,15 @@ class ModelerHomePage {
177
189
  }
178
190
  async clickMessageBanner() {
179
191
  try {
180
- await Promise.race([
181
- this.messageBanner.click(),
182
- this.closeButton.click(),
183
- ]);
192
+ const banner = this.messageBanner
193
+ .or(this.closeButton)
194
+ .or(this.modalCloseButton);
195
+ if (await banner.isVisible({ timeout: 2000 })) {
196
+ await banner.click();
197
+ }
198
+ else {
199
+ console.log('No banner or close button found to click');
200
+ }
184
201
  }
185
202
  catch {
186
203
  console.log('No banner or close button found to click');
@@ -23,6 +23,7 @@ declare class ModelerHomePage {
23
23
  readonly uploadFilesButton: Locator;
24
24
  readonly messageBanner: Locator;
25
25
  readonly closeButton: Locator;
26
+ readonly modalCloseButton: Locator;
26
27
  constructor(page: Page);
27
28
  clickCreateNewProjectButton(): Promise<void>;
28
29
  enterNewProjectName(name: string): Promise<void>;
@@ -28,6 +28,7 @@ class ModelerHomePage {
28
28
  uploadFilesButton;
29
29
  messageBanner;
30
30
  closeButton;
31
+ modalCloseButton;
31
32
  constructor(page) {
32
33
  this.page = page;
33
34
  this.modelerPageBanner = page
@@ -71,11 +72,22 @@ class ModelerHomePage {
71
72
  this.uploadFilesButton = page.getByRole('menuitem', { name: 'Upload files' });
72
73
  this.messageBanner = page.locator('[data-test="close-top-banner"]');
73
74
  this.closeButton = page.getByRole('button', { name: 'Got it - Dismiss' });
75
+ this.modalCloseButton = page.locator('.cds--modal.is-visible .cds--modal-close');
74
76
  }
75
77
  async clickCreateNewProjectButton() {
76
78
  await (0, expectLocatorWithRetry_1.expectLocatorWithRetry)(this.page, this.createNewProjectButton, {
77
79
  totalTimeout: 60000,
78
80
  });
81
+ // Modals (WhatsNew, "BPMN conditional events", etc.) render lazily after
82
+ // page load and intercept clicks on the button underneath. Dismiss them.
83
+ await this.closeButton
84
+ .waitFor({ state: 'visible', timeout: 5000 })
85
+ .then(() => this.closeButton.click())
86
+ .catch(() => { });
87
+ await this.modalCloseButton
88
+ .waitFor({ state: 'visible', timeout: 2000 })
89
+ .then(() => this.modalCloseButton.click())
90
+ .catch(() => { });
79
91
  await this.createNewProjectButton.click();
80
92
  }
81
93
  async enterNewProjectName(name) {
@@ -189,10 +201,15 @@ class ModelerHomePage {
189
201
  }
190
202
  async clickMessageBanner() {
191
203
  try {
192
- await Promise.race([
193
- this.messageBanner.click({ timeout: 5000 }),
194
- this.closeButton.click({ timeout: 5000 }),
195
- ]);
204
+ const banner = this.messageBanner
205
+ .or(this.closeButton)
206
+ .or(this.modalCloseButton);
207
+ if (await banner.isVisible({ timeout: 2000 })) {
208
+ await banner.click();
209
+ }
210
+ else {
211
+ console.log('No banner or close button found to click');
212
+ }
196
213
  }
197
214
  catch {
198
215
  console.log('No banner or close button found to click');
@@ -52,7 +52,7 @@ class OperateProcessesPage {
52
52
  await checkbox.check({ force: true, timeout: constants_1._1_SECOND_IN_MS * 30 });
53
53
  await (0, test_1.expect)(checkbox).toBeChecked({
54
54
  checked: true,
55
- timeout: constants_1._1_SECOND_IN_MS * 10,
55
+ timeout: constants_1._1_SECOND_IN_MS * 30,
56
56
  });
57
57
  }
58
58
  }
@@ -62,7 +62,7 @@ class OperateProcessesPage {
62
62
  await checkbox.uncheck({ force: true, timeout: constants_1._1_SECOND_IN_MS * 30 });
63
63
  await (0, test_1.expect)(checkbox).toBeChecked({
64
64
  checked: false,
65
- timeout: constants_1._1_SECOND_IN_MS * 10,
65
+ timeout: constants_1._1_SECOND_IN_MS * 30,
66
66
  });
67
67
  }
68
68
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/e2e-test-suite",
3
- "version": "0.0.548",
3
+ "version": "0.0.550",
4
4
  "description": "End-to-end test helpers for Camunda 8",
5
5
  "repository": {
6
6
  "type": "git",