d5-testing-library 2.0.0-alpha.0 → 2.0.0-alpha.10
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/README.md +1 -1
- package/dist/FormEdit-QX5S7TDU.mjs +6 -0
- package/dist/ListForm-4DCCOHKJ.mjs +6 -0
- package/dist/TreeView-RDCA3LGU.mjs +6 -0
- package/dist/chunk-GSTA5R4B.mjs +6383 -0
- package/dist/cjs/d5-testing-library.cjs +1377 -1469
- package/dist/cjs/d5-testing-library.d.ts +154 -165
- package/dist/d5-testing-library.d.mts +154 -165
- package/dist/d5-testing-library.legacy-esm.js +14 -3174
- package/dist/d5-testing-library.mjs +14 -3174
- package/package.json +3 -16
- package/dist/FormEdit-VFV53QIZ.mjs +0 -7
- package/dist/ListForm-KIHLT7EU.mjs +0 -7
- package/dist/TreeView-TFBZB2UK.mjs +0 -8
- package/dist/chunk-EFNMD3S7.mjs +0 -22
- package/dist/chunk-GVYXH7L3.mjs +0 -75
- package/dist/chunk-RPSLW2WB.mjs +0 -1722
- package/dist/chunk-TSE33S3X.mjs +0 -1555
|
@@ -59,84 +59,44 @@ var init_config = __esm({
|
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
|
|
62
|
-
// src/utils/fixElementStaleError.ts
|
|
63
|
-
function fixElementStaleError(by, driver) {
|
|
64
|
-
const maxCount = 3;
|
|
65
|
-
let err;
|
|
66
|
-
const call = async (times) => {
|
|
67
|
-
if (times > maxCount) throw err;
|
|
68
|
-
try {
|
|
69
|
-
let el = await driver.findElement(by);
|
|
70
|
-
await el.getAttribute("class");
|
|
71
|
-
return el;
|
|
72
|
-
} catch (e) {
|
|
73
|
-
err = e;
|
|
74
|
-
if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
|
|
75
|
-
return call(times + 1);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
if (err) throw err;
|
|
79
|
-
};
|
|
80
|
-
return call(0);
|
|
81
|
-
}
|
|
82
|
-
async function staleElementAction(action) {
|
|
83
|
-
const maxCount = 3;
|
|
84
|
-
let err;
|
|
85
|
-
const call = async (times) => {
|
|
86
|
-
if (times > maxCount) throw err;
|
|
87
|
-
try {
|
|
88
|
-
await action();
|
|
89
|
-
} catch (e) {
|
|
90
|
-
err = e;
|
|
91
|
-
if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
|
|
92
|
-
await call(times + 1);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (err) throw err;
|
|
96
|
-
};
|
|
97
|
-
await call(0);
|
|
98
|
-
}
|
|
99
|
-
var init_fixElementStaleError = __esm({
|
|
100
|
-
"src/utils/fixElementStaleError.ts"() {
|
|
101
|
-
"use strict";
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
62
|
// src/pageObjects/AbstractElement.ts
|
|
106
|
-
var
|
|
63
|
+
var AbstractElement;
|
|
107
64
|
var init_AbstractElement = __esm({
|
|
108
65
|
"src/pageObjects/AbstractElement.ts"() {
|
|
109
66
|
"use strict";
|
|
110
|
-
import_selenium_webdriver = require("selenium-webdriver");
|
|
111
|
-
init_fixElementStaleError();
|
|
112
67
|
AbstractElement = class {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
constructor(driver, elementCssSelector) {
|
|
116
|
-
this.driver = driver;
|
|
68
|
+
constructor(page, elementCssSelector) {
|
|
69
|
+
this.page = page;
|
|
117
70
|
this.elementCssSelector = elementCssSelector;
|
|
118
71
|
}
|
|
72
|
+
elementCssSelector;
|
|
119
73
|
getFullCssSelector() {
|
|
120
74
|
return this.elementCssSelector;
|
|
121
75
|
}
|
|
122
76
|
joinRelativeCssSelectors(selectors) {
|
|
123
77
|
return selectors.join(" ");
|
|
124
78
|
}
|
|
125
|
-
|
|
126
|
-
return
|
|
79
|
+
syncLocator() {
|
|
80
|
+
return this.page.locator(`css=${this.getFullCssSelector()}`);
|
|
81
|
+
}
|
|
82
|
+
getLocator() {
|
|
83
|
+
return this.syncLocator();
|
|
127
84
|
}
|
|
128
85
|
async getAttribute(attr) {
|
|
129
|
-
const
|
|
130
|
-
|
|
86
|
+
const locator = this.syncLocator();
|
|
87
|
+
if (await locator.isVisible()) {
|
|
88
|
+
return locator.getAttribute(attr);
|
|
89
|
+
}
|
|
90
|
+
return "";
|
|
131
91
|
}
|
|
132
|
-
|
|
133
|
-
return
|
|
92
|
+
getClasses() {
|
|
93
|
+
return this.getAttribute("class");
|
|
134
94
|
}
|
|
135
|
-
|
|
136
|
-
return
|
|
95
|
+
getDataTestId() {
|
|
96
|
+
return this.getAttribute("data-testid");
|
|
137
97
|
}
|
|
138
|
-
|
|
139
|
-
return
|
|
98
|
+
getDataDateMode() {
|
|
99
|
+
return this.getAttribute("data-datemode");
|
|
140
100
|
}
|
|
141
101
|
};
|
|
142
102
|
}
|
|
@@ -147,15 +107,12 @@ var AbstractPage;
|
|
|
147
107
|
var init_AbstractPage = __esm({
|
|
148
108
|
"src/pageObjects/pages/AbstractPage.ts"() {
|
|
149
109
|
"use strict";
|
|
150
|
-
init_config();
|
|
151
110
|
init_AbstractElement();
|
|
152
111
|
AbstractPage = class extends AbstractElement {
|
|
153
112
|
url;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
this.host = config().auth.host;
|
|
158
|
-
this.url = this.host + this.prependHash(this.path);
|
|
113
|
+
constructor(page) {
|
|
114
|
+
super(page);
|
|
115
|
+
this.url = this.prependHash(this.path);
|
|
159
116
|
}
|
|
160
117
|
prependHash(urlPath) {
|
|
161
118
|
if (!urlPath.startsWith("/#")) {
|
|
@@ -164,7 +121,7 @@ var init_AbstractPage = __esm({
|
|
|
164
121
|
return urlPath;
|
|
165
122
|
}
|
|
166
123
|
async goToUrl(url) {
|
|
167
|
-
await this.
|
|
124
|
+
await this.page.goto(url);
|
|
168
125
|
}
|
|
169
126
|
get path() {
|
|
170
127
|
return "/#";
|
|
@@ -173,115 +130,99 @@ var init_AbstractPage = __esm({
|
|
|
173
130
|
await this.goToUrl(this.url);
|
|
174
131
|
}
|
|
175
132
|
async reloadPage() {
|
|
176
|
-
await this.
|
|
133
|
+
await this.page.reload();
|
|
177
134
|
}
|
|
178
135
|
};
|
|
179
136
|
}
|
|
180
137
|
});
|
|
181
138
|
|
|
182
|
-
// src/
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
function safeWait(condition, driver, errorMessage, timeout) {
|
|
187
|
-
return wait(async () => {
|
|
188
|
-
try {
|
|
189
|
-
return await condition(driver);
|
|
190
|
-
} catch {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
}, driver, errorMessage, timeout);
|
|
194
|
-
}
|
|
195
|
-
var init_wait = __esm({
|
|
196
|
-
"src/utils/wait.ts"() {
|
|
197
|
-
"use strict";
|
|
198
|
-
init_config();
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
// src/utils/waitElementIsVisible.ts
|
|
203
|
-
async function waitElementIsVisible({
|
|
204
|
-
timeout,
|
|
205
|
-
errorMessage,
|
|
206
|
-
driver,
|
|
207
|
-
...rest
|
|
208
|
-
}) {
|
|
209
|
-
await safeWait(async () => {
|
|
210
|
-
const searchedElement = "by" in rest ? await fixElementStaleError(rest.by, driver) : rest.element;
|
|
211
|
-
return await searchedElement.isDisplayed();
|
|
212
|
-
}, driver, errorMessage ?? "Element is not visible", timeout ?? config().timeout);
|
|
213
|
-
}
|
|
214
|
-
var waitElementIsVisible_default;
|
|
215
|
-
var init_waitElementIsVisible = __esm({
|
|
216
|
-
"src/utils/waitElementIsVisible.ts"() {
|
|
217
|
-
"use strict";
|
|
218
|
-
init_config();
|
|
219
|
-
init_wait();
|
|
220
|
-
init_fixElementStaleError();
|
|
221
|
-
waitElementIsVisible_default = waitElementIsVisible;
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// src/utils/actions.ts
|
|
226
|
-
var click, contextMenu;
|
|
227
|
-
var init_actions = __esm({
|
|
228
|
-
"src/utils/actions.ts"() {
|
|
139
|
+
// src/pageObjects/pages/LoginPage.ts
|
|
140
|
+
var LOGIN_PATH, LoginPage;
|
|
141
|
+
var init_LoginPage = __esm({
|
|
142
|
+
"src/pageObjects/pages/LoginPage.ts"() {
|
|
229
143
|
"use strict";
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
144
|
+
init_AbstractPage();
|
|
145
|
+
LOGIN_PATH = "/login";
|
|
146
|
+
LoginPage = class extends AbstractPage {
|
|
147
|
+
async locate() {
|
|
148
|
+
await super.locate();
|
|
149
|
+
await this.page.getByTestId("loginField").waitFor({ state: "visible" });
|
|
233
150
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
151
|
+
get path() {
|
|
152
|
+
return LOGIN_PATH;
|
|
153
|
+
}
|
|
154
|
+
enterUsername(username) {
|
|
155
|
+
return this.page.getByTestId("loginField").fill(username);
|
|
156
|
+
}
|
|
157
|
+
enterPassword(password) {
|
|
158
|
+
return this.page.getByTestId("passwordField").fill(password);
|
|
159
|
+
}
|
|
160
|
+
async clickLoginButton() {
|
|
161
|
+
await this.page.getByTestId("loginButton").click();
|
|
162
|
+
}
|
|
163
|
+
async loginWith(username, password) {
|
|
164
|
+
await this.enterUsername(username);
|
|
165
|
+
await this.enterPassword(password);
|
|
166
|
+
await this.clickLoginButton();
|
|
240
167
|
}
|
|
241
|
-
const actions = driver.actions({ async: true });
|
|
242
|
-
await actions.move({ origin: webElement }).contextClick().perform();
|
|
243
168
|
};
|
|
244
169
|
}
|
|
245
170
|
});
|
|
246
171
|
|
|
247
172
|
// src/utils/locators.ts
|
|
248
|
-
var
|
|
173
|
+
var byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
|
|
249
174
|
var init_locators = __esm({
|
|
250
175
|
"src/utils/locators.ts"() {
|
|
251
176
|
"use strict";
|
|
252
|
-
import_selenium_webdriver2 = require("selenium-webdriver");
|
|
253
177
|
byTestIdCssSelector = (testId, element = "div") => {
|
|
254
178
|
return `${element}[data-testid="${testId}"]`;
|
|
255
179
|
};
|
|
256
180
|
byTestId = (testId, element = "div") => {
|
|
257
|
-
return
|
|
181
|
+
return byTestIdCssSelector(testId, element);
|
|
258
182
|
};
|
|
259
183
|
readonlyLocator = "readonly";
|
|
260
184
|
disabledLocator = "disabled";
|
|
261
185
|
}
|
|
262
186
|
});
|
|
263
187
|
|
|
264
|
-
// src/utils/
|
|
265
|
-
async function
|
|
188
|
+
// src/utils/waitElementIsVisible.ts
|
|
189
|
+
async function waitElementIsVisible({
|
|
266
190
|
timeout,
|
|
267
|
-
|
|
268
|
-
driver,
|
|
269
|
-
...rest
|
|
191
|
+
locator
|
|
270
192
|
}) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
193
|
+
try {
|
|
194
|
+
await locator.waitFor({ state: "visible", timeout });
|
|
195
|
+
} catch {
|
|
196
|
+
throw new Error("Element is not visible");
|
|
197
|
+
}
|
|
276
198
|
}
|
|
277
|
-
var
|
|
278
|
-
var
|
|
279
|
-
"src/utils/
|
|
199
|
+
var waitElementIsVisible_default;
|
|
200
|
+
var init_waitElementIsVisible = __esm({
|
|
201
|
+
"src/utils/waitElementIsVisible.ts"() {
|
|
202
|
+
"use strict";
|
|
203
|
+
waitElementIsVisible_default = waitElementIsVisible;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// src/utils/wait.ts
|
|
208
|
+
async function wait(condition, page, errorMessage, timeout = 3e4) {
|
|
209
|
+
const start = Date.now();
|
|
210
|
+
while (true) {
|
|
211
|
+
try {
|
|
212
|
+
const result = await condition();
|
|
213
|
+
if (result) return;
|
|
214
|
+
} catch {
|
|
215
|
+
}
|
|
216
|
+
if (Date.now() - start > timeout) {
|
|
217
|
+
const msg = errorMessage || `Timeout waiting for condition after ${timeout}ms`;
|
|
218
|
+
throw new Error(msg);
|
|
219
|
+
}
|
|
220
|
+
await page.waitForTimeout(100);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
var init_wait = __esm({
|
|
224
|
+
"src/utils/wait.ts"() {
|
|
280
225
|
"use strict";
|
|
281
|
-
init_config();
|
|
282
|
-
init_wait();
|
|
283
|
-
init_fixElementStaleError();
|
|
284
|
-
waitElementIsClickable_default = waitElementIsClickable;
|
|
285
226
|
}
|
|
286
227
|
});
|
|
287
228
|
|
|
@@ -293,9 +234,8 @@ var init_AbstractElementWithParent = __esm({
|
|
|
293
234
|
init_AbstractElement();
|
|
294
235
|
init_locators();
|
|
295
236
|
AbstractElementWithParent = class extends AbstractElement {
|
|
296
|
-
parentCssSelector
|
|
297
|
-
|
|
298
|
-
super(driver, elementCssSelector);
|
|
237
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
238
|
+
super(page, elementCssSelector);
|
|
299
239
|
this.parentCssSelector = parentCssSelector;
|
|
300
240
|
}
|
|
301
241
|
getFullCssSelector() {
|
|
@@ -308,59 +248,92 @@ var init_AbstractElementWithParent = __esm({
|
|
|
308
248
|
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
309
249
|
}
|
|
310
250
|
async isReadonly() {
|
|
311
|
-
const
|
|
312
|
-
return
|
|
251
|
+
const classString = await this.getClasses();
|
|
252
|
+
return classString.includes(readonlyLocator);
|
|
313
253
|
}
|
|
314
254
|
async isDisabled() {
|
|
315
|
-
const
|
|
316
|
-
return
|
|
255
|
+
const classString = await this.getClasses();
|
|
256
|
+
return classString.includes(disabledLocator);
|
|
317
257
|
}
|
|
318
258
|
};
|
|
319
259
|
}
|
|
320
260
|
});
|
|
321
261
|
|
|
322
|
-
// src/pageObjects/elements/
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
"src/pageObjects/elements/
|
|
262
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
263
|
+
var SubsystemsPanelHeader;
|
|
264
|
+
var init_SubsystemsPanelHeader = __esm({
|
|
265
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts"() {
|
|
326
266
|
"use strict";
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
267
|
+
init_AbstractElementWithParent();
|
|
268
|
+
SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
269
|
+
async title() {
|
|
270
|
+
return this.page.locator(this.getFullCssSelector());
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
277
|
+
var DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
|
|
278
|
+
var init_ClearButtonStrategy = __esm({
|
|
279
|
+
"src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
|
|
280
|
+
"use strict";
|
|
281
|
+
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
282
|
+
DX_CLEAR_BUTTON_AREA = ".dx-clear-button-area .dx-icon-clear";
|
|
283
|
+
ClearButtonStrategy = class {
|
|
284
|
+
editorContainerSelector;
|
|
285
|
+
page;
|
|
286
|
+
constructor(editorContainerSelector, page) {
|
|
287
|
+
this.editorContainerSelector = editorContainerSelector;
|
|
288
|
+
this.page = page;
|
|
289
|
+
}
|
|
290
|
+
get editorContainer() {
|
|
291
|
+
return this.page.locator(this.editorContainerSelector);
|
|
292
|
+
}
|
|
293
|
+
async isEmptyEditorField() {
|
|
294
|
+
const classAttribute = await this.editorContainer.getAttribute("class");
|
|
295
|
+
return Boolean(classAttribute?.includes(DX_TEXTEDITOR_EMPTY));
|
|
296
|
+
}
|
|
297
|
+
async clear() {
|
|
298
|
+
if (await this.isEmptyEditorField()) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const clearButton = this.editorContainer.locator(`${DX_CLEAR_BUTTON_AREA}`);
|
|
302
|
+
if (await clearButton.isHidden()) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
await clearButton.click();
|
|
331
306
|
}
|
|
332
307
|
};
|
|
333
308
|
}
|
|
334
309
|
});
|
|
335
310
|
|
|
336
311
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
337
|
-
var
|
|
312
|
+
var AbstractDXEditorWithInput;
|
|
338
313
|
var init_AbstractEditor = __esm({
|
|
339
314
|
"src/pageObjects/elements/Editors/AbstractEditor.ts"() {
|
|
340
315
|
"use strict";
|
|
341
|
-
import_selenium_webdriver7 = require("selenium-webdriver");
|
|
342
|
-
init_actions();
|
|
343
|
-
init_InputClearStrategy();
|
|
344
316
|
init_AbstractElementWithParent();
|
|
317
|
+
init_ClearButtonStrategy();
|
|
345
318
|
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
346
|
-
clearStrategy = new
|
|
319
|
+
clearStrategy = new ClearButtonStrategy(this.getFullCssSelector(), this.page);
|
|
347
320
|
setClearStrategy(strategy) {
|
|
348
321
|
this.clearStrategy = strategy;
|
|
349
322
|
}
|
|
350
323
|
getInputCssSelector() {
|
|
351
324
|
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
352
325
|
}
|
|
353
|
-
|
|
354
|
-
return this.
|
|
326
|
+
getInputLocator() {
|
|
327
|
+
return this.page.locator(this.getInputCssSelector());
|
|
355
328
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
return inputEl.getAttribute("value");
|
|
329
|
+
getInputValue() {
|
|
330
|
+
return this.getInputLocator().inputValue();
|
|
359
331
|
}
|
|
360
332
|
async setInputValue(value) {
|
|
361
|
-
const
|
|
362
|
-
await click(
|
|
363
|
-
await
|
|
333
|
+
const input = this.getInputLocator();
|
|
334
|
+
await input.click();
|
|
335
|
+
await input.pressSequentially(value + "");
|
|
336
|
+
await input.press("Enter");
|
|
364
337
|
}
|
|
365
338
|
async clear() {
|
|
366
339
|
await this.clearStrategy.clear(this);
|
|
@@ -375,11 +348,11 @@ var init_TextEditor = __esm({
|
|
|
375
348
|
"src/pageObjects/elements/Editors/TextEditor.ts"() {
|
|
376
349
|
"use strict";
|
|
377
350
|
init_AbstractEditor();
|
|
378
|
-
|
|
351
|
+
init_ClearButtonStrategy();
|
|
379
352
|
TextEditor = class extends AbstractDXEditorWithInput {
|
|
380
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
381
|
-
super(parentCssSelector, elementCssSelector,
|
|
382
|
-
this.setClearStrategy(new
|
|
353
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
354
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
355
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
383
356
|
}
|
|
384
357
|
async getValue() {
|
|
385
358
|
const value = await super.getInputValue();
|
|
@@ -398,11 +371,11 @@ var init_NumberEditor = __esm({
|
|
|
398
371
|
"src/pageObjects/elements/Editors/NumberEditor.ts"() {
|
|
399
372
|
"use strict";
|
|
400
373
|
init_AbstractEditor();
|
|
401
|
-
|
|
374
|
+
init_ClearButtonStrategy();
|
|
402
375
|
NumberEditor = class extends AbstractDXEditorWithInput {
|
|
403
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
404
|
-
super(parentCssSelector, elementCssSelector,
|
|
405
|
-
this.setClearStrategy(new
|
|
376
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
377
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
378
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
406
379
|
}
|
|
407
380
|
async getValue() {
|
|
408
381
|
const value = await super.getInputValue();
|
|
@@ -433,6 +406,7 @@ var init_types = __esm({
|
|
|
433
406
|
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
434
407
|
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
435
408
|
ControlClass2["HeaderFilterDictionary"] = "header-filter-dictionary";
|
|
409
|
+
ControlClass2["FileUploader"] = "file-uploader";
|
|
436
410
|
return ControlClass2;
|
|
437
411
|
})(ControlClass || {});
|
|
438
412
|
}
|
|
@@ -445,8 +419,8 @@ var init_AbstractFormElement = __esm({
|
|
|
445
419
|
"use strict";
|
|
446
420
|
init_AbstractElementWithParent();
|
|
447
421
|
AbstractFormElement = class extends AbstractElementWithParent {
|
|
448
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
449
|
-
super(parentCssSelector, elementCssSelector,
|
|
422
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
423
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
450
424
|
}
|
|
451
425
|
};
|
|
452
426
|
}
|
|
@@ -457,7 +431,6 @@ var CheckBox;
|
|
|
457
431
|
var init_CheckBox = __esm({
|
|
458
432
|
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
459
433
|
"use strict";
|
|
460
|
-
init_actions();
|
|
461
434
|
init_AbstractElementWithParent();
|
|
462
435
|
CheckBox = class extends AbstractElementWithParent {
|
|
463
436
|
async getValue() {
|
|
@@ -467,10 +440,10 @@ var init_CheckBox = __esm({
|
|
|
467
440
|
return null;
|
|
468
441
|
}
|
|
469
442
|
async setValue(value) {
|
|
470
|
-
const inputEl =
|
|
443
|
+
const inputEl = this.getLocator();
|
|
471
444
|
const currentValue = await this.getValue();
|
|
472
445
|
if (currentValue !== value) {
|
|
473
|
-
await click(
|
|
446
|
+
await inputEl.click();
|
|
474
447
|
}
|
|
475
448
|
}
|
|
476
449
|
};
|
|
@@ -484,111 +457,128 @@ var init_xpathHelper = __esm({
|
|
|
484
457
|
"use strict";
|
|
485
458
|
XPathHelper = class {
|
|
486
459
|
static getClassAndValueXpath(cssClass, value) {
|
|
487
|
-
return `div[contains(@class, '${cssClass}') and
|
|
460
|
+
return `div[contains(@class, '${cssClass}') and .='${value}']`;
|
|
488
461
|
}
|
|
489
462
|
};
|
|
490
463
|
}
|
|
491
464
|
});
|
|
492
465
|
|
|
493
|
-
// src/
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
502
|
-
ClearButtonStrategy = class {
|
|
503
|
-
editorContainerClass;
|
|
504
|
-
_driver;
|
|
505
|
-
constructor(editorContainerClass, driver) {
|
|
506
|
-
this.editorContainerClass = editorContainerClass;
|
|
507
|
-
this._driver = driver;
|
|
508
|
-
}
|
|
509
|
-
async isEmptyEditorField() {
|
|
510
|
-
const editorContainer = await this._driver.findElement(import_selenium_webdriver8.By.css(this.editorContainerClass));
|
|
511
|
-
const classAttribute = await editorContainer.getAttribute("class");
|
|
512
|
-
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
513
|
-
}
|
|
514
|
-
async clear() {
|
|
515
|
-
if (await this.isEmptyEditorField()) {
|
|
516
|
-
throw new Error("This field is already empty");
|
|
517
|
-
}
|
|
518
|
-
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
519
|
-
const clearBtn = await this._driver.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
|
|
520
|
-
await click(clearBtn, this._driver);
|
|
521
|
-
}
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
});
|
|
525
|
-
|
|
526
|
-
// src/utils/withCustomTimeouts.ts
|
|
527
|
-
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
528
|
-
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
529
|
-
try {
|
|
530
|
-
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
531
|
-
return await callback();
|
|
532
|
-
} finally {
|
|
533
|
-
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
466
|
+
// src/utils/typesUtil.ts
|
|
467
|
+
function isEmptyValue(value) {
|
|
468
|
+
switch (true) {
|
|
469
|
+
case !isDefined(value):
|
|
470
|
+
case value === "":
|
|
471
|
+
case (isArray(value) && !value.length):
|
|
472
|
+
case (isObject(value) && isEmptyObject(value)):
|
|
473
|
+
return true;
|
|
534
474
|
}
|
|
475
|
+
return false;
|
|
535
476
|
}
|
|
536
|
-
var
|
|
537
|
-
var
|
|
538
|
-
"src/utils/
|
|
477
|
+
var types, isObject, isEmptyObject, type, isNull, isArray, isDefined, isString, isDate, isArrayOfDates, isUndefined;
|
|
478
|
+
var init_typesUtil = __esm({
|
|
479
|
+
"src/utils/typesUtil.ts"() {
|
|
539
480
|
"use strict";
|
|
540
|
-
|
|
481
|
+
types = {
|
|
482
|
+
"[object Array]": "array",
|
|
483
|
+
"[object Date]": "date",
|
|
484
|
+
"[object Object]": "object",
|
|
485
|
+
"[object String]": "string",
|
|
486
|
+
"[object Null]": "null"
|
|
487
|
+
};
|
|
488
|
+
isObject = function(value) {
|
|
489
|
+
return type(value) === "object" && !isNull(value) && !isArray(value) && !isDate(value);
|
|
490
|
+
};
|
|
491
|
+
isEmptyObject = function(object) {
|
|
492
|
+
return !Object.keys(object).length;
|
|
493
|
+
};
|
|
494
|
+
type = function(object) {
|
|
495
|
+
const typeOfObject = Object.prototype.toString.call(object);
|
|
496
|
+
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
497
|
+
};
|
|
498
|
+
isNull = function(value) {
|
|
499
|
+
return type(value) === "null";
|
|
500
|
+
};
|
|
501
|
+
isArray = function(value) {
|
|
502
|
+
return type(value) === "array";
|
|
503
|
+
};
|
|
504
|
+
isDefined = function(value) {
|
|
505
|
+
return value !== null && !isUndefined(value);
|
|
506
|
+
};
|
|
507
|
+
isString = function(object) {
|
|
508
|
+
return typeof object === "string";
|
|
509
|
+
};
|
|
510
|
+
isDate = function(object) {
|
|
511
|
+
return type(object) === "date";
|
|
512
|
+
};
|
|
513
|
+
isArrayOfDates = function(array) {
|
|
514
|
+
return isArray(array) && array.every(isDate);
|
|
515
|
+
};
|
|
516
|
+
isUndefined = (val) => val === void 0;
|
|
541
517
|
}
|
|
542
518
|
});
|
|
543
519
|
|
|
544
520
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
545
|
-
var
|
|
521
|
+
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
546
522
|
var init_SelectBoxEditor = __esm({
|
|
547
523
|
"src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
|
|
548
524
|
"use strict";
|
|
549
525
|
init_AbstractEditor();
|
|
550
|
-
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
551
|
-
init_xpathHelper();
|
|
552
|
-
init_actions();
|
|
553
526
|
init_ClearButtonStrategy();
|
|
554
|
-
|
|
527
|
+
init_xpathHelper();
|
|
528
|
+
init_src();
|
|
529
|
+
init_typesUtil();
|
|
555
530
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
556
531
|
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
557
|
-
dropDownOptionClick = async (optionValue,
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
err = new Error(`Item not found: "${optionValue}"`);
|
|
532
|
+
dropDownOptionClick = async (optionValue, page, delay = true) => {
|
|
533
|
+
const locator = page.locator(`xpath=${combinedValueXpath(optionValue)}`);
|
|
534
|
+
if (delay) {
|
|
535
|
+
try {
|
|
536
|
+
await locator.waitFor({ state: "visible", timeout: 5e3 });
|
|
537
|
+
} catch {
|
|
538
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
539
|
+
}
|
|
540
|
+
} else {
|
|
541
|
+
if (await locator.count() === 0) {
|
|
542
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
543
|
+
}
|
|
570
544
|
}
|
|
571
|
-
|
|
572
|
-
throw err;
|
|
545
|
+
await locator.click();
|
|
573
546
|
};
|
|
574
547
|
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
575
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
576
|
-
super(parentCssSelector, elementCssSelector,
|
|
577
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
548
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
549
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
550
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
551
|
+
}
|
|
552
|
+
getInputLocator() {
|
|
553
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
578
554
|
}
|
|
579
555
|
async setSelectInputValue(value) {
|
|
580
|
-
const inputEl =
|
|
581
|
-
await click(
|
|
556
|
+
const inputEl = this.getInputLocator();
|
|
557
|
+
await inputEl.click();
|
|
582
558
|
try {
|
|
583
|
-
await
|
|
559
|
+
await inputEl.pressSequentially(value + "");
|
|
560
|
+
await inputEl.press("Enter");
|
|
561
|
+
await dropDownOptionClick(value, this.page, false);
|
|
584
562
|
} catch {
|
|
585
|
-
await
|
|
586
|
-
await dropDownOptionClick(value, this.driver);
|
|
563
|
+
await dropDownOptionClick(value, this.page);
|
|
587
564
|
}
|
|
588
565
|
}
|
|
566
|
+
getHiddenInputValue() {
|
|
567
|
+
const hiddenInput = this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
|
|
568
|
+
return hiddenInput.getAttribute("value");
|
|
569
|
+
}
|
|
589
570
|
async getValue() {
|
|
590
|
-
|
|
591
|
-
|
|
571
|
+
let result = null;
|
|
572
|
+
await wait(async () => {
|
|
573
|
+
const hiddenValue = await this.getHiddenInputValue();
|
|
574
|
+
if (!isEmptyValue(hiddenValue)) {
|
|
575
|
+
const value = await super.getInputValue();
|
|
576
|
+
result = value;
|
|
577
|
+
return !isEmptyValue(value);
|
|
578
|
+
}
|
|
579
|
+
return true;
|
|
580
|
+
}, this.page);
|
|
581
|
+
return result === "" ? null : result;
|
|
592
582
|
}
|
|
593
583
|
setValue(value) {
|
|
594
584
|
return this.setSelectInputValue(value);
|
|
@@ -602,7 +592,6 @@ var SwitchEditor;
|
|
|
602
592
|
var init_SwitchEditor = __esm({
|
|
603
593
|
"src/pageObjects/elements/Editors/SwitchEditor.ts"() {
|
|
604
594
|
"use strict";
|
|
605
|
-
init_actions();
|
|
606
595
|
init_AbstractElementWithParent();
|
|
607
596
|
init_wait();
|
|
608
597
|
SwitchEditor = class extends AbstractElementWithParent {
|
|
@@ -616,141 +605,139 @@ var init_SwitchEditor = __esm({
|
|
|
616
605
|
if (value !== 0 && value !== 1) {
|
|
617
606
|
value = value ? 1 : 0;
|
|
618
607
|
}
|
|
619
|
-
const inputEl =
|
|
608
|
+
const inputEl = this.getLocator();
|
|
620
609
|
const currentValue = await this.getValue();
|
|
621
610
|
if (currentValue === value) {
|
|
622
611
|
return;
|
|
623
612
|
}
|
|
624
|
-
await click(
|
|
625
|
-
await
|
|
613
|
+
await inputEl.click();
|
|
614
|
+
await wait(async () => {
|
|
626
615
|
const updatedValue = await this.getValue();
|
|
627
616
|
return updatedValue !== currentValue;
|
|
628
|
-
}, this.
|
|
617
|
+
}, this.page);
|
|
629
618
|
}
|
|
630
619
|
};
|
|
631
620
|
}
|
|
632
621
|
});
|
|
633
622
|
|
|
634
623
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
635
|
-
var
|
|
624
|
+
var TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TagBox;
|
|
636
625
|
var init_TagBox = __esm({
|
|
637
626
|
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
638
627
|
"use strict";
|
|
639
628
|
init_AbstractEditor();
|
|
640
|
-
|
|
641
|
-
init_actions();
|
|
629
|
+
init_ClearButtonStrategy();
|
|
642
630
|
init_locators();
|
|
643
631
|
init_SelectBoxEditor();
|
|
644
|
-
init_ClearButtonStrategy();
|
|
645
|
-
init_fixElementStaleError();
|
|
646
632
|
init_wait();
|
|
647
633
|
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
648
634
|
DX_TAG_CONTAINER = "dx-tag-container";
|
|
649
635
|
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
650
636
|
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
651
|
-
getSelectedOptionXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//div[contains(@class, 'dx-list-item') and @aria-selected="true"]//div[contains(., "${value}")]`;
|
|
652
637
|
TagBox = class extends AbstractDXEditorWithInput {
|
|
653
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
654
|
-
super(parentCssSelector, elementCssSelector,
|
|
655
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
638
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
639
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
640
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
641
|
+
}
|
|
642
|
+
getInputLocator() {
|
|
643
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
656
644
|
}
|
|
657
645
|
async setTagBoxInputValue(values) {
|
|
658
646
|
const lastElement = values[values.length - 1];
|
|
659
|
-
const
|
|
660
|
-
await
|
|
647
|
+
const input = this.getInputLocator();
|
|
648
|
+
await input.click();
|
|
661
649
|
for (const value of values) {
|
|
662
|
-
await this.selectOption(
|
|
650
|
+
await this.selectOption(input, value, lastElement);
|
|
663
651
|
}
|
|
664
652
|
await this.confirmSelection();
|
|
665
653
|
}
|
|
666
654
|
async waitOptionSelection(value) {
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
const elements = await this.driver.findElements(import_selenium_webdriver10.By.xpath(getSelectedOptionXpath(value)));
|
|
670
|
-
if (elements.length === 0) return false;
|
|
671
|
-
return await elements[0].isDisplayed();
|
|
672
|
-
},
|
|
673
|
-
this.driver
|
|
674
|
-
);
|
|
655
|
+
const option = this.page.locator(`.dx-overlay-wrapper .dx-list-item[aria-selected="true"] >> text=${value}`);
|
|
656
|
+
await option.waitFor({ state: "visible", timeout: 5e3 });
|
|
675
657
|
}
|
|
676
|
-
async selectOption(
|
|
658
|
+
async selectOption(input, value, lastElement) {
|
|
677
659
|
try {
|
|
678
|
-
await dropDownOptionClick(value, this.
|
|
660
|
+
await dropDownOptionClick(value, this.page, false);
|
|
679
661
|
} catch {
|
|
680
|
-
await
|
|
681
|
-
await dropDownOptionClick(value, this.
|
|
662
|
+
await input.pressSequentially(value + "");
|
|
663
|
+
await dropDownOptionClick(value, this.page, true);
|
|
682
664
|
}
|
|
683
665
|
await this.waitOptionSelection(value);
|
|
684
666
|
if (value !== lastElement) {
|
|
685
|
-
await
|
|
667
|
+
await input.pressSequentially("");
|
|
686
668
|
}
|
|
687
669
|
}
|
|
688
670
|
async confirmSelection() {
|
|
689
|
-
const btnOk =
|
|
690
|
-
await click(
|
|
671
|
+
const btnOk = this.page.locator(BTN_OK_SELECTOR);
|
|
672
|
+
await btnOk.click();
|
|
691
673
|
}
|
|
692
674
|
async getTagBoxInputValue() {
|
|
693
|
-
if (await this.isTagBoxEmpty())
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
675
|
+
if (await this.isTagBoxEmpty()) return [];
|
|
676
|
+
let count = 0;
|
|
677
|
+
let tags = null;
|
|
678
|
+
await wait(
|
|
679
|
+
async () => {
|
|
680
|
+
tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`);
|
|
681
|
+
count = await tags.count();
|
|
682
|
+
return count > 0;
|
|
683
|
+
},
|
|
684
|
+
this.page
|
|
698
685
|
);
|
|
699
686
|
const values = [];
|
|
700
|
-
|
|
701
|
-
|
|
687
|
+
if (tags) {
|
|
688
|
+
for (let i = 0; i < count; i++) {
|
|
689
|
+
const tag = tags.nth(i);
|
|
690
|
+
const text = await tag.innerText();
|
|
691
|
+
if (text) values.push(text.trim());
|
|
692
|
+
}
|
|
702
693
|
}
|
|
703
694
|
return values;
|
|
704
695
|
}
|
|
705
696
|
async isTagBoxEmpty() {
|
|
706
|
-
const
|
|
707
|
-
return
|
|
697
|
+
const classAttr = await this.getClasses();
|
|
698
|
+
return classAttr.includes(DX_TEXTEDITOR_EMPTY2);
|
|
708
699
|
}
|
|
709
700
|
async getValue() {
|
|
710
701
|
const value = await this.getTagBoxInputValue();
|
|
711
702
|
return value.length ? value : null;
|
|
712
703
|
}
|
|
713
704
|
async setValue(values) {
|
|
714
|
-
if (!Array.isArray(values))
|
|
715
|
-
throw new Error("The provided value is not an array");
|
|
716
|
-
}
|
|
705
|
+
if (!Array.isArray(values)) throw new Error("The provided value is not an array");
|
|
717
706
|
await this.setTagBoxInputValue(values);
|
|
718
707
|
}
|
|
719
708
|
async remove(itemText) {
|
|
720
709
|
const tagValues = await this.getValue();
|
|
721
|
-
|
|
722
|
-
if (!tagExists) {
|
|
710
|
+
if (!tagValues.includes(itemText)) {
|
|
723
711
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
724
712
|
}
|
|
725
713
|
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
726
|
-
const clearBtn =
|
|
727
|
-
|
|
728
|
-
);
|
|
729
|
-
await click(clearBtn, this.driver);
|
|
714
|
+
const clearBtn = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`);
|
|
715
|
+
await clearBtn.click();
|
|
730
716
|
}
|
|
731
717
|
};
|
|
732
718
|
}
|
|
733
719
|
});
|
|
734
720
|
|
|
735
721
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
736
|
-
var
|
|
722
|
+
var ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
|
|
737
723
|
var init_ButtonGroup = __esm({
|
|
738
724
|
"src/pageObjects/elements/Editors/ButtonGroup.ts"() {
|
|
739
725
|
"use strict";
|
|
740
|
-
init_actions();
|
|
741
|
-
import_selenium_webdriver11 = require("selenium-webdriver");
|
|
742
726
|
init_AbstractElementWithParent();
|
|
743
727
|
ITEM_CLASS = "dx-buttongroup-item";
|
|
744
728
|
SELECTED_CLASS = "dx-state-selected";
|
|
745
729
|
ButtonGroup = class extends AbstractElementWithParent {
|
|
730
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
731
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
732
|
+
}
|
|
746
733
|
getItems() {
|
|
747
|
-
return this.
|
|
734
|
+
return this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}`).all();
|
|
748
735
|
}
|
|
749
|
-
getDataValue(el) {
|
|
750
|
-
return el.getAttribute("data-value");
|
|
736
|
+
async getDataValue(el) {
|
|
737
|
+
return await el.getAttribute("data-value");
|
|
751
738
|
}
|
|
752
739
|
async getValue() {
|
|
753
|
-
const selectedEl =
|
|
740
|
+
const selectedEl = this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`);
|
|
754
741
|
return this.getDataValue(selectedEl);
|
|
755
742
|
}
|
|
756
743
|
async setValue(value) {
|
|
@@ -764,7 +751,7 @@ var init_ButtonGroup = __esm({
|
|
|
764
751
|
}
|
|
765
752
|
}
|
|
766
753
|
if (!buttonEl) throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
767
|
-
await click(
|
|
754
|
+
await buttonEl.click();
|
|
768
755
|
}
|
|
769
756
|
};
|
|
770
757
|
}
|
|
@@ -838,14 +825,12 @@ var init_DateSelectMode = __esm({
|
|
|
838
825
|
});
|
|
839
826
|
|
|
840
827
|
// src/pageObjects/elements/Editors/Date/Calendar.ts
|
|
841
|
-
var
|
|
828
|
+
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, CALENDAR_CAPTION_SELECTOR, CALENDAR_CELL_SELECTOR, CALENDAR_PREVIOUS_SELECTOR, CALENDAR_NEXT_SELECTOR, TEXT_EDITOR_SELECTOR, movesToCalendarEndForWeek, movesToCalendarEndForMonth, Calendar;
|
|
842
829
|
var init_Calendar = __esm({
|
|
843
830
|
"src/pageObjects/elements/Editors/Date/Calendar.ts"() {
|
|
844
831
|
"use strict";
|
|
845
832
|
init_AbstractElementWithParent();
|
|
846
|
-
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
847
833
|
init_locators();
|
|
848
|
-
init_actions();
|
|
849
834
|
init_utils();
|
|
850
835
|
BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
851
836
|
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
@@ -860,131 +845,110 @@ var init_Calendar = __esm({
|
|
|
860
845
|
movesToCalendarEndForMonth = 1;
|
|
861
846
|
Calendar = class extends AbstractElementWithParent {
|
|
862
847
|
_parentCssSelector;
|
|
863
|
-
constructor({ parentCssSelector, dateFieldDataTestID,
|
|
864
|
-
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`),
|
|
848
|
+
constructor({ parentCssSelector, dateFieldDataTestID, page }) {
|
|
849
|
+
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), page);
|
|
865
850
|
this._parentCssSelector = parentCssSelector;
|
|
866
851
|
}
|
|
852
|
+
get root() {
|
|
853
|
+
return this.getLocator();
|
|
854
|
+
}
|
|
867
855
|
async init() {
|
|
868
|
-
const dateField =
|
|
869
|
-
|
|
870
|
-
await click(button, this.driver);
|
|
856
|
+
const dateField = this.page.locator(this._parentCssSelector);
|
|
857
|
+
await dateField.locator(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`).click();
|
|
871
858
|
}
|
|
872
|
-
/**
|
|
873
|
-
* Переходимо на найвищий рівень календаря
|
|
874
|
-
*/
|
|
875
859
|
async moveToCalendarEnd(count) {
|
|
876
860
|
while (count >= 0) {
|
|
877
|
-
|
|
878
|
-
const button = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_CAPTION_SELECTOR}`));
|
|
879
|
-
await click(button, this.driver);
|
|
861
|
+
await this.root.locator(`.${CALENDAR_CAPTION_SELECTOR}`).click();
|
|
880
862
|
count--;
|
|
881
863
|
}
|
|
882
864
|
}
|
|
883
|
-
/**
|
|
884
|
-
* Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
|
|
885
|
-
*/
|
|
886
865
|
async choosePeriodForYear(targetYear) {
|
|
887
866
|
let found = false;
|
|
888
867
|
while (!found) {
|
|
889
|
-
const
|
|
890
|
-
const
|
|
891
|
-
for (
|
|
892
|
-
const
|
|
868
|
+
const periodCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
|
|
869
|
+
const count = await periodCells.count();
|
|
870
|
+
for (let i = 0; i < count; i++) {
|
|
871
|
+
const cell = periodCells.nth(i);
|
|
872
|
+
const text = await cell.innerText();
|
|
893
873
|
if (text) {
|
|
894
874
|
const [start, end] = text.split("-").map(Number);
|
|
895
875
|
if (targetYear >= start && targetYear <= end) {
|
|
896
|
-
await click(
|
|
876
|
+
await cell.click();
|
|
897
877
|
found = true;
|
|
898
878
|
break;
|
|
899
879
|
}
|
|
900
880
|
}
|
|
901
881
|
}
|
|
902
882
|
if (!found) {
|
|
903
|
-
const
|
|
904
|
-
const [start] =
|
|
883
|
+
const firstText = await periodCells.first().innerText();
|
|
884
|
+
const [start] = firstText.split("-").map(Number);
|
|
905
885
|
if (targetYear < start) {
|
|
906
|
-
|
|
907
|
-
await click(prevBtn, this.driver);
|
|
886
|
+
await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
|
|
908
887
|
} else {
|
|
909
|
-
|
|
910
|
-
await click(nextBtn, this.driver);
|
|
888
|
+
await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
|
|
911
889
|
}
|
|
912
890
|
}
|
|
913
891
|
}
|
|
914
892
|
}
|
|
915
|
-
/**
|
|
916
|
-
* Пошук та клік по конкретному року з навігацією
|
|
917
|
-
*/
|
|
918
893
|
async chooseYear(targetYear) {
|
|
919
894
|
let found = false;
|
|
920
895
|
while (!found) {
|
|
921
|
-
const
|
|
922
|
-
const
|
|
923
|
-
for (
|
|
924
|
-
const
|
|
925
|
-
const
|
|
926
|
-
if (!isNaN(
|
|
927
|
-
await click(
|
|
896
|
+
const yearCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
|
|
897
|
+
const count = await yearCells.count();
|
|
898
|
+
for (let i = 0; i < count; i++) {
|
|
899
|
+
const cell = yearCells.nth(i);
|
|
900
|
+
const year = Number(await cell.innerText());
|
|
901
|
+
if (!isNaN(year) && year === targetYear) {
|
|
902
|
+
await cell.click();
|
|
928
903
|
found = true;
|
|
929
904
|
break;
|
|
930
905
|
}
|
|
931
906
|
}
|
|
932
907
|
if (!found) {
|
|
933
|
-
const
|
|
934
|
-
const
|
|
935
|
-
const firstYear = Number(firstYearText);
|
|
936
|
-
const lastYear = Number(lastYearText);
|
|
908
|
+
const firstYear = Number(await yearCells.first().innerText());
|
|
909
|
+
const lastYear = Number(await yearCells.nth(count - 1).innerText());
|
|
937
910
|
if (targetYear < firstYear) {
|
|
938
|
-
|
|
939
|
-
await click(prevBtn, this.driver);
|
|
911
|
+
await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
|
|
940
912
|
} else if (targetYear > lastYear) {
|
|
941
|
-
|
|
942
|
-
await click(nextBtn, this.driver);
|
|
913
|
+
await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
|
|
943
914
|
} else {
|
|
944
915
|
throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
|
|
945
916
|
}
|
|
946
917
|
}
|
|
947
918
|
}
|
|
948
919
|
}
|
|
949
|
-
/**
|
|
950
|
-
* Пошук та клік по конкретному місяцю
|
|
951
|
-
*/
|
|
952
920
|
async chooseMonth(year, month) {
|
|
953
|
-
const
|
|
954
|
-
const
|
|
955
|
-
for (
|
|
921
|
+
const monthCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
|
|
922
|
+
const count = await monthCells.count();
|
|
923
|
+
for (let i = 0; i < count; i++) {
|
|
924
|
+
const cell = monthCells.nth(i);
|
|
956
925
|
const dataValue = await cell.getAttribute("data-value");
|
|
957
926
|
if (dataValue) {
|
|
958
927
|
const [cellYear, cellMonth] = dataValue.split("/").map(Number);
|
|
959
928
|
if (cellYear === year && cellMonth === month) {
|
|
960
|
-
await click(
|
|
929
|
+
await cell.click();
|
|
961
930
|
return;
|
|
962
931
|
}
|
|
963
932
|
}
|
|
964
933
|
}
|
|
965
934
|
throw new Error(`Month ${month} for year ${year} not found`);
|
|
966
935
|
}
|
|
967
|
-
/**
|
|
968
|
-
* Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
|
|
969
|
-
*/
|
|
970
936
|
async chooseDay(year, month, day) {
|
|
971
|
-
const
|
|
972
|
-
const
|
|
973
|
-
for (
|
|
937
|
+
const dayCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
|
|
938
|
+
const count = await dayCells.count();
|
|
939
|
+
for (let i = 0; i < count; i++) {
|
|
940
|
+
const cell = dayCells.nth(i);
|
|
974
941
|
const dataValue = await cell.getAttribute("data-value");
|
|
975
942
|
if (dataValue) {
|
|
976
943
|
const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
|
|
977
944
|
if (cellYear === year && cellMonth === month && cellDay === day) {
|
|
978
|
-
await click(
|
|
945
|
+
await cell.click();
|
|
979
946
|
return;
|
|
980
947
|
}
|
|
981
948
|
}
|
|
982
949
|
}
|
|
983
950
|
throw new Error(`Day ${day}.${month}.${year} not found`);
|
|
984
951
|
}
|
|
985
|
-
/**
|
|
986
|
-
* Встановлення дати для тижня
|
|
987
|
-
*/
|
|
988
952
|
async setValueForWeek(date) {
|
|
989
953
|
const { year, month, day } = getYearMonthDay(date);
|
|
990
954
|
await this.moveToCalendarEnd(movesToCalendarEndForWeek);
|
|
@@ -994,9 +958,6 @@ var init_Calendar = __esm({
|
|
|
994
958
|
await this.chooseDay(year, month, day);
|
|
995
959
|
await this.save();
|
|
996
960
|
}
|
|
997
|
-
/**
|
|
998
|
-
* Встановлення дати для місяця
|
|
999
|
-
*/
|
|
1000
961
|
async setValueForMonth(date) {
|
|
1001
962
|
const { year, month } = getYearMonthDay(date);
|
|
1002
963
|
await this.moveToCalendarEnd(movesToCalendarEndForMonth);
|
|
@@ -1004,46 +965,37 @@ var init_Calendar = __esm({
|
|
|
1004
965
|
await this.chooseMonth(year, month);
|
|
1005
966
|
await this.save();
|
|
1006
967
|
}
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
return calendarPopoverElement.findElement(
|
|
1010
|
-
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1011
|
-
);
|
|
968
|
+
getDateFromInputLocator() {
|
|
969
|
+
return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
|
|
1012
970
|
}
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
return calendarPopoverElement.findElement(
|
|
1016
|
-
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1017
|
-
);
|
|
971
|
+
getDateToInputLocator() {
|
|
972
|
+
return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
|
|
1018
973
|
}
|
|
1019
974
|
async save() {
|
|
1020
|
-
|
|
1021
|
-
await click(btnOk, this.driver);
|
|
975
|
+
await this.root.locator(`.${BTN_SAVE_SELECTOR}`).click();
|
|
1022
976
|
}
|
|
1023
977
|
};
|
|
1024
978
|
}
|
|
1025
979
|
});
|
|
1026
980
|
|
|
1027
981
|
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
1028
|
-
var
|
|
982
|
+
var DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
|
|
1029
983
|
var init_BaseDateEditor = __esm({
|
|
1030
984
|
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
1031
985
|
"use strict";
|
|
1032
986
|
init_AbstractEditor();
|
|
1033
|
-
init_InputClearStrategy();
|
|
1034
|
-
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
1035
|
-
init_actions();
|
|
1036
987
|
init_utils();
|
|
1037
988
|
init_DateSelectMode();
|
|
1038
989
|
init_Calendar();
|
|
990
|
+
init_ClearButtonStrategy();
|
|
1039
991
|
DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
|
|
1040
992
|
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
1041
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1042
|
-
super(parentCssSelector, elementCssSelector,
|
|
1043
|
-
this.setClearStrategy(new
|
|
993
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
994
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
995
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1044
996
|
}
|
|
1045
997
|
async getIsAllowedTime() {
|
|
1046
|
-
const dateField =
|
|
998
|
+
const dateField = this.page.locator(`${this.getFullCssSelector()}`);
|
|
1047
999
|
const classString = await dateField.getAttribute("class");
|
|
1048
1000
|
return classString.includes(DATETIME_ALLOWED_SELECTOR);
|
|
1049
1001
|
}
|
|
@@ -1052,7 +1004,7 @@ var init_BaseDateEditor = __esm({
|
|
|
1052
1004
|
const calendar = new Calendar({
|
|
1053
1005
|
parentCssSelector: this.getFullCssSelector(),
|
|
1054
1006
|
dateFieldDataTestID,
|
|
1055
|
-
|
|
1007
|
+
page: this.page
|
|
1056
1008
|
});
|
|
1057
1009
|
await calendar.init();
|
|
1058
1010
|
return calendar;
|
|
@@ -1067,13 +1019,13 @@ var init_BaseDateEditor = __esm({
|
|
|
1067
1019
|
}
|
|
1068
1020
|
async setArrayValue(value) {
|
|
1069
1021
|
const calendar = await this.initCalendar();
|
|
1070
|
-
const dateFromInput =
|
|
1071
|
-
const dateToInput =
|
|
1022
|
+
const dateFromInput = calendar.getDateFromInputLocator();
|
|
1023
|
+
const dateToInput = calendar.getDateToInputLocator();
|
|
1072
1024
|
await this.setSingleValue(value[0], dateFromInput);
|
|
1073
1025
|
await this.setSingleValue(value[1], dateToInput);
|
|
1074
1026
|
await calendar.save();
|
|
1075
1027
|
}
|
|
1076
|
-
async setSingleValue(value,
|
|
1028
|
+
async setSingleValue(value, input) {
|
|
1077
1029
|
const dateMode = await this.getDataDateMode();
|
|
1078
1030
|
if (DateSelectMode.isWeek(dateMode)) {
|
|
1079
1031
|
await this.setValueForWeek(value);
|
|
@@ -1083,18 +1035,18 @@ var init_BaseDateEditor = __esm({
|
|
|
1083
1035
|
await this.setValueForMonth(value);
|
|
1084
1036
|
return;
|
|
1085
1037
|
}
|
|
1086
|
-
const actions = this.driver.actions({ async: true });
|
|
1087
1038
|
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1088
1039
|
const formattedDate = formatDMYDate(value, isTimeAllowed);
|
|
1089
|
-
await click(
|
|
1090
|
-
await
|
|
1091
|
-
await
|
|
1040
|
+
await input.click();
|
|
1041
|
+
await input.press("Home");
|
|
1042
|
+
await input.pressSequentially(formattedDate);
|
|
1043
|
+
await input.press("Enter");
|
|
1092
1044
|
}
|
|
1093
1045
|
async setDateValue(value) {
|
|
1094
1046
|
if (Array.isArray(value)) {
|
|
1095
1047
|
await this.setArrayValue(value);
|
|
1096
1048
|
} else {
|
|
1097
|
-
await this.setSingleValue(value,
|
|
1049
|
+
await this.setSingleValue(value, this.getInputLocator());
|
|
1098
1050
|
}
|
|
1099
1051
|
}
|
|
1100
1052
|
};
|
|
@@ -1102,77 +1054,79 @@ var init_BaseDateEditor = __esm({
|
|
|
1102
1054
|
});
|
|
1103
1055
|
|
|
1104
1056
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
1105
|
-
var
|
|
1057
|
+
var SingleDateEditor;
|
|
1106
1058
|
var init_SingleDateEditor = __esm({
|
|
1107
1059
|
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
1108
1060
|
"use strict";
|
|
1109
|
-
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
1110
|
-
init_InputClearStrategy();
|
|
1111
1061
|
init_BaseDateEditor();
|
|
1112
1062
|
init_utils();
|
|
1063
|
+
init_ClearButtonStrategy();
|
|
1113
1064
|
SingleDateEditor = class extends BaseDateEditor {
|
|
1114
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1115
|
-
super(parentCssSelector, elementCssSelector,
|
|
1116
|
-
this.setClearStrategy(new
|
|
1065
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1066
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1067
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1117
1068
|
}
|
|
1118
|
-
|
|
1119
|
-
return this.
|
|
1069
|
+
getDateLocator() {
|
|
1070
|
+
return this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
|
|
1120
1071
|
}
|
|
1121
1072
|
async getDateValue() {
|
|
1122
|
-
const
|
|
1123
|
-
return
|
|
1073
|
+
const input = this.getDateLocator();
|
|
1074
|
+
return input.getAttribute("value");
|
|
1124
1075
|
}
|
|
1125
1076
|
async getValue() {
|
|
1126
1077
|
const value = await this.getDateValue();
|
|
1127
1078
|
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1128
1079
|
if (isTimeAllowed) {
|
|
1129
|
-
return value
|
|
1080
|
+
return value === "" ? null : formatToDateTime(value);
|
|
1130
1081
|
}
|
|
1131
|
-
return value
|
|
1082
|
+
return value === "" ? null : new Date(value);
|
|
1132
1083
|
}
|
|
1133
|
-
setValue(value) {
|
|
1134
|
-
if (
|
|
1135
|
-
|
|
1084
|
+
async setValue(value) {
|
|
1085
|
+
if (value instanceof Date) {
|
|
1086
|
+
await this.setDateValue(value);
|
|
1087
|
+
} else {
|
|
1088
|
+
throw new Error(`Value is incorrect. It should be a Date object`);
|
|
1136
1089
|
}
|
|
1137
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
1138
1090
|
}
|
|
1139
1091
|
};
|
|
1140
1092
|
}
|
|
1141
1093
|
});
|
|
1142
1094
|
|
|
1143
1095
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
1144
|
-
var
|
|
1096
|
+
var DateRangeEditor;
|
|
1145
1097
|
var init_DateRangeEditor = __esm({
|
|
1146
1098
|
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
1147
1099
|
"use strict";
|
|
1148
|
-
import_selenium_webdriver15 = require("selenium-webdriver");
|
|
1149
|
-
init_InputClearStrategy();
|
|
1150
1100
|
init_BaseDateEditor();
|
|
1101
|
+
init_typesUtil();
|
|
1102
|
+
init_ClearButtonStrategy();
|
|
1151
1103
|
DateRangeEditor = class extends BaseDateEditor {
|
|
1152
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1153
|
-
super(parentCssSelector, elementCssSelector,
|
|
1154
|
-
this.setClearStrategy(new
|
|
1104
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1105
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1106
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1155
1107
|
}
|
|
1156
|
-
|
|
1157
|
-
return this.
|
|
1108
|
+
getDateLocator() {
|
|
1109
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
1158
1110
|
}
|
|
1159
1111
|
async getDateValue() {
|
|
1160
|
-
const
|
|
1161
|
-
const dateFromStr = await
|
|
1162
|
-
const dateToStr = await
|
|
1163
|
-
const dateFrom = new Date(dateFromStr);
|
|
1164
|
-
const dateTo = new Date(dateToStr);
|
|
1165
|
-
return [dateFrom, dateTo];
|
|
1112
|
+
const input = this.getDateLocator();
|
|
1113
|
+
const dateFromStr = await input.getAttribute("datefrom");
|
|
1114
|
+
const dateToStr = await input.getAttribute("dateto");
|
|
1115
|
+
const dateFrom = dateFromStr ? new Date(dateFromStr) : null;
|
|
1116
|
+
const dateTo = dateToStr ? new Date(dateToStr) : null;
|
|
1117
|
+
return dateFrom && dateTo ? [dateFrom, dateTo] : null;
|
|
1166
1118
|
}
|
|
1167
1119
|
async getValue() {
|
|
1168
1120
|
const values = await this.getDateValue();
|
|
1169
|
-
return
|
|
1121
|
+
return values?.length ? values : null;
|
|
1170
1122
|
}
|
|
1171
|
-
setValue(value) {
|
|
1172
|
-
if (
|
|
1173
|
-
|
|
1123
|
+
async setValue(value) {
|
|
1124
|
+
if (isDate(value) || isArrayOfDates(value)) {
|
|
1125
|
+
const inputValue = Array.isArray(value) ? value : [value, value];
|
|
1126
|
+
await this.setDateValue(inputValue);
|
|
1127
|
+
return;
|
|
1174
1128
|
}
|
|
1175
|
-
throw new Error(`Value is incorrect. It should be
|
|
1129
|
+
throw new Error(`Value is incorrect. It should be a Date object or Date array`);
|
|
1176
1130
|
}
|
|
1177
1131
|
};
|
|
1178
1132
|
}
|
|
@@ -1197,18 +1151,18 @@ var init_DateEditor = __esm({
|
|
|
1197
1151
|
await this.setEditorInstance();
|
|
1198
1152
|
}
|
|
1199
1153
|
async setEditorInstance() {
|
|
1200
|
-
const { parentCssSelector, elementCssSelector,
|
|
1201
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector,
|
|
1154
|
+
const { parentCssSelector, elementCssSelector, page } = this;
|
|
1155
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1202
1156
|
const classString = await elementInstance.getClasses();
|
|
1203
1157
|
switch (true) {
|
|
1204
1158
|
case classString.includes("date-control" /* Date */):
|
|
1205
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector,
|
|
1159
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
|
|
1206
1160
|
break;
|
|
1207
1161
|
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
1208
|
-
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector,
|
|
1162
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, page);
|
|
1209
1163
|
break;
|
|
1210
1164
|
default:
|
|
1211
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector,
|
|
1165
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
|
|
1212
1166
|
}
|
|
1213
1167
|
}
|
|
1214
1168
|
async setValue(value) {
|
|
@@ -1225,87 +1179,73 @@ var init_DateEditor = __esm({
|
|
|
1225
1179
|
});
|
|
1226
1180
|
|
|
1227
1181
|
// src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
|
|
1228
|
-
var
|
|
1182
|
+
var TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
|
|
1229
1183
|
var init_HeaderFilterDictionary = __esm({
|
|
1230
1184
|
"src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
|
|
1231
1185
|
"use strict";
|
|
1232
1186
|
init_AbstractEditor();
|
|
1233
|
-
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1234
|
-
init_actions();
|
|
1235
|
-
init_locators();
|
|
1236
1187
|
init_ClearButtonStrategy();
|
|
1237
|
-
|
|
1238
|
-
init_withCustomTimeouts();
|
|
1188
|
+
init_locators();
|
|
1239
1189
|
TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
1240
1190
|
DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
1241
1191
|
DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
1242
1192
|
CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
|
|
1243
1193
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
1244
1194
|
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1195
|
+
dropDownHeaderFilterDictionaryOptionClick = async (optionValue, page, dataTEST = "", delay = true) => {
|
|
1196
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
1197
|
+
const calendarPopover = page.locator(calendarPopoverSelector);
|
|
1198
|
+
const customOptionList = calendarPopover.locator(`.${CUSTOM_OPTION_LIST_SELECTOR}`);
|
|
1199
|
+
const optElement = customOptionList.locator(`.${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}`, { hasText: optionValue });
|
|
1248
1200
|
try {
|
|
1249
|
-
|
|
1250
|
-
await
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
callback: async () => {
|
|
1254
|
-
const calendarPopoverElement = await driver.findElement(import_selenium_webdriver16.By.css(calendarPopoverSelector));
|
|
1255
|
-
const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver16.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
1256
|
-
const optElement = await customOptionList.findElement(import_selenium_webdriver16.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
1257
|
-
await click(optElement, driver);
|
|
1258
|
-
}
|
|
1259
|
-
});
|
|
1260
|
-
} catch (e) {
|
|
1261
|
-
err = new Error(`Item not found: "${optionValue}"`);
|
|
1201
|
+
await optElement.waitFor({ state: "visible", timeout: delay ? void 0 : 600 });
|
|
1202
|
+
await optElement.click();
|
|
1203
|
+
} catch {
|
|
1204
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
1262
1205
|
}
|
|
1263
|
-
if (err)
|
|
1264
|
-
throw err;
|
|
1265
1206
|
};
|
|
1266
1207
|
HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
1267
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1268
|
-
super(parentCssSelector, elementCssSelector,
|
|
1269
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
1208
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1209
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1210
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1211
|
+
}
|
|
1212
|
+
getInputLocator() {
|
|
1213
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
1270
1214
|
}
|
|
1271
1215
|
async setTagBoxInputValue(values) {
|
|
1272
1216
|
const lastElement = values[values.length - 1];
|
|
1273
|
-
const inputEl =
|
|
1217
|
+
const inputEl = this.getInputLocator();
|
|
1274
1218
|
await inputEl.click();
|
|
1275
1219
|
for (const value of values) {
|
|
1276
1220
|
await this.selectOption(inputEl, value, lastElement);
|
|
1277
1221
|
}
|
|
1278
1222
|
}
|
|
1279
|
-
async waitOptionSelection() {
|
|
1280
|
-
await
|
|
1223
|
+
async waitOptionSelection(value) {
|
|
1224
|
+
await this.page.locator(`${TAG_BOX_LIST_ITEM_SELECTOR}`).filter({ hasText: value }).first().waitFor({ state: "visible" });
|
|
1281
1225
|
}
|
|
1282
1226
|
async selectOption(inputEl, value, lastElement) {
|
|
1283
1227
|
try {
|
|
1284
|
-
await inputEl.
|
|
1228
|
+
await inputEl.pressSequentially(value + "");
|
|
1285
1229
|
const dataTEST = await this.getDataTestId();
|
|
1286
|
-
await dropDownHeaderFilterDictionaryOptionClick(value, this.
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
await inputEl.sendKeys(import_selenium_webdriver16.Key.BACK_SPACE);
|
|
1230
|
+
await dropDownHeaderFilterDictionaryOptionClick(value, this.page, dataTEST);
|
|
1231
|
+
if (value !== lastElement) {
|
|
1232
|
+
await inputEl.pressSequentially("");
|
|
1290
1233
|
}
|
|
1291
1234
|
} catch (error) {
|
|
1292
1235
|
throw error;
|
|
1293
1236
|
}
|
|
1294
|
-
await this.waitOptionSelection();
|
|
1295
|
-
if (value !== lastElement) {
|
|
1296
|
-
await inputEl.clear();
|
|
1297
|
-
}
|
|
1237
|
+
await this.waitOptionSelection(value);
|
|
1298
1238
|
}
|
|
1299
1239
|
async getHeaderFilterDictionaryInputValue() {
|
|
1300
1240
|
if (await this.isHeaderFilterDictionaryEmpty()) {
|
|
1301
1241
|
return [];
|
|
1302
1242
|
}
|
|
1303
|
-
const tags =
|
|
1304
|
-
|
|
1305
|
-
);
|
|
1243
|
+
const tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`);
|
|
1244
|
+
await tags.first().waitFor({ state: "visible" });
|
|
1245
|
+
const count = await tags.count();
|
|
1306
1246
|
const values = [];
|
|
1307
|
-
for (
|
|
1308
|
-
values.push(await
|
|
1247
|
+
for (let i = 0; i < count; i++) {
|
|
1248
|
+
values.push(await tags.nth(i).innerText() ?? "");
|
|
1309
1249
|
}
|
|
1310
1250
|
return values;
|
|
1311
1251
|
}
|
|
@@ -1327,6 +1267,125 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
1327
1267
|
}
|
|
1328
1268
|
});
|
|
1329
1269
|
|
|
1270
|
+
// src/pageObjects/elements/Editors/FileUploader.ts
|
|
1271
|
+
var FILE_NAME_SELECTOR, FILE_SIZE_ATTRIBUTE, FILE_DATE_ATTRIBUTE, FILE_TYPE_ATTRIBUTE, SELECT_FILE_BUTTON_SELECTOR, DOWNLOAD_FILE_BUTTON_SELECTOR, METADATA_SELECTOR, CLEAR_BUTTON_SELECTOR, FileUploader;
|
|
1272
|
+
var init_FileUploader = __esm({
|
|
1273
|
+
"src/pageObjects/elements/Editors/FileUploader.ts"() {
|
|
1274
|
+
"use strict";
|
|
1275
|
+
init_AbstractElementWithParent();
|
|
1276
|
+
FILE_NAME_SELECTOR = ".file-text";
|
|
1277
|
+
FILE_SIZE_ATTRIBUTE = "data-filesize";
|
|
1278
|
+
FILE_DATE_ATTRIBUTE = "data-moddate";
|
|
1279
|
+
FILE_TYPE_ATTRIBUTE = "data-filetype";
|
|
1280
|
+
SELECT_FILE_BUTTON_SELECTOR = ".select-file-button";
|
|
1281
|
+
DOWNLOAD_FILE_BUTTON_SELECTOR = ".download-file-button";
|
|
1282
|
+
METADATA_SELECTOR = ".file-text-file-info-wrapper";
|
|
1283
|
+
CLEAR_BUTTON_SELECTOR = ".clear-button";
|
|
1284
|
+
FileUploader = class extends AbstractElementWithParent {
|
|
1285
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1286
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1287
|
+
}
|
|
1288
|
+
/**
|
|
1289
|
+
* Returns the metadata container element for the uploaded file.
|
|
1290
|
+
* Returns null when metadata is not rendered or not visible.
|
|
1291
|
+
*/
|
|
1292
|
+
async getMedataElement() {
|
|
1293
|
+
const root = this.getFullCssSelector();
|
|
1294
|
+
const locator = this.page.locator(`${root} ${METADATA_SELECTOR}`);
|
|
1295
|
+
if (!await locator.isVisible()) return null;
|
|
1296
|
+
return locator;
|
|
1297
|
+
}
|
|
1298
|
+
/**
|
|
1299
|
+
* Returns the name of the uploaded file, or null if not present.
|
|
1300
|
+
*/
|
|
1301
|
+
async getFileName() {
|
|
1302
|
+
const root = this.getFullCssSelector();
|
|
1303
|
+
const locator = this.page.locator(`${root} ${FILE_NAME_SELECTOR}`);
|
|
1304
|
+
if (!await locator.isVisible()) return null;
|
|
1305
|
+
const text = await locator.innerText();
|
|
1306
|
+
return text?.trim() || null;
|
|
1307
|
+
}
|
|
1308
|
+
/**
|
|
1309
|
+
* Returns the size of the uploaded file, or null if not present.
|
|
1310
|
+
*/
|
|
1311
|
+
async getFileSize() {
|
|
1312
|
+
const element = await this.getMedataElement();
|
|
1313
|
+
if (!element) return null;
|
|
1314
|
+
const result = (await element.getAttribute(FILE_SIZE_ATTRIBUTE))?.trim();
|
|
1315
|
+
return isNaN(+result) ? null : +result;
|
|
1316
|
+
}
|
|
1317
|
+
/**
|
|
1318
|
+
* Returns the upload/modification date of the file, or null if not present.
|
|
1319
|
+
*/
|
|
1320
|
+
async getFileDate() {
|
|
1321
|
+
const element = await this.getMedataElement();
|
|
1322
|
+
if (!element) return null;
|
|
1323
|
+
const fileModDate = (await element.getAttribute(FILE_DATE_ATTRIBUTE))?.trim();
|
|
1324
|
+
return fileModDate ? new Date(fileModDate) : null;
|
|
1325
|
+
}
|
|
1326
|
+
/**
|
|
1327
|
+
* Returns the MIME/content type of the uploaded file from metadata.
|
|
1328
|
+
* Returns null when the type attribute is absent or empty.
|
|
1329
|
+
*/
|
|
1330
|
+
async getFileType() {
|
|
1331
|
+
const element = await this.getMedataElement();
|
|
1332
|
+
if (!element) return null;
|
|
1333
|
+
const fileType = (await element.getAttribute(FILE_TYPE_ATTRIBUTE))?.trim();
|
|
1334
|
+
return fileType || null;
|
|
1335
|
+
}
|
|
1336
|
+
/**
|
|
1337
|
+
* Returns current file information: name, size and upload/modification date.
|
|
1338
|
+
* Returns null if no file is uploaded.
|
|
1339
|
+
*/
|
|
1340
|
+
async getValue() {
|
|
1341
|
+
const name = await this.getFileName();
|
|
1342
|
+
const size = await this.getFileSize();
|
|
1343
|
+
const date = await this.getFileDate();
|
|
1344
|
+
const type2 = await this.getFileType();
|
|
1345
|
+
if (!name && !size && !date && !type2) return null;
|
|
1346
|
+
return { FileName: name, FileSize: size, FileType: type2, ModDate: date };
|
|
1347
|
+
}
|
|
1348
|
+
/**
|
|
1349
|
+
* Uploads a file by clicking the select-file-button and providing the file path.
|
|
1350
|
+
* @param filePath - Absolute or relative path to the file on disk.
|
|
1351
|
+
*/
|
|
1352
|
+
async setValue(filePath) {
|
|
1353
|
+
const root = this.getFullCssSelector();
|
|
1354
|
+
const fileChooserPromise = this.page.waitForEvent("filechooser");
|
|
1355
|
+
await this.page.locator(`${root} ${SELECT_FILE_BUTTON_SELECTOR}`).click();
|
|
1356
|
+
const fileChooser = await fileChooserPromise;
|
|
1357
|
+
await fileChooser.setFiles(filePath);
|
|
1358
|
+
}
|
|
1359
|
+
/**
|
|
1360
|
+
* Downloads the currently uploaded file by clicking the download-file-button.
|
|
1361
|
+
* Returns the suggested file name of the downloaded file.
|
|
1362
|
+
*/
|
|
1363
|
+
async download() {
|
|
1364
|
+
const root = this.getFullCssSelector();
|
|
1365
|
+
const buttonLocator = this.page.locator(
|
|
1366
|
+
`${root} ${DOWNLOAD_FILE_BUTTON_SELECTOR}`
|
|
1367
|
+
);
|
|
1368
|
+
if (await buttonLocator.isHidden()) return "";
|
|
1369
|
+
const downloadPromise = this.page.waitForEvent("download");
|
|
1370
|
+
await buttonLocator.click();
|
|
1371
|
+
const download = await downloadPromise;
|
|
1372
|
+
return download.suggestedFilename();
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Removes the currently uploaded file by clicking the delete-file-button.
|
|
1376
|
+
* Does nothing if no file is uploaded.
|
|
1377
|
+
*/
|
|
1378
|
+
async clear() {
|
|
1379
|
+
if (await this.getValue() === null) return;
|
|
1380
|
+
const root = this.getFullCssSelector();
|
|
1381
|
+
const deleteButton = this.page.locator(`${root} ${CLEAR_BUTTON_SELECTOR}`);
|
|
1382
|
+
if (await deleteButton.isHidden()) return;
|
|
1383
|
+
await deleteButton.click();
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
}
|
|
1387
|
+
});
|
|
1388
|
+
|
|
1330
1389
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
1331
1390
|
var editorFactory;
|
|
1332
1391
|
var init_editorFactory = __esm({
|
|
@@ -1344,26 +1403,29 @@ var init_editorFactory = __esm({
|
|
|
1344
1403
|
init_ButtonGroup();
|
|
1345
1404
|
init_DateEditor();
|
|
1346
1405
|
init_HeaderFilterDictionary();
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
const
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
if (
|
|
1354
|
-
if (
|
|
1355
|
-
if (
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
if (
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1406
|
+
init_FileUploader();
|
|
1407
|
+
editorFactory = async (parentCssSelector, elementCssSelector, page) => {
|
|
1408
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1409
|
+
const classString = await elementInstance.getClasses();
|
|
1410
|
+
if ((classString.includes("text-control" /* Text */) || classString.includes("text-area-control" /* TextArea */)) && !classString.includes("single-date-range-control" /* SingleDateRange */))
|
|
1411
|
+
return new TextEditor(parentCssSelector, elementCssSelector, page);
|
|
1412
|
+
if (classString.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, page);
|
|
1413
|
+
if (classString.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, page);
|
|
1414
|
+
if (classString.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, page);
|
|
1415
|
+
if (classString.includes("select-control" /* Select */))
|
|
1416
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, page);
|
|
1417
|
+
if (classString.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, page);
|
|
1418
|
+
if (classString.includes("date-control" /* Date */) || classString.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
1419
|
+
return new DateEditor(parentCssSelector, elementCssSelector, page);
|
|
1420
|
+
}
|
|
1421
|
+
if (classString.includes("buttons-group" /* BooleanSelector */))
|
|
1422
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, page);
|
|
1423
|
+
if (classString.includes("button-group-field" /* ButtonGroup */))
|
|
1424
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, page);
|
|
1425
|
+
if (classString.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
|
|
1426
|
+
return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, page);
|
|
1427
|
+
if (classString.includes("file-uploader" /* FileUploader */))
|
|
1428
|
+
return new FileUploader(parentCssSelector, elementCssSelector, page);
|
|
1367
1429
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
1368
1430
|
};
|
|
1369
1431
|
}
|
|
@@ -1380,6 +1442,35 @@ var init_Editors = __esm({
|
|
|
1380
1442
|
}
|
|
1381
1443
|
});
|
|
1382
1444
|
|
|
1445
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
1446
|
+
var SubsystemItem;
|
|
1447
|
+
var init_SubsystemItem = __esm({
|
|
1448
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts"() {
|
|
1449
|
+
"use strict";
|
|
1450
|
+
init_waitElementIsVisible();
|
|
1451
|
+
SubsystemItem = class {
|
|
1452
|
+
bySelector;
|
|
1453
|
+
page;
|
|
1454
|
+
constructor({ page, bySelector }) {
|
|
1455
|
+
this.bySelector = bySelector;
|
|
1456
|
+
this.page = page;
|
|
1457
|
+
}
|
|
1458
|
+
getElement() {
|
|
1459
|
+
return this.page.locator(this.bySelector);
|
|
1460
|
+
}
|
|
1461
|
+
async getTitle() {
|
|
1462
|
+
await waitElementIsVisible_default({ locator: this.getElement() });
|
|
1463
|
+
const el = this.getElement();
|
|
1464
|
+
return await el.getAttribute("data-title");
|
|
1465
|
+
}
|
|
1466
|
+
async click() {
|
|
1467
|
+
const el = this.getElement();
|
|
1468
|
+
await el.click();
|
|
1469
|
+
}
|
|
1470
|
+
};
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
|
|
1383
1474
|
// src/utils/createDataTestId.ts
|
|
1384
1475
|
function createDataTestId(formName, itemType, itemName) {
|
|
1385
1476
|
return `${formName}-${itemType}-${itemName}`;
|
|
@@ -1414,51 +1505,160 @@ function createSubSystemTestId(itemName) {
|
|
|
1414
1505
|
function createEditorButtonTestId(itemName) {
|
|
1415
1506
|
return `${"editor-button" /* EDITOR_BUTTON */}-${itemName}`;
|
|
1416
1507
|
}
|
|
1508
|
+
function createLabelFieldTestId(formName, itemName) {
|
|
1509
|
+
return `${"label" /* LABEL */}-${createFieldTestId(formName, itemName)}`;
|
|
1510
|
+
}
|
|
1511
|
+
function createLabelDocFilterTestId(formName, itemName) {
|
|
1512
|
+
return `${"label" /* LABEL */}-${createDocFilterTestId(formName, itemName)}`;
|
|
1513
|
+
}
|
|
1514
|
+
function createLabelLayoutFilterTestId(formName, itemName) {
|
|
1515
|
+
return `${"label" /* LABEL */}-${createLayoutFilterTestId(formName, itemName)}`;
|
|
1516
|
+
}
|
|
1417
1517
|
var init_createDataTestId = __esm({
|
|
1418
1518
|
"src/utils/createDataTestId.ts"() {
|
|
1419
1519
|
"use strict";
|
|
1420
1520
|
}
|
|
1421
1521
|
});
|
|
1422
1522
|
|
|
1523
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
1524
|
+
var SEARCH_ITEM_SELECTOR, BACK_BUTTON_SELECTOR, SEARCH_INPUT_SELECTOR, byTitleCssSelector, SubsystemsPanel;
|
|
1525
|
+
var init_SubsystemsPanel = __esm({
|
|
1526
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts"() {
|
|
1527
|
+
"use strict";
|
|
1528
|
+
init_AbstractElement();
|
|
1529
|
+
init_SubsystemsPanelHeader();
|
|
1530
|
+
init_wait();
|
|
1531
|
+
init_locators();
|
|
1532
|
+
init_Editors();
|
|
1533
|
+
init_SubsystemItem();
|
|
1534
|
+
init_createDataTestId();
|
|
1535
|
+
init_ClearButtonStrategy();
|
|
1536
|
+
init_waitElementIsVisible();
|
|
1537
|
+
SEARCH_ITEM_SELECTOR = "search-item";
|
|
1538
|
+
BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
1539
|
+
SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
1540
|
+
byTitleCssSelector = (title) => {
|
|
1541
|
+
return `span[data-title="${title}"]`;
|
|
1542
|
+
};
|
|
1543
|
+
SubsystemsPanel = class extends AbstractElement {
|
|
1544
|
+
header;
|
|
1545
|
+
constructor(page) {
|
|
1546
|
+
super(page);
|
|
1547
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.page);
|
|
1548
|
+
}
|
|
1549
|
+
async headerTitle() {
|
|
1550
|
+
const title = await this.header.title();
|
|
1551
|
+
await wait(async () => await title.innerText() != "", this.page);
|
|
1552
|
+
return title.innerText();
|
|
1553
|
+
}
|
|
1554
|
+
getSearchComponent() {
|
|
1555
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.page);
|
|
1556
|
+
}
|
|
1557
|
+
/**
|
|
1558
|
+
* Находит сабсистему по заголовку
|
|
1559
|
+
* @example
|
|
1560
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1561
|
+
* //...
|
|
1562
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
1563
|
+
*/
|
|
1564
|
+
async search(title) {
|
|
1565
|
+
const searchComponent = this.getSearchComponent();
|
|
1566
|
+
await this.searchClear();
|
|
1567
|
+
await searchComponent.setValue(title);
|
|
1568
|
+
await wait(
|
|
1569
|
+
async () => {
|
|
1570
|
+
const findElement = this.itemByTitle(title).getElement();
|
|
1571
|
+
const classes = await findElement.getAttribute("class");
|
|
1572
|
+
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
1573
|
+
},
|
|
1574
|
+
this.page,
|
|
1575
|
+
`Cannot find element: ${title}`
|
|
1576
|
+
);
|
|
1577
|
+
}
|
|
1578
|
+
/**
|
|
1579
|
+
* Очищает поиск сабсистем
|
|
1580
|
+
* @example
|
|
1581
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1582
|
+
* //...
|
|
1583
|
+
* await subsystemsPanel.searchClear();
|
|
1584
|
+
*/
|
|
1585
|
+
async searchClear() {
|
|
1586
|
+
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} ${DX_CLEAR_BUTTON_AREA}`;
|
|
1587
|
+
const clearBtn = this.page.locator(clearBtnSelector);
|
|
1588
|
+
if (await clearBtn.isVisible()) {
|
|
1589
|
+
await clearBtn.click();
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
/**
|
|
1593
|
+
* Возвращает сабсистему по имени
|
|
1594
|
+
* @example
|
|
1595
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1596
|
+
* //...
|
|
1597
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
1598
|
+
*/
|
|
1599
|
+
item(name) {
|
|
1600
|
+
const elementCSS = createSubSystemTestId(name);
|
|
1601
|
+
return new SubsystemItem({ page: this.page, bySelector: `${byTestIdCssSelector(elementCSS, "span")}` });
|
|
1602
|
+
}
|
|
1603
|
+
/**
|
|
1604
|
+
* Возвращает сабсистему по заголовку
|
|
1605
|
+
* @example
|
|
1606
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1607
|
+
* //...
|
|
1608
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
1609
|
+
*/
|
|
1610
|
+
itemByTitle(title) {
|
|
1611
|
+
return new SubsystemItem({ page: this.page, bySelector: byTitleCssSelector(title) });
|
|
1612
|
+
}
|
|
1613
|
+
/**
|
|
1614
|
+
* Возвращается на уровень выше по сабсистемам
|
|
1615
|
+
* @example
|
|
1616
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1617
|
+
* //...
|
|
1618
|
+
* wait subsystemsPanel.back();
|
|
1619
|
+
*/
|
|
1620
|
+
async back() {
|
|
1621
|
+
const locator = this.page.locator(`#aside .${BACK_BUTTON_SELECTOR}`);
|
|
1622
|
+
await waitElementIsVisible_default({ locator });
|
|
1623
|
+
await locator.click();
|
|
1624
|
+
}
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
});
|
|
1628
|
+
|
|
1423
1629
|
// src/pageObjects/elements/AbstractButton.ts
|
|
1424
1630
|
var D5_BUTTON_IS_PRESSED, AbstractButton;
|
|
1425
1631
|
var init_AbstractButton = __esm({
|
|
1426
1632
|
"src/pageObjects/elements/AbstractButton.ts"() {
|
|
1427
1633
|
"use strict";
|
|
1428
1634
|
init_AbstractElementWithParent();
|
|
1429
|
-
init_actions();
|
|
1430
|
-
init_waitElementIsClickable();
|
|
1431
1635
|
D5_BUTTON_IS_PRESSED = "d5-is-pressed";
|
|
1432
1636
|
AbstractButton = class extends AbstractElementWithParent {
|
|
1433
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1434
|
-
super(parentCssSelector, elementCssSelector,
|
|
1637
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1638
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1639
|
+
}
|
|
1640
|
+
get button() {
|
|
1641
|
+
return this.getLocator();
|
|
1642
|
+
}
|
|
1643
|
+
getLocator() {
|
|
1644
|
+
return super.getLocator();
|
|
1435
1645
|
}
|
|
1436
1646
|
async click() {
|
|
1437
|
-
|
|
1438
|
-
await waitElementIsClickable_default({
|
|
1439
|
-
element: button,
|
|
1440
|
-
errorMessage: this.buttonNotDisplayedError(),
|
|
1441
|
-
driver: this.driver
|
|
1442
|
-
});
|
|
1443
|
-
await click(button, this.driver);
|
|
1647
|
+
await this.button.click();
|
|
1444
1648
|
}
|
|
1445
1649
|
async isDisabled() {
|
|
1446
|
-
|
|
1447
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
1650
|
+
return await this.button.isDisabled();
|
|
1448
1651
|
}
|
|
1449
|
-
async
|
|
1450
|
-
|
|
1451
|
-
const button = await this.getElement();
|
|
1452
|
-
return await button.isDisplayed();
|
|
1453
|
-
} catch {
|
|
1454
|
-
return false;
|
|
1455
|
-
}
|
|
1652
|
+
async isVisible() {
|
|
1653
|
+
return await this.button.isVisible();
|
|
1456
1654
|
}
|
|
1457
1655
|
async isPressed() {
|
|
1458
1656
|
try {
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1657
|
+
if (await this.button.isVisible()) {
|
|
1658
|
+
const classAttribute = await this.button.getAttribute("class");
|
|
1659
|
+
return classAttribute.includes(D5_BUTTON_IS_PRESSED);
|
|
1660
|
+
}
|
|
1661
|
+
return false;
|
|
1462
1662
|
} catch {
|
|
1463
1663
|
return false;
|
|
1464
1664
|
}
|
|
@@ -1468,21 +1668,22 @@ var init_AbstractButton = __esm({
|
|
|
1468
1668
|
});
|
|
1469
1669
|
|
|
1470
1670
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1471
|
-
var
|
|
1671
|
+
var DXButton;
|
|
1472
1672
|
var init_DXButton = __esm({
|
|
1473
1673
|
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
1474
1674
|
"use strict";
|
|
1475
1675
|
init_AbstractButton();
|
|
1476
|
-
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1477
1676
|
DXButton = class extends AbstractButton {
|
|
1478
1677
|
async getText() {
|
|
1479
1678
|
const classes = await this.getClasses();
|
|
1480
|
-
if (!classes
|
|
1679
|
+
if (!classes?.includes("dx-button-has-text")) {
|
|
1680
|
+
return null;
|
|
1681
|
+
}
|
|
1682
|
+
const textEl = this.getLocator().locator(".dx-button-text");
|
|
1683
|
+
if (!await textEl.count()) {
|
|
1481
1684
|
return null;
|
|
1482
1685
|
}
|
|
1483
|
-
|
|
1484
|
-
const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
|
|
1485
|
-
return await textEl.getText();
|
|
1686
|
+
return await textEl.innerText();
|
|
1486
1687
|
}
|
|
1487
1688
|
};
|
|
1488
1689
|
}
|
|
@@ -1498,8 +1699,8 @@ var init_FormButton = __esm({
|
|
|
1498
1699
|
init_DXButton();
|
|
1499
1700
|
FormButton = class extends DXButton {
|
|
1500
1701
|
name;
|
|
1501
|
-
constructor(parentCssSelector, formName, name,
|
|
1502
|
-
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)),
|
|
1702
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
1703
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), page);
|
|
1503
1704
|
this.name = name;
|
|
1504
1705
|
}
|
|
1505
1706
|
buttonNotDisplayedError() {
|
|
@@ -1519,9 +1720,9 @@ var init_AbstractGroup = __esm({
|
|
|
1519
1720
|
"use strict";
|
|
1520
1721
|
init_AbstractElementWithParent();
|
|
1521
1722
|
AbstractGroup = class extends AbstractElementWithParent {
|
|
1522
|
-
async
|
|
1523
|
-
const groupElement =
|
|
1524
|
-
return await groupElement.
|
|
1723
|
+
async isVisible() {
|
|
1724
|
+
const groupElement = this.getLocator();
|
|
1725
|
+
return await groupElement.isVisible();
|
|
1525
1726
|
}
|
|
1526
1727
|
};
|
|
1527
1728
|
}
|
|
@@ -1539,24 +1740,24 @@ var init_Panel = __esm({
|
|
|
1539
1740
|
});
|
|
1540
1741
|
|
|
1541
1742
|
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1542
|
-
var
|
|
1743
|
+
var TabPanelItem, TabPanel;
|
|
1543
1744
|
var init_TabPanel = __esm({
|
|
1544
1745
|
"src/pageObjects/elements/Groups/TabPanel.ts"() {
|
|
1545
1746
|
"use strict";
|
|
1546
1747
|
init_AbstractGroup();
|
|
1547
|
-
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1548
|
-
init_actions();
|
|
1549
1748
|
TabPanelItem = class extends AbstractGroup {
|
|
1550
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1551
|
-
super(parentCssSelector, elementCssSelector,
|
|
1749
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1750
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1751
|
+
}
|
|
1752
|
+
get itemElement() {
|
|
1753
|
+
return this.getLocator();
|
|
1552
1754
|
}
|
|
1553
1755
|
async click() {
|
|
1554
|
-
await
|
|
1756
|
+
await this.itemElement.click();
|
|
1555
1757
|
}
|
|
1556
1758
|
async isActive() {
|
|
1557
|
-
const
|
|
1558
|
-
|
|
1559
|
-
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1759
|
+
const tab = this.itemElement.locator('xpath=ancestor::div[@role="tab"][1]');
|
|
1760
|
+
return await tab.getAttribute("aria-selected") === "true";
|
|
1560
1761
|
}
|
|
1561
1762
|
async getTitle() {
|
|
1562
1763
|
return "";
|
|
@@ -1564,7 +1765,11 @@ var init_TabPanel = __esm({
|
|
|
1564
1765
|
};
|
|
1565
1766
|
TabPanel = class extends AbstractGroup {
|
|
1566
1767
|
item(name) {
|
|
1567
|
-
return new TabPanelItem(
|
|
1768
|
+
return new TabPanelItem(
|
|
1769
|
+
this.getFullCssSelector(),
|
|
1770
|
+
`.tab-panel-item[data-groupname="${name}"]`,
|
|
1771
|
+
this.page
|
|
1772
|
+
);
|
|
1568
1773
|
}
|
|
1569
1774
|
async getTitle() {
|
|
1570
1775
|
return "";
|
|
@@ -1574,37 +1779,35 @@ var init_TabPanel = __esm({
|
|
|
1574
1779
|
});
|
|
1575
1780
|
|
|
1576
1781
|
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1577
|
-
var
|
|
1782
|
+
var ACCORDION_TITLE_CONTAINER, AccordionItem;
|
|
1578
1783
|
var init_AccordionItem = __esm({
|
|
1579
1784
|
"src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
|
|
1580
1785
|
"use strict";
|
|
1581
1786
|
init_AbstractGroup();
|
|
1582
|
-
|
|
1583
|
-
init_actions();
|
|
1584
|
-
ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1787
|
+
ACCORDION_TITLE_CONTAINER = ".accordion-title-container";
|
|
1585
1788
|
AccordionItem = class extends AbstractGroup {
|
|
1586
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1587
|
-
super(parentCssSelector, elementCssSelector,
|
|
1789
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1790
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1588
1791
|
}
|
|
1589
1792
|
async getDataOpenedAccordItemAttr() {
|
|
1590
|
-
const
|
|
1591
|
-
|
|
1793
|
+
const locator = this.getLocator();
|
|
1794
|
+
if (await locator.isVisible()) {
|
|
1795
|
+
return locator.getAttribute("data-opened");
|
|
1796
|
+
}
|
|
1797
|
+
return "";
|
|
1592
1798
|
}
|
|
1593
1799
|
async clickAccordionItemTitle() {
|
|
1594
|
-
|
|
1595
|
-
const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver20.By.className(ACCORDION_TITLE_CONTAINER));
|
|
1596
|
-
await accordTitleElement.click();
|
|
1800
|
+
await this.getLocator().locator(ACCORDION_TITLE_CONTAINER).click();
|
|
1597
1801
|
}
|
|
1598
1802
|
async click() {
|
|
1599
|
-
await
|
|
1803
|
+
await this.getLocator().click();
|
|
1600
1804
|
}
|
|
1601
1805
|
async isExpanded() {
|
|
1602
|
-
|
|
1603
|
-
return dataOpened === "true";
|
|
1806
|
+
return await this.getDataOpenedAccordItemAttr() === "true";
|
|
1604
1807
|
}
|
|
1605
1808
|
async isCollapsed() {
|
|
1606
|
-
const
|
|
1607
|
-
return
|
|
1809
|
+
const opened = await this.getDataOpenedAccordItemAttr();
|
|
1810
|
+
return opened === "false" || opened === null;
|
|
1608
1811
|
}
|
|
1609
1812
|
async expand() {
|
|
1610
1813
|
if (!await this.isExpanded()) {
|
|
@@ -1628,11 +1831,11 @@ var init_Accordion = __esm({
|
|
|
1628
1831
|
init_AbstractGroup();
|
|
1629
1832
|
init_AccordionItem();
|
|
1630
1833
|
Accordion = class extends AbstractGroup {
|
|
1631
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1632
|
-
super(parentCssSelector, elementCssSelector,
|
|
1834
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1835
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1633
1836
|
}
|
|
1634
1837
|
item(name) {
|
|
1635
|
-
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.
|
|
1838
|
+
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.page);
|
|
1636
1839
|
}
|
|
1637
1840
|
};
|
|
1638
1841
|
}
|
|
@@ -1648,14 +1851,14 @@ var init_groupFactory = __esm({
|
|
|
1648
1851
|
init_TabPanel();
|
|
1649
1852
|
init_Accordion();
|
|
1650
1853
|
init_AccordionItem();
|
|
1651
|
-
groupFactory = async (parentCssSelector, elementCssSelector,
|
|
1652
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector,
|
|
1854
|
+
groupFactory = async (parentCssSelector, elementCssSelector, page) => {
|
|
1855
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1653
1856
|
const classSting = await elementInstance.getClasses();
|
|
1654
|
-
if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector,
|
|
1655
|
-
if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector,
|
|
1656
|
-
if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector,
|
|
1657
|
-
if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector,
|
|
1658
|
-
if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector,
|
|
1857
|
+
if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, page);
|
|
1858
|
+
if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, page);
|
|
1859
|
+
if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, page);
|
|
1860
|
+
if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, page);
|
|
1861
|
+
if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, page);
|
|
1659
1862
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1660
1863
|
};
|
|
1661
1864
|
}
|
|
@@ -1674,23 +1877,23 @@ var init_FormGroup = __esm({
|
|
|
1674
1877
|
init_TabPanel();
|
|
1675
1878
|
FormGroup = class extends AbstractElementWithParent {
|
|
1676
1879
|
groupInstance;
|
|
1677
|
-
constructor(parentCssSelector, formName, name,
|
|
1678
|
-
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)),
|
|
1880
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
1881
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), page);
|
|
1679
1882
|
}
|
|
1680
1883
|
async initInstance() {
|
|
1681
1884
|
if (!this.groupInstance) {
|
|
1682
|
-
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.
|
|
1885
|
+
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.page);
|
|
1683
1886
|
}
|
|
1684
1887
|
}
|
|
1685
1888
|
/**
|
|
1686
1889
|
* Возвращает булевое значение доступна ли группа
|
|
1687
1890
|
* @example
|
|
1688
|
-
* expect(await tableList.group('MainSuperPanel').
|
|
1891
|
+
* expect(await tableList.group('MainSuperPanel').isVisible();
|
|
1689
1892
|
*/
|
|
1690
|
-
async
|
|
1893
|
+
async isVisible() {
|
|
1691
1894
|
try {
|
|
1692
1895
|
await this.initInstance();
|
|
1693
|
-
return this.groupInstance.
|
|
1896
|
+
return this.groupInstance.isVisible();
|
|
1694
1897
|
} catch {
|
|
1695
1898
|
return false;
|
|
1696
1899
|
}
|
|
@@ -1766,10 +1969,12 @@ var init_AbstractForm = __esm({
|
|
|
1766
1969
|
AbstractForm = class extends AbstractPage {
|
|
1767
1970
|
containerCssSelector = "";
|
|
1768
1971
|
_formName = "";
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1972
|
+
get container() {
|
|
1973
|
+
return this.page.locator(this.containerCssSelector);
|
|
1974
|
+
}
|
|
1975
|
+
constructor(page) {
|
|
1976
|
+
super(page);
|
|
1977
|
+
}
|
|
1773
1978
|
set formName(name) {
|
|
1774
1979
|
this._formName = name;
|
|
1775
1980
|
}
|
|
@@ -1786,22 +1991,20 @@ var init_AbstractForm = __esm({
|
|
|
1786
1991
|
*/
|
|
1787
1992
|
async exists() {
|
|
1788
1993
|
try {
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
return false;
|
|
1792
|
-
}
|
|
1793
|
-
await waitElementIsVisible_default({
|
|
1794
|
-
element: elements[0],
|
|
1795
|
-
errorMessage: "Element exists in DOM but is not visible",
|
|
1796
|
-
driver: this.driver
|
|
1797
|
-
});
|
|
1994
|
+
const container = this.page.locator(this.containerCssSelector);
|
|
1995
|
+
await waitElementIsVisible_default({ locator: container, timeout: 3e3 });
|
|
1798
1996
|
return true;
|
|
1799
1997
|
} catch (error) {
|
|
1800
1998
|
return false;
|
|
1801
1999
|
}
|
|
1802
2000
|
}
|
|
1803
2001
|
button(name) {
|
|
1804
|
-
return new FormButton(
|
|
2002
|
+
return new FormButton(
|
|
2003
|
+
this.containerCssSelector,
|
|
2004
|
+
this.formName,
|
|
2005
|
+
name,
|
|
2006
|
+
this.page
|
|
2007
|
+
);
|
|
1805
2008
|
}
|
|
1806
2009
|
/**
|
|
1807
2010
|
* Находит группу на форме по имени
|
|
@@ -1811,7 +2014,12 @@ var init_AbstractForm = __esm({
|
|
|
1811
2014
|
* expect(await formEdit.group('Name');
|
|
1812
2015
|
*/
|
|
1813
2016
|
group(name) {
|
|
1814
|
-
return new FormGroup(
|
|
2017
|
+
return new FormGroup(
|
|
2018
|
+
this.containerCssSelector,
|
|
2019
|
+
this.formName,
|
|
2020
|
+
name,
|
|
2021
|
+
this.page
|
|
2022
|
+
);
|
|
1815
2023
|
}
|
|
1816
2024
|
};
|
|
1817
2025
|
}
|
|
@@ -1831,11 +2039,10 @@ function getCssRowByIndexSelector(index) {
|
|
|
1831
2039
|
function getCssCellByIndexSelector(index) {
|
|
1832
2040
|
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1833
2041
|
}
|
|
1834
|
-
var
|
|
2042
|
+
var getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
1835
2043
|
var init_utils2 = __esm({
|
|
1836
2044
|
"src/pageObjects/elements/Table/utils.ts"() {
|
|
1837
2045
|
"use strict";
|
|
1838
|
-
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1839
2046
|
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1840
2047
|
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1841
2048
|
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
@@ -1852,19 +2059,18 @@ var init_types3 = __esm({
|
|
|
1852
2059
|
});
|
|
1853
2060
|
|
|
1854
2061
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1855
|
-
var
|
|
2062
|
+
var Cell;
|
|
1856
2063
|
var init_Cell = __esm({
|
|
1857
2064
|
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
1858
2065
|
"use strict";
|
|
1859
|
-
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1860
2066
|
init_AbstractElementWithParent();
|
|
1861
2067
|
init_utils2();
|
|
1862
2068
|
init_types3();
|
|
1863
2069
|
Cell = class extends AbstractElementWithParent {
|
|
1864
2070
|
_index;
|
|
1865
2071
|
getCellIndex;
|
|
1866
|
-
constructor(parentCssSelector, getCellIndex,
|
|
1867
|
-
super(parentCssSelector, getCssCellByIndexSelector(index),
|
|
2072
|
+
constructor(parentCssSelector, getCellIndex, page, index) {
|
|
2073
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), page);
|
|
1868
2074
|
this.getCellIndex = getCellIndex;
|
|
1869
2075
|
this._index = index;
|
|
1870
2076
|
}
|
|
@@ -1873,25 +2079,27 @@ var init_Cell = __esm({
|
|
|
1873
2079
|
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1874
2080
|
}
|
|
1875
2081
|
async getBooleanValue(cellEl) {
|
|
1876
|
-
const booleanEl =
|
|
1877
|
-
|
|
2082
|
+
const booleanEl = cellEl.locator(".boolean-widget");
|
|
2083
|
+
const checked = await booleanEl.getAttribute("aria-checked");
|
|
2084
|
+
return checked === "true" ? 1 : 0;
|
|
1878
2085
|
}
|
|
1879
2086
|
async getTagsValue(cellEl) {
|
|
1880
|
-
const
|
|
1881
|
-
const
|
|
2087
|
+
const tags = cellEl.locator(".multiselect-container .multiselect-cell");
|
|
2088
|
+
const count = await tags.count();
|
|
1882
2089
|
const values = [];
|
|
1883
|
-
for (
|
|
1884
|
-
|
|
2090
|
+
for (let i = 0; i < count; i++) {
|
|
2091
|
+
const text = await tags.nth(i).innerText();
|
|
2092
|
+
if (text) values.push(text.trim());
|
|
1885
2093
|
}
|
|
1886
2094
|
return values.length ? values : null;
|
|
1887
2095
|
}
|
|
1888
2096
|
async getNumberValue(cellEl) {
|
|
1889
|
-
const
|
|
1890
|
-
return
|
|
2097
|
+
const text = (await cellEl.innerText())?.trim() ?? "";
|
|
2098
|
+
return text === "" ? null : Number.parseFloat(text);
|
|
1891
2099
|
}
|
|
1892
2100
|
async getDateValue(cellEl, cellElClass) {
|
|
1893
|
-
const value = (await cellEl.
|
|
1894
|
-
if (value
|
|
2101
|
+
const value = (await cellEl.innerText())?.trim() ?? "";
|
|
2102
|
+
if (!value) return null;
|
|
1895
2103
|
const getDate = (stringDate) => {
|
|
1896
2104
|
const isWithTime = cellElClass.includes("with-time");
|
|
1897
2105
|
try {
|
|
@@ -1917,21 +2125,21 @@ var init_Cell = __esm({
|
|
|
1917
2125
|
}
|
|
1918
2126
|
return getDate(value);
|
|
1919
2127
|
}
|
|
1920
|
-
async
|
|
2128
|
+
async getLocator() {
|
|
1921
2129
|
if (this._index == null) {
|
|
1922
2130
|
this.index = await this.getCellIndex();
|
|
1923
2131
|
}
|
|
1924
|
-
return
|
|
2132
|
+
return this.syncLocator();
|
|
1925
2133
|
}
|
|
1926
2134
|
async getValue() {
|
|
1927
|
-
const cellEl = await this.
|
|
1928
|
-
const cellElClass = await cellEl.getAttribute("class");
|
|
2135
|
+
const cellEl = await this.getLocator();
|
|
2136
|
+
const cellElClass = await cellEl.getAttribute("class") ?? "";
|
|
1929
2137
|
if (cellElClass.includes("boolean-column" /* Boolean */)) return this.getBooleanValue(cellEl);
|
|
1930
2138
|
if (cellElClass.includes("tags-column" /* Tags */)) return this.getTagsValue(cellEl);
|
|
1931
2139
|
if (cellElClass.includes("number-column" /* Number */)) return this.getNumberValue(cellEl);
|
|
1932
2140
|
if (cellElClass.includes("date-column" /* Date */)) return this.getDateValue(cellEl, cellElClass);
|
|
1933
|
-
const cellText = await cellEl.
|
|
1934
|
-
return cellText
|
|
2141
|
+
const cellText = (await cellEl.innerText())?.trim() ?? "";
|
|
2142
|
+
return cellText === "" ? null : cellText;
|
|
1935
2143
|
}
|
|
1936
2144
|
getIndex() {
|
|
1937
2145
|
return this._index;
|
|
@@ -1941,17 +2149,14 @@ var init_Cell = __esm({
|
|
|
1941
2149
|
});
|
|
1942
2150
|
|
|
1943
2151
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1944
|
-
var
|
|
2152
|
+
var DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, FIRST_CLICKED_CELL_SELECTOR, Row;
|
|
1945
2153
|
var init_Row = __esm({
|
|
1946
2154
|
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
1947
2155
|
"use strict";
|
|
1948
|
-
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1949
2156
|
init_Cell();
|
|
1950
2157
|
init_utils2();
|
|
1951
2158
|
init_AbstractElementWithParent();
|
|
1952
|
-
init_actions();
|
|
1953
2159
|
init_wait();
|
|
1954
|
-
init_fixElementStaleError();
|
|
1955
2160
|
DX_SELECTION_CLASS = "dx-selection";
|
|
1956
2161
|
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
1957
2162
|
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
@@ -1964,11 +2169,11 @@ var init_Row = __esm({
|
|
|
1964
2169
|
* @param parentCssSelector
|
|
1965
2170
|
* @param fixedTableContentCssSelector
|
|
1966
2171
|
* @param index починається з 0 (в getCssRowByIndexSelector додається +1)
|
|
1967
|
-
* @param
|
|
2172
|
+
* @param page
|
|
1968
2173
|
* @param getColumnBy
|
|
1969
2174
|
*/
|
|
1970
|
-
constructor(parentCssSelector, fixedTableContentCssSelector, index,
|
|
1971
|
-
super(parentCssSelector, getCssRowByIndexSelector(index),
|
|
2175
|
+
constructor(parentCssSelector, fixedTableContentCssSelector, index, page, getColumnBy) {
|
|
2176
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), page);
|
|
1972
2177
|
this.index = index;
|
|
1973
2178
|
this.getColumnBy = getColumnBy;
|
|
1974
2179
|
this.fixedTableContentCssSelector = fixedTableContentCssSelector;
|
|
@@ -1976,10 +2181,8 @@ var init_Row = __esm({
|
|
|
1976
2181
|
_getCell({ index, name, title }) {
|
|
1977
2182
|
return new Cell(
|
|
1978
2183
|
this.getFullCssSelector(),
|
|
1979
|
-
() => {
|
|
1980
|
-
|
|
1981
|
-
},
|
|
1982
|
-
this.driver,
|
|
2184
|
+
() => this.getColumnBy({ title, name }).getIndex(),
|
|
2185
|
+
this.page,
|
|
1983
2186
|
index
|
|
1984
2187
|
);
|
|
1985
2188
|
}
|
|
@@ -1993,61 +2196,56 @@ var init_Row = __esm({
|
|
|
1993
2196
|
return this._getCell({ title });
|
|
1994
2197
|
}
|
|
1995
2198
|
async select(preserve = false) {
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
await safeWait(
|
|
2199
|
+
const rowEl = this.getLocator();
|
|
2200
|
+
const classes = await this.getClasses();
|
|
2201
|
+
const isSelected = classes.includes(DX_SELECTION_CLASS);
|
|
2202
|
+
const clickedElement = rowEl.locator(FIRST_CLICKED_CELL_SELECTOR);
|
|
2203
|
+
if (isSelected && !preserve) {
|
|
2204
|
+
await this.page.keyboard.up("Control");
|
|
2205
|
+
}
|
|
2206
|
+
if (preserve && !isSelected) {
|
|
2207
|
+
await this.page.keyboard.down("Control");
|
|
2208
|
+
await clickedElement.click();
|
|
2209
|
+
return;
|
|
2210
|
+
}
|
|
2211
|
+
await clickedElement.click();
|
|
2212
|
+
await wait(
|
|
2011
2213
|
async () => {
|
|
2012
|
-
const
|
|
2013
|
-
return
|
|
2214
|
+
const classes2 = await this.getClasses();
|
|
2215
|
+
return classes2.includes(DX_SELECTION_CLASS);
|
|
2014
2216
|
},
|
|
2015
|
-
this.
|
|
2217
|
+
this.page,
|
|
2016
2218
|
"Cannot select row"
|
|
2017
2219
|
);
|
|
2018
2220
|
}
|
|
2019
2221
|
async isSelected() {
|
|
2020
|
-
const
|
|
2021
|
-
|
|
2222
|
+
const rowEl = this.getLocator();
|
|
2223
|
+
const ariaSelected = await rowEl.getAttribute("aria-selected");
|
|
2224
|
+
return ariaSelected === "true";
|
|
2022
2225
|
}
|
|
2023
2226
|
getIndex() {
|
|
2024
2227
|
return this.index;
|
|
2025
2228
|
}
|
|
2026
2229
|
async getCells() {
|
|
2027
|
-
const
|
|
2230
|
+
const rowEl = this.getLocator();
|
|
2231
|
+
const cellsCount = await rowEl.locator('td[role="gridcell"]').count();
|
|
2028
2232
|
const result = [];
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
});
|
|
2233
|
+
for (let i = 0; i < cellsCount; i++) {
|
|
2234
|
+
result.push(this.getCellByIndex(i));
|
|
2235
|
+
}
|
|
2033
2236
|
return result;
|
|
2034
2237
|
}
|
|
2035
2238
|
async clickInlineButton(buttonClass) {
|
|
2036
|
-
const
|
|
2037
|
-
|
|
2038
|
-
)
|
|
2039
|
-
const by = import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
|
|
2040
|
-
await staleElementAction(async () => {
|
|
2041
|
-
const button = await fixElementStaleError(by, this.driver);
|
|
2042
|
-
await click(button, this.driver);
|
|
2043
|
-
});
|
|
2239
|
+
const buttonSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
|
|
2240
|
+
const button = this.page.locator(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonSelector}`);
|
|
2241
|
+
await button.click();
|
|
2044
2242
|
}
|
|
2045
2243
|
async checkEditingMode(isEditing, msg) {
|
|
2046
|
-
await
|
|
2244
|
+
await wait(
|
|
2047
2245
|
async () => {
|
|
2048
2246
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
2049
2247
|
},
|
|
2050
|
-
this.
|
|
2248
|
+
this.page,
|
|
2051
2249
|
msg
|
|
2052
2250
|
);
|
|
2053
2251
|
}
|
|
@@ -2068,39 +2266,37 @@ var init_Row = __esm({
|
|
|
2068
2266
|
});
|
|
2069
2267
|
|
|
2070
2268
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
2071
|
-
var
|
|
2269
|
+
var Column;
|
|
2072
2270
|
var init_Column = __esm({
|
|
2073
2271
|
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
2074
2272
|
"use strict";
|
|
2075
|
-
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
2076
2273
|
init_utils2();
|
|
2077
2274
|
init_AbstractElementWithParent();
|
|
2078
|
-
init_fixElementStaleError();
|
|
2079
2275
|
Column = class extends AbstractElementWithParent {
|
|
2080
2276
|
_index;
|
|
2081
2277
|
_caption;
|
|
2082
2278
|
_name;
|
|
2083
2279
|
headerCssSelector;
|
|
2084
|
-
constructor({ parentCssSelector, headerCssSelector, name, caption, index,
|
|
2085
|
-
super(parentCssSelector, "",
|
|
2280
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, page }) {
|
|
2281
|
+
super(parentCssSelector, "", page);
|
|
2086
2282
|
this._name = name;
|
|
2283
|
+
this.headerCssSelector = headerCssSelector;
|
|
2087
2284
|
this.index = index;
|
|
2088
2285
|
this._caption = caption;
|
|
2089
|
-
this.headerCssSelector = headerCssSelector;
|
|
2090
2286
|
}
|
|
2091
2287
|
set index(index) {
|
|
2092
2288
|
this._index = index;
|
|
2093
|
-
this.elementCssSelector = getColumnByIndexCssSelector(index)
|
|
2289
|
+
this.elementCssSelector = `${this.headerCssSelector} ${getColumnByIndexCssSelector(index)}`;
|
|
2094
2290
|
}
|
|
2095
2291
|
get index() {
|
|
2096
2292
|
return this._index;
|
|
2097
2293
|
}
|
|
2098
|
-
async
|
|
2294
|
+
async getLocator() {
|
|
2099
2295
|
await this.getIndex();
|
|
2100
|
-
return
|
|
2296
|
+
return this.syncLocator();
|
|
2101
2297
|
}
|
|
2102
2298
|
async getColumnHeaderIndexBy(cssSelector) {
|
|
2103
|
-
const column =
|
|
2299
|
+
const column = this.page.locator(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`);
|
|
2104
2300
|
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
2105
2301
|
}
|
|
2106
2302
|
async getIndexByCaption() {
|
|
@@ -2110,13 +2306,12 @@ var init_Column = __esm({
|
|
|
2110
2306
|
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
2111
2307
|
}
|
|
2112
2308
|
async caption() {
|
|
2113
|
-
const el = await this.
|
|
2114
|
-
|
|
2309
|
+
const el = await this.getLocator();
|
|
2310
|
+
const text = await el.innerText();
|
|
2311
|
+
return text?.trim() ?? null;
|
|
2115
2312
|
}
|
|
2116
2313
|
async getIndex() {
|
|
2117
|
-
if (this.index != null)
|
|
2118
|
-
return this.index;
|
|
2119
|
-
}
|
|
2314
|
+
if (this.index != null) return this.index;
|
|
2120
2315
|
if (this._caption != null) {
|
|
2121
2316
|
this.index = await this.getIndexByCaption();
|
|
2122
2317
|
return this.index;
|
|
@@ -2125,7 +2320,7 @@ var init_Column = __esm({
|
|
|
2125
2320
|
this.index = await this.getIndexByName();
|
|
2126
2321
|
return this.index;
|
|
2127
2322
|
}
|
|
2128
|
-
throw new Error("
|
|
2323
|
+
throw new Error("Cannot get the index in the column");
|
|
2129
2324
|
}
|
|
2130
2325
|
};
|
|
2131
2326
|
}
|
|
@@ -2139,31 +2334,24 @@ var init_EditorButton = __esm({
|
|
|
2139
2334
|
init_locators();
|
|
2140
2335
|
init_createDataTestId();
|
|
2141
2336
|
init_AbstractElementWithParent();
|
|
2142
|
-
init_waitElementIsClickable();
|
|
2143
|
-
init_actions();
|
|
2144
2337
|
EditorButton = class extends AbstractElementWithParent {
|
|
2145
2338
|
name;
|
|
2146
|
-
constructor(parentCssSelector, name,
|
|
2147
|
-
super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)),
|
|
2339
|
+
constructor(parentCssSelector, name, page) {
|
|
2340
|
+
super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), page);
|
|
2148
2341
|
this.name = name;
|
|
2149
2342
|
}
|
|
2150
2343
|
buttonNotDisplayedError() {
|
|
2151
2344
|
return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
2152
2345
|
}
|
|
2153
2346
|
async click() {
|
|
2154
|
-
const button =
|
|
2155
|
-
await
|
|
2156
|
-
element: button,
|
|
2157
|
-
errorMessage: this.buttonNotDisplayedError(),
|
|
2158
|
-
driver: this.driver
|
|
2159
|
-
});
|
|
2160
|
-
await click(button, this.driver);
|
|
2347
|
+
const button = this.getLocator();
|
|
2348
|
+
await button.click();
|
|
2161
2349
|
}
|
|
2162
|
-
async
|
|
2350
|
+
async isVisible() {
|
|
2163
2351
|
try {
|
|
2164
|
-
const button =
|
|
2165
|
-
return await button.
|
|
2166
|
-
} catch
|
|
2352
|
+
const button = this.getLocator();
|
|
2353
|
+
return await button.isVisible();
|
|
2354
|
+
} catch {
|
|
2167
2355
|
return false;
|
|
2168
2356
|
}
|
|
2169
2357
|
}
|
|
@@ -2171,6 +2359,25 @@ var init_EditorButton = __esm({
|
|
|
2171
2359
|
}
|
|
2172
2360
|
});
|
|
2173
2361
|
|
|
2362
|
+
// src/pageObjects/elements/EditorTitle.ts
|
|
2363
|
+
var CAPTION_TEXT_CLASS, EditorTitle;
|
|
2364
|
+
var init_EditorTitle = __esm({
|
|
2365
|
+
"src/pageObjects/elements/EditorTitle.ts"() {
|
|
2366
|
+
"use strict";
|
|
2367
|
+
init_AbstractElementWithParent();
|
|
2368
|
+
CAPTION_TEXT_CLASS = " .caption-text";
|
|
2369
|
+
EditorTitle = class extends AbstractElementWithParent {
|
|
2370
|
+
constructor({ parentCssSelector, elementCssSelector, page }) {
|
|
2371
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2372
|
+
}
|
|
2373
|
+
async getTitle() {
|
|
2374
|
+
const captionElement = this.getLocator().locator(CAPTION_TEXT_CLASS);
|
|
2375
|
+
return captionElement.innerText();
|
|
2376
|
+
}
|
|
2377
|
+
};
|
|
2378
|
+
}
|
|
2379
|
+
});
|
|
2380
|
+
|
|
2174
2381
|
// src/pageObjects/elements/AbstractEditor.ts
|
|
2175
2382
|
var AbstractEditor;
|
|
2176
2383
|
var init_AbstractEditor2 = __esm({
|
|
@@ -2179,14 +2386,17 @@ var init_AbstractEditor2 = __esm({
|
|
|
2179
2386
|
init_AbstractElementWithParent();
|
|
2180
2387
|
init_Editors();
|
|
2181
2388
|
init_EditorButton();
|
|
2389
|
+
init_EditorTitle();
|
|
2182
2390
|
AbstractEditor = class extends AbstractElementWithParent {
|
|
2183
2391
|
editor;
|
|
2184
|
-
|
|
2185
|
-
|
|
2392
|
+
_titleCssSelector;
|
|
2393
|
+
constructor({ parentCssSelector, elementCssSelector, titleCssSelector, page }) {
|
|
2394
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2395
|
+
this._titleCssSelector = titleCssSelector;
|
|
2186
2396
|
}
|
|
2187
2397
|
async initEditor() {
|
|
2188
2398
|
if (!this.editor) {
|
|
2189
|
-
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.
|
|
2399
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.page);
|
|
2190
2400
|
}
|
|
2191
2401
|
}
|
|
2192
2402
|
/**
|
|
@@ -2254,16 +2464,16 @@ var init_AbstractEditor2 = __esm({
|
|
|
2254
2464
|
return this.editor.isDisabled();
|
|
2255
2465
|
}
|
|
2256
2466
|
/**
|
|
2257
|
-
* Возвращает значение true|false в зависимости
|
|
2467
|
+
* Возвращает значение true|false в зависимости isVisible поле или нет
|
|
2258
2468
|
* @example
|
|
2259
|
-
* expect(await formEdit.field('NumberFld').
|
|
2260
|
-
* expect(await formEdit.field('TextFld').
|
|
2469
|
+
* expect(await formEdit.field('NumberFld').isVisible()).toBe(true);
|
|
2470
|
+
* expect(await formEdit.field('TextFld').isVisible()).toBe(false);
|
|
2261
2471
|
*/
|
|
2262
|
-
async
|
|
2472
|
+
async isVisible() {
|
|
2263
2473
|
try {
|
|
2264
2474
|
await this.initEditor();
|
|
2265
|
-
const element =
|
|
2266
|
-
return await element.
|
|
2475
|
+
const element = this.getLocator();
|
|
2476
|
+
return await element.isVisible();
|
|
2267
2477
|
} catch {
|
|
2268
2478
|
return false;
|
|
2269
2479
|
}
|
|
@@ -2276,7 +2486,33 @@ var init_AbstractEditor2 = __esm({
|
|
|
2276
2486
|
* await form.field('Name').button('editorButton).click()
|
|
2277
2487
|
*/
|
|
2278
2488
|
button(name) {
|
|
2279
|
-
return new EditorButton(this.getFullCssSelector(), name, this.
|
|
2489
|
+
return new EditorButton(this.getFullCssSelector(), name, this.page);
|
|
2490
|
+
}
|
|
2491
|
+
/**
|
|
2492
|
+
* Повертає загловок едітора
|
|
2493
|
+
* @example
|
|
2494
|
+
* expect(await formEdit.field('NumberFld').title()).toBe('Title1');
|
|
2495
|
+
* expect(await formEdit.field('TextFld').title()).toBe('Title2`);
|
|
2496
|
+
*/
|
|
2497
|
+
async title() {
|
|
2498
|
+
return new EditorTitle({
|
|
2499
|
+
elementCssSelector: this._titleCssSelector,
|
|
2500
|
+
parentCssSelector: this.parentCssSelector,
|
|
2501
|
+
page: this.page
|
|
2502
|
+
}).getTitle();
|
|
2503
|
+
}
|
|
2504
|
+
/**
|
|
2505
|
+
* Вивантажує файл і повертає назву файла. Доступний тільки для поля FileUploader.
|
|
2506
|
+
* @example
|
|
2507
|
+
* const fileName = await formEdit.field('FileField').downloadFile();
|
|
2508
|
+
* expect(filename()).toBe('file.pdf');
|
|
2509
|
+
*/
|
|
2510
|
+
async download() {
|
|
2511
|
+
await this.initEditor();
|
|
2512
|
+
if (!this.editor.download) {
|
|
2513
|
+
throw new Error("download is only available for the FileUploader field type.");
|
|
2514
|
+
}
|
|
2515
|
+
return this.editor.download();
|
|
2280
2516
|
}
|
|
2281
2517
|
};
|
|
2282
2518
|
}
|
|
@@ -2287,39 +2523,18 @@ var FormField;
|
|
|
2287
2523
|
var init_FormField = __esm({
|
|
2288
2524
|
"src/pageObjects/elements/FormField.ts"() {
|
|
2289
2525
|
"use strict";
|
|
2290
|
-
init_locators();
|
|
2291
|
-
init_createDataTestId();
|
|
2292
|
-
init_AbstractEditor2();
|
|
2293
|
-
FormField = class extends AbstractEditor {
|
|
2294
|
-
constructor(parentCssSelector, formName, name,
|
|
2295
|
-
super(
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
var import_util, types, type, isArray, isString;
|
|
2303
|
-
var init_typesUtil = __esm({
|
|
2304
|
-
"src/utils/typesUtil.ts"() {
|
|
2305
|
-
"use strict";
|
|
2306
|
-
import_util = require("selenium-webdriver/lib/util");
|
|
2307
|
-
types = {
|
|
2308
|
-
"[object Array]": "array",
|
|
2309
|
-
"[object Date]": "date",
|
|
2310
|
-
"[object Object]": "object",
|
|
2311
|
-
"[object String]": "string",
|
|
2312
|
-
"[object Null]": "null"
|
|
2313
|
-
};
|
|
2314
|
-
type = function(object) {
|
|
2315
|
-
const typeOfObject = Object.prototype.toString.call(object);
|
|
2316
|
-
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
2317
|
-
};
|
|
2318
|
-
isArray = function(value) {
|
|
2319
|
-
return type(value) === "array";
|
|
2320
|
-
};
|
|
2321
|
-
isString = function(object) {
|
|
2322
|
-
return typeof object === "string";
|
|
2526
|
+
init_locators();
|
|
2527
|
+
init_createDataTestId();
|
|
2528
|
+
init_AbstractEditor2();
|
|
2529
|
+
FormField = class extends AbstractEditor {
|
|
2530
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
2531
|
+
super({
|
|
2532
|
+
parentCssSelector,
|
|
2533
|
+
elementCssSelector: byTestIdCssSelector(createFieldTestId(formName, name)),
|
|
2534
|
+
titleCssSelector: byTestIdCssSelector(createLabelFieldTestId(formName, name)),
|
|
2535
|
+
page
|
|
2536
|
+
});
|
|
2537
|
+
}
|
|
2323
2538
|
};
|
|
2324
2539
|
}
|
|
2325
2540
|
});
|
|
@@ -2330,32 +2545,21 @@ var init_AbstractDropDownMenuList = __esm({
|
|
|
2330
2545
|
"src/pageObjects/elements/AbstractDropDownMenuList.ts"() {
|
|
2331
2546
|
"use strict";
|
|
2332
2547
|
init_AbstractElementWithParent();
|
|
2333
|
-
init_actions();
|
|
2334
|
-
init_waitElementIsClickable();
|
|
2335
|
-
init_fixElementStaleError();
|
|
2336
2548
|
init_typesUtil();
|
|
2337
2549
|
AbstractDropDownMenuList = class extends AbstractElementWithParent {
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
async clickItemBy(errorMessage, by) {
|
|
2342
|
-
await waitElementIsClickable_default({
|
|
2343
|
-
errorMessage,
|
|
2344
|
-
driver: this.driver,
|
|
2345
|
-
by
|
|
2346
|
-
});
|
|
2347
|
-
const menuItemElement = await fixElementStaleError(by, this.driver);
|
|
2348
|
-
await click(menuItemElement, this.driver);
|
|
2550
|
+
async clickItemBy(locator) {
|
|
2551
|
+
const menuItemElement = this.page.locator(locator);
|
|
2552
|
+
await menuItemElement.click();
|
|
2349
2553
|
}
|
|
2350
|
-
async getElementByPath(
|
|
2351
|
-
let pathList = isString(
|
|
2554
|
+
async getElementByPath(path, getBy, returnLastElement = false) {
|
|
2555
|
+
let pathList = isString(path) ? [path] : path;
|
|
2352
2556
|
let result = null;
|
|
2353
2557
|
let index = 1;
|
|
2354
2558
|
for (let text of pathList) {
|
|
2355
2559
|
if (!returnLastElement || index < pathList.length) {
|
|
2356
|
-
await this.clickItemBy(
|
|
2560
|
+
await this.clickItemBy(getBy(text));
|
|
2357
2561
|
} else {
|
|
2358
|
-
result =
|
|
2562
|
+
result = this.page.locator(getBy(text));
|
|
2359
2563
|
}
|
|
2360
2564
|
index++;
|
|
2361
2565
|
}
|
|
@@ -2380,26 +2584,12 @@ var init_AbstractDropDownMenuList = __esm({
|
|
|
2380
2584
|
}
|
|
2381
2585
|
});
|
|
2382
2586
|
|
|
2383
|
-
// src/utils/cssToXPath.ts
|
|
2384
|
-
function cssClassesToXPath(classNames) {
|
|
2385
|
-
const classNamesList = classNames.split(".").filter((className) => !!className);
|
|
2386
|
-
const chained = classNamesList.map((className) => `contains(@class, "${className}")`).join(" and ");
|
|
2387
|
-
return `[${chained}]`;
|
|
2388
|
-
}
|
|
2389
|
-
var init_cssToXPath = __esm({
|
|
2390
|
-
"src/utils/cssToXPath.ts"() {
|
|
2391
|
-
"use strict";
|
|
2392
|
-
}
|
|
2393
|
-
});
|
|
2394
|
-
|
|
2395
2587
|
// src/pageObjects/elements/DXContextMenuList.ts
|
|
2396
|
-
var
|
|
2588
|
+
var CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
|
|
2397
2589
|
var init_DXContextMenuList = __esm({
|
|
2398
2590
|
"src/pageObjects/elements/DXContextMenuList.ts"() {
|
|
2399
2591
|
"use strict";
|
|
2400
2592
|
init_AbstractDropDownMenuList();
|
|
2401
|
-
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2402
|
-
init_cssToXPath();
|
|
2403
2593
|
init_waitElementIsVisible();
|
|
2404
2594
|
CONTEXT_MENU_CLASS = "dx-context-menu";
|
|
2405
2595
|
CONTEXT_MENU_ITEM_TEXT_CLASS = "dx-menu-item-text";
|
|
@@ -2407,23 +2597,21 @@ var init_DXContextMenuList = __esm({
|
|
|
2407
2597
|
/**
|
|
2408
2598
|
* @param parentCssSelector
|
|
2409
2599
|
* @param classNames - Список класів. Починається з крапки
|
|
2410
|
-
* @param
|
|
2600
|
+
* @param page
|
|
2411
2601
|
*/
|
|
2412
|
-
constructor(parentCssSelector, classNames,
|
|
2413
|
-
super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`,
|
|
2602
|
+
constructor(parentCssSelector, classNames, page) {
|
|
2603
|
+
super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, page);
|
|
2414
2604
|
}
|
|
2415
2605
|
getButtonTitleBy(title) {
|
|
2416
|
-
|
|
2417
|
-
const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
|
|
2418
|
-
return import_selenium_webdriver25.By.xpath(xpath);
|
|
2606
|
+
return `${this.elementCssSelector} span.${CONTEXT_MENU_ITEM_TEXT_CLASS}:has-text("${title}")`;
|
|
2419
2607
|
}
|
|
2420
2608
|
async isVisible() {
|
|
2421
2609
|
try {
|
|
2610
|
+
const el = this.page.locator(`.dx-overlay-wrapper .${CONTEXT_MENU_CLASS}`);
|
|
2422
2611
|
await waitElementIsVisible_default({
|
|
2423
|
-
|
|
2424
|
-
driver: this.driver,
|
|
2425
|
-
errorMessage: "Cannot find dropdown element"
|
|
2612
|
+
locator: el
|
|
2426
2613
|
});
|
|
2614
|
+
return true;
|
|
2427
2615
|
} catch {
|
|
2428
2616
|
return false;
|
|
2429
2617
|
}
|
|
@@ -2442,8 +2630,8 @@ var init_ContextMenu = __esm({
|
|
|
2442
2630
|
ContextMenu = class extends DXContextMenuList {
|
|
2443
2631
|
_formName;
|
|
2444
2632
|
_initFn;
|
|
2445
|
-
constructor(cssClass, formName,
|
|
2446
|
-
super("", cssClass,
|
|
2633
|
+
constructor(cssClass, formName, page) {
|
|
2634
|
+
super("", cssClass, page);
|
|
2447
2635
|
this._formName = formName;
|
|
2448
2636
|
}
|
|
2449
2637
|
setInit(cb) {
|
|
@@ -2451,7 +2639,7 @@ var init_ContextMenu = __esm({
|
|
|
2451
2639
|
return this;
|
|
2452
2640
|
}
|
|
2453
2641
|
getButtonNameBy(name) {
|
|
2454
|
-
return
|
|
2642
|
+
return byTestIdCssSelector(`cm-${this._formName}-${name}`);
|
|
2455
2643
|
}
|
|
2456
2644
|
async clickButtonByTitle(title) {
|
|
2457
2645
|
await this._initFn?.();
|
|
@@ -2466,20 +2654,17 @@ var init_ContextMenu = __esm({
|
|
|
2466
2654
|
});
|
|
2467
2655
|
|
|
2468
2656
|
// src/pageObjects/elements/Table/Table.ts
|
|
2469
|
-
var
|
|
2657
|
+
var Table;
|
|
2470
2658
|
var init_Table = __esm({
|
|
2471
2659
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
2472
2660
|
"use strict";
|
|
2473
|
-
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2474
2661
|
init_createDataTestId();
|
|
2475
2662
|
init_AbstractElementWithParent();
|
|
2476
2663
|
init_Row();
|
|
2477
2664
|
init_Column();
|
|
2478
2665
|
init_FormField();
|
|
2479
2666
|
init_ContextMenu();
|
|
2480
|
-
init_actions();
|
|
2481
2667
|
init_wait();
|
|
2482
|
-
init_withCustomTimeouts();
|
|
2483
2668
|
Table = class extends AbstractElementWithParent {
|
|
2484
2669
|
formName;
|
|
2485
2670
|
headerCssSelector;
|
|
@@ -2493,9 +2678,9 @@ var init_Table = __esm({
|
|
|
2493
2678
|
headerCssSelector,
|
|
2494
2679
|
fixedTableContentCssSelector,
|
|
2495
2680
|
formName,
|
|
2496
|
-
|
|
2681
|
+
page
|
|
2497
2682
|
}) {
|
|
2498
|
-
super(parentCssSelector, `#${createTableId(formName)}`,
|
|
2683
|
+
super(parentCssSelector, `#${createTableId(formName)}`, page);
|
|
2499
2684
|
this.formName = formName;
|
|
2500
2685
|
this.headerCssSelector = headerCssSelector;
|
|
2501
2686
|
this.contextMenuCssSelector = contextMenuCssSelector;
|
|
@@ -2513,7 +2698,7 @@ var init_Table = __esm({
|
|
|
2513
2698
|
* @param index починається з 0
|
|
2514
2699
|
*/
|
|
2515
2700
|
getRowByIndex(index) {
|
|
2516
|
-
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.
|
|
2701
|
+
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.page, this.getColumnBy);
|
|
2517
2702
|
}
|
|
2518
2703
|
/**
|
|
2519
2704
|
* @param index починається з 0
|
|
@@ -2522,26 +2707,27 @@ var init_Table = __esm({
|
|
|
2522
2707
|
this.getRowByIndex(index);
|
|
2523
2708
|
return new Column({
|
|
2524
2709
|
parentCssSelector: this.getFullCssSelector(),
|
|
2525
|
-
|
|
2710
|
+
headerCssSelector: this.headerCssSelector,
|
|
2711
|
+
page: this.page,
|
|
2526
2712
|
index
|
|
2527
2713
|
});
|
|
2528
2714
|
}
|
|
2529
|
-
getColumnByTitle
|
|
2715
|
+
getColumnByTitle(title) {
|
|
2530
2716
|
return new Column({
|
|
2531
2717
|
parentCssSelector: this.getFullCssSelector(),
|
|
2532
2718
|
headerCssSelector: this.headerCssSelector,
|
|
2533
2719
|
caption: title,
|
|
2534
|
-
|
|
2720
|
+
page: this.page
|
|
2535
2721
|
});
|
|
2536
|
-
}
|
|
2537
|
-
getColumnByName
|
|
2722
|
+
}
|
|
2723
|
+
getColumnByName(name) {
|
|
2538
2724
|
return new Column({
|
|
2539
2725
|
parentCssSelector: this.getFullCssSelector(),
|
|
2540
2726
|
headerCssSelector: this.headerCssSelector,
|
|
2541
2727
|
name,
|
|
2542
|
-
|
|
2728
|
+
page: this.page
|
|
2543
2729
|
});
|
|
2544
|
-
}
|
|
2730
|
+
}
|
|
2545
2731
|
/**
|
|
2546
2732
|
* Вибрати рядок по індексу.
|
|
2547
2733
|
* @param index починається з 0
|
|
@@ -2559,48 +2745,31 @@ var init_Table = __esm({
|
|
|
2559
2745
|
await this.selectRowByIndex(index, true);
|
|
2560
2746
|
}
|
|
2561
2747
|
}
|
|
2562
|
-
getRowElements(
|
|
2563
|
-
const
|
|
2564
|
-
return
|
|
2565
|
-
driver: this.driver,
|
|
2566
|
-
timeout,
|
|
2567
|
-
callback: () => {
|
|
2568
|
-
return this.driver.findElements(import_selenium_webdriver26.By.css(rowsFullCssSelector));
|
|
2569
|
-
}
|
|
2570
|
-
});
|
|
2748
|
+
getRowElements() {
|
|
2749
|
+
const rowsSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
2750
|
+
return this.page.locator(rowsSelector);
|
|
2571
2751
|
}
|
|
2572
2752
|
async getRows() {
|
|
2573
|
-
const
|
|
2753
|
+
const rowCount = await this.getRowElements().count();
|
|
2574
2754
|
const result = [];
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
this.fixedTableContentCssSelector,
|
|
2579
|
-
index,
|
|
2580
|
-
this.driver,
|
|
2581
|
-
this.getColumnBy
|
|
2582
|
-
);
|
|
2583
|
-
result.push(newRow);
|
|
2584
|
-
});
|
|
2755
|
+
for (let i = 0; i < rowCount; i++) {
|
|
2756
|
+
result.push(this.getRowByIndex(i));
|
|
2757
|
+
}
|
|
2585
2758
|
return result;
|
|
2586
2759
|
}
|
|
2587
2760
|
async getColumns() {
|
|
2588
|
-
const
|
|
2589
|
-
|
|
2761
|
+
const columnsLocator = this.page.locator(
|
|
2762
|
+
`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`
|
|
2590
2763
|
);
|
|
2764
|
+
const count = await columnsLocator.count();
|
|
2591
2765
|
const result = [];
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
index,
|
|
2596
|
-
driver: this.driver
|
|
2597
|
-
});
|
|
2598
|
-
result.push(newCol);
|
|
2599
|
-
});
|
|
2766
|
+
for (let i = 0; i < count; i++) {
|
|
2767
|
+
result.push(new Column({ parentCssSelector: this.getFullCssSelector(), page: this.page, index: i }));
|
|
2768
|
+
}
|
|
2600
2769
|
return result;
|
|
2601
2770
|
}
|
|
2602
2771
|
element() {
|
|
2603
|
-
return this.
|
|
2772
|
+
return this.getLocator();
|
|
2604
2773
|
}
|
|
2605
2774
|
/**
|
|
2606
2775
|
* Находит поле когда форма находится в состоянии редактирования
|
|
@@ -2610,7 +2779,7 @@ var init_Table = __esm({
|
|
|
2610
2779
|
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
2611
2780
|
*/
|
|
2612
2781
|
field(name) {
|
|
2613
|
-
return new FormField(this.getFullCssSelector(), this.formName, name, this.
|
|
2782
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.page);
|
|
2614
2783
|
}
|
|
2615
2784
|
/**
|
|
2616
2785
|
* Возвращает список строк которые выделены
|
|
@@ -2622,11 +2791,11 @@ var init_Table = __esm({
|
|
|
2622
2791
|
*/
|
|
2623
2792
|
async getSelectedRows() {
|
|
2624
2793
|
const rows = await this.getRows();
|
|
2625
|
-
|
|
2794
|
+
const result = [];
|
|
2626
2795
|
for (const row of rows) {
|
|
2627
2796
|
if (await row.isSelected()) {
|
|
2797
|
+
result.push(row);
|
|
2628
2798
|
}
|
|
2629
|
-
result.push(row);
|
|
2630
2799
|
}
|
|
2631
2800
|
return result;
|
|
2632
2801
|
}
|
|
@@ -2643,17 +2812,16 @@ var init_Table = __esm({
|
|
|
2643
2812
|
* await form.contextMenu('FieldName', 3).clickButton(['Group', 'ButtonInGroup']);
|
|
2644
2813
|
*/
|
|
2645
2814
|
contextMenu(fieldName, rowIndex) {
|
|
2646
|
-
return new ContextMenu(this.contextMenuCssSelector, this.formName, this.
|
|
2815
|
+
return new ContextMenu(this.contextMenuCssSelector, this.formName, this.page).setInit(async () => {
|
|
2647
2816
|
let row;
|
|
2648
2817
|
if (rowIndex != null) {
|
|
2649
2818
|
row = this.getRowByIndex(rowIndex);
|
|
2650
2819
|
} else {
|
|
2651
2820
|
[row] = await this.getSelectedRows();
|
|
2652
2821
|
}
|
|
2653
|
-
if (!row)
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
await contextMenu(cellElement, this.driver);
|
|
2822
|
+
if (!row) throw new Error("No row available row for context menu");
|
|
2823
|
+
const cellElement = await row.getCell(fieldName).getLocator();
|
|
2824
|
+
await cellElement.click({ button: "right" });
|
|
2657
2825
|
});
|
|
2658
2826
|
}
|
|
2659
2827
|
/**
|
|
@@ -2665,16 +2833,14 @@ var init_Table = __esm({
|
|
|
2665
2833
|
* @returns {Promise<string>} Повертає значення комірки
|
|
2666
2834
|
*
|
|
2667
2835
|
* @example
|
|
2668
|
-
* const table = new Table(
|
|
2836
|
+
* const table = new Table(page);
|
|
2669
2837
|
*
|
|
2670
2838
|
* // Отримання значення комірки 'Name' в першому рядку (індекс 0)
|
|
2671
2839
|
* const cellValue = await table.getCellValueByCellName('Name', 0);
|
|
2672
2840
|
* expect(cellValue).toBe('Очікуване значення');
|
|
2673
2841
|
*/
|
|
2674
2842
|
getCellValueByCellName(cellName, rowIndex) {
|
|
2675
|
-
if (rowIndex == null)
|
|
2676
|
-
throw new Error("Error: getCellValue(): rowIndex is required");
|
|
2677
|
-
}
|
|
2843
|
+
if (rowIndex == null) throw new Error("Error: getCellValue(): rowIndex is required");
|
|
2678
2844
|
const row = this.getRowByIndex(rowIndex);
|
|
2679
2845
|
return row.getCell(cellName).getValue();
|
|
2680
2846
|
}
|
|
@@ -2684,19 +2850,15 @@ var init_Table = __esm({
|
|
|
2684
2850
|
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
2685
2851
|
*
|
|
2686
2852
|
* @example
|
|
2687
|
-
* const table = new Table(
|
|
2853
|
+
* const table = new Table(page);
|
|
2688
2854
|
*
|
|
2689
2855
|
* // Перевірка чи порожня таблиця
|
|
2690
2856
|
* const empty = await table.isEmpty();
|
|
2691
2857
|
* expect(empty).toBe(true);
|
|
2692
2858
|
*/
|
|
2693
2859
|
async isEmpty() {
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
return true;
|
|
2697
|
-
} catch {
|
|
2698
|
-
return false;
|
|
2699
|
-
}
|
|
2860
|
+
const rowCount = await this.getRowElements().count();
|
|
2861
|
+
return rowCount === 0;
|
|
2700
2862
|
}
|
|
2701
2863
|
/**
|
|
2702
2864
|
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
@@ -2707,7 +2869,7 @@ var init_Table = __esm({
|
|
|
2707
2869
|
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
2708
2870
|
*
|
|
2709
2871
|
* @example
|
|
2710
|
-
* const table = new Table(
|
|
2872
|
+
* const table = new Table(page);
|
|
2711
2873
|
*
|
|
2712
2874
|
* // Очікування, поки таблиця не стане порожньою
|
|
2713
2875
|
* await table.waitRowsCount(0);
|
|
@@ -2717,21 +2879,24 @@ var init_Table = __esm({
|
|
|
2717
2879
|
* console.log('Таблиця містить 5 рядків');
|
|
2718
2880
|
*/
|
|
2719
2881
|
async waitRowsCount(count) {
|
|
2720
|
-
await
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2882
|
+
await wait(
|
|
2883
|
+
async () => {
|
|
2884
|
+
const rowsCount = await this.getRowElements().count();
|
|
2885
|
+
return rowsCount === count;
|
|
2886
|
+
},
|
|
2887
|
+
this.page,
|
|
2888
|
+
`Rows count not equal: ${count}`
|
|
2889
|
+
);
|
|
2724
2890
|
}
|
|
2725
2891
|
};
|
|
2726
2892
|
}
|
|
2727
2893
|
});
|
|
2728
2894
|
|
|
2729
2895
|
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
2730
|
-
var
|
|
2896
|
+
var TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
|
|
2731
2897
|
var init_ToolbarButton = __esm({
|
|
2732
2898
|
"src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
|
|
2733
2899
|
"use strict";
|
|
2734
|
-
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2735
2900
|
init_AbstractButton();
|
|
2736
2901
|
init_locators();
|
|
2737
2902
|
TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
@@ -2741,8 +2906,8 @@ var init_ToolbarButton = __esm({
|
|
|
2741
2906
|
getToolbarButtonTextByTestIdSelector = (testId) => `${byTestIdCssSelector(testId)} .${TOOLBAR_BUTTON_TEXT_CLASS}`;
|
|
2742
2907
|
ToolbarButton = class extends AbstractButton {
|
|
2743
2908
|
name;
|
|
2744
|
-
constructor(parentCssSelector, name,
|
|
2745
|
-
super(parentCssSelector, getToolbarButtonSelector(name),
|
|
2909
|
+
constructor(parentCssSelector, name, page) {
|
|
2910
|
+
super(parentCssSelector, getToolbarButtonSelector(name), page);
|
|
2746
2911
|
this.name = name;
|
|
2747
2912
|
}
|
|
2748
2913
|
buttonNotDisplayedError() {
|
|
@@ -2750,8 +2915,8 @@ var init_ToolbarButton = __esm({
|
|
|
2750
2915
|
}
|
|
2751
2916
|
async getTitle() {
|
|
2752
2917
|
try {
|
|
2753
|
-
const buttonTextContainer =
|
|
2754
|
-
return await buttonTextContainer.
|
|
2918
|
+
const buttonTextContainer = this.page.locator(getToolbarButtonTextSelector(this.name));
|
|
2919
|
+
return await buttonTextContainer.innerText();
|
|
2755
2920
|
} catch (_) {
|
|
2756
2921
|
return null;
|
|
2757
2922
|
}
|
|
@@ -2761,17 +2926,16 @@ var init_ToolbarButton = __esm({
|
|
|
2761
2926
|
});
|
|
2762
2927
|
|
|
2763
2928
|
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
2764
|
-
var
|
|
2929
|
+
var ToolbarGroupButton;
|
|
2765
2930
|
var init_ToolbarGroupButton = __esm({
|
|
2766
2931
|
"src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
|
|
2767
2932
|
"use strict";
|
|
2768
2933
|
init_AbstractButton();
|
|
2769
|
-
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2770
2934
|
init_ToolbarButton();
|
|
2771
2935
|
ToolbarGroupButton = class extends AbstractButton {
|
|
2772
2936
|
name;
|
|
2773
|
-
constructor(parentCssSelector, name,
|
|
2774
|
-
super(parentCssSelector, ``,
|
|
2937
|
+
constructor(parentCssSelector, name, page) {
|
|
2938
|
+
super(parentCssSelector, ``, page);
|
|
2775
2939
|
this.name = name;
|
|
2776
2940
|
}
|
|
2777
2941
|
buttonNotDisplayedError() {
|
|
@@ -2780,8 +2944,8 @@ var init_ToolbarGroupButton = __esm({
|
|
|
2780
2944
|
async getTitle() {
|
|
2781
2945
|
try {
|
|
2782
2946
|
const buttonTestId = await this.getDataTestId();
|
|
2783
|
-
const buttonTextContainer =
|
|
2784
|
-
return await buttonTextContainer.
|
|
2947
|
+
const buttonTextContainer = this.page.locator(getToolbarButtonTextByTestIdSelector(buttonTestId));
|
|
2948
|
+
return await buttonTextContainer.innerText();
|
|
2785
2949
|
} catch (_) {
|
|
2786
2950
|
return null;
|
|
2787
2951
|
}
|
|
@@ -2796,16 +2960,15 @@ var init_AbstractDropDownMenuButton = __esm({
|
|
|
2796
2960
|
"src/pageObjects/elements/AbstractDropDownMenuButton.ts"() {
|
|
2797
2961
|
"use strict";
|
|
2798
2962
|
init_AbstractElementWithParent();
|
|
2799
|
-
init_actions();
|
|
2800
2963
|
AbstractDropDownMenuButton = class extends AbstractElementWithParent {
|
|
2801
2964
|
_list;
|
|
2802
|
-
constructor(parentCssSelector, elementCssSelector, list,
|
|
2803
|
-
super(parentCssSelector, elementCssSelector,
|
|
2965
|
+
constructor(parentCssSelector, elementCssSelector, list, page) {
|
|
2966
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2804
2967
|
this._list = list;
|
|
2805
2968
|
}
|
|
2806
2969
|
async openDropdownMenu() {
|
|
2807
|
-
const dropdown =
|
|
2808
|
-
await click(
|
|
2970
|
+
const dropdown = this.getLocator();
|
|
2971
|
+
await dropdown.click();
|
|
2809
2972
|
await this._list.isVisible();
|
|
2810
2973
|
}
|
|
2811
2974
|
async clickButton(name) {
|
|
@@ -2833,6 +2996,7 @@ var ToolbarMenuItem;
|
|
|
2833
2996
|
var init_ToolbarMenuItem = __esm({
|
|
2834
2997
|
"src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts"() {
|
|
2835
2998
|
"use strict";
|
|
2999
|
+
init_waitElementIsVisible();
|
|
2836
3000
|
ToolbarMenuItem = class {
|
|
2837
3001
|
getMenuItem;
|
|
2838
3002
|
name;
|
|
@@ -2840,26 +3004,44 @@ var init_ToolbarMenuItem = __esm({
|
|
|
2840
3004
|
this.getMenuItem = getMenuItem;
|
|
2841
3005
|
this.name = name;
|
|
2842
3006
|
}
|
|
3007
|
+
isPressed() {
|
|
3008
|
+
throw new Error("Method not implemented.");
|
|
3009
|
+
}
|
|
3010
|
+
getLocator() {
|
|
3011
|
+
throw new Error("Method not implemented.");
|
|
3012
|
+
}
|
|
2843
3013
|
async click() {
|
|
2844
|
-
|
|
2845
|
-
|
|
3014
|
+
try {
|
|
3015
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
3016
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
3017
|
+
await menuItemElement.click();
|
|
3018
|
+
} catch (error) {
|
|
3019
|
+
throw new Error(`Cannot click on toolbar menu item: ${this.name}`);
|
|
3020
|
+
}
|
|
2846
3021
|
}
|
|
2847
3022
|
async getTitle() {
|
|
2848
3023
|
try {
|
|
2849
3024
|
const menuItemElement = await this.getMenuItem(this.name);
|
|
2850
|
-
|
|
3025
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
3026
|
+
return await menuItemElement.innerText();
|
|
2851
3027
|
} catch (_) {
|
|
2852
3028
|
return null;
|
|
2853
3029
|
}
|
|
2854
3030
|
}
|
|
2855
3031
|
async isDisabled() {
|
|
2856
|
-
|
|
2857
|
-
|
|
3032
|
+
try {
|
|
3033
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
3034
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
3035
|
+
return await menuItemElement.isDisabled();
|
|
3036
|
+
} catch (_) {
|
|
3037
|
+
return false;
|
|
3038
|
+
}
|
|
2858
3039
|
}
|
|
2859
|
-
async
|
|
3040
|
+
async isVisible() {
|
|
2860
3041
|
try {
|
|
2861
3042
|
const menuItemElement = await this.getMenuItem(this.name);
|
|
2862
|
-
|
|
3043
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
3044
|
+
return await menuItemElement.isVisible();
|
|
2863
3045
|
} catch (_) {
|
|
2864
3046
|
return false;
|
|
2865
3047
|
}
|
|
@@ -2883,8 +3065,8 @@ var init_ToolbarMenu = __esm({
|
|
|
2883
3065
|
getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
2884
3066
|
ToolbarMenuList = class extends DXContextMenuList {
|
|
2885
3067
|
_formName;
|
|
2886
|
-
constructor(parentCssSelector, elementCssSelector, formName,
|
|
2887
|
-
super(parentCssSelector, elementCssSelector,
|
|
3068
|
+
constructor(parentCssSelector, elementCssSelector, formName, page) {
|
|
3069
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2888
3070
|
this._formName = formName;
|
|
2889
3071
|
}
|
|
2890
3072
|
getButtonNameBy(name) {
|
|
@@ -2892,10 +3074,10 @@ var init_ToolbarMenu = __esm({
|
|
|
2892
3074
|
}
|
|
2893
3075
|
};
|
|
2894
3076
|
ToolbarMenu = class extends AbstractDropDownMenuButton {
|
|
2895
|
-
constructor(parentCssSelector, formName, name,
|
|
3077
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
2896
3078
|
const fullSelector = getFullCssSelector(formName, name);
|
|
2897
|
-
const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName,
|
|
2898
|
-
super(parentCssSelector, fullSelector, list,
|
|
3079
|
+
const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, page);
|
|
3080
|
+
super(parentCssSelector, fullSelector, list, page);
|
|
2899
3081
|
}
|
|
2900
3082
|
checkNameValue(name) {
|
|
2901
3083
|
if (!isString(name) && !isArray(name))
|
|
@@ -2913,13 +3095,13 @@ var init_ToolbarMenu = __esm({
|
|
|
2913
3095
|
this.checkTitleValue(title);
|
|
2914
3096
|
return new ToolbarMenuItem(this.getMenuItemElementByTitle.bind(this), title);
|
|
2915
3097
|
}
|
|
2916
|
-
async
|
|
3098
|
+
async buttonIsVisible(name) {
|
|
2917
3099
|
const button = this.buttonByName(name);
|
|
2918
|
-
return await button.
|
|
3100
|
+
return await button.isVisible();
|
|
2919
3101
|
}
|
|
2920
|
-
async
|
|
3102
|
+
async buttonByTitleIsVisible(title) {
|
|
2921
3103
|
const button = this.buttonByTitle(title);
|
|
2922
|
-
return await button.
|
|
3104
|
+
return await button.isVisible();
|
|
2923
3105
|
}
|
|
2924
3106
|
async buttonTitle(name) {
|
|
2925
3107
|
const button = this.buttonByName(name);
|
|
@@ -2955,14 +3137,16 @@ var init_ToolbarItem = __esm({
|
|
|
2955
3137
|
init_ToolbarButton();
|
|
2956
3138
|
init_locators();
|
|
2957
3139
|
init_ToolbarMenu();
|
|
3140
|
+
init_waitElementIsVisible();
|
|
3141
|
+
init_wait();
|
|
2958
3142
|
GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
2959
3143
|
toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
2960
3144
|
ToolbarItem = class extends AbstractElementWithParent {
|
|
2961
3145
|
_button;
|
|
2962
3146
|
_formName;
|
|
2963
3147
|
_itemName;
|
|
2964
|
-
constructor(parentCssSelector, formName, itemName,
|
|
2965
|
-
super(parentCssSelector, toolbarItemSelector(formName, itemName),
|
|
3148
|
+
constructor(parentCssSelector, formName, itemName, page) {
|
|
3149
|
+
super(parentCssSelector, toolbarItemSelector(formName, itemName), page);
|
|
2966
3150
|
this._itemName = itemName;
|
|
2967
3151
|
this._formName = formName;
|
|
2968
3152
|
}
|
|
@@ -2970,23 +3154,36 @@ var init_ToolbarItem = __esm({
|
|
|
2970
3154
|
if (this._button) return this._button;
|
|
2971
3155
|
const classNames = await this.getClasses();
|
|
2972
3156
|
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
2973
|
-
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.
|
|
3157
|
+
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.page);
|
|
2974
3158
|
return;
|
|
2975
3159
|
}
|
|
2976
|
-
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.
|
|
3160
|
+
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.page);
|
|
2977
3161
|
}
|
|
2978
3162
|
async click() {
|
|
2979
|
-
|
|
2980
|
-
|
|
3163
|
+
try {
|
|
3164
|
+
await this.init();
|
|
3165
|
+
await wait(async () => {
|
|
3166
|
+
const element = this._button.getLocator();
|
|
3167
|
+
return await element.isEnabled() && await element.isVisible();
|
|
3168
|
+
}, this.page);
|
|
3169
|
+
await this._button.click();
|
|
3170
|
+
} catch (error) {
|
|
3171
|
+
throw new Error(`Cannot click on toolbar item: ${this._itemName}`);
|
|
3172
|
+
}
|
|
2981
3173
|
}
|
|
2982
3174
|
async isDisabled() {
|
|
2983
|
-
|
|
2984
|
-
|
|
3175
|
+
try {
|
|
3176
|
+
await this.init();
|
|
3177
|
+
await waitElementIsVisible_default({ locator: this._button.getLocator() });
|
|
3178
|
+
return await this._button.isDisabled();
|
|
3179
|
+
} catch (error) {
|
|
3180
|
+
return false;
|
|
3181
|
+
}
|
|
2985
3182
|
}
|
|
2986
|
-
async
|
|
3183
|
+
async isVisible() {
|
|
2987
3184
|
try {
|
|
2988
3185
|
await this.init();
|
|
2989
|
-
return this._button.
|
|
3186
|
+
return this._button.isVisible();
|
|
2990
3187
|
} catch (error) {
|
|
2991
3188
|
return false;
|
|
2992
3189
|
}
|
|
@@ -3000,11 +3197,15 @@ var init_ToolbarItem = __esm({
|
|
|
3000
3197
|
}
|
|
3001
3198
|
}
|
|
3002
3199
|
async getTitle() {
|
|
3003
|
-
|
|
3004
|
-
|
|
3200
|
+
try {
|
|
3201
|
+
await this.init();
|
|
3202
|
+
return await this._button.getTitle();
|
|
3203
|
+
} catch (error) {
|
|
3204
|
+
return "";
|
|
3205
|
+
}
|
|
3005
3206
|
}
|
|
3006
3207
|
get menu() {
|
|
3007
|
-
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.
|
|
3208
|
+
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.page);
|
|
3008
3209
|
}
|
|
3009
3210
|
};
|
|
3010
3211
|
}
|
|
@@ -3020,30 +3221,25 @@ var init_FormToolbar = __esm({
|
|
|
3020
3221
|
TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
3021
3222
|
FormToolbar = class extends AbstractElementWithParent {
|
|
3022
3223
|
formName;
|
|
3023
|
-
constructor(parentCssSelector, formName,
|
|
3024
|
-
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`,
|
|
3224
|
+
constructor(parentCssSelector, formName, page) {
|
|
3225
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, page);
|
|
3025
3226
|
this.formName = formName;
|
|
3026
3227
|
}
|
|
3027
3228
|
button(name) {
|
|
3028
|
-
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.
|
|
3229
|
+
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.page);
|
|
3029
3230
|
}
|
|
3030
3231
|
};
|
|
3031
3232
|
}
|
|
3032
3233
|
});
|
|
3033
3234
|
|
|
3034
3235
|
// src/pageObjects/elements/Filters/FilterOperation.ts
|
|
3035
|
-
var
|
|
3236
|
+
var FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
|
|
3036
3237
|
var init_FilterOperation = __esm({
|
|
3037
3238
|
"src/pageObjects/elements/Filters/FilterOperation.ts"() {
|
|
3038
3239
|
"use strict";
|
|
3039
|
-
import_selenium_webdriver29 = require("selenium-webdriver");
|
|
3040
|
-
init_fixElementStaleError();
|
|
3041
3240
|
init_AbstractElementWithParent();
|
|
3042
3241
|
init_locators();
|
|
3043
|
-
init_actions();
|
|
3044
3242
|
init_wait();
|
|
3045
|
-
init_waitElementIsClickable();
|
|
3046
|
-
init_waitElementIsVisible();
|
|
3047
3243
|
FILTER_OPERATIONS = [
|
|
3048
3244
|
"=",
|
|
3049
3245
|
"<>",
|
|
@@ -3065,44 +3261,42 @@ var init_FilterOperation = __esm({
|
|
|
3065
3261
|
getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
|
|
3066
3262
|
FilterOperation = class extends AbstractElementWithParent {
|
|
3067
3263
|
_testId;
|
|
3068
|
-
constructor({ parentCssSelector, filterTestID,
|
|
3069
|
-
super(
|
|
3264
|
+
constructor({ parentCssSelector, filterTestID, page }) {
|
|
3265
|
+
super(
|
|
3266
|
+
parentCssSelector,
|
|
3267
|
+
byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`),
|
|
3268
|
+
page
|
|
3269
|
+
);
|
|
3070
3270
|
this._testId = filterTestID;
|
|
3071
3271
|
}
|
|
3272
|
+
popup() {
|
|
3273
|
+
return this.page.locator(
|
|
3274
|
+
byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)
|
|
3275
|
+
);
|
|
3276
|
+
}
|
|
3072
3277
|
async initOperationWidget() {
|
|
3073
|
-
const
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
});
|
|
3079
|
-
const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver29.By.className("dx-icon"));
|
|
3080
|
-
await click(clickableElement, this.driver);
|
|
3081
|
-
try {
|
|
3082
|
-
const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
|
|
3083
|
-
await waitElementIsVisible_default({
|
|
3084
|
-
element: widgetPopupEl,
|
|
3085
|
-
errorMessage: `Operation widget popup is not visible`,
|
|
3086
|
-
driver: this.driver
|
|
3087
|
-
});
|
|
3088
|
-
} catch (_) {
|
|
3089
|
-
throw `Operation widget popup is not visible`;
|
|
3090
|
-
}
|
|
3278
|
+
const widgetButton = this.getLocator();
|
|
3279
|
+
const icon = widgetButton.locator(".dx-icon");
|
|
3280
|
+
await icon.first().click();
|
|
3281
|
+
const popup = this.popup();
|
|
3282
|
+
await popup.waitFor({ state: "visible" });
|
|
3091
3283
|
}
|
|
3092
3284
|
async setOperation(operationName) {
|
|
3093
3285
|
if (!FILTER_OPERATIONS.includes(operationName)) {
|
|
3094
3286
|
throw new Error(`Operation with name "${operationName}" is not correct.`);
|
|
3095
3287
|
}
|
|
3096
3288
|
await this.initOperationWidget();
|
|
3097
|
-
const
|
|
3098
|
-
|
|
3099
|
-
|
|
3289
|
+
const operationItem = this.popup().locator(
|
|
3290
|
+
getWidgetInPopupSelector(operationName)
|
|
3291
|
+
);
|
|
3292
|
+
await operationItem.click();
|
|
3293
|
+
await wait(
|
|
3100
3294
|
async () => {
|
|
3101
3295
|
const currOperationName = await this.getAttribute("data-operation");
|
|
3102
3296
|
if (operationName === "isblank") return true;
|
|
3103
3297
|
return currOperationName === operationName;
|
|
3104
3298
|
},
|
|
3105
|
-
this.
|
|
3299
|
+
this.page,
|
|
3106
3300
|
"Operation is not changed"
|
|
3107
3301
|
);
|
|
3108
3302
|
}
|
|
@@ -3115,12 +3309,12 @@ var init_FilterOperation = __esm({
|
|
|
3115
3309
|
const currValue = await this.getIsBlank();
|
|
3116
3310
|
if (currValue !== value) {
|
|
3117
3311
|
await this.setOperation("isblank");
|
|
3118
|
-
await
|
|
3312
|
+
await wait(
|
|
3119
3313
|
async () => {
|
|
3120
3314
|
const currIsBlank = await this.getIsBlank();
|
|
3121
3315
|
return currIsBlank === value;
|
|
3122
3316
|
},
|
|
3123
|
-
this.
|
|
3317
|
+
this.page,
|
|
3124
3318
|
"Operation is not changed"
|
|
3125
3319
|
);
|
|
3126
3320
|
}
|
|
@@ -3145,8 +3339,13 @@ var init_FormFilterField = __esm({
|
|
|
3145
3339
|
FormFilterField = class extends AbstractEditor {
|
|
3146
3340
|
formName;
|
|
3147
3341
|
name;
|
|
3148
|
-
constructor(parentCssSelector, formName, name,
|
|
3149
|
-
super(
|
|
3342
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3343
|
+
super({
|
|
3344
|
+
parentCssSelector,
|
|
3345
|
+
elementCssSelector: byTestIdCssSelector(createLayoutFilterTestId(formName, name)),
|
|
3346
|
+
titleCssSelector: byTestIdCssSelector(createLabelLayoutFilterTestId(formName, name)),
|
|
3347
|
+
page
|
|
3348
|
+
});
|
|
3150
3349
|
this.formName = formName;
|
|
3151
3350
|
this.name = name;
|
|
3152
3351
|
}
|
|
@@ -3198,7 +3397,7 @@ var init_FormFilterField = __esm({
|
|
|
3198
3397
|
return new FilterOperation({
|
|
3199
3398
|
parentCssSelector: this.parentCssSelector,
|
|
3200
3399
|
filterTestID: createLayoutFilterTestId(this.formName, this.name),
|
|
3201
|
-
|
|
3400
|
+
page: this.page
|
|
3202
3401
|
});
|
|
3203
3402
|
}
|
|
3204
3403
|
/**
|
|
@@ -3259,8 +3458,13 @@ var init_PanelFilterField = __esm({
|
|
|
3259
3458
|
PanelFilterField = class extends AbstractEditor {
|
|
3260
3459
|
formName;
|
|
3261
3460
|
name;
|
|
3262
|
-
constructor(parentCssSelector, formName, name,
|
|
3263
|
-
super(
|
|
3461
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3462
|
+
super({
|
|
3463
|
+
parentCssSelector,
|
|
3464
|
+
elementCssSelector: byTestIdCssSelector(createDocFilterTestId(formName, name)),
|
|
3465
|
+
titleCssSelector: byTestIdCssSelector(createLabelDocFilterTestId(formName, name)),
|
|
3466
|
+
page
|
|
3467
|
+
});
|
|
3264
3468
|
this.formName = formName;
|
|
3265
3469
|
this.name = name;
|
|
3266
3470
|
}
|
|
@@ -3312,7 +3516,7 @@ var init_PanelFilterField = __esm({
|
|
|
3312
3516
|
return new FilterOperation({
|
|
3313
3517
|
parentCssSelector: this.parentCssSelector,
|
|
3314
3518
|
filterTestID: createDocFilterTestId(this.formName, this.name),
|
|
3315
|
-
|
|
3519
|
+
page: this.page
|
|
3316
3520
|
});
|
|
3317
3521
|
}
|
|
3318
3522
|
/**
|
|
@@ -3362,14 +3566,12 @@ var init_PanelFilterField = __esm({
|
|
|
3362
3566
|
});
|
|
3363
3567
|
|
|
3364
3568
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
3365
|
-
var
|
|
3569
|
+
var drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
3366
3570
|
var init_FilterPanel = __esm({
|
|
3367
3571
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
3368
3572
|
"use strict";
|
|
3369
|
-
import_selenium_webdriver30 = require("selenium-webdriver");
|
|
3370
3573
|
init_AbstractElement();
|
|
3371
3574
|
init_PanelFilterField();
|
|
3372
|
-
init_actions();
|
|
3373
3575
|
drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
|
|
3374
3576
|
FILTER_PANEL_SELECTOR = ".filter-panel";
|
|
3375
3577
|
CLOSE_SELECTOR = ".button-close";
|
|
@@ -3380,11 +3582,10 @@ var init_FilterPanel = __esm({
|
|
|
3380
3582
|
}
|
|
3381
3583
|
async filterPanelButtons() {
|
|
3382
3584
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
3383
|
-
|
|
3384
|
-
return el.findElements(import_selenium_webdriver30.By.css(selector));
|
|
3585
|
+
return this.page.locator(selector).all();
|
|
3385
3586
|
}
|
|
3386
|
-
constructor(formName,
|
|
3387
|
-
super(
|
|
3587
|
+
constructor(formName, page) {
|
|
3588
|
+
super(page, drawerSelector(formName));
|
|
3388
3589
|
this._formName = formName;
|
|
3389
3590
|
}
|
|
3390
3591
|
/**
|
|
@@ -3394,28 +3595,28 @@ var init_FilterPanel = __esm({
|
|
|
3394
3595
|
* await form.filterPanel.filterField('NumberFld');
|
|
3395
3596
|
*/
|
|
3396
3597
|
filterField(name) {
|
|
3397
|
-
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.
|
|
3598
|
+
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.page);
|
|
3398
3599
|
}
|
|
3399
3600
|
async apply() {
|
|
3400
3601
|
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
3401
|
-
await click(
|
|
3602
|
+
await btn.click();
|
|
3402
3603
|
}
|
|
3403
3604
|
async findButtonByTitle(title) {
|
|
3404
3605
|
const buttons = await this.filterPanelButtons();
|
|
3405
3606
|
for (const btn of buttons) {
|
|
3406
|
-
if (await btn.
|
|
3607
|
+
if (await btn.innerText() === title) {
|
|
3407
3608
|
return btn;
|
|
3408
3609
|
}
|
|
3409
3610
|
}
|
|
3410
3611
|
}
|
|
3411
3612
|
async clearAll() {
|
|
3412
3613
|
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
3413
|
-
await click(
|
|
3414
|
-
await this.
|
|
3614
|
+
await btn.click();
|
|
3615
|
+
await this.page.waitForTimeout(300);
|
|
3415
3616
|
}
|
|
3416
3617
|
async close() {
|
|
3417
|
-
const btn =
|
|
3418
|
-
await click(
|
|
3618
|
+
const btn = this.page.locator(`${this.elementCssSelector} ${CLOSE_SELECTOR}`);
|
|
3619
|
+
await btn.click();
|
|
3419
3620
|
}
|
|
3420
3621
|
};
|
|
3421
3622
|
}
|
|
@@ -3430,8 +3631,13 @@ var init_HeaderFilterField = __esm({
|
|
|
3430
3631
|
init_createDataTestId();
|
|
3431
3632
|
init_AbstractEditor2();
|
|
3432
3633
|
HeaderFilterField = class extends AbstractEditor {
|
|
3433
|
-
constructor(parentCssSelector, formName, name,
|
|
3434
|
-
super(
|
|
3634
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3635
|
+
super({
|
|
3636
|
+
parentCssSelector,
|
|
3637
|
+
elementCssSelector: byTestIdCssSelector(createHeaderFilterTestId(formName, name)),
|
|
3638
|
+
titleCssSelector: "",
|
|
3639
|
+
page
|
|
3640
|
+
});
|
|
3435
3641
|
}
|
|
3436
3642
|
async getValue() {
|
|
3437
3643
|
return super.getValue();
|
|
@@ -3456,71 +3662,51 @@ var init_HeaderFilterField = __esm({
|
|
|
3456
3662
|
});
|
|
3457
3663
|
|
|
3458
3664
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
3459
|
-
var
|
|
3665
|
+
var APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
3460
3666
|
var init_ColumnFilter = __esm({
|
|
3461
3667
|
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
3462
3668
|
"use strict";
|
|
3463
|
-
init_actions();
|
|
3464
|
-
import_selenium_webdriver31 = require("selenium-webdriver");
|
|
3465
3669
|
init_HeaderFilterField();
|
|
3466
|
-
init_waitElementIsVisible();
|
|
3467
|
-
init_AbstractElement();
|
|
3468
3670
|
init_FilterOperation();
|
|
3469
3671
|
init_createDataTestId();
|
|
3470
|
-
|
|
3672
|
+
init_waitElementIsVisible();
|
|
3471
3673
|
APPLY_SELECTOR = ".apply-button";
|
|
3472
3674
|
CANCEL_SELECTOR = ".cancel-button";
|
|
3473
3675
|
HEADER_FILTER_ICON = ".indicators-container .filter-icon";
|
|
3474
3676
|
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
3475
3677
|
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
3476
|
-
ColumnFilter = class
|
|
3678
|
+
ColumnFilter = class {
|
|
3477
3679
|
_formName;
|
|
3478
3680
|
_name;
|
|
3479
3681
|
_column;
|
|
3480
|
-
|
|
3481
|
-
|
|
3682
|
+
page;
|
|
3683
|
+
constructor(formName, name, column, page) {
|
|
3482
3684
|
this._formName = formName;
|
|
3483
3685
|
this._name = name;
|
|
3484
3686
|
this._column = column;
|
|
3485
|
-
this.
|
|
3687
|
+
this.page = page;
|
|
3486
3688
|
}
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3689
|
+
getApplyButton() {
|
|
3690
|
+
return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`);
|
|
3490
3691
|
}
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3692
|
+
getCancelButton() {
|
|
3693
|
+
return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`);
|
|
3494
3694
|
}
|
|
3495
3695
|
async apply() {
|
|
3496
|
-
|
|
3497
|
-
await click(btn, this.driver);
|
|
3696
|
+
await this.getApplyButton().click();
|
|
3498
3697
|
}
|
|
3499
3698
|
async cancel() {
|
|
3500
|
-
|
|
3501
|
-
await click(btn, this.driver);
|
|
3699
|
+
await this.getCancelButton().click();
|
|
3502
3700
|
}
|
|
3503
3701
|
async initFilter() {
|
|
3504
|
-
const columnEl = await this._column.
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
},
|
|
3513
|
-
this.driver,
|
|
3514
|
-
`HeaderFilter "${this._name}" is not visible`
|
|
3515
|
-
);
|
|
3516
|
-
await click(headerFilterIcon, this.driver);
|
|
3517
|
-
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
3518
|
-
const filterEl = await filter.getElement();
|
|
3519
|
-
await waitElementIsVisible_default({
|
|
3520
|
-
element: filterEl,
|
|
3521
|
-
driver: this.driver,
|
|
3522
|
-
errorMessage: `Header filter is not visible`
|
|
3523
|
-
});
|
|
3702
|
+
const columnEl = await this._column.getLocator();
|
|
3703
|
+
await columnEl.hover();
|
|
3704
|
+
const headerFilterIcon = columnEl.locator(HEADER_FILTER_ICON);
|
|
3705
|
+
await headerFilterIcon.waitFor({ state: "visible" });
|
|
3706
|
+
await headerFilterIcon.click();
|
|
3707
|
+
const filter = new HeaderFilterField("", this._formName, this._name, this.page);
|
|
3708
|
+
const filterEl = filter.getLocator();
|
|
3709
|
+
await waitElementIsVisible_default({ locator: filterEl });
|
|
3524
3710
|
return filter;
|
|
3525
3711
|
}
|
|
3526
3712
|
/**
|
|
@@ -3547,9 +3733,9 @@ var init_ColumnFilter = __esm({
|
|
|
3547
3733
|
const filterOperation = new FilterOperation({
|
|
3548
3734
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
3549
3735
|
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3550
|
-
|
|
3736
|
+
page: this.page
|
|
3551
3737
|
});
|
|
3552
|
-
const inputEl =
|
|
3738
|
+
const inputEl = filter.getLocator();
|
|
3553
3739
|
if (typeof operation === "string") {
|
|
3554
3740
|
await inputEl.click();
|
|
3555
3741
|
await filterOperation.setOperation(operation);
|
|
@@ -3559,7 +3745,7 @@ var init_ColumnFilter = __esm({
|
|
|
3559
3745
|
await filterOperation.setIsBlank(isBlank);
|
|
3560
3746
|
}
|
|
3561
3747
|
await filter.setValue(value);
|
|
3562
|
-
|
|
3748
|
+
await this.apply();
|
|
3563
3749
|
}
|
|
3564
3750
|
/**
|
|
3565
3751
|
* Очищает значение в поле
|
|
@@ -3586,12 +3772,12 @@ var init_ColumnFilter = __esm({
|
|
|
3586
3772
|
*/
|
|
3587
3773
|
async initOperation() {
|
|
3588
3774
|
const filter = await this.initFilter();
|
|
3589
|
-
const inputEl =
|
|
3775
|
+
const inputEl = filter.getLocator();
|
|
3590
3776
|
await inputEl.click();
|
|
3591
3777
|
return new FilterOperation({
|
|
3592
3778
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
3593
3779
|
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3594
|
-
|
|
3780
|
+
page: this.page
|
|
3595
3781
|
});
|
|
3596
3782
|
}
|
|
3597
3783
|
/**
|
|
@@ -3611,7 +3797,7 @@ var init_ColumnFilter = __esm({
|
|
|
3611
3797
|
*/
|
|
3612
3798
|
async getOperation() {
|
|
3613
3799
|
const filterOperation = await this.initOperation();
|
|
3614
|
-
return
|
|
3800
|
+
return filterOperation.getOperation();
|
|
3615
3801
|
}
|
|
3616
3802
|
/**
|
|
3617
3803
|
* Устанавливает операцию 'isblank' для фильтра
|
|
@@ -3630,7 +3816,7 @@ var init_ColumnFilter = __esm({
|
|
|
3630
3816
|
*/
|
|
3631
3817
|
async getIsBlank() {
|
|
3632
3818
|
const filterOperation = await this.initOperation();
|
|
3633
|
-
return
|
|
3819
|
+
return filterOperation.getIsBlank();
|
|
3634
3820
|
}
|
|
3635
3821
|
async isReadonly() {
|
|
3636
3822
|
const filter = await this.initFilter();
|
|
@@ -3672,8 +3858,8 @@ var init_ListForm = __esm({
|
|
|
3672
3858
|
fixedTableContentCssSelector;
|
|
3673
3859
|
tableContentCssSelector;
|
|
3674
3860
|
contextMenuCssSelector;
|
|
3675
|
-
constructor(
|
|
3676
|
-
super(
|
|
3861
|
+
constructor(page) {
|
|
3862
|
+
super(page);
|
|
3677
3863
|
this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
|
|
3678
3864
|
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
3679
3865
|
this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
|
|
@@ -3688,17 +3874,15 @@ var init_ListForm = __esm({
|
|
|
3688
3874
|
* expect(listForm.table());
|
|
3689
3875
|
*/
|
|
3690
3876
|
table() {
|
|
3691
|
-
return new Table(
|
|
3692
|
-
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
}
|
|
3701
|
-
);
|
|
3877
|
+
return new Table({
|
|
3878
|
+
parentCssSelector: this.containerCssSelector,
|
|
3879
|
+
headerCssSelector: this.headerCssSelector,
|
|
3880
|
+
fixedTableContentCssSelector: this.fixedTableContentCssSelector,
|
|
3881
|
+
formName: this.formName,
|
|
3882
|
+
page: this.page,
|
|
3883
|
+
contextMenuCssSelector: this.contextMenuCssSelector,
|
|
3884
|
+
tableContentCssSelector: this.tableContentCssSelector
|
|
3885
|
+
});
|
|
3702
3886
|
}
|
|
3703
3887
|
/**
|
|
3704
3888
|
* Находит таблицу
|
|
@@ -3708,7 +3892,7 @@ var init_ListForm = __esm({
|
|
|
3708
3892
|
* expect(listForm.toolbarButton());
|
|
3709
3893
|
*/
|
|
3710
3894
|
toolbarButton(name) {
|
|
3711
|
-
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.
|
|
3895
|
+
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.page);
|
|
3712
3896
|
return toolbar.button(name);
|
|
3713
3897
|
}
|
|
3714
3898
|
/**
|
|
@@ -3719,11 +3903,11 @@ var init_ListForm = __esm({
|
|
|
3719
3903
|
* expect(listForm.formFilter());
|
|
3720
3904
|
*/
|
|
3721
3905
|
formFilter(name) {
|
|
3722
|
-
return new FormFilterField(this.containerCssSelector, this.formName, name, this.
|
|
3906
|
+
return new FormFilterField(this.containerCssSelector, this.formName, name, this.page);
|
|
3723
3907
|
}
|
|
3724
3908
|
columnFilter(name) {
|
|
3725
3909
|
const column = this.table().getColumnByName(name);
|
|
3726
|
-
return new ColumnFilter(this.formName, name, column, this.
|
|
3910
|
+
return new ColumnFilter(this.formName, name, column, this.page);
|
|
3727
3911
|
}
|
|
3728
3912
|
/**
|
|
3729
3913
|
* Модель панели фильтрации
|
|
@@ -3734,7 +3918,7 @@ var init_ListForm = __esm({
|
|
|
3734
3918
|
* expect(listForm.filterPanel());
|
|
3735
3919
|
*/
|
|
3736
3920
|
get filterPanel() {
|
|
3737
|
-
return new FilterPanel(this.formName, this.
|
|
3921
|
+
return new FilterPanel(this.formName, this.page);
|
|
3738
3922
|
}
|
|
3739
3923
|
};
|
|
3740
3924
|
}
|
|
@@ -3754,8 +3938,8 @@ var init_TreeView = __esm({
|
|
|
3754
3938
|
TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3755
3939
|
FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3756
3940
|
TreeView = class extends ListForm {
|
|
3757
|
-
constructor(
|
|
3758
|
-
super(
|
|
3941
|
+
constructor(page) {
|
|
3942
|
+
super(page);
|
|
3759
3943
|
this.popupContainerCssSelector = `.popup.tree-view-${this.formName}`;
|
|
3760
3944
|
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
3761
3945
|
this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
|
|
@@ -3805,29 +3989,28 @@ var init_createSubFormInstance = __esm({
|
|
|
3805
3989
|
});
|
|
3806
3990
|
|
|
3807
3991
|
// src/pageObjects/elements/Forms/Form.ts
|
|
3808
|
-
var
|
|
3992
|
+
var formTestId, Form;
|
|
3809
3993
|
var init_Form = __esm({
|
|
3810
3994
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
3811
3995
|
"use strict";
|
|
3812
3996
|
init_locators();
|
|
3813
|
-
import_selenium_webdriver32 = require("selenium-webdriver");
|
|
3814
3997
|
init_AbstractForm();
|
|
3815
|
-
init_waitElementIsVisible();
|
|
3816
3998
|
init_createSubFormInstance();
|
|
3999
|
+
init_waitElementIsVisible();
|
|
3817
4000
|
formTestId = (formName) => `form-content-wrapper-${formName}`;
|
|
3818
4001
|
Form = class extends AbstractForm {
|
|
3819
4002
|
popupContainerCssSelector;
|
|
3820
|
-
constructor(
|
|
3821
|
-
super(
|
|
4003
|
+
constructor(page) {
|
|
4004
|
+
super(page);
|
|
3822
4005
|
this.setSubFormMode();
|
|
3823
4006
|
}
|
|
3824
4007
|
async isModal() {
|
|
3825
|
-
const el =
|
|
4008
|
+
const el = this.getContainerElement();
|
|
3826
4009
|
const value = await el.getAttribute("data-ismodal");
|
|
3827
4010
|
return value === "true";
|
|
3828
4011
|
}
|
|
3829
4012
|
async isFullScreen() {
|
|
3830
|
-
const el =
|
|
4013
|
+
const el = this.getContainerElement();
|
|
3831
4014
|
const value = await el.getAttribute("data-isfullscreen");
|
|
3832
4015
|
return value === "true";
|
|
3833
4016
|
}
|
|
@@ -3837,29 +4020,27 @@ var init_Form = __esm({
|
|
|
3837
4020
|
* const listForm = new MyForm();
|
|
3838
4021
|
* //...
|
|
3839
4022
|
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
4023
|
+
* Получение заголовка на форме
|
|
3840
4024
|
*/
|
|
3841
4025
|
async getTitleText() {
|
|
3842
4026
|
const getFullScreenTitle = async () => {
|
|
3843
|
-
|
|
3844
|
-
return titleEl.
|
|
4027
|
+
const titleEl = this.page.locator(".main-toolbar-form-title");
|
|
4028
|
+
return titleEl.innerText();
|
|
3845
4029
|
};
|
|
3846
4030
|
if (await this.isFullScreen()) {
|
|
3847
4031
|
return getFullScreenTitle();
|
|
3848
4032
|
}
|
|
3849
4033
|
if (await this.isModal()) {
|
|
3850
|
-
const titleEl =
|
|
4034
|
+
const titleEl = this.page.locator(`${this.popupContainerCssSelector} .popup-title`);
|
|
3851
4035
|
await waitElementIsVisible_default({
|
|
3852
|
-
|
|
3853
|
-
driver: this.driver,
|
|
3854
|
-
errorMessage: `Form title element is not visible`
|
|
4036
|
+
locator: titleEl
|
|
3855
4037
|
});
|
|
3856
|
-
return titleEl.
|
|
4038
|
+
return titleEl.innerText();
|
|
3857
4039
|
}
|
|
3858
4040
|
return getFullScreenTitle();
|
|
3859
4041
|
}
|
|
3860
4042
|
setSubFormMode() {
|
|
3861
4043
|
const testId = formTestId(this.formName);
|
|
3862
|
-
this.containerBy = byTestId(testId);
|
|
3863
4044
|
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
3864
4045
|
}
|
|
3865
4046
|
/**
|
|
@@ -3873,26 +4054,26 @@ var init_Form = __esm({
|
|
|
3873
4054
|
async subForm(name, options = {}) {
|
|
3874
4055
|
const { isDockPanel = false } = options;
|
|
3875
4056
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
3876
|
-
const
|
|
3877
|
-
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
4057
|
+
const subFormEl = this.page.locator(cssSelector);
|
|
3878
4058
|
await waitElementIsVisible_default({
|
|
3879
|
-
|
|
3880
|
-
driver: this.driver,
|
|
3881
|
-
errorMessage: `Subform "${name}" is not visible`
|
|
4059
|
+
locator: subFormEl
|
|
3882
4060
|
});
|
|
3883
4061
|
const formType = await subFormEl.getAttribute("data-formtype");
|
|
3884
|
-
const formName = await subFormEl.getAttribute("data-formname");
|
|
3885
|
-
|
|
4062
|
+
const formName = await subFormEl.getAttribute("data-formname") ?? "";
|
|
4063
|
+
const SubFormFactoryClass = await classDependencyInjector(formType);
|
|
3886
4064
|
const SubForm = class extends SubFormFactoryClass {
|
|
3887
4065
|
setSubFormMode() {
|
|
3888
4066
|
this.containerCssSelector = cssSelector;
|
|
3889
|
-
this.containerBy =
|
|
4067
|
+
this.containerBy = cssSelector;
|
|
3890
4068
|
}
|
|
3891
4069
|
get formName() {
|
|
3892
4070
|
return formName;
|
|
3893
4071
|
}
|
|
3894
4072
|
};
|
|
3895
|
-
return new SubForm(this.
|
|
4073
|
+
return new SubForm(this.page);
|
|
4074
|
+
}
|
|
4075
|
+
getContainerElement() {
|
|
4076
|
+
return this.page.locator(this.containerCssSelector);
|
|
3896
4077
|
}
|
|
3897
4078
|
};
|
|
3898
4079
|
}
|
|
@@ -3903,20 +4084,18 @@ var FormEdit_exports = {};
|
|
|
3903
4084
|
__export(FormEdit_exports, {
|
|
3904
4085
|
default: () => FormEdit
|
|
3905
4086
|
});
|
|
3906
|
-
var
|
|
4087
|
+
var FormEdit;
|
|
3907
4088
|
var init_FormEdit = __esm({
|
|
3908
4089
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
3909
4090
|
"use strict";
|
|
3910
4091
|
init_Form();
|
|
3911
|
-
import_selenium_webdriver33 = require("selenium-webdriver");
|
|
3912
4092
|
init_FormField();
|
|
3913
|
-
init_actions();
|
|
3914
4093
|
init_wait();
|
|
3915
4094
|
FormEdit = class extends Form {
|
|
3916
4095
|
saveButtonId = "#button-save";
|
|
3917
4096
|
closeButtonId = "#button-cancel";
|
|
3918
|
-
constructor(
|
|
3919
|
-
super(
|
|
4097
|
+
constructor(page) {
|
|
4098
|
+
super(page);
|
|
3920
4099
|
this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
|
|
3921
4100
|
}
|
|
3922
4101
|
async getButtonCssSelector(buttonId) {
|
|
@@ -3933,7 +4112,7 @@ var init_FormEdit = __esm({
|
|
|
3933
4112
|
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
3934
4113
|
*/
|
|
3935
4114
|
field(name) {
|
|
3936
|
-
return new FormField(this.containerCssSelector, this.formName, name, this.
|
|
4115
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.page);
|
|
3937
4116
|
}
|
|
3938
4117
|
/**
|
|
3939
4118
|
* Проверяет не отключена ли кнопка Сохранить
|
|
@@ -3944,7 +4123,7 @@ var init_FormEdit = __esm({
|
|
|
3944
4123
|
*/
|
|
3945
4124
|
async isSaveButtonDisabled() {
|
|
3946
4125
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3947
|
-
const saveButton =
|
|
4126
|
+
const saveButton = this.page.locator(saveButtonCssSelector);
|
|
3948
4127
|
const result = await saveButton.getAttribute("aria-disabled");
|
|
3949
4128
|
return result === "true";
|
|
3950
4129
|
}
|
|
@@ -3957,9 +4136,9 @@ var init_FormEdit = __esm({
|
|
|
3957
4136
|
*/
|
|
3958
4137
|
async saveButtonClick() {
|
|
3959
4138
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3960
|
-
const saveButton =
|
|
3961
|
-
await
|
|
3962
|
-
await click(
|
|
4139
|
+
const saveButton = this.page.locator(saveButtonCssSelector);
|
|
4140
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.page, "Button is disabled");
|
|
4141
|
+
await saveButton.click();
|
|
3963
4142
|
}
|
|
3964
4143
|
/**
|
|
3965
4144
|
* Нажатие на кнопку Закрить
|
|
@@ -3970,8 +4149,91 @@ var init_FormEdit = __esm({
|
|
|
3970
4149
|
*/
|
|
3971
4150
|
async closeButtonClick() {
|
|
3972
4151
|
const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
|
|
3973
|
-
const closeButton =
|
|
3974
|
-
await click(
|
|
4152
|
+
const closeButton = this.page.locator(closeButtonCssSelector);
|
|
4153
|
+
await closeButton.click();
|
|
4154
|
+
}
|
|
4155
|
+
};
|
|
4156
|
+
}
|
|
4157
|
+
});
|
|
4158
|
+
|
|
4159
|
+
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
4160
|
+
var ReportForm;
|
|
4161
|
+
var init_ReportForm = __esm({
|
|
4162
|
+
"src/pageObjects/elements/Forms/ReportForm.ts"() {
|
|
4163
|
+
"use strict";
|
|
4164
|
+
init_FormEdit();
|
|
4165
|
+
ReportForm = class extends FormEdit {
|
|
4166
|
+
constructor(page) {
|
|
4167
|
+
super(page);
|
|
4168
|
+
this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
|
|
4169
|
+
this.saveButtonId = "#button-apply";
|
|
4170
|
+
}
|
|
4171
|
+
/**
|
|
4172
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
4173
|
+
* @example
|
|
4174
|
+
* const formReport = new MyForm();
|
|
4175
|
+
* //...
|
|
4176
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
4177
|
+
*/
|
|
4178
|
+
filterField(name) {
|
|
4179
|
+
return super.field(name);
|
|
4180
|
+
}
|
|
4181
|
+
};
|
|
4182
|
+
}
|
|
4183
|
+
});
|
|
4184
|
+
|
|
4185
|
+
// src/pageObjects/elements/Dialog.ts
|
|
4186
|
+
var DIALOG_CLASS, DIALOG_TITLE_CLASS, DIALOG_TEXT_CLASS, DIALOG_BUTTONS_PANEL_CLASS, buttonByTextXpath, DialogButton, Dialog;
|
|
4187
|
+
var init_Dialog = __esm({
|
|
4188
|
+
"src/pageObjects/elements/Dialog.ts"() {
|
|
4189
|
+
"use strict";
|
|
4190
|
+
init_AbstractElement();
|
|
4191
|
+
init_AbstractButton();
|
|
4192
|
+
DIALOG_CLASS = ".d5-dialog";
|
|
4193
|
+
DIALOG_TITLE_CLASS = ".dialog__title";
|
|
4194
|
+
DIALOG_TEXT_CLASS = ".dialog__text";
|
|
4195
|
+
DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
|
|
4196
|
+
buttonByTextXpath = (text) => `xpath=.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
|
|
4197
|
+
DialogButton = class extends AbstractButton {
|
|
4198
|
+
text;
|
|
4199
|
+
constructor(parentCssSelector, text, page) {
|
|
4200
|
+
super(parentCssSelector, "", page);
|
|
4201
|
+
this.text = text;
|
|
4202
|
+
}
|
|
4203
|
+
getLocator() {
|
|
4204
|
+
const panel = super.getLocator();
|
|
4205
|
+
return panel.locator(buttonByTextXpath(this.text));
|
|
4206
|
+
}
|
|
4207
|
+
buttonNotDisplayedError() {
|
|
4208
|
+
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
4209
|
+
}
|
|
4210
|
+
getTitle() {
|
|
4211
|
+
throw new Error(`Method "getTitle()" is not working.`);
|
|
4212
|
+
}
|
|
4213
|
+
};
|
|
4214
|
+
Dialog = class extends AbstractElement {
|
|
4215
|
+
constructor(page) {
|
|
4216
|
+
super(page, DIALOG_CLASS);
|
|
4217
|
+
}
|
|
4218
|
+
get titleSelector() {
|
|
4219
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
|
|
4220
|
+
}
|
|
4221
|
+
get textSelector() {
|
|
4222
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
|
|
4223
|
+
}
|
|
4224
|
+
get buttonsSelector() {
|
|
4225
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
4226
|
+
}
|
|
4227
|
+
async title() {
|
|
4228
|
+
const el = this.page.locator(this.titleSelector);
|
|
4229
|
+
return await el.innerText();
|
|
4230
|
+
}
|
|
4231
|
+
async text() {
|
|
4232
|
+
const el = this.page.locator(this.textSelector);
|
|
4233
|
+
return await el.innerText();
|
|
4234
|
+
}
|
|
4235
|
+
button(text) {
|
|
4236
|
+
return new DialogButton(this.buttonsSelector, text, this.page);
|
|
3975
4237
|
}
|
|
3976
4238
|
};
|
|
3977
4239
|
}
|
|
@@ -6783,6 +7045,25 @@ var require_d5lib = __commonJS({
|
|
|
6783
7045
|
}
|
|
6784
7046
|
});
|
|
6785
7047
|
|
|
7048
|
+
// src/api/ApiRequest.ts
|
|
7049
|
+
function ApiRequest(objectName, operation) {
|
|
7050
|
+
const { auth } = config();
|
|
7051
|
+
(0, import_d5lib.config)(auth);
|
|
7052
|
+
const postInstance = (0, import_d5lib.post)(objectName, operation);
|
|
7053
|
+
const invoke = async () => {
|
|
7054
|
+
return postInstance.send(true);
|
|
7055
|
+
};
|
|
7056
|
+
return Object.assign(postInstance, { invoke });
|
|
7057
|
+
}
|
|
7058
|
+
var import_d5lib;
|
|
7059
|
+
var init_ApiRequest = __esm({
|
|
7060
|
+
"src/api/ApiRequest.ts"() {
|
|
7061
|
+
"use strict";
|
|
7062
|
+
init_config();
|
|
7063
|
+
import_d5lib = __toESM(require_d5lib());
|
|
7064
|
+
}
|
|
7065
|
+
});
|
|
7066
|
+
|
|
6786
7067
|
// src/index.ts
|
|
6787
7068
|
var src_exports = {};
|
|
6788
7069
|
__export(src_exports, {
|
|
@@ -6804,405 +7085,38 @@ __export(src_exports, {
|
|
|
6804
7085
|
TreeView: () => TreeView,
|
|
6805
7086
|
byTestId: () => byTestId,
|
|
6806
7087
|
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
6807
|
-
click: () => click,
|
|
6808
7088
|
config: () => config,
|
|
6809
|
-
contextMenu: () => contextMenu,
|
|
6810
|
-
createDriver: () => createDriver,
|
|
6811
7089
|
disabledLocator: () => disabledLocator,
|
|
6812
7090
|
editorFactory: () => editorFactory,
|
|
6813
|
-
elementIsNotPresent: () => elementIsNotPresent,
|
|
6814
7091
|
readonlyLocator: () => readonlyLocator,
|
|
6815
|
-
|
|
6816
|
-
wait: () => safeWait,
|
|
6817
|
-
waitElementIsClickable: () => waitElementIsClickable_default,
|
|
7092
|
+
wait: () => wait,
|
|
6818
7093
|
waitElementIsVisible: () => waitElementIsVisible_default
|
|
6819
7094
|
});
|
|
6820
7095
|
module.exports = __toCommonJS(src_exports);
|
|
6821
|
-
|
|
6822
|
-
|
|
6823
|
-
|
|
6824
|
-
|
|
6825
|
-
|
|
6826
|
-
init_waitElementIsVisible();
|
|
6827
|
-
|
|
6828
|
-
|
|
6829
|
-
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6839
|
-
|
|
6840
|
-
|
|
6841
|
-
|
|
6842
|
-
}
|
|
6843
|
-
get path() {
|
|
6844
|
-
return LOGIN_PATH;
|
|
6845
|
-
}
|
|
6846
|
-
async enterUsername(username) {
|
|
6847
|
-
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
6848
|
-
}
|
|
6849
|
-
async enterPassword(password) {
|
|
6850
|
-
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
6851
|
-
}
|
|
6852
|
-
async clickLoginButton() {
|
|
6853
|
-
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
6854
|
-
await waitElementIsVisible_default({
|
|
6855
|
-
driver: this.driver,
|
|
6856
|
-
by: import_selenium_webdriver3.By.id("section"),
|
|
6857
|
-
errorMessage: "Sing in not successful"
|
|
6858
|
-
});
|
|
6859
|
-
}
|
|
6860
|
-
async loginWith(username, password) {
|
|
6861
|
-
await this.enterUsername(username);
|
|
6862
|
-
await this.enterPassword(password);
|
|
6863
|
-
await this.clickLoginButton();
|
|
6864
|
-
}
|
|
6865
|
-
async authorize() {
|
|
6866
|
-
await this.loginWith(config().auth.login, config().auth.password);
|
|
6867
|
-
}
|
|
6868
|
-
};
|
|
6869
|
-
|
|
6870
|
-
// src/index.ts
|
|
6871
|
-
init_locators();
|
|
6872
|
-
|
|
6873
|
-
// src/utils/createDriver.ts
|
|
6874
|
-
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
6875
|
-
var import_node_path = __toESM(require("path"));
|
|
6876
|
-
var import_node_fs = __toESM(require("fs"));
|
|
6877
|
-
var import_node_os = __toESM(require("os"));
|
|
6878
|
-
init_config();
|
|
6879
|
-
var import_chrome = __toESM(require("selenium-webdriver/chrome"));
|
|
6880
|
-
var import_firefox = __toESM(require("selenium-webdriver/firefox"));
|
|
6881
|
-
function chromeOptions(builder, options) {
|
|
6882
|
-
const ChromeOptions = new import_chrome.default.Options();
|
|
6883
|
-
if (options.headless) {
|
|
6884
|
-
ChromeOptions.addArguments(`--headless=new`);
|
|
6885
|
-
ChromeOptions.addArguments(`--disable-gpu`);
|
|
6886
|
-
ChromeOptions.addArguments(`--disable-dev-shm-usage`);
|
|
6887
|
-
ChromeOptions.addArguments(`--window-size=1920,1080`);
|
|
6888
|
-
}
|
|
6889
|
-
const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
|
|
6890
|
-
if (!import_node_fs.default.existsSync(userDataDir)) {
|
|
6891
|
-
import_node_fs.default.mkdirSync(userDataDir, { recursive: true });
|
|
6892
|
-
}
|
|
6893
|
-
ChromeOptions.addArguments(`--user-data-dir=${userDataDir}`);
|
|
6894
|
-
return builder.setChromeOptions(ChromeOptions);
|
|
6895
|
-
}
|
|
6896
|
-
function firefoxOptions(builder, options) {
|
|
6897
|
-
const FirefoxOptions = new import_firefox.default.Options();
|
|
6898
|
-
if (options.headless) {
|
|
6899
|
-
FirefoxOptions.addArguments(`--headless`);
|
|
6900
|
-
}
|
|
6901
|
-
return builder.setFirefoxOptions(FirefoxOptions);
|
|
6902
|
-
}
|
|
6903
|
-
function setOptions(builder, browser, options) {
|
|
6904
|
-
switch (browser) {
|
|
6905
|
-
case "chrome":
|
|
6906
|
-
return chromeOptions(builder, options);
|
|
6907
|
-
case "firefox":
|
|
6908
|
-
return firefoxOptions(builder, options);
|
|
6909
|
-
default:
|
|
6910
|
-
return builder;
|
|
6911
|
-
}
|
|
6912
|
-
}
|
|
6913
|
-
var createDriver = async (browser) => {
|
|
6914
|
-
const _browser = browser ?? config().browser;
|
|
6915
|
-
const headless = config().headless === "true";
|
|
6916
|
-
let builder = new import_selenium_webdriver4.Builder().forBrowser(_browser);
|
|
6917
|
-
builder = setOptions(builder, _browser, { headless });
|
|
6918
|
-
const driver = await builder.build();
|
|
6919
|
-
const manage = driver.manage();
|
|
6920
|
-
await manage.setTimeouts({ implicit: config().timeout });
|
|
6921
|
-
if (!headless) {
|
|
6922
|
-
await manage.window().maximize();
|
|
6923
|
-
}
|
|
6924
|
-
return driver;
|
|
6925
|
-
};
|
|
6926
|
-
|
|
6927
|
-
// src/utils/elementIsNotPresent.ts
|
|
6928
|
-
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
6929
|
-
var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
6930
|
-
return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
|
|
6931
|
-
const elements = await driver.findElements(locator);
|
|
6932
|
-
return elements.length == 0;
|
|
6933
|
-
});
|
|
6934
|
-
};
|
|
6935
|
-
|
|
6936
|
-
// src/index.ts
|
|
6937
|
-
init_waitElementIsVisible();
|
|
6938
|
-
init_waitElementIsClickable();
|
|
6939
|
-
init_wait();
|
|
6940
|
-
|
|
6941
|
-
// src/utils/signIn.ts
|
|
6942
|
-
async function signIn(driver) {
|
|
6943
|
-
const webDriver = driver ?? await createDriver();
|
|
6944
|
-
const loginPage = new LoginPage(webDriver);
|
|
6945
|
-
await loginPage.locate();
|
|
6946
|
-
await loginPage.authorize();
|
|
6947
|
-
return webDriver;
|
|
6948
|
-
}
|
|
6949
|
-
|
|
6950
|
-
// src/index.ts
|
|
6951
|
-
init_actions();
|
|
6952
|
-
init_AbstractPage();
|
|
6953
|
-
|
|
6954
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
6955
|
-
init_AbstractElement();
|
|
6956
|
-
|
|
6957
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
6958
|
-
init_AbstractElementWithParent();
|
|
6959
|
-
var import_selenium_webdriver6 = require("selenium-webdriver");
|
|
6960
|
-
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
6961
|
-
async title() {
|
|
6962
|
-
return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
|
|
6963
|
-
}
|
|
6964
|
-
};
|
|
6965
|
-
|
|
6966
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
6967
|
-
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
6968
|
-
init_wait();
|
|
6969
|
-
init_locators();
|
|
6970
|
-
init_Editors();
|
|
6971
|
-
|
|
6972
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
6973
|
-
init_actions();
|
|
6974
|
-
init_fixElementStaleError();
|
|
6975
|
-
init_waitElementIsVisible();
|
|
6976
|
-
init_waitElementIsClickable();
|
|
6977
|
-
var SubsystemItem = class {
|
|
6978
|
-
bySelector;
|
|
6979
|
-
driver;
|
|
6980
|
-
constructor({ driver, bySelector }) {
|
|
6981
|
-
this.bySelector = bySelector;
|
|
6982
|
-
this.driver = driver;
|
|
6983
|
-
}
|
|
6984
|
-
async getElement() {
|
|
6985
|
-
return fixElementStaleError(this.bySelector, this.driver);
|
|
6986
|
-
}
|
|
6987
|
-
async getTitle() {
|
|
6988
|
-
await waitElementIsVisible_default(
|
|
6989
|
-
{
|
|
6990
|
-
by: this.bySelector,
|
|
6991
|
-
driver: this.driver
|
|
6992
|
-
}
|
|
6993
|
-
);
|
|
6994
|
-
const el = await this.getElement();
|
|
6995
|
-
return await el.getAttribute("data-title");
|
|
6996
|
-
}
|
|
6997
|
-
async click() {
|
|
6998
|
-
await waitElementIsClickable_default(
|
|
6999
|
-
{
|
|
7000
|
-
by: this.bySelector,
|
|
7001
|
-
driver: this.driver
|
|
7002
|
-
}
|
|
7003
|
-
);
|
|
7004
|
-
const el = await this.getElement();
|
|
7005
|
-
await click(el, this.driver);
|
|
7006
|
-
}
|
|
7007
|
-
};
|
|
7008
|
-
|
|
7009
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
7010
|
-
init_createDataTestId();
|
|
7011
|
-
init_actions();
|
|
7012
|
-
init_ClearButtonStrategy();
|
|
7013
|
-
init_waitElementIsVisible();
|
|
7014
|
-
init_fixElementStaleError();
|
|
7015
|
-
var SEARCH_ITEM_SELECTOR = "search-item";
|
|
7016
|
-
var BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
7017
|
-
var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
7018
|
-
var byTitleCssSelector = (title) => {
|
|
7019
|
-
return `span[data-title="${title}"]`;
|
|
7020
|
-
};
|
|
7021
|
-
var SubsystemsPanel = class extends AbstractElement {
|
|
7022
|
-
header;
|
|
7023
|
-
constructor(driver) {
|
|
7024
|
-
super(driver);
|
|
7025
|
-
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
7026
|
-
}
|
|
7027
|
-
async headerTitle() {
|
|
7028
|
-
const title = await this.header.title();
|
|
7029
|
-
await safeWait(async () => await title.getText() != "", this.driver);
|
|
7030
|
-
return title.getText();
|
|
7031
|
-
}
|
|
7032
|
-
getSearchComponent() {
|
|
7033
|
-
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.driver);
|
|
7034
|
-
}
|
|
7035
|
-
/**
|
|
7036
|
-
* Находит сабсистему по заголовку
|
|
7037
|
-
* @example
|
|
7038
|
-
* const subsystemsPanel= new SubsystemsPanel();
|
|
7039
|
-
* //...
|
|
7040
|
-
* await subsystemsPanel.search('SubSystemTitle');
|
|
7041
|
-
*/
|
|
7042
|
-
async search(title) {
|
|
7043
|
-
const searchComponent = this.getSearchComponent();
|
|
7044
|
-
await this.searchClear();
|
|
7045
|
-
await searchComponent.setValue(title);
|
|
7046
|
-
await safeWait(
|
|
7047
|
-
async () => {
|
|
7048
|
-
const findElement = await this.itemByTitle(title).getElement();
|
|
7049
|
-
const classes = await findElement.getAttribute("class");
|
|
7050
|
-
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
7051
|
-
},
|
|
7052
|
-
this.driver,
|
|
7053
|
-
`Cannot find element: ${title}`
|
|
7054
|
-
);
|
|
7055
|
-
}
|
|
7056
|
-
/**
|
|
7057
|
-
* Очищает поиск сабсистем
|
|
7058
|
-
* @example
|
|
7059
|
-
* const subsystemsPanel= new SubsystemsPanel();
|
|
7060
|
-
* //...
|
|
7061
|
-
* await subsystemsPanel.searchClear();
|
|
7062
|
-
*/
|
|
7063
|
-
async searchClear() {
|
|
7064
|
-
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
7065
|
-
const clearBtn = await fixElementStaleError(import_selenium_webdriver17.By.css(clearBtnSelector), this.driver);
|
|
7066
|
-
if (await clearBtn.isDisplayed()) {
|
|
7067
|
-
await click(clearBtn, this.driver);
|
|
7068
|
-
}
|
|
7069
|
-
}
|
|
7070
|
-
/**
|
|
7071
|
-
* Возвращает сабсистему по имени
|
|
7072
|
-
* @example
|
|
7073
|
-
* const subsystemsPanel= new SubsystemsPanel();
|
|
7074
|
-
* //...
|
|
7075
|
-
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
7076
|
-
*/
|
|
7077
|
-
item(name) {
|
|
7078
|
-
const elementCSS = createSubSystemTestId(name);
|
|
7079
|
-
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
|
|
7080
|
-
}
|
|
7081
|
-
/**
|
|
7082
|
-
* Возвращает сабсистему по заголовку
|
|
7083
|
-
* @example
|
|
7084
|
-
* const subsystemsPanel= new SubsystemsPanel();
|
|
7085
|
-
* //...
|
|
7086
|
-
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
7087
|
-
*/
|
|
7088
|
-
itemByTitle(title) {
|
|
7089
|
-
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(byTitleCssSelector(title)) });
|
|
7090
|
-
}
|
|
7091
|
-
/**
|
|
7092
|
-
* Возвращается на уровень выше по сабсистемам
|
|
7093
|
-
* @example
|
|
7094
|
-
* const subsystemsPanel= new SubsystemsPanel();
|
|
7095
|
-
* //...
|
|
7096
|
-
* wait subsystemsPanel.back();
|
|
7097
|
-
*/
|
|
7098
|
-
async back() {
|
|
7099
|
-
const by = import_selenium_webdriver17.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
|
|
7100
|
-
await waitElementIsVisible_default(
|
|
7101
|
-
{
|
|
7102
|
-
by,
|
|
7103
|
-
driver: this.driver
|
|
7104
|
-
}
|
|
7105
|
-
);
|
|
7106
|
-
await click(await fixElementStaleError(by, this.driver), this.driver);
|
|
7107
|
-
}
|
|
7108
|
-
};
|
|
7109
|
-
|
|
7110
|
-
// src/index.ts
|
|
7111
|
-
init_FormEdit();
|
|
7112
|
-
init_ListForm();
|
|
7113
|
-
init_TreeView();
|
|
7114
|
-
|
|
7115
|
-
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
7116
|
-
init_FormEdit();
|
|
7117
|
-
var ReportForm = class extends FormEdit {
|
|
7118
|
-
constructor(driver) {
|
|
7119
|
-
super(driver);
|
|
7120
|
-
this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
|
|
7121
|
-
this.saveButtonId = "#button-apply";
|
|
7122
|
-
}
|
|
7123
|
-
/**
|
|
7124
|
-
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
7125
|
-
* @example
|
|
7126
|
-
* const formReport = new MyForm();
|
|
7127
|
-
* //...
|
|
7128
|
-
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
7129
|
-
*/
|
|
7130
|
-
filterField(name) {
|
|
7131
|
-
return super.field(name);
|
|
7132
|
-
}
|
|
7133
|
-
};
|
|
7134
|
-
|
|
7135
|
-
// src/index.ts
|
|
7136
|
-
init_Editors();
|
|
7137
|
-
init_FormField();
|
|
7138
|
-
init_FormFilterField();
|
|
7139
|
-
init_PanelFilterField();
|
|
7140
|
-
init_FilterPanel();
|
|
7141
|
-
|
|
7142
|
-
// src/pageObjects/elements/Dialog.ts
|
|
7143
|
-
init_AbstractElement();
|
|
7144
|
-
var import_selenium_webdriver34 = require("selenium-webdriver");
|
|
7145
|
-
init_AbstractButton();
|
|
7146
|
-
var DIALOG_CLASS = ".d5-dialog";
|
|
7147
|
-
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
7148
|
-
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
7149
|
-
var DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
|
|
7150
|
-
var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
|
|
7151
|
-
var DialogButton = class extends AbstractButton {
|
|
7152
|
-
text;
|
|
7153
|
-
constructor(parentCssSelector, text, driver) {
|
|
7154
|
-
super(parentCssSelector, "", driver);
|
|
7155
|
-
this.text = text;
|
|
7156
|
-
}
|
|
7157
|
-
async getElement() {
|
|
7158
|
-
const panel = await super.getElement();
|
|
7159
|
-
return panel.findElement(import_selenium_webdriver34.By.xpath(buttonByTextXpath(this.text)));
|
|
7160
|
-
}
|
|
7161
|
-
buttonNotDisplayedError() {
|
|
7162
|
-
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
7163
|
-
}
|
|
7164
|
-
getTitle() {
|
|
7165
|
-
throw new Error(`Method "getTitle()" is not working.`);
|
|
7166
|
-
}
|
|
7167
|
-
};
|
|
7168
|
-
var Dialog = class extends AbstractElement {
|
|
7169
|
-
constructor(driver) {
|
|
7170
|
-
super(driver, DIALOG_CLASS);
|
|
7171
|
-
}
|
|
7172
|
-
get titleSelector() {
|
|
7173
|
-
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
|
|
7174
|
-
}
|
|
7175
|
-
get textSelector() {
|
|
7176
|
-
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
|
|
7177
|
-
}
|
|
7178
|
-
get buttonsSelector() {
|
|
7179
|
-
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
7180
|
-
}
|
|
7181
|
-
async title() {
|
|
7182
|
-
const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.titleSelector));
|
|
7183
|
-
return await el.getText();
|
|
7184
|
-
}
|
|
7185
|
-
async text() {
|
|
7186
|
-
const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.textSelector));
|
|
7187
|
-
return await el.getText();
|
|
7188
|
-
}
|
|
7189
|
-
button(text) {
|
|
7190
|
-
return new DialogButton(this.buttonsSelector, text, this.driver);
|
|
7096
|
+
var init_src = __esm({
|
|
7097
|
+
"src/index.ts"() {
|
|
7098
|
+
init_config();
|
|
7099
|
+
init_LoginPage();
|
|
7100
|
+
init_locators();
|
|
7101
|
+
init_waitElementIsVisible();
|
|
7102
|
+
init_wait();
|
|
7103
|
+
init_AbstractPage();
|
|
7104
|
+
init_LoginPage();
|
|
7105
|
+
init_SubsystemsPanel();
|
|
7106
|
+
init_FormEdit();
|
|
7107
|
+
init_ListForm();
|
|
7108
|
+
init_TreeView();
|
|
7109
|
+
init_ReportForm();
|
|
7110
|
+
init_Editors();
|
|
7111
|
+
init_FormField();
|
|
7112
|
+
init_FormFilterField();
|
|
7113
|
+
init_PanelFilterField();
|
|
7114
|
+
init_FilterPanel();
|
|
7115
|
+
init_Dialog();
|
|
7116
|
+
init_ApiRequest();
|
|
7191
7117
|
}
|
|
7192
|
-
};
|
|
7193
|
-
|
|
7194
|
-
// src/api/ApiRequest.ts
|
|
7195
|
-
init_config();
|
|
7196
|
-
var import_d5lib = __toESM(require_d5lib());
|
|
7197
|
-
function ApiRequest(objectName, operation) {
|
|
7198
|
-
const { auth } = config();
|
|
7199
|
-
(0, import_d5lib.config)(auth);
|
|
7200
|
-
const postInstance = (0, import_d5lib.post)(objectName, operation);
|
|
7201
|
-
const invoke = async () => {
|
|
7202
|
-
return postInstance.send(true);
|
|
7203
|
-
};
|
|
7204
|
-
return Object.assign(postInstance, { invoke });
|
|
7205
|
-
}
|
|
7118
|
+
});
|
|
7119
|
+
init_src();
|
|
7206
7120
|
// Annotate the CommonJS export names for ESM import in node:
|
|
7207
7121
|
0 && (module.exports = {
|
|
7208
7122
|
AbstractPage,
|
|
@@ -7223,17 +7137,11 @@ function ApiRequest(objectName, operation) {
|
|
|
7223
7137
|
TreeView,
|
|
7224
7138
|
byTestId,
|
|
7225
7139
|
byTestIdCssSelector,
|
|
7226
|
-
click,
|
|
7227
7140
|
config,
|
|
7228
|
-
contextMenu,
|
|
7229
|
-
createDriver,
|
|
7230
7141
|
disabledLocator,
|
|
7231
7142
|
editorFactory,
|
|
7232
|
-
elementIsNotPresent,
|
|
7233
7143
|
readonlyLocator,
|
|
7234
|
-
signIn,
|
|
7235
7144
|
wait,
|
|
7236
|
-
waitElementIsClickable,
|
|
7237
7145
|
waitElementIsVisible
|
|
7238
7146
|
});
|
|
7239
7147
|
/*! For license information please see d5lib.js.LICENSE.txt */
|