@camunda/e2e-test-suite 0.0.257 → 0.0.258
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/dist/fixtures/SM-8.10.d.ts +81 -0
- package/dist/fixtures/SM-8.10.js +184 -0
- package/dist/pages/SM-8.10/Authorization.d.ts +31 -0
- package/dist/pages/SM-8.10/Authorization.js +146 -0
- package/dist/pages/SM-8.10/ClusterDetailsPage.d.ts +8 -0
- package/dist/pages/SM-8.10/ClusterDetailsPage.js +28 -0
- package/dist/pages/SM-8.10/ClusterPage.d.ts +11 -0
- package/dist/pages/SM-8.10/ClusterPage.js +32 -0
- package/dist/pages/SM-8.10/ConnectorMarketplacePage.d.ts +16 -0
- package/dist/pages/SM-8.10/ConnectorMarketplacePage.js +52 -0
- package/dist/pages/SM-8.10/ConnectorSettingsPage.d.ts +40 -0
- package/dist/pages/SM-8.10/ConnectorSettingsPage.js +133 -0
- package/dist/pages/SM-8.10/ConnectorTemplatePage.d.ts +11 -0
- package/dist/pages/SM-8.10/ConnectorTemplatePage.js +34 -0
- package/dist/pages/SM-8.10/ConsoleHomePage.d.ts +11 -0
- package/dist/pages/SM-8.10/ConsoleHomePage.js +31 -0
- package/dist/pages/SM-8.10/ConsoleOrganizationPage.d.ts +22 -0
- package/dist/pages/SM-8.10/ConsoleOrganizationPage.js +68 -0
- package/dist/pages/SM-8.10/FormJsPage.d.ts +31 -0
- package/dist/pages/SM-8.10/FormJsPage.js +87 -0
- package/dist/pages/SM-8.10/HomePage.d.ts +20 -0
- package/dist/pages/SM-8.10/HomePage.js +49 -0
- package/dist/pages/SM-8.10/IdentityTenantPage.d.ts +52 -0
- package/dist/pages/SM-8.10/IdentityTenantPage.js +218 -0
- package/dist/pages/SM-8.10/IdentityUsersPage.d.ts +92 -0
- package/dist/pages/SM-8.10/IdentityUsersPage.js +473 -0
- package/dist/pages/SM-8.10/KeycloakAdminPage.d.ts +15 -0
- package/dist/pages/SM-8.10/KeycloakAdminPage.js +68 -0
- package/dist/pages/SM-8.10/KeycloakLoginPage.d.ts +11 -0
- package/dist/pages/SM-8.10/KeycloakLoginPage.js +25 -0
- package/dist/pages/SM-8.10/KeycloakUtils.d.ts +16 -0
- package/dist/pages/SM-8.10/KeycloakUtils.js +63 -0
- package/dist/pages/SM-8.10/LoginPage.d.ts +21 -0
- package/dist/pages/SM-8.10/LoginPage.js +100 -0
- package/dist/pages/SM-8.10/ManagementIdentityPage.d.ts +46 -0
- package/dist/pages/SM-8.10/ManagementIdentityPage.js +153 -0
- package/dist/pages/SM-8.10/ModelerCreatePage.d.ts +199 -0
- package/dist/pages/SM-8.10/ModelerCreatePage.js +1052 -0
- package/dist/pages/SM-8.10/ModelerHomePage.d.ts +44 -0
- package/dist/pages/SM-8.10/ModelerHomePage.js +179 -0
- package/dist/pages/SM-8.10/NavigationPage.d.ts +47 -0
- package/dist/pages/SM-8.10/NavigationPage.js +134 -0
- package/dist/pages/SM-8.10/OCIdentityAuthorizationsPage.d.ts +10 -0
- package/dist/pages/SM-8.10/OCIdentityAuthorizationsPage.js +35 -0
- package/dist/pages/SM-8.10/OCIdentityClusterVariablesPage.d.ts +20 -0
- package/dist/pages/SM-8.10/OCIdentityClusterVariablesPage.js +69 -0
- package/dist/pages/SM-8.10/OCIdentityGroupsPage.d.ts +39 -0
- package/dist/pages/SM-8.10/OCIdentityGroupsPage.js +154 -0
- package/dist/pages/SM-8.10/OCIdentityHomePage.d.ts +23 -0
- package/dist/pages/SM-8.10/OCIdentityHomePage.js +81 -0
- package/dist/pages/SM-8.10/OCIdentityMappingRulesPage.d.ts +23 -0
- package/dist/pages/SM-8.10/OCIdentityMappingRulesPage.js +110 -0
- package/dist/pages/SM-8.10/OCIdentityRolesPage.d.ts +55 -0
- package/dist/pages/SM-8.10/OCIdentityRolesPage.js +197 -0
- package/dist/pages/SM-8.10/OCTenantPage.d.ts +67 -0
- package/dist/pages/SM-8.10/OCTenantPage.js +280 -0
- package/dist/pages/SM-8.10/OperateHomePage.d.ts +24 -0
- package/dist/pages/SM-8.10/OperateHomePage.js +81 -0
- package/dist/pages/SM-8.10/OperateProcessInstancePage.d.ts +24 -0
- package/dist/pages/SM-8.10/OperateProcessInstancePage.js +170 -0
- package/dist/pages/SM-8.10/OperateProcessesPage.d.ts +32 -0
- package/dist/pages/SM-8.10/OperateProcessesPage.js +205 -0
- package/dist/pages/SM-8.10/OptimizeCollectionsPage.d.ts +17 -0
- package/dist/pages/SM-8.10/OptimizeCollectionsPage.js +66 -0
- package/dist/pages/SM-8.10/OptimizeDashboardPage.d.ts +14 -0
- package/dist/pages/SM-8.10/OptimizeDashboardPage.js +56 -0
- package/dist/pages/SM-8.10/OptimizeHomePage.d.ts +19 -0
- package/dist/pages/SM-8.10/OptimizeHomePage.js +64 -0
- package/dist/pages/SM-8.10/OptimizeReportPage.d.ts +50 -0
- package/dist/pages/SM-8.10/OptimizeReportPage.js +179 -0
- package/dist/pages/SM-8.10/PlayPage.d.ts +44 -0
- package/dist/pages/SM-8.10/PlayPage.js +235 -0
- package/dist/pages/SM-8.10/SettingsPage.d.ts +12 -0
- package/dist/pages/SM-8.10/SettingsPage.js +25 -0
- package/dist/pages/SM-8.10/TaskDetailsPage.d.ts +70 -0
- package/dist/pages/SM-8.10/TaskDetailsPage.js +266 -0
- package/dist/pages/SM-8.10/TaskPanelPage.d.ts +24 -0
- package/dist/pages/SM-8.10/TaskPanelPage.js +93 -0
- package/dist/pages/SM-8.10/TaskProcessesPage.d.ts +14 -0
- package/dist/pages/SM-8.10/TaskProcessesPage.js +53 -0
- package/dist/pages/SM-8.10/UtilitiesPage.d.ts +34 -0
- package/dist/pages/SM-8.10/UtilitiesPage.js +435 -0
- package/dist/pages/SM-8.10/optimizeReportUtils.d.ts +6 -0
- package/dist/pages/SM-8.10/optimizeReportUtils.js +42 -0
- package/dist/pages/SM-8.7/ModelerCreatePage.js +3 -0
- package/dist/pages/SM-8.7/PlayPage.d.ts +1 -0
- package/dist/pages/SM-8.7/PlayPage.js +4 -2
- package/dist/tests/SM-8.10/cluster-variables.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/cluster-variables.spec.js +190 -0
- package/dist/tests/SM-8.10/connectors-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/connectors-user-flows.spec.js +260 -0
- package/dist/tests/SM-8.10/console-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/console-user-flows.spec.js +88 -0
- package/dist/tests/SM-8.10/document-handling-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/document-handling-user-flows.spec.js +157 -0
- package/dist/tests/SM-8.10/hto-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/hto-user-flows.spec.js +408 -0
- package/dist/tests/SM-8.10/identity-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/identity-user-flows.spec.js +233 -0
- package/dist/tests/SM-8.10/license-key-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/license-key-user-flows.spec.js +523 -0
- package/dist/tests/SM-8.10/login.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/login.spec.js +24 -0
- package/dist/tests/SM-8.10/migration-path-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/migration-path-user-flows.spec.js +224 -0
- package/dist/tests/SM-8.10/mt-enabled-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/mt-enabled-user-flows.spec.js +584 -0
- package/dist/tests/SM-8.10/optimize-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/optimize-user-flows.spec.js +184 -0
- package/dist/tests/SM-8.10/play.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/play.spec.js +152 -0
- package/dist/tests/SM-8.10/rba-enabled-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/rba-enabled-user-flows.spec.js +715 -0
- package/dist/tests/SM-8.10/smoke-tests.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/smoke-tests.spec.js +163 -0
- package/dist/tests/SM-8.10/test-setup.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/test-setup.spec.js +24 -0
- package/dist/tests/SM-8.10/web-modeler-user-flows.spec.d.ts +1 -0
- package/dist/tests/SM-8.10/web-modeler-user-flows.spec.js +178 -0
- package/package.json +1 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OperateProcessesPage = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
const sleep_1 = require("../../utils/sleep");
|
|
6
|
+
const constants_1 = require("../../utils/constants");
|
|
7
|
+
const env_1 = require("../../utils/env");
|
|
8
|
+
class OperateProcessesPage {
|
|
9
|
+
page;
|
|
10
|
+
processResultCount;
|
|
11
|
+
processActiveCheckbox;
|
|
12
|
+
processCompletedCheckbox;
|
|
13
|
+
processRunningInstancesCheckbox;
|
|
14
|
+
processIncidentsCheckbox;
|
|
15
|
+
processPageHeading;
|
|
16
|
+
noMatchingInstancesMessage;
|
|
17
|
+
processFinishedInstancesCheckbox;
|
|
18
|
+
moreFiltersButton;
|
|
19
|
+
processInstanceKeyTextBox;
|
|
20
|
+
constructor(page) {
|
|
21
|
+
this.page = page;
|
|
22
|
+
this.processResultCount = page.getByTestId('result-count');
|
|
23
|
+
this.processActiveCheckbox = page
|
|
24
|
+
.locator('label')
|
|
25
|
+
.filter({ hasText: 'Active' });
|
|
26
|
+
this.processCompletedCheckbox = page
|
|
27
|
+
.locator('label')
|
|
28
|
+
.filter({ hasText: 'Completed' });
|
|
29
|
+
this.processRunningInstancesCheckbox = page
|
|
30
|
+
.locator('label')
|
|
31
|
+
.filter({ hasText: 'Running Instances' });
|
|
32
|
+
this.processIncidentsCheckbox = page
|
|
33
|
+
.locator('label')
|
|
34
|
+
.filter({ hasText: 'Incidents' });
|
|
35
|
+
this.processPageHeading = page
|
|
36
|
+
.getByTestId('expanded-panel')
|
|
37
|
+
.getByRole('heading', { name: 'Process' });
|
|
38
|
+
this.noMatchingInstancesMessage = page.getByText('There are no Instances matching this filter set');
|
|
39
|
+
this.processFinishedInstancesCheckbox = page
|
|
40
|
+
.getByTestId('filter-finished-instances')
|
|
41
|
+
.getByRole('checkbox');
|
|
42
|
+
this.moreFiltersButton = page.getByRole('button', { name: 'More filters' });
|
|
43
|
+
this.processInstanceKeyTextBox = page.locator('#ids');
|
|
44
|
+
}
|
|
45
|
+
async checkCheckbox(checkbox) {
|
|
46
|
+
if (!(await checkbox.isChecked())) {
|
|
47
|
+
await checkbox.click();
|
|
48
|
+
await (0, test_1.expect)(checkbox).toBeChecked({
|
|
49
|
+
checked: true,
|
|
50
|
+
timeout: constants_1._1_SECOND_IN_MS * 2,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async uncheckCheckbox(checkbox) {
|
|
55
|
+
if (await checkbox.isChecked()) {
|
|
56
|
+
await checkbox.click();
|
|
57
|
+
await (0, test_1.expect)(checkbox).toBeChecked({
|
|
58
|
+
checked: false,
|
|
59
|
+
timeout: constants_1._1_SECOND_IN_MS * 2,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async uncheckCompletedCheckbox() {
|
|
64
|
+
await this.uncheckCheckbox(this.processCompletedCheckbox);
|
|
65
|
+
}
|
|
66
|
+
async uncheckActiveCheckbox() {
|
|
67
|
+
await this.uncheckCheckbox(this.processActiveCheckbox);
|
|
68
|
+
}
|
|
69
|
+
async toggleActiveCheckboxOn() {
|
|
70
|
+
await this.uncheckCompletedCheckbox();
|
|
71
|
+
await this.clickProcessIncidentsCheckbox();
|
|
72
|
+
if (await this.processActiveCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
|
|
73
|
+
await this.uncheckCheckbox(this.processActiveCheckbox);
|
|
74
|
+
await (0, sleep_1.sleep)(200); // Required to skip the debounce protection on the frontend
|
|
75
|
+
await this.checkCheckbox(this.processActiveCheckbox);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await this.checkCheckbox(this.processActiveCheckbox);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async toggleCompletedCheckbox() {
|
|
82
|
+
await this.uncheckActiveCheckbox();
|
|
83
|
+
await this.clickProcessIncidentsCheckbox();
|
|
84
|
+
if (await this.processCompletedCheckbox.isChecked({ timeout: constants_1._1_SECOND_IN_MS })) {
|
|
85
|
+
await this.uncheckCheckbox(this.processCompletedCheckbox);
|
|
86
|
+
await (0, sleep_1.sleep)(200); // Required to skip the debounce protection on the frontend
|
|
87
|
+
await this.checkCheckbox(this.processCompletedCheckbox);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await this.checkCheckbox(this.processCompletedCheckbox);
|
|
91
|
+
await (0, sleep_1.sleep)(200);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async checkTableForProcess(processName) {
|
|
95
|
+
try {
|
|
96
|
+
const processTable = this.page.locator('[aria-label="Process Instances Panel"]');
|
|
97
|
+
await (0, test_1.expect)(processTable).toBeVisible({ timeout: constants_1._1_SECOND_IN_MS * 4 });
|
|
98
|
+
const timeout = env_1.isOpenSearch ? constants_1._1_SECOND_IN_MS * 10 : constants_1._100_MS * 2;
|
|
99
|
+
const row = this.page.locator(`tr:has-text("${processName}")`).first();
|
|
100
|
+
await (0, test_1.expect)(row).toBeVisible({ timeout });
|
|
101
|
+
const link = row.locator('a').first();
|
|
102
|
+
await (0, test_1.expect)(link).toBeVisible({ timeout: constants_1._100_MS * 2 });
|
|
103
|
+
await link.scrollIntoViewIfNeeded();
|
|
104
|
+
await link.click({ timeout: constants_1._100_MS * 2 });
|
|
105
|
+
await (0, test_1.expect)(this.page.getByText('Instance History').first()).toBeVisible({ timeout: constants_1._1_SECOND_IN_MS * 4 });
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async clickProcessActiveCheckbox() {
|
|
113
|
+
if (!(await this.processActiveCheckbox.isChecked({ timeout: 60000 }))) {
|
|
114
|
+
await this.processActiveCheckbox.click({ timeout: 120000 });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async clickProcessCompletedCheckbox() {
|
|
118
|
+
if (!(await this.processCompletedCheckbox.isChecked({ timeout: 60000 }))) {
|
|
119
|
+
await this.processCompletedCheckbox.click({ timeout: 120000 });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async clickProcessIncidentsCheckbox() {
|
|
123
|
+
await this.processIncidentsCheckbox.click({ timeout: 90000 });
|
|
124
|
+
}
|
|
125
|
+
async clickRunningProcessInstancesCheckbox() {
|
|
126
|
+
await this.processRunningInstancesCheckbox.click({ timeout: 90000 });
|
|
127
|
+
}
|
|
128
|
+
async clickFinishedProcessInstancesCheckbox() {
|
|
129
|
+
await this.processFinishedInstancesCheckbox.click({ timeout: 90000 });
|
|
130
|
+
}
|
|
131
|
+
async clickProcessInstanceLink(processName, type = 'active') {
|
|
132
|
+
if (await this.checkTableForProcess(processName)) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const MAX_ATTEMPTS = 100;
|
|
136
|
+
const TOTAL_TIMEOUT_MS = constants_1._1_MINUTE_IN_MS * 2;
|
|
137
|
+
let attempt = 0;
|
|
138
|
+
let lastError;
|
|
139
|
+
const startTime = Date.now();
|
|
140
|
+
if (type === 'active') {
|
|
141
|
+
await this.toggleActiveCheckboxOn();
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
await this.toggleCompletedCheckbox();
|
|
145
|
+
}
|
|
146
|
+
while (Date.now() - startTime < TOTAL_TIMEOUT_MS &&
|
|
147
|
+
attempt < MAX_ATTEMPTS) {
|
|
148
|
+
attempt++;
|
|
149
|
+
try {
|
|
150
|
+
if (await this.checkTableForProcess(processName)) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts.`);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
lastError = err instanceof Error ? err.message : err;
|
|
157
|
+
await this.page.reload();
|
|
158
|
+
await this.page.waitForLoadState('networkidle');
|
|
159
|
+
await (0, sleep_1.sleep)(2000);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
throw new Error(`Failed to open instance "${processName}" after ${MAX_ATTEMPTS} attempts. Last error: ${String(lastError)}`);
|
|
163
|
+
}
|
|
164
|
+
async clickProcessInstanceLinkWithPartialNameMatch(processName) {
|
|
165
|
+
let retryCount = 0;
|
|
166
|
+
const maxRetries = 5;
|
|
167
|
+
while (retryCount < maxRetries) {
|
|
168
|
+
try {
|
|
169
|
+
const process = this.page
|
|
170
|
+
.locator(`td:right-of(:has-text("${processName}"))`)
|
|
171
|
+
.first();
|
|
172
|
+
await (0, test_1.expect)(process).toBeVisible({ timeout: 60000 });
|
|
173
|
+
await process.click({ timeout: 60000 });
|
|
174
|
+
await (0, test_1.expect)(this.page.getByText('Instance History').first()).toBeVisible({
|
|
175
|
+
timeout: 30000,
|
|
176
|
+
});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
retryCount++;
|
|
181
|
+
console.log(`Attempt ${retryCount} failed. Retrying...`);
|
|
182
|
+
await this.page.reload();
|
|
183
|
+
await this.page.waitForTimeout(10000);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
throw new Error(`Failed to click on process instance link containing "${processName}" after ${maxRetries} attempts.`);
|
|
187
|
+
}
|
|
188
|
+
getMoreFilterValueLocator(filter) {
|
|
189
|
+
switch (filter.trim()) {
|
|
190
|
+
case 'Process Instance Key(s)':
|
|
191
|
+
return this.processInstanceKeyTextBox;
|
|
192
|
+
default:
|
|
193
|
+
throw new Error(`Unsupported filter: "${filter}". Add a mapping in getMoreFilterValueLocator().`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async applyMoreFilters(filter, value) {
|
|
197
|
+
await this.moreFiltersButton.click();
|
|
198
|
+
await this.page.getByRole('menuitem', { name: filter }).click();
|
|
199
|
+
const valueInput = this.getMoreFilterValueLocator(filter);
|
|
200
|
+
await (0, test_1.expect)(valueInput).toBeVisible({ timeout: 10000 });
|
|
201
|
+
await valueInput.fill(value);
|
|
202
|
+
await (0, sleep_1.sleep)(2000);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.OperateProcessesPage = OperateProcessesPage;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Page, Locator } from '@playwright/test';
|
|
2
|
+
declare class OptimizeCollectionsPage {
|
|
3
|
+
private page;
|
|
4
|
+
readonly collectionsPageHeader: Locator;
|
|
5
|
+
readonly createNewButton: Locator;
|
|
6
|
+
readonly reportOption: Locator;
|
|
7
|
+
readonly modalCloseButton: Locator;
|
|
8
|
+
readonly processReport: Locator;
|
|
9
|
+
readonly collectionsLink: Locator;
|
|
10
|
+
readonly reportAuthor: Locator;
|
|
11
|
+
constructor(page: Page);
|
|
12
|
+
clickCreateNewButton(): Promise<void>;
|
|
13
|
+
clickReportOption(): Promise<void>;
|
|
14
|
+
clickMostRecentProcessReport(reportName: string): Promise<void>;
|
|
15
|
+
clickFirstProcessReport(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export { OptimizeCollectionsPage };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OptimizeCollectionsPage = void 0;
|
|
4
|
+
class OptimizeCollectionsPage {
|
|
5
|
+
page;
|
|
6
|
+
collectionsPageHeader;
|
|
7
|
+
createNewButton;
|
|
8
|
+
reportOption;
|
|
9
|
+
modalCloseButton;
|
|
10
|
+
processReport;
|
|
11
|
+
collectionsLink;
|
|
12
|
+
reportAuthor;
|
|
13
|
+
constructor(page) {
|
|
14
|
+
this.page = page;
|
|
15
|
+
this.collectionsPageHeader = page.getByRole('heading', {
|
|
16
|
+
name: 'Collections, Dashboards, and Reports',
|
|
17
|
+
});
|
|
18
|
+
this.createNewButton = page.getByRole('button', {
|
|
19
|
+
name: 'Create new',
|
|
20
|
+
exact: true,
|
|
21
|
+
});
|
|
22
|
+
this.reportOption = page.getByText('Report', { exact: true });
|
|
23
|
+
this.modalCloseButton = page.getByText('Close', { exact: true });
|
|
24
|
+
this.processReport = page.getByText('Process Report').first();
|
|
25
|
+
this.collectionsLink = page.getByRole('link', { name: 'Collections' });
|
|
26
|
+
this.reportAuthor = page.getByRole('cell', { name: 'Demo User' });
|
|
27
|
+
}
|
|
28
|
+
async clickCreateNewButton() {
|
|
29
|
+
try {
|
|
30
|
+
await this.modalCloseButton.click({ timeout: 60000 });
|
|
31
|
+
await this.collectionsLink.click({ timeout: 60000 });
|
|
32
|
+
await this.createNewButton.click({ timeout: 90000 });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
await this.collectionsLink.click({ timeout: 60000 });
|
|
36
|
+
await this.createNewButton.click({ timeout: 90000 });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async clickReportOption() {
|
|
40
|
+
await this.reportOption.click();
|
|
41
|
+
}
|
|
42
|
+
async clickMostRecentProcessReport(reportName) {
|
|
43
|
+
await this.page.getByText(reportName).click({ timeout: 60000 });
|
|
44
|
+
}
|
|
45
|
+
async clickFirstProcessReport() {
|
|
46
|
+
const cells = await this.page
|
|
47
|
+
.getByRole('cell', { name: /Process report/ })
|
|
48
|
+
.all();
|
|
49
|
+
if (cells.length === 0) {
|
|
50
|
+
throw new Error('No process report cells found');
|
|
51
|
+
}
|
|
52
|
+
const cell = cells[0];
|
|
53
|
+
const text = (await cell.textContent())?.trim();
|
|
54
|
+
if (!text) {
|
|
55
|
+
throw new Error('Could not read cell text');
|
|
56
|
+
}
|
|
57
|
+
const match = text.match(/^(\S+)\s*Process report$/i);
|
|
58
|
+
if (!match) {
|
|
59
|
+
throw new Error(`Unexpected text format: ${text}`);
|
|
60
|
+
}
|
|
61
|
+
const dynamicValue = match[1];
|
|
62
|
+
await cell.click();
|
|
63
|
+
await this.page.getByRole('link', { name: dynamicValue }).click();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.OptimizeCollectionsPage = OptimizeCollectionsPage;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Page, Locator } from '@playwright/test';
|
|
2
|
+
declare class OptimizeDashboardPage {
|
|
3
|
+
private page;
|
|
4
|
+
readonly filterTable: Locator;
|
|
5
|
+
constructor(page: Page);
|
|
6
|
+
clickFilterTable(): Promise<void>;
|
|
7
|
+
fillFilterTable(processName: string): Promise<void>;
|
|
8
|
+
processOwnerNameAssertion(processName: string): Promise<void>;
|
|
9
|
+
processAssertion(processName: string, { timeout, not }?: {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
not?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export { OptimizeDashboardPage };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OptimizeDashboardPage = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
class OptimizeDashboardPage {
|
|
6
|
+
page;
|
|
7
|
+
filterTable;
|
|
8
|
+
constructor(page) {
|
|
9
|
+
this.page = page;
|
|
10
|
+
this.filterTable = page.getByPlaceholder('Filter table');
|
|
11
|
+
}
|
|
12
|
+
async clickFilterTable() {
|
|
13
|
+
await this.filterTable.click({ timeout: 180000 });
|
|
14
|
+
}
|
|
15
|
+
async fillFilterTable(processName) {
|
|
16
|
+
await this.filterTable.fill(processName, { timeout: 60000 });
|
|
17
|
+
await this.filterTable.press('Enter');
|
|
18
|
+
}
|
|
19
|
+
async processOwnerNameAssertion(processName) {
|
|
20
|
+
try {
|
|
21
|
+
await this.page.reload();
|
|
22
|
+
await (0, test_1.expect)(this.page.getByRole('row', {
|
|
23
|
+
name: processName + ' Process QA Camunda',
|
|
24
|
+
})).toBeVisible({ timeout: 180000 });
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
await this.page.reload();
|
|
28
|
+
await (0, test_1.expect)(this.page.getByRole('row', {
|
|
29
|
+
name: processName + ' Process QA Camunda',
|
|
30
|
+
})).toBeVisible({ timeout: 180000 });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async processAssertion(processName, { timeout = 180000, not = false } = {}) {
|
|
34
|
+
const interval = 45000;
|
|
35
|
+
const start = Date.now();
|
|
36
|
+
while (Date.now() - start < timeout) {
|
|
37
|
+
const locator = this.page.getByTitle(processName).first();
|
|
38
|
+
try {
|
|
39
|
+
if (not) {
|
|
40
|
+
await (0, test_1.expect)(locator).not.toBeVisible({ timeout: interval });
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
await (0, test_1.expect)(locator).toBeVisible({ timeout: interval });
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
if (Date.now() - start + interval >= timeout) {
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
await this.page.reload();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.OptimizeDashboardPage = OptimizeDashboardPage;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Page, Locator } from '@playwright/test';
|
|
2
|
+
declare class OptimizeHomePage {
|
|
3
|
+
private page;
|
|
4
|
+
readonly collectionsLink: Locator;
|
|
5
|
+
readonly dashboardLink: Locator;
|
|
6
|
+
readonly modalCloseButton: Locator;
|
|
7
|
+
readonly optimizeBanner: Locator;
|
|
8
|
+
readonly openUserSettingsButton: Locator;
|
|
9
|
+
readonly logoutButton: Locator;
|
|
10
|
+
readonly licenseKeyTagNonProduction: Locator;
|
|
11
|
+
readonly licenseKeyTagProduction: Locator;
|
|
12
|
+
constructor(page: Page);
|
|
13
|
+
clickCollectionsLink(): Promise<void>;
|
|
14
|
+
clickDashboardLink(): Promise<void>;
|
|
15
|
+
assertProcessHasBeenImported(processId: string): Promise<void>;
|
|
16
|
+
clickOpenUserSettingsButton(): Promise<void>;
|
|
17
|
+
clickLogoutButton(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export { OptimizeHomePage };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OptimizeHomePage = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
class OptimizeHomePage {
|
|
6
|
+
page;
|
|
7
|
+
collectionsLink;
|
|
8
|
+
dashboardLink;
|
|
9
|
+
modalCloseButton;
|
|
10
|
+
optimizeBanner;
|
|
11
|
+
openUserSettingsButton;
|
|
12
|
+
logoutButton;
|
|
13
|
+
licenseKeyTagNonProduction;
|
|
14
|
+
licenseKeyTagProduction;
|
|
15
|
+
constructor(page) {
|
|
16
|
+
this.page = page;
|
|
17
|
+
this.collectionsLink = page
|
|
18
|
+
.getByRole('banner')
|
|
19
|
+
.getByRole('link', { name: 'Collections' });
|
|
20
|
+
this.dashboardLink = page.getByRole('link', { name: 'Dashboard' });
|
|
21
|
+
this.modalCloseButton = page.getByText('Close', { exact: true });
|
|
22
|
+
this.optimizeBanner = page.getByRole('link', {
|
|
23
|
+
name: 'Camunda logo Optimize',
|
|
24
|
+
});
|
|
25
|
+
this.openUserSettingsButton = page.getByLabel('Open User');
|
|
26
|
+
this.logoutButton = page.getByRole('button', { name: 'Logout' });
|
|
27
|
+
this.licenseKeyTagNonProduction = page
|
|
28
|
+
.getByText('Non-production license')
|
|
29
|
+
.first();
|
|
30
|
+
this.licenseKeyTagProduction = page.getByText('Production license').first();
|
|
31
|
+
}
|
|
32
|
+
async clickCollectionsLink() {
|
|
33
|
+
try {
|
|
34
|
+
await this.modalCloseButton.click();
|
|
35
|
+
await this.collectionsLink.click();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
await this.collectionsLink.click();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async clickDashboardLink() {
|
|
42
|
+
try {
|
|
43
|
+
await this.modalCloseButton.click();
|
|
44
|
+
await this.dashboardLink.click();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
await this.dashboardLink.click();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async assertProcessHasBeenImported(processId) {
|
|
51
|
+
await this.clickDashboardLink();
|
|
52
|
+
await this.page.reload();
|
|
53
|
+
await (0, test_1.expect)(this.page.getByRole('link', { name: processId })).toBeVisible({
|
|
54
|
+
timeout: 180000,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async clickOpenUserSettingsButton() {
|
|
58
|
+
await this.openUserSettingsButton.click();
|
|
59
|
+
}
|
|
60
|
+
async clickLogoutButton() {
|
|
61
|
+
await this.logoutButton.click();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.OptimizeHomePage = OptimizeHomePage;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Page, Locator } from '@playwright/test';
|
|
2
|
+
declare class OptimizeReportPage {
|
|
3
|
+
private page;
|
|
4
|
+
readonly processSelectionButton: Locator;
|
|
5
|
+
readonly userTaskProcess: Locator;
|
|
6
|
+
readonly versionSelection: Locator;
|
|
7
|
+
readonly alwaysDisplayLatestSelection: Locator;
|
|
8
|
+
readonly createReportLink: Locator;
|
|
9
|
+
readonly durationButton: Locator;
|
|
10
|
+
readonly countOption: Locator;
|
|
11
|
+
readonly processInstanceButton: Locator;
|
|
12
|
+
readonly userTaskOption: Locator;
|
|
13
|
+
readonly heatMapButton: Locator;
|
|
14
|
+
readonly numberButton: Locator;
|
|
15
|
+
readonly tableOption: Locator;
|
|
16
|
+
readonly reportName: Locator;
|
|
17
|
+
readonly saveButton: Locator;
|
|
18
|
+
readonly oneUserTaskInstance: Locator;
|
|
19
|
+
readonly twoUserTaskInstance: Locator;
|
|
20
|
+
readonly cancelButton: Locator;
|
|
21
|
+
readonly createNewButton: Locator;
|
|
22
|
+
readonly reportOption: Locator;
|
|
23
|
+
readonly processInstanceCount: Locator;
|
|
24
|
+
readonly blankReportButton: Locator;
|
|
25
|
+
readonly selectDropdown: Locator;
|
|
26
|
+
constructor(page: Page);
|
|
27
|
+
clickProcessSelectionButton(): Promise<void>;
|
|
28
|
+
clickUserTaskProcess(processName: string): Promise<void>;
|
|
29
|
+
clickVersionSelection(): Promise<void>;
|
|
30
|
+
clickAlwaysDisplayLatestSelection(): Promise<void>;
|
|
31
|
+
clickCreateReportLink(): Promise<void>;
|
|
32
|
+
clickDurationButton(): Promise<void>;
|
|
33
|
+
clickCountOption(): Promise<void>;
|
|
34
|
+
clickProcessInstanceButton(): Promise<void>;
|
|
35
|
+
clickUserTaskOption(): Promise<void>;
|
|
36
|
+
clickHeatMapButton(): Promise<void>;
|
|
37
|
+
clickNumberButton(): Promise<void>;
|
|
38
|
+
clickTableOption(): Promise<void>;
|
|
39
|
+
clickReportName(): Promise<void>;
|
|
40
|
+
clearReportName(): Promise<void>;
|
|
41
|
+
fillReportName(name: string): Promise<void>;
|
|
42
|
+
clickSaveButton(): Promise<void>;
|
|
43
|
+
waitUntilLocatorIsVisible(locator: Locator, tab: Page): Promise<void>;
|
|
44
|
+
waitUntilProcessIsVisible(locator: Locator, tab: Page): Promise<void>;
|
|
45
|
+
clickBlankReportButton(): Promise<void>;
|
|
46
|
+
clickSelectDropdown(): Promise<void>;
|
|
47
|
+
waitUntilUserTaskProcessIsVisible(processName: string): Promise<void>;
|
|
48
|
+
clickCancelButton(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
export { OptimizeReportPage };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OptimizeReportPage = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
const sleep_1 = require("../../utils/sleep");
|
|
6
|
+
class OptimizeReportPage {
|
|
7
|
+
page;
|
|
8
|
+
processSelectionButton;
|
|
9
|
+
userTaskProcess;
|
|
10
|
+
versionSelection;
|
|
11
|
+
alwaysDisplayLatestSelection;
|
|
12
|
+
createReportLink;
|
|
13
|
+
durationButton;
|
|
14
|
+
countOption;
|
|
15
|
+
processInstanceButton;
|
|
16
|
+
userTaskOption;
|
|
17
|
+
heatMapButton;
|
|
18
|
+
numberButton;
|
|
19
|
+
tableOption;
|
|
20
|
+
reportName;
|
|
21
|
+
saveButton;
|
|
22
|
+
oneUserTaskInstance;
|
|
23
|
+
twoUserTaskInstance;
|
|
24
|
+
cancelButton;
|
|
25
|
+
createNewButton;
|
|
26
|
+
reportOption;
|
|
27
|
+
processInstanceCount;
|
|
28
|
+
blankReportButton;
|
|
29
|
+
selectDropdown;
|
|
30
|
+
constructor(page) {
|
|
31
|
+
this.page = page;
|
|
32
|
+
this.processSelectionButton = page.getByPlaceholder('Select...');
|
|
33
|
+
this.userTaskProcess = page.getByText('User_Task_Process', { exact: true });
|
|
34
|
+
this.versionSelection = page.getByLabel('Version');
|
|
35
|
+
this.alwaysDisplayLatestSelection = page.getByText('Always display latest');
|
|
36
|
+
this.createReportLink = page.getByRole('link', { name: 'Create Report' });
|
|
37
|
+
this.durationButton = page.getByRole('button', { name: 'Duration' });
|
|
38
|
+
this.countOption = page.getByText('Count').first();
|
|
39
|
+
this.processInstanceButton = page.getByRole('button', {
|
|
40
|
+
name: 'Process Instance',
|
|
41
|
+
exact: true,
|
|
42
|
+
});
|
|
43
|
+
this.userTaskOption = page.getByRole('menuitemcheckbox', {
|
|
44
|
+
name: 'User task',
|
|
45
|
+
});
|
|
46
|
+
this.heatMapButton = page.getByRole('button', { name: 'Heatmap' });
|
|
47
|
+
this.numberButton = page.getByRole('button', { name: 'Number' });
|
|
48
|
+
this.tableOption = page.getByText('Table');
|
|
49
|
+
this.reportName = page.getByPlaceholder('Report name');
|
|
50
|
+
this.saveButton = page.getByRole('button', { name: 'Save' });
|
|
51
|
+
this.oneUserTaskInstance = page.getByRole('cell', { name: '1', exact: true });
|
|
52
|
+
this.twoUserTaskInstance = page.getByRole('cell', { name: '2', exact: true });
|
|
53
|
+
this.cancelButton = page.getByRole('button', { name: 'Cancel' });
|
|
54
|
+
this.createNewButton = page.getByRole('button', {
|
|
55
|
+
name: 'Create New',
|
|
56
|
+
exact: true,
|
|
57
|
+
});
|
|
58
|
+
this.reportOption = page.getByText('Report', { exact: true });
|
|
59
|
+
this.processInstanceCount = page.locator('.progressLabel');
|
|
60
|
+
this.blankReportButton = page.getByRole('button', { name: 'Blank report' });
|
|
61
|
+
this.selectDropdown = page
|
|
62
|
+
.getByRole('button', { name: 'Select... Open menu' })
|
|
63
|
+
.last();
|
|
64
|
+
}
|
|
65
|
+
async clickProcessSelectionButton() {
|
|
66
|
+
await (0, test_1.expect)(this.processSelectionButton).toBeVisible({ timeout: 180000 });
|
|
67
|
+
await this.processSelectionButton.click({ timeout: 180000 });
|
|
68
|
+
}
|
|
69
|
+
async clickUserTaskProcess(processName) {
|
|
70
|
+
await this.page.getByText(processName, { exact: true }).first().click();
|
|
71
|
+
}
|
|
72
|
+
async clickVersionSelection() {
|
|
73
|
+
await this.versionSelection.click();
|
|
74
|
+
}
|
|
75
|
+
async clickAlwaysDisplayLatestSelection() {
|
|
76
|
+
await this.alwaysDisplayLatestSelection.click();
|
|
77
|
+
}
|
|
78
|
+
async clickCreateReportLink() {
|
|
79
|
+
await this.createReportLink.click();
|
|
80
|
+
}
|
|
81
|
+
async clickDurationButton() {
|
|
82
|
+
await this.durationButton.click();
|
|
83
|
+
}
|
|
84
|
+
async clickCountOption() {
|
|
85
|
+
await this.countOption.click();
|
|
86
|
+
}
|
|
87
|
+
async clickProcessInstanceButton() {
|
|
88
|
+
await this.processInstanceButton.click();
|
|
89
|
+
}
|
|
90
|
+
async clickUserTaskOption() {
|
|
91
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
92
|
+
try {
|
|
93
|
+
await this.userTaskOption.click();
|
|
94
|
+
return; // success
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (attempt < 3) {
|
|
98
|
+
await this.clickSelectDropdown();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
throw new Error(`clickUserTaskOption failed after 3 attempts: ${error}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async clickHeatMapButton() {
|
|
107
|
+
if (await this.heatMapButton.isVisible()) {
|
|
108
|
+
await this.heatMapButton.click();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async clickNumberButton() {
|
|
112
|
+
if (await this.numberButton.isVisible()) {
|
|
113
|
+
await this.numberButton.click();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async clickTableOption() {
|
|
117
|
+
await this.tableOption.click();
|
|
118
|
+
}
|
|
119
|
+
async clickReportName() {
|
|
120
|
+
await this.reportName.click();
|
|
121
|
+
}
|
|
122
|
+
async clearReportName() {
|
|
123
|
+
await this.reportName.clear({ force: true });
|
|
124
|
+
}
|
|
125
|
+
async fillReportName(name) {
|
|
126
|
+
await this.reportName.fill(name, { force: true });
|
|
127
|
+
}
|
|
128
|
+
async clickSaveButton() {
|
|
129
|
+
await this.saveButton.click();
|
|
130
|
+
}
|
|
131
|
+
async waitUntilLocatorIsVisible(locator, tab) {
|
|
132
|
+
let elapsedTime = 0;
|
|
133
|
+
const maxWaitTimeSeconds = 120000;
|
|
134
|
+
while (elapsedTime < maxWaitTimeSeconds) {
|
|
135
|
+
const element = await locator;
|
|
136
|
+
if (await element.isVisible()) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await tab.reload();
|
|
140
|
+
await tab.waitForTimeout(10 * 1000);
|
|
141
|
+
// Update the elapsed time
|
|
142
|
+
elapsedTime += 10000;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async waitUntilProcessIsVisible(locator, tab) {
|
|
146
|
+
let elapsedTime = 0;
|
|
147
|
+
const maxWaitTimeSeconds = 240000;
|
|
148
|
+
while (elapsedTime < maxWaitTimeSeconds) {
|
|
149
|
+
const element = await locator;
|
|
150
|
+
if (await element.isVisible()) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
await this.cancelButton.click();
|
|
154
|
+
await tab.reload();
|
|
155
|
+
await tab.waitForTimeout(10 * 1000);
|
|
156
|
+
// Update the elapsed time
|
|
157
|
+
elapsedTime += 10000;
|
|
158
|
+
await this.createNewButton.click();
|
|
159
|
+
await this.reportOption.click();
|
|
160
|
+
await this.processSelectionButton.click();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async clickBlankReportButton() {
|
|
164
|
+
await this.blankReportButton.click();
|
|
165
|
+
}
|
|
166
|
+
async clickSelectDropdown() {
|
|
167
|
+
await this.selectDropdown.click();
|
|
168
|
+
await (0, sleep_1.sleep)(10000);
|
|
169
|
+
}
|
|
170
|
+
async waitUntilUserTaskProcessIsVisible(processName) {
|
|
171
|
+
await (0, test_1.expect)(this.page.getByText(processName, { exact: true })).toBeVisible({
|
|
172
|
+
timeout: 1000,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async clickCancelButton() {
|
|
176
|
+
await this.cancelButton.click();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.OptimizeReportPage = OptimizeReportPage;
|