d5-testing-library 2.0.0-alpha.0 → 2.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormEdit-I63LWQEH.mjs +6 -0
- package/dist/ListForm-NEBCZD4X.mjs +6 -0
- package/dist/TreeView-T3PIDSZQ.mjs +6 -0
- package/dist/chunk-75NROWLM.mjs +6193 -0
- package/dist/cjs/d5-testing-library.cjs +1175 -1473
- package/dist/cjs/d5-testing-library.d.ts +126 -160
- package/dist/d5-testing-library.d.mts +126 -160
- 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,41 @@ 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
|
+
getLocator() {
|
|
80
|
+
return this.page.locator(`css=${this.getFullCssSelector()}`);
|
|
127
81
|
}
|
|
128
82
|
async getAttribute(attr) {
|
|
129
|
-
const
|
|
130
|
-
|
|
83
|
+
const locator = this.getLocator();
|
|
84
|
+
if (await locator.isVisible()) {
|
|
85
|
+
return locator.getAttribute(attr);
|
|
86
|
+
}
|
|
87
|
+
return "";
|
|
131
88
|
}
|
|
132
|
-
|
|
133
|
-
return
|
|
89
|
+
getClasses() {
|
|
90
|
+
return this.getAttribute("class");
|
|
134
91
|
}
|
|
135
|
-
|
|
136
|
-
return
|
|
92
|
+
getDataTestId() {
|
|
93
|
+
return this.getAttribute("data-testid");
|
|
137
94
|
}
|
|
138
|
-
|
|
139
|
-
return
|
|
95
|
+
getDataDateMode() {
|
|
96
|
+
return this.getAttribute("data-datemode");
|
|
140
97
|
}
|
|
141
98
|
};
|
|
142
99
|
}
|
|
@@ -147,15 +104,12 @@ var AbstractPage;
|
|
|
147
104
|
var init_AbstractPage = __esm({
|
|
148
105
|
"src/pageObjects/pages/AbstractPage.ts"() {
|
|
149
106
|
"use strict";
|
|
150
|
-
init_config();
|
|
151
107
|
init_AbstractElement();
|
|
152
108
|
AbstractPage = class extends AbstractElement {
|
|
153
109
|
url;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
this.host = config().auth.host;
|
|
158
|
-
this.url = this.host + this.prependHash(this.path);
|
|
110
|
+
constructor(page) {
|
|
111
|
+
super(page);
|
|
112
|
+
this.url = this.prependHash(this.path);
|
|
159
113
|
}
|
|
160
114
|
prependHash(urlPath) {
|
|
161
115
|
if (!urlPath.startsWith("/#")) {
|
|
@@ -164,7 +118,7 @@ var init_AbstractPage = __esm({
|
|
|
164
118
|
return urlPath;
|
|
165
119
|
}
|
|
166
120
|
async goToUrl(url) {
|
|
167
|
-
await this.
|
|
121
|
+
await this.page.goto(url);
|
|
168
122
|
}
|
|
169
123
|
get path() {
|
|
170
124
|
return "/#";
|
|
@@ -173,115 +127,99 @@ var init_AbstractPage = __esm({
|
|
|
173
127
|
await this.goToUrl(this.url);
|
|
174
128
|
}
|
|
175
129
|
async reloadPage() {
|
|
176
|
-
await this.
|
|
130
|
+
await this.page.reload();
|
|
177
131
|
}
|
|
178
132
|
};
|
|
179
133
|
}
|
|
180
134
|
});
|
|
181
135
|
|
|
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"() {
|
|
136
|
+
// src/pageObjects/pages/LoginPage.ts
|
|
137
|
+
var LOGIN_PATH, LoginPage;
|
|
138
|
+
var init_LoginPage = __esm({
|
|
139
|
+
"src/pageObjects/pages/LoginPage.ts"() {
|
|
229
140
|
"use strict";
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
141
|
+
init_AbstractPage();
|
|
142
|
+
LOGIN_PATH = "/login";
|
|
143
|
+
LoginPage = class extends AbstractPage {
|
|
144
|
+
async locate() {
|
|
145
|
+
await super.locate();
|
|
146
|
+
await this.page.getByTestId("loginField").waitFor({ state: "visible" });
|
|
233
147
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
148
|
+
get path() {
|
|
149
|
+
return LOGIN_PATH;
|
|
150
|
+
}
|
|
151
|
+
enterUsername(username) {
|
|
152
|
+
return this.page.getByTestId("loginField").fill(username);
|
|
153
|
+
}
|
|
154
|
+
enterPassword(password) {
|
|
155
|
+
return this.page.getByTestId("passwordField").fill(password);
|
|
156
|
+
}
|
|
157
|
+
async clickLoginButton() {
|
|
158
|
+
await this.page.getByTestId("loginButton").click();
|
|
159
|
+
}
|
|
160
|
+
async loginWith(username, password) {
|
|
161
|
+
await this.enterUsername(username);
|
|
162
|
+
await this.enterPassword(password);
|
|
163
|
+
await this.clickLoginButton();
|
|
240
164
|
}
|
|
241
|
-
const actions = driver.actions({ async: true });
|
|
242
|
-
await actions.move({ origin: webElement }).contextClick().perform();
|
|
243
165
|
};
|
|
244
166
|
}
|
|
245
167
|
});
|
|
246
168
|
|
|
247
169
|
// src/utils/locators.ts
|
|
248
|
-
var
|
|
170
|
+
var byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
|
|
249
171
|
var init_locators = __esm({
|
|
250
172
|
"src/utils/locators.ts"() {
|
|
251
173
|
"use strict";
|
|
252
|
-
import_selenium_webdriver2 = require("selenium-webdriver");
|
|
253
174
|
byTestIdCssSelector = (testId, element = "div") => {
|
|
254
175
|
return `${element}[data-testid="${testId}"]`;
|
|
255
176
|
};
|
|
256
177
|
byTestId = (testId, element = "div") => {
|
|
257
|
-
return
|
|
178
|
+
return byTestIdCssSelector(testId, element);
|
|
258
179
|
};
|
|
259
180
|
readonlyLocator = "readonly";
|
|
260
181
|
disabledLocator = "disabled";
|
|
261
182
|
}
|
|
262
183
|
});
|
|
263
184
|
|
|
264
|
-
// src/utils/
|
|
265
|
-
async function
|
|
185
|
+
// src/utils/waitElementIsVisible.ts
|
|
186
|
+
async function waitElementIsVisible({
|
|
266
187
|
timeout,
|
|
267
|
-
|
|
268
|
-
driver,
|
|
269
|
-
...rest
|
|
188
|
+
locator
|
|
270
189
|
}) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
190
|
+
try {
|
|
191
|
+
await locator.waitFor({ state: "visible", timeout });
|
|
192
|
+
} catch {
|
|
193
|
+
throw new Error("Element is not visible");
|
|
194
|
+
}
|
|
276
195
|
}
|
|
277
|
-
var
|
|
278
|
-
var
|
|
279
|
-
"src/utils/
|
|
196
|
+
var waitElementIsVisible_default;
|
|
197
|
+
var init_waitElementIsVisible = __esm({
|
|
198
|
+
"src/utils/waitElementIsVisible.ts"() {
|
|
199
|
+
"use strict";
|
|
200
|
+
waitElementIsVisible_default = waitElementIsVisible;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// src/utils/wait.ts
|
|
205
|
+
async function wait(condition, page, errorMessage, timeout = 3e4) {
|
|
206
|
+
const start = Date.now();
|
|
207
|
+
while (true) {
|
|
208
|
+
try {
|
|
209
|
+
const result = await condition();
|
|
210
|
+
if (result) return;
|
|
211
|
+
} catch {
|
|
212
|
+
}
|
|
213
|
+
if (Date.now() - start > timeout) {
|
|
214
|
+
const msg = errorMessage || `Timeout waiting for condition after ${timeout}ms`;
|
|
215
|
+
throw new Error(msg);
|
|
216
|
+
}
|
|
217
|
+
await page.waitForTimeout(100);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
var init_wait = __esm({
|
|
221
|
+
"src/utils/wait.ts"() {
|
|
280
222
|
"use strict";
|
|
281
|
-
init_config();
|
|
282
|
-
init_wait();
|
|
283
|
-
init_fixElementStaleError();
|
|
284
|
-
waitElementIsClickable_default = waitElementIsClickable;
|
|
285
223
|
}
|
|
286
224
|
});
|
|
287
225
|
|
|
@@ -293,9 +231,8 @@ var init_AbstractElementWithParent = __esm({
|
|
|
293
231
|
init_AbstractElement();
|
|
294
232
|
init_locators();
|
|
295
233
|
AbstractElementWithParent = class extends AbstractElement {
|
|
296
|
-
parentCssSelector
|
|
297
|
-
|
|
298
|
-
super(driver, elementCssSelector);
|
|
234
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
235
|
+
super(page, elementCssSelector);
|
|
299
236
|
this.parentCssSelector = parentCssSelector;
|
|
300
237
|
}
|
|
301
238
|
getFullCssSelector() {
|
|
@@ -308,59 +245,92 @@ var init_AbstractElementWithParent = __esm({
|
|
|
308
245
|
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
309
246
|
}
|
|
310
247
|
async isReadonly() {
|
|
311
|
-
const
|
|
312
|
-
return
|
|
248
|
+
const classString = await this.getClasses();
|
|
249
|
+
return classString.includes(readonlyLocator);
|
|
313
250
|
}
|
|
314
251
|
async isDisabled() {
|
|
315
|
-
const
|
|
316
|
-
return
|
|
252
|
+
const classString = await this.getClasses();
|
|
253
|
+
return classString.includes(disabledLocator);
|
|
317
254
|
}
|
|
318
255
|
};
|
|
319
256
|
}
|
|
320
257
|
});
|
|
321
258
|
|
|
322
|
-
// src/pageObjects/elements/
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
"src/pageObjects/elements/
|
|
259
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
260
|
+
var SubsystemsPanelHeader;
|
|
261
|
+
var init_SubsystemsPanelHeader = __esm({
|
|
262
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts"() {
|
|
326
263
|
"use strict";
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
264
|
+
init_AbstractElementWithParent();
|
|
265
|
+
SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
266
|
+
async title() {
|
|
267
|
+
return this.page.locator(this.getFullCssSelector());
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
274
|
+
var DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
|
|
275
|
+
var init_ClearButtonStrategy = __esm({
|
|
276
|
+
"src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
|
|
277
|
+
"use strict";
|
|
278
|
+
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
279
|
+
DX_CLEAR_BUTTON_AREA = ".dx-clear-button-area .dx-icon-clear";
|
|
280
|
+
ClearButtonStrategy = class {
|
|
281
|
+
editorContainerSelector;
|
|
282
|
+
page;
|
|
283
|
+
constructor(editorContainerSelector, page) {
|
|
284
|
+
this.editorContainerSelector = editorContainerSelector;
|
|
285
|
+
this.page = page;
|
|
286
|
+
}
|
|
287
|
+
get editorContainer() {
|
|
288
|
+
return this.page.locator(this.editorContainerSelector);
|
|
289
|
+
}
|
|
290
|
+
async isEmptyEditorField() {
|
|
291
|
+
const classAttribute = await this.editorContainer.getAttribute("class");
|
|
292
|
+
return Boolean(classAttribute?.includes(DX_TEXTEDITOR_EMPTY));
|
|
293
|
+
}
|
|
294
|
+
async clear() {
|
|
295
|
+
if (await this.isEmptyEditorField()) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const clearButton = this.editorContainer.locator(`${DX_CLEAR_BUTTON_AREA}`);
|
|
299
|
+
if (await clearButton.isHidden()) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
await clearButton.click();
|
|
331
303
|
}
|
|
332
304
|
};
|
|
333
305
|
}
|
|
334
306
|
});
|
|
335
307
|
|
|
336
308
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
337
|
-
var
|
|
309
|
+
var AbstractDXEditorWithInput;
|
|
338
310
|
var init_AbstractEditor = __esm({
|
|
339
311
|
"src/pageObjects/elements/Editors/AbstractEditor.ts"() {
|
|
340
312
|
"use strict";
|
|
341
|
-
import_selenium_webdriver7 = require("selenium-webdriver");
|
|
342
|
-
init_actions();
|
|
343
|
-
init_InputClearStrategy();
|
|
344
313
|
init_AbstractElementWithParent();
|
|
314
|
+
init_ClearButtonStrategy();
|
|
345
315
|
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
346
|
-
clearStrategy = new
|
|
316
|
+
clearStrategy = new ClearButtonStrategy(this.getFullCssSelector(), this.page);
|
|
347
317
|
setClearStrategy(strategy) {
|
|
348
318
|
this.clearStrategy = strategy;
|
|
349
319
|
}
|
|
350
320
|
getInputCssSelector() {
|
|
351
321
|
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
352
322
|
}
|
|
353
|
-
|
|
354
|
-
return this.
|
|
323
|
+
getInputLocator() {
|
|
324
|
+
return this.page.locator(this.getInputCssSelector());
|
|
355
325
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
return inputEl.getAttribute("value");
|
|
326
|
+
getInputValue() {
|
|
327
|
+
return this.getInputLocator().inputValue();
|
|
359
328
|
}
|
|
360
329
|
async setInputValue(value) {
|
|
361
|
-
const
|
|
362
|
-
await click(
|
|
363
|
-
await
|
|
330
|
+
const input = this.getInputLocator();
|
|
331
|
+
await input.click();
|
|
332
|
+
await input.fill(value + "");
|
|
333
|
+
await input.press("Enter");
|
|
364
334
|
}
|
|
365
335
|
async clear() {
|
|
366
336
|
await this.clearStrategy.clear(this);
|
|
@@ -375,11 +345,11 @@ var init_TextEditor = __esm({
|
|
|
375
345
|
"src/pageObjects/elements/Editors/TextEditor.ts"() {
|
|
376
346
|
"use strict";
|
|
377
347
|
init_AbstractEditor();
|
|
378
|
-
|
|
348
|
+
init_ClearButtonStrategy();
|
|
379
349
|
TextEditor = class extends AbstractDXEditorWithInput {
|
|
380
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
381
|
-
super(parentCssSelector, elementCssSelector,
|
|
382
|
-
this.setClearStrategy(new
|
|
350
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
351
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
352
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
383
353
|
}
|
|
384
354
|
async getValue() {
|
|
385
355
|
const value = await super.getInputValue();
|
|
@@ -398,11 +368,11 @@ var init_NumberEditor = __esm({
|
|
|
398
368
|
"src/pageObjects/elements/Editors/NumberEditor.ts"() {
|
|
399
369
|
"use strict";
|
|
400
370
|
init_AbstractEditor();
|
|
401
|
-
|
|
371
|
+
init_ClearButtonStrategy();
|
|
402
372
|
NumberEditor = class extends AbstractDXEditorWithInput {
|
|
403
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
404
|
-
super(parentCssSelector, elementCssSelector,
|
|
405
|
-
this.setClearStrategy(new
|
|
373
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
374
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
375
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
406
376
|
}
|
|
407
377
|
async getValue() {
|
|
408
378
|
const value = await super.getInputValue();
|
|
@@ -445,8 +415,8 @@ var init_AbstractFormElement = __esm({
|
|
|
445
415
|
"use strict";
|
|
446
416
|
init_AbstractElementWithParent();
|
|
447
417
|
AbstractFormElement = class extends AbstractElementWithParent {
|
|
448
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
449
|
-
super(parentCssSelector, elementCssSelector,
|
|
418
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
419
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
450
420
|
}
|
|
451
421
|
};
|
|
452
422
|
}
|
|
@@ -457,7 +427,6 @@ var CheckBox;
|
|
|
457
427
|
var init_CheckBox = __esm({
|
|
458
428
|
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
459
429
|
"use strict";
|
|
460
|
-
init_actions();
|
|
461
430
|
init_AbstractElementWithParent();
|
|
462
431
|
CheckBox = class extends AbstractElementWithParent {
|
|
463
432
|
async getValue() {
|
|
@@ -467,10 +436,10 @@ var init_CheckBox = __esm({
|
|
|
467
436
|
return null;
|
|
468
437
|
}
|
|
469
438
|
async setValue(value) {
|
|
470
|
-
const inputEl =
|
|
439
|
+
const inputEl = this.getLocator();
|
|
471
440
|
const currentValue = await this.getValue();
|
|
472
441
|
if (currentValue !== value) {
|
|
473
|
-
await click(
|
|
442
|
+
await inputEl.click();
|
|
474
443
|
}
|
|
475
444
|
}
|
|
476
445
|
};
|
|
@@ -490,105 +459,122 @@ var init_xpathHelper = __esm({
|
|
|
490
459
|
}
|
|
491
460
|
});
|
|
492
461
|
|
|
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 });
|
|
462
|
+
// src/utils/typesUtil.ts
|
|
463
|
+
function isEmptyValue(value) {
|
|
464
|
+
switch (true) {
|
|
465
|
+
case !isDefined(value):
|
|
466
|
+
case value === "":
|
|
467
|
+
case (isArray(value) && !value.length):
|
|
468
|
+
case (isObject(value) && isEmptyObject(value)):
|
|
469
|
+
return true;
|
|
534
470
|
}
|
|
471
|
+
return false;
|
|
535
472
|
}
|
|
536
|
-
var
|
|
537
|
-
var
|
|
538
|
-
"src/utils/
|
|
473
|
+
var types, isObject, isEmptyObject, type, isNull, isArray, isDefined, isString, isDate, isArrayOfDates, isUndefined;
|
|
474
|
+
var init_typesUtil = __esm({
|
|
475
|
+
"src/utils/typesUtil.ts"() {
|
|
539
476
|
"use strict";
|
|
540
|
-
|
|
477
|
+
types = {
|
|
478
|
+
"[object Array]": "array",
|
|
479
|
+
"[object Date]": "date",
|
|
480
|
+
"[object Object]": "object",
|
|
481
|
+
"[object String]": "string",
|
|
482
|
+
"[object Null]": "null"
|
|
483
|
+
};
|
|
484
|
+
isObject = function(value) {
|
|
485
|
+
return type(value) === "object" && !isNull(value) && !isArray(value) && !isDate(value);
|
|
486
|
+
};
|
|
487
|
+
isEmptyObject = function(object) {
|
|
488
|
+
return !Object.keys(object).length;
|
|
489
|
+
};
|
|
490
|
+
type = function(object) {
|
|
491
|
+
const typeOfObject = Object.prototype.toString.call(object);
|
|
492
|
+
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
493
|
+
};
|
|
494
|
+
isNull = function(value) {
|
|
495
|
+
return type(value) === "null";
|
|
496
|
+
};
|
|
497
|
+
isArray = function(value) {
|
|
498
|
+
return type(value) === "array";
|
|
499
|
+
};
|
|
500
|
+
isDefined = function(value) {
|
|
501
|
+
return value !== null && !isUndefined(value);
|
|
502
|
+
};
|
|
503
|
+
isString = function(object) {
|
|
504
|
+
return typeof object === "string";
|
|
505
|
+
};
|
|
506
|
+
isDate = function(object) {
|
|
507
|
+
return type(object) === "date";
|
|
508
|
+
};
|
|
509
|
+
isArrayOfDates = function(array) {
|
|
510
|
+
return isArray(array) && array.every(isDate);
|
|
511
|
+
};
|
|
512
|
+
isUndefined = (val) => val === void 0;
|
|
541
513
|
}
|
|
542
514
|
});
|
|
543
515
|
|
|
544
516
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
545
|
-
var
|
|
517
|
+
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
546
518
|
var init_SelectBoxEditor = __esm({
|
|
547
519
|
"src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
|
|
548
520
|
"use strict";
|
|
549
521
|
init_AbstractEditor();
|
|
550
|
-
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
551
|
-
init_xpathHelper();
|
|
552
|
-
init_actions();
|
|
553
522
|
init_ClearButtonStrategy();
|
|
554
|
-
|
|
523
|
+
init_xpathHelper();
|
|
524
|
+
init_src();
|
|
525
|
+
init_typesUtil();
|
|
555
526
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
556
527
|
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}"`);
|
|
528
|
+
dropDownOptionClick = async (optionValue, page, delay = true) => {
|
|
529
|
+
const locator = page.locator(`xpath=${combinedValueXpath(optionValue)}`);
|
|
530
|
+
if (delay) {
|
|
531
|
+
try {
|
|
532
|
+
await locator.waitFor({ state: "visible", timeout: 5e3 });
|
|
533
|
+
} catch {
|
|
534
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
535
|
+
}
|
|
536
|
+
} else {
|
|
537
|
+
if (await locator.count() === 0) {
|
|
538
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
539
|
+
}
|
|
570
540
|
}
|
|
571
|
-
|
|
572
|
-
throw err;
|
|
541
|
+
await locator.click();
|
|
573
542
|
};
|
|
574
543
|
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
575
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
576
|
-
super(parentCssSelector, elementCssSelector,
|
|
577
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
544
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
545
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
546
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
547
|
+
}
|
|
548
|
+
getInputLocator() {
|
|
549
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
578
550
|
}
|
|
579
551
|
async setSelectInputValue(value) {
|
|
580
|
-
const inputEl =
|
|
581
|
-
await click(
|
|
552
|
+
const inputEl = this.getInputLocator();
|
|
553
|
+
await inputEl.click();
|
|
582
554
|
try {
|
|
583
|
-
await
|
|
555
|
+
await inputEl.fill(value);
|
|
556
|
+
await inputEl.press("Enter");
|
|
557
|
+
await dropDownOptionClick(value, this.page, false);
|
|
584
558
|
} catch {
|
|
585
|
-
await
|
|
586
|
-
await dropDownOptionClick(value, this.driver);
|
|
559
|
+
await dropDownOptionClick(value, this.page);
|
|
587
560
|
}
|
|
588
561
|
}
|
|
562
|
+
getHiddenInputValue() {
|
|
563
|
+
const hiddenInput = this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
|
|
564
|
+
return hiddenInput.getAttribute("value");
|
|
565
|
+
}
|
|
589
566
|
async getValue() {
|
|
590
|
-
|
|
591
|
-
|
|
567
|
+
let result = null;
|
|
568
|
+
await wait(async () => {
|
|
569
|
+
const hiddenValue = await this.getHiddenInputValue();
|
|
570
|
+
if (!isEmptyValue(hiddenValue)) {
|
|
571
|
+
const value = await super.getInputValue();
|
|
572
|
+
result = value;
|
|
573
|
+
return !isEmptyValue(value);
|
|
574
|
+
}
|
|
575
|
+
return true;
|
|
576
|
+
}, this.page);
|
|
577
|
+
return result === "" ? null : result;
|
|
592
578
|
}
|
|
593
579
|
setValue(value) {
|
|
594
580
|
return this.setSelectInputValue(value);
|
|
@@ -602,7 +588,6 @@ var SwitchEditor;
|
|
|
602
588
|
var init_SwitchEditor = __esm({
|
|
603
589
|
"src/pageObjects/elements/Editors/SwitchEditor.ts"() {
|
|
604
590
|
"use strict";
|
|
605
|
-
init_actions();
|
|
606
591
|
init_AbstractElementWithParent();
|
|
607
592
|
init_wait();
|
|
608
593
|
SwitchEditor = class extends AbstractElementWithParent {
|
|
@@ -616,141 +601,139 @@ var init_SwitchEditor = __esm({
|
|
|
616
601
|
if (value !== 0 && value !== 1) {
|
|
617
602
|
value = value ? 1 : 0;
|
|
618
603
|
}
|
|
619
|
-
const inputEl =
|
|
604
|
+
const inputEl = this.getLocator();
|
|
620
605
|
const currentValue = await this.getValue();
|
|
621
606
|
if (currentValue === value) {
|
|
622
607
|
return;
|
|
623
608
|
}
|
|
624
|
-
await click(
|
|
625
|
-
await
|
|
609
|
+
await inputEl.click();
|
|
610
|
+
await wait(async () => {
|
|
626
611
|
const updatedValue = await this.getValue();
|
|
627
612
|
return updatedValue !== currentValue;
|
|
628
|
-
}, this.
|
|
613
|
+
}, this.page);
|
|
629
614
|
}
|
|
630
615
|
};
|
|
631
616
|
}
|
|
632
617
|
});
|
|
633
618
|
|
|
634
619
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
635
|
-
var
|
|
620
|
+
var TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TagBox;
|
|
636
621
|
var init_TagBox = __esm({
|
|
637
622
|
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
638
623
|
"use strict";
|
|
639
624
|
init_AbstractEditor();
|
|
640
|
-
|
|
641
|
-
init_actions();
|
|
625
|
+
init_ClearButtonStrategy();
|
|
642
626
|
init_locators();
|
|
643
627
|
init_SelectBoxEditor();
|
|
644
|
-
init_ClearButtonStrategy();
|
|
645
|
-
init_fixElementStaleError();
|
|
646
628
|
init_wait();
|
|
647
629
|
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
648
630
|
DX_TAG_CONTAINER = "dx-tag-container";
|
|
649
631
|
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
650
632
|
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
633
|
TagBox = class extends AbstractDXEditorWithInput {
|
|
653
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
654
|
-
super(parentCssSelector, elementCssSelector,
|
|
655
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
634
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
635
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
636
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
637
|
+
}
|
|
638
|
+
getInputLocator() {
|
|
639
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
656
640
|
}
|
|
657
641
|
async setTagBoxInputValue(values) {
|
|
658
642
|
const lastElement = values[values.length - 1];
|
|
659
|
-
const
|
|
660
|
-
await
|
|
643
|
+
const input = this.getInputLocator();
|
|
644
|
+
await input.click();
|
|
661
645
|
for (const value of values) {
|
|
662
|
-
await this.selectOption(
|
|
646
|
+
await this.selectOption(input, value, lastElement);
|
|
663
647
|
}
|
|
664
648
|
await this.confirmSelection();
|
|
665
649
|
}
|
|
666
650
|
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
|
-
);
|
|
651
|
+
const option = this.page.locator(`.dx-overlay-wrapper .dx-list-item[aria-selected="true"] >> text=${value}`);
|
|
652
|
+
await option.waitFor({ state: "visible", timeout: 5e3 });
|
|
675
653
|
}
|
|
676
|
-
async selectOption(
|
|
654
|
+
async selectOption(input, value, lastElement) {
|
|
677
655
|
try {
|
|
678
|
-
await dropDownOptionClick(value, this.
|
|
656
|
+
await dropDownOptionClick(value, this.page, false);
|
|
679
657
|
} catch {
|
|
680
|
-
await
|
|
681
|
-
await dropDownOptionClick(value, this.
|
|
658
|
+
await input.fill(value);
|
|
659
|
+
await dropDownOptionClick(value, this.page, true);
|
|
682
660
|
}
|
|
683
661
|
await this.waitOptionSelection(value);
|
|
684
662
|
if (value !== lastElement) {
|
|
685
|
-
await
|
|
663
|
+
await input.fill("");
|
|
686
664
|
}
|
|
687
665
|
}
|
|
688
666
|
async confirmSelection() {
|
|
689
|
-
const btnOk =
|
|
690
|
-
await click(
|
|
667
|
+
const btnOk = this.page.locator(BTN_OK_SELECTOR);
|
|
668
|
+
await btnOk.click();
|
|
691
669
|
}
|
|
692
670
|
async getTagBoxInputValue() {
|
|
693
|
-
if (await this.isTagBoxEmpty())
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
671
|
+
if (await this.isTagBoxEmpty()) return [];
|
|
672
|
+
let count = 0;
|
|
673
|
+
let tags = null;
|
|
674
|
+
await wait(
|
|
675
|
+
async () => {
|
|
676
|
+
tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`);
|
|
677
|
+
count = await tags.count();
|
|
678
|
+
return count > 0;
|
|
679
|
+
},
|
|
680
|
+
this.page
|
|
698
681
|
);
|
|
699
682
|
const values = [];
|
|
700
|
-
|
|
701
|
-
|
|
683
|
+
if (tags) {
|
|
684
|
+
for (let i = 0; i < count; i++) {
|
|
685
|
+
const tag = tags.nth(i);
|
|
686
|
+
const text = await tag.innerText();
|
|
687
|
+
if (text) values.push(text.trim());
|
|
688
|
+
}
|
|
702
689
|
}
|
|
703
690
|
return values;
|
|
704
691
|
}
|
|
705
692
|
async isTagBoxEmpty() {
|
|
706
|
-
const
|
|
707
|
-
return
|
|
693
|
+
const classAttr = await this.getClasses();
|
|
694
|
+
return classAttr.includes(DX_TEXTEDITOR_EMPTY2);
|
|
708
695
|
}
|
|
709
696
|
async getValue() {
|
|
710
697
|
const value = await this.getTagBoxInputValue();
|
|
711
698
|
return value.length ? value : null;
|
|
712
699
|
}
|
|
713
700
|
async setValue(values) {
|
|
714
|
-
if (!Array.isArray(values))
|
|
715
|
-
throw new Error("The provided value is not an array");
|
|
716
|
-
}
|
|
701
|
+
if (!Array.isArray(values)) throw new Error("The provided value is not an array");
|
|
717
702
|
await this.setTagBoxInputValue(values);
|
|
718
703
|
}
|
|
719
704
|
async remove(itemText) {
|
|
720
705
|
const tagValues = await this.getValue();
|
|
721
|
-
|
|
722
|
-
if (!tagExists) {
|
|
706
|
+
if (!tagValues.includes(itemText)) {
|
|
723
707
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
724
708
|
}
|
|
725
709
|
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
726
|
-
const clearBtn =
|
|
727
|
-
|
|
728
|
-
);
|
|
729
|
-
await click(clearBtn, this.driver);
|
|
710
|
+
const clearBtn = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`);
|
|
711
|
+
await clearBtn.click();
|
|
730
712
|
}
|
|
731
713
|
};
|
|
732
714
|
}
|
|
733
715
|
});
|
|
734
716
|
|
|
735
717
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
736
|
-
var
|
|
718
|
+
var ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
|
|
737
719
|
var init_ButtonGroup = __esm({
|
|
738
720
|
"src/pageObjects/elements/Editors/ButtonGroup.ts"() {
|
|
739
721
|
"use strict";
|
|
740
|
-
init_actions();
|
|
741
|
-
import_selenium_webdriver11 = require("selenium-webdriver");
|
|
742
722
|
init_AbstractElementWithParent();
|
|
743
723
|
ITEM_CLASS = "dx-buttongroup-item";
|
|
744
724
|
SELECTED_CLASS = "dx-state-selected";
|
|
745
725
|
ButtonGroup = class extends AbstractElementWithParent {
|
|
726
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
727
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
728
|
+
}
|
|
746
729
|
getItems() {
|
|
747
|
-
return this.
|
|
730
|
+
return this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}`).all();
|
|
748
731
|
}
|
|
749
|
-
getDataValue(el) {
|
|
750
|
-
return el.getAttribute("data-value");
|
|
732
|
+
async getDataValue(el) {
|
|
733
|
+
return await el.getAttribute("data-value");
|
|
751
734
|
}
|
|
752
735
|
async getValue() {
|
|
753
|
-
const selectedEl =
|
|
736
|
+
const selectedEl = this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`);
|
|
754
737
|
return this.getDataValue(selectedEl);
|
|
755
738
|
}
|
|
756
739
|
async setValue(value) {
|
|
@@ -764,7 +747,7 @@ var init_ButtonGroup = __esm({
|
|
|
764
747
|
}
|
|
765
748
|
}
|
|
766
749
|
if (!buttonEl) throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
767
|
-
await click(
|
|
750
|
+
await buttonEl.click();
|
|
768
751
|
}
|
|
769
752
|
};
|
|
770
753
|
}
|
|
@@ -838,14 +821,12 @@ var init_DateSelectMode = __esm({
|
|
|
838
821
|
});
|
|
839
822
|
|
|
840
823
|
// src/pageObjects/elements/Editors/Date/Calendar.ts
|
|
841
|
-
var
|
|
824
|
+
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
825
|
var init_Calendar = __esm({
|
|
843
826
|
"src/pageObjects/elements/Editors/Date/Calendar.ts"() {
|
|
844
827
|
"use strict";
|
|
845
828
|
init_AbstractElementWithParent();
|
|
846
|
-
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
847
829
|
init_locators();
|
|
848
|
-
init_actions();
|
|
849
830
|
init_utils();
|
|
850
831
|
BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
851
832
|
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
@@ -860,131 +841,110 @@ var init_Calendar = __esm({
|
|
|
860
841
|
movesToCalendarEndForMonth = 1;
|
|
861
842
|
Calendar = class extends AbstractElementWithParent {
|
|
862
843
|
_parentCssSelector;
|
|
863
|
-
constructor({ parentCssSelector, dateFieldDataTestID,
|
|
864
|
-
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`),
|
|
844
|
+
constructor({ parentCssSelector, dateFieldDataTestID, page }) {
|
|
845
|
+
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), page);
|
|
865
846
|
this._parentCssSelector = parentCssSelector;
|
|
866
847
|
}
|
|
848
|
+
get root() {
|
|
849
|
+
return this.getLocator();
|
|
850
|
+
}
|
|
867
851
|
async init() {
|
|
868
|
-
const dateField =
|
|
869
|
-
|
|
870
|
-
await click(button, this.driver);
|
|
852
|
+
const dateField = this.page.locator(this._parentCssSelector);
|
|
853
|
+
await dateField.locator(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`).click();
|
|
871
854
|
}
|
|
872
|
-
/**
|
|
873
|
-
* Переходимо на найвищий рівень календаря
|
|
874
|
-
*/
|
|
875
855
|
async moveToCalendarEnd(count) {
|
|
876
856
|
while (count >= 0) {
|
|
877
|
-
|
|
878
|
-
const button = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_CAPTION_SELECTOR}`));
|
|
879
|
-
await click(button, this.driver);
|
|
857
|
+
await this.root.locator(`.${CALENDAR_CAPTION_SELECTOR}`).click();
|
|
880
858
|
count--;
|
|
881
859
|
}
|
|
882
860
|
}
|
|
883
|
-
/**
|
|
884
|
-
* Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
|
|
885
|
-
*/
|
|
886
861
|
async choosePeriodForYear(targetYear) {
|
|
887
862
|
let found = false;
|
|
888
863
|
while (!found) {
|
|
889
|
-
const
|
|
890
|
-
const
|
|
891
|
-
for (
|
|
892
|
-
const
|
|
864
|
+
const periodCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
|
|
865
|
+
const count = await periodCells.count();
|
|
866
|
+
for (let i = 0; i < count; i++) {
|
|
867
|
+
const cell = periodCells.nth(i);
|
|
868
|
+
const text = await cell.innerText();
|
|
893
869
|
if (text) {
|
|
894
870
|
const [start, end] = text.split("-").map(Number);
|
|
895
871
|
if (targetYear >= start && targetYear <= end) {
|
|
896
|
-
await click(
|
|
872
|
+
await cell.click();
|
|
897
873
|
found = true;
|
|
898
874
|
break;
|
|
899
875
|
}
|
|
900
876
|
}
|
|
901
877
|
}
|
|
902
878
|
if (!found) {
|
|
903
|
-
const
|
|
904
|
-
const [start] =
|
|
879
|
+
const firstText = await periodCells.first().innerText();
|
|
880
|
+
const [start] = firstText.split("-").map(Number);
|
|
905
881
|
if (targetYear < start) {
|
|
906
|
-
|
|
907
|
-
await click(prevBtn, this.driver);
|
|
882
|
+
await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
|
|
908
883
|
} else {
|
|
909
|
-
|
|
910
|
-
await click(nextBtn, this.driver);
|
|
884
|
+
await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
|
|
911
885
|
}
|
|
912
886
|
}
|
|
913
887
|
}
|
|
914
888
|
}
|
|
915
|
-
/**
|
|
916
|
-
* Пошук та клік по конкретному року з навігацією
|
|
917
|
-
*/
|
|
918
889
|
async chooseYear(targetYear) {
|
|
919
890
|
let found = false;
|
|
920
891
|
while (!found) {
|
|
921
|
-
const
|
|
922
|
-
const
|
|
923
|
-
for (
|
|
924
|
-
const
|
|
925
|
-
const
|
|
926
|
-
if (!isNaN(
|
|
927
|
-
await click(
|
|
892
|
+
const yearCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
|
|
893
|
+
const count = await yearCells.count();
|
|
894
|
+
for (let i = 0; i < count; i++) {
|
|
895
|
+
const cell = yearCells.nth(i);
|
|
896
|
+
const year = Number(await cell.innerText());
|
|
897
|
+
if (!isNaN(year) && year === targetYear) {
|
|
898
|
+
await cell.click();
|
|
928
899
|
found = true;
|
|
929
900
|
break;
|
|
930
901
|
}
|
|
931
902
|
}
|
|
932
903
|
if (!found) {
|
|
933
|
-
const
|
|
934
|
-
const
|
|
935
|
-
const firstYear = Number(firstYearText);
|
|
936
|
-
const lastYear = Number(lastYearText);
|
|
904
|
+
const firstYear = Number(await yearCells.first().innerText());
|
|
905
|
+
const lastYear = Number(await yearCells.nth(count - 1).innerText());
|
|
937
906
|
if (targetYear < firstYear) {
|
|
938
|
-
|
|
939
|
-
await click(prevBtn, this.driver);
|
|
907
|
+
await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
|
|
940
908
|
} else if (targetYear > lastYear) {
|
|
941
|
-
|
|
942
|
-
await click(nextBtn, this.driver);
|
|
909
|
+
await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
|
|
943
910
|
} else {
|
|
944
911
|
throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
|
|
945
912
|
}
|
|
946
913
|
}
|
|
947
914
|
}
|
|
948
915
|
}
|
|
949
|
-
/**
|
|
950
|
-
* Пошук та клік по конкретному місяцю
|
|
951
|
-
*/
|
|
952
916
|
async chooseMonth(year, month) {
|
|
953
|
-
const
|
|
954
|
-
const
|
|
955
|
-
for (
|
|
917
|
+
const monthCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
|
|
918
|
+
const count = await monthCells.count();
|
|
919
|
+
for (let i = 0; i < count; i++) {
|
|
920
|
+
const cell = monthCells.nth(i);
|
|
956
921
|
const dataValue = await cell.getAttribute("data-value");
|
|
957
922
|
if (dataValue) {
|
|
958
923
|
const [cellYear, cellMonth] = dataValue.split("/").map(Number);
|
|
959
924
|
if (cellYear === year && cellMonth === month) {
|
|
960
|
-
await click(
|
|
925
|
+
await cell.click();
|
|
961
926
|
return;
|
|
962
927
|
}
|
|
963
928
|
}
|
|
964
929
|
}
|
|
965
930
|
throw new Error(`Month ${month} for year ${year} not found`);
|
|
966
931
|
}
|
|
967
|
-
/**
|
|
968
|
-
* Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
|
|
969
|
-
*/
|
|
970
932
|
async chooseDay(year, month, day) {
|
|
971
|
-
const
|
|
972
|
-
const
|
|
973
|
-
for (
|
|
933
|
+
const dayCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
|
|
934
|
+
const count = await dayCells.count();
|
|
935
|
+
for (let i = 0; i < count; i++) {
|
|
936
|
+
const cell = dayCells.nth(i);
|
|
974
937
|
const dataValue = await cell.getAttribute("data-value");
|
|
975
938
|
if (dataValue) {
|
|
976
939
|
const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
|
|
977
940
|
if (cellYear === year && cellMonth === month && cellDay === day) {
|
|
978
|
-
await click(
|
|
941
|
+
await cell.click();
|
|
979
942
|
return;
|
|
980
943
|
}
|
|
981
944
|
}
|
|
982
945
|
}
|
|
983
946
|
throw new Error(`Day ${day}.${month}.${year} not found`);
|
|
984
947
|
}
|
|
985
|
-
/**
|
|
986
|
-
* Встановлення дати для тижня
|
|
987
|
-
*/
|
|
988
948
|
async setValueForWeek(date) {
|
|
989
949
|
const { year, month, day } = getYearMonthDay(date);
|
|
990
950
|
await this.moveToCalendarEnd(movesToCalendarEndForWeek);
|
|
@@ -994,9 +954,6 @@ var init_Calendar = __esm({
|
|
|
994
954
|
await this.chooseDay(year, month, day);
|
|
995
955
|
await this.save();
|
|
996
956
|
}
|
|
997
|
-
/**
|
|
998
|
-
* Встановлення дати для місяця
|
|
999
|
-
*/
|
|
1000
957
|
async setValueForMonth(date) {
|
|
1001
958
|
const { year, month } = getYearMonthDay(date);
|
|
1002
959
|
await this.moveToCalendarEnd(movesToCalendarEndForMonth);
|
|
@@ -1004,46 +961,37 @@ var init_Calendar = __esm({
|
|
|
1004
961
|
await this.chooseMonth(year, month);
|
|
1005
962
|
await this.save();
|
|
1006
963
|
}
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
return calendarPopoverElement.findElement(
|
|
1010
|
-
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1011
|
-
);
|
|
964
|
+
getDateFromInputLocator() {
|
|
965
|
+
return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
|
|
1012
966
|
}
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
return calendarPopoverElement.findElement(
|
|
1016
|
-
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1017
|
-
);
|
|
967
|
+
getDateToInputLocator() {
|
|
968
|
+
return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
|
|
1018
969
|
}
|
|
1019
970
|
async save() {
|
|
1020
|
-
|
|
1021
|
-
await click(btnOk, this.driver);
|
|
971
|
+
await this.root.locator(`.${BTN_SAVE_SELECTOR}`).click();
|
|
1022
972
|
}
|
|
1023
973
|
};
|
|
1024
974
|
}
|
|
1025
975
|
});
|
|
1026
976
|
|
|
1027
977
|
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
1028
|
-
var
|
|
978
|
+
var DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
|
|
1029
979
|
var init_BaseDateEditor = __esm({
|
|
1030
980
|
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
1031
981
|
"use strict";
|
|
1032
982
|
init_AbstractEditor();
|
|
1033
|
-
init_InputClearStrategy();
|
|
1034
|
-
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
1035
|
-
init_actions();
|
|
1036
983
|
init_utils();
|
|
1037
984
|
init_DateSelectMode();
|
|
1038
985
|
init_Calendar();
|
|
986
|
+
init_ClearButtonStrategy();
|
|
1039
987
|
DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
|
|
1040
988
|
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
1041
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1042
|
-
super(parentCssSelector, elementCssSelector,
|
|
1043
|
-
this.setClearStrategy(new
|
|
989
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
990
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
991
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1044
992
|
}
|
|
1045
993
|
async getIsAllowedTime() {
|
|
1046
|
-
const dateField =
|
|
994
|
+
const dateField = this.page.locator(`${this.getFullCssSelector()}`);
|
|
1047
995
|
const classString = await dateField.getAttribute("class");
|
|
1048
996
|
return classString.includes(DATETIME_ALLOWED_SELECTOR);
|
|
1049
997
|
}
|
|
@@ -1052,7 +1000,7 @@ var init_BaseDateEditor = __esm({
|
|
|
1052
1000
|
const calendar = new Calendar({
|
|
1053
1001
|
parentCssSelector: this.getFullCssSelector(),
|
|
1054
1002
|
dateFieldDataTestID,
|
|
1055
|
-
|
|
1003
|
+
page: this.page
|
|
1056
1004
|
});
|
|
1057
1005
|
await calendar.init();
|
|
1058
1006
|
return calendar;
|
|
@@ -1067,13 +1015,13 @@ var init_BaseDateEditor = __esm({
|
|
|
1067
1015
|
}
|
|
1068
1016
|
async setArrayValue(value) {
|
|
1069
1017
|
const calendar = await this.initCalendar();
|
|
1070
|
-
const dateFromInput =
|
|
1071
|
-
const dateToInput =
|
|
1018
|
+
const dateFromInput = calendar.getDateFromInputLocator();
|
|
1019
|
+
const dateToInput = calendar.getDateToInputLocator();
|
|
1072
1020
|
await this.setSingleValue(value[0], dateFromInput);
|
|
1073
1021
|
await this.setSingleValue(value[1], dateToInput);
|
|
1074
1022
|
await calendar.save();
|
|
1075
1023
|
}
|
|
1076
|
-
async setSingleValue(value,
|
|
1024
|
+
async setSingleValue(value, input) {
|
|
1077
1025
|
const dateMode = await this.getDataDateMode();
|
|
1078
1026
|
if (DateSelectMode.isWeek(dateMode)) {
|
|
1079
1027
|
await this.setValueForWeek(value);
|
|
@@ -1083,18 +1031,18 @@ var init_BaseDateEditor = __esm({
|
|
|
1083
1031
|
await this.setValueForMonth(value);
|
|
1084
1032
|
return;
|
|
1085
1033
|
}
|
|
1086
|
-
const actions = this.driver.actions({ async: true });
|
|
1087
1034
|
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1088
1035
|
const formattedDate = formatDMYDate(value, isTimeAllowed);
|
|
1089
|
-
await click(
|
|
1090
|
-
await
|
|
1091
|
-
await
|
|
1036
|
+
await input.click();
|
|
1037
|
+
await input.press("Home");
|
|
1038
|
+
await input.pressSequentially(formattedDate);
|
|
1039
|
+
await input.press("Enter");
|
|
1092
1040
|
}
|
|
1093
1041
|
async setDateValue(value) {
|
|
1094
1042
|
if (Array.isArray(value)) {
|
|
1095
1043
|
await this.setArrayValue(value);
|
|
1096
1044
|
} else {
|
|
1097
|
-
await this.setSingleValue(value,
|
|
1045
|
+
await this.setSingleValue(value, this.getInputLocator());
|
|
1098
1046
|
}
|
|
1099
1047
|
}
|
|
1100
1048
|
};
|
|
@@ -1102,77 +1050,84 @@ var init_BaseDateEditor = __esm({
|
|
|
1102
1050
|
});
|
|
1103
1051
|
|
|
1104
1052
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
1105
|
-
var
|
|
1053
|
+
var SingleDateEditor;
|
|
1106
1054
|
var init_SingleDateEditor = __esm({
|
|
1107
1055
|
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
1108
1056
|
"use strict";
|
|
1109
|
-
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
1110
|
-
init_InputClearStrategy();
|
|
1111
1057
|
init_BaseDateEditor();
|
|
1112
1058
|
init_utils();
|
|
1059
|
+
init_ClearButtonStrategy();
|
|
1060
|
+
init_src();
|
|
1113
1061
|
SingleDateEditor = class extends BaseDateEditor {
|
|
1114
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1115
|
-
super(parentCssSelector, elementCssSelector,
|
|
1116
|
-
this.setClearStrategy(new
|
|
1062
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1063
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1064
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1117
1065
|
}
|
|
1118
|
-
|
|
1119
|
-
return this.
|
|
1066
|
+
getDateLocator() {
|
|
1067
|
+
return this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
|
|
1120
1068
|
}
|
|
1121
1069
|
async getDateValue() {
|
|
1122
|
-
const
|
|
1123
|
-
return
|
|
1070
|
+
const input = this.getDateLocator();
|
|
1071
|
+
return input.getAttribute("value");
|
|
1124
1072
|
}
|
|
1125
1073
|
async getValue() {
|
|
1126
1074
|
const value = await this.getDateValue();
|
|
1127
1075
|
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1128
1076
|
if (isTimeAllowed) {
|
|
1129
|
-
return value
|
|
1077
|
+
return value === "" ? null : formatToDateTime(value);
|
|
1130
1078
|
}
|
|
1131
|
-
return value
|
|
1079
|
+
return value === "" ? null : new Date(value);
|
|
1132
1080
|
}
|
|
1133
|
-
setValue(value) {
|
|
1134
|
-
if (
|
|
1135
|
-
|
|
1081
|
+
async setValue(value) {
|
|
1082
|
+
if (value instanceof Date) {
|
|
1083
|
+
await wait(async () => {
|
|
1084
|
+
await this.setDateValue(value);
|
|
1085
|
+
const updatedValue = await this.getValue();
|
|
1086
|
+
return updatedValue.toDateString() === value.toDateString();
|
|
1087
|
+
}, this.page);
|
|
1088
|
+
} else {
|
|
1089
|
+
throw new Error(`Value is incorrect. It should be a Date object`);
|
|
1136
1090
|
}
|
|
1137
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
1138
1091
|
}
|
|
1139
1092
|
};
|
|
1140
1093
|
}
|
|
1141
1094
|
});
|
|
1142
1095
|
|
|
1143
1096
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
1144
|
-
var
|
|
1097
|
+
var DateRangeEditor;
|
|
1145
1098
|
var init_DateRangeEditor = __esm({
|
|
1146
1099
|
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
1147
1100
|
"use strict";
|
|
1148
|
-
import_selenium_webdriver15 = require("selenium-webdriver");
|
|
1149
|
-
init_InputClearStrategy();
|
|
1150
1101
|
init_BaseDateEditor();
|
|
1102
|
+
init_typesUtil();
|
|
1103
|
+
init_ClearButtonStrategy();
|
|
1151
1104
|
DateRangeEditor = class extends BaseDateEditor {
|
|
1152
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1153
|
-
super(parentCssSelector, elementCssSelector,
|
|
1154
|
-
this.setClearStrategy(new
|
|
1105
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1106
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1107
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1155
1108
|
}
|
|
1156
|
-
|
|
1157
|
-
return this.
|
|
1109
|
+
getDateLocator() {
|
|
1110
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
1158
1111
|
}
|
|
1159
1112
|
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];
|
|
1113
|
+
const input = this.getDateLocator();
|
|
1114
|
+
const dateFromStr = await input.getAttribute("datefrom");
|
|
1115
|
+
const dateToStr = await input.getAttribute("dateto");
|
|
1116
|
+
const dateFrom = dateFromStr ? new Date(dateFromStr) : null;
|
|
1117
|
+
const dateTo = dateToStr ? new Date(dateToStr) : null;
|
|
1118
|
+
return dateFrom && dateTo ? [dateFrom, dateTo] : null;
|
|
1166
1119
|
}
|
|
1167
1120
|
async getValue() {
|
|
1168
1121
|
const values = await this.getDateValue();
|
|
1169
|
-
return
|
|
1122
|
+
return values?.length ? values : null;
|
|
1170
1123
|
}
|
|
1171
|
-
setValue(value) {
|
|
1172
|
-
if (
|
|
1173
|
-
|
|
1124
|
+
async setValue(value) {
|
|
1125
|
+
if (isDate(value) || isArrayOfDates(value)) {
|
|
1126
|
+
const inputValue = Array.isArray(value) ? value : [value, value];
|
|
1127
|
+
await this.setDateValue(inputValue);
|
|
1128
|
+
return;
|
|
1174
1129
|
}
|
|
1175
|
-
throw new Error(`Value is incorrect. It should be
|
|
1130
|
+
throw new Error(`Value is incorrect. It should be a Date object or Date array`);
|
|
1176
1131
|
}
|
|
1177
1132
|
};
|
|
1178
1133
|
}
|
|
@@ -1197,18 +1152,18 @@ var init_DateEditor = __esm({
|
|
|
1197
1152
|
await this.setEditorInstance();
|
|
1198
1153
|
}
|
|
1199
1154
|
async setEditorInstance() {
|
|
1200
|
-
const { parentCssSelector, elementCssSelector,
|
|
1201
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector,
|
|
1155
|
+
const { parentCssSelector, elementCssSelector, page } = this;
|
|
1156
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1202
1157
|
const classString = await elementInstance.getClasses();
|
|
1203
1158
|
switch (true) {
|
|
1204
1159
|
case classString.includes("date-control" /* Date */):
|
|
1205
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector,
|
|
1160
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
|
|
1206
1161
|
break;
|
|
1207
1162
|
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
1208
|
-
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector,
|
|
1163
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, page);
|
|
1209
1164
|
break;
|
|
1210
1165
|
default:
|
|
1211
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector,
|
|
1166
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
|
|
1212
1167
|
}
|
|
1213
1168
|
}
|
|
1214
1169
|
async setValue(value) {
|
|
@@ -1225,17 +1180,13 @@ var init_DateEditor = __esm({
|
|
|
1225
1180
|
});
|
|
1226
1181
|
|
|
1227
1182
|
// src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
|
|
1228
|
-
var
|
|
1183
|
+
var TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
|
|
1229
1184
|
var init_HeaderFilterDictionary = __esm({
|
|
1230
1185
|
"src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
|
|
1231
1186
|
"use strict";
|
|
1232
1187
|
init_AbstractEditor();
|
|
1233
|
-
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1234
|
-
init_actions();
|
|
1235
|
-
init_locators();
|
|
1236
1188
|
init_ClearButtonStrategy();
|
|
1237
|
-
|
|
1238
|
-
init_withCustomTimeouts();
|
|
1189
|
+
init_locators();
|
|
1239
1190
|
TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
1240
1191
|
DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
1241
1192
|
DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
@@ -1243,69 +1194,60 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
1243
1194
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
1244
1195
|
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
1245
1196
|
combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
1246
|
-
dropDownHeaderFilterDictionaryOptionClick = async (optionValue,
|
|
1247
|
-
|
|
1197
|
+
dropDownHeaderFilterDictionaryOptionClick = async (optionValue, page, dataTEST = "", delay = true) => {
|
|
1198
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
1199
|
+
const calendarPopover = page.locator(calendarPopoverSelector);
|
|
1200
|
+
const customOptionList = calendarPopover.locator(`.${CUSTOM_OPTION_LIST_SELECTOR}`);
|
|
1201
|
+
const optElement = customOptionList.locator(`xpath=${combinedOptionHeaderFilterDictValueXpath(optionValue)}`);
|
|
1248
1202
|
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}"`);
|
|
1203
|
+
await optElement.waitFor({ state: "visible", timeout: delay ? void 0 : 600 });
|
|
1204
|
+
await optElement.click();
|
|
1205
|
+
} catch {
|
|
1206
|
+
throw new Error(`Item not found: "${optionValue}"`);
|
|
1262
1207
|
}
|
|
1263
|
-
if (err)
|
|
1264
|
-
throw err;
|
|
1265
1208
|
};
|
|
1266
1209
|
HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
1267
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1268
|
-
super(parentCssSelector, elementCssSelector,
|
|
1269
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(),
|
|
1210
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1211
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1212
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
|
|
1213
|
+
}
|
|
1214
|
+
getInputLocator() {
|
|
1215
|
+
return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
|
|
1270
1216
|
}
|
|
1271
1217
|
async setTagBoxInputValue(values) {
|
|
1272
1218
|
const lastElement = values[values.length - 1];
|
|
1273
|
-
const inputEl =
|
|
1219
|
+
const inputEl = this.getInputLocator();
|
|
1274
1220
|
await inputEl.click();
|
|
1275
1221
|
for (const value of values) {
|
|
1276
1222
|
await this.selectOption(inputEl, value, lastElement);
|
|
1277
1223
|
}
|
|
1278
1224
|
}
|
|
1279
1225
|
async waitOptionSelection() {
|
|
1280
|
-
|
|
1226
|
+
const selectedItem = this.page.locator(TAG_BOX_LIST_ITEM_SELECTOR);
|
|
1227
|
+
await selectedItem.waitFor({ state: "visible" });
|
|
1281
1228
|
}
|
|
1282
1229
|
async selectOption(inputEl, value, lastElement) {
|
|
1283
1230
|
try {
|
|
1284
|
-
await inputEl.
|
|
1231
|
+
await inputEl.fill(value);
|
|
1285
1232
|
const dataTEST = await this.getDataTestId();
|
|
1286
|
-
await dropDownHeaderFilterDictionaryOptionClick(value, this.
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
await inputEl.sendKeys(import_selenium_webdriver16.Key.BACK_SPACE);
|
|
1233
|
+
await dropDownHeaderFilterDictionaryOptionClick(value, this.page, dataTEST);
|
|
1234
|
+
if (value !== lastElement) {
|
|
1235
|
+
await inputEl.fill("");
|
|
1290
1236
|
}
|
|
1291
1237
|
} catch (error) {
|
|
1292
1238
|
throw error;
|
|
1293
1239
|
}
|
|
1294
1240
|
await this.waitOptionSelection();
|
|
1295
|
-
if (value !== lastElement) {
|
|
1296
|
-
await inputEl.clear();
|
|
1297
|
-
}
|
|
1298
1241
|
}
|
|
1299
1242
|
async getHeaderFilterDictionaryInputValue() {
|
|
1300
1243
|
if (await this.isHeaderFilterDictionaryEmpty()) {
|
|
1301
1244
|
return [];
|
|
1302
1245
|
}
|
|
1303
|
-
const tags =
|
|
1304
|
-
|
|
1305
|
-
);
|
|
1246
|
+
const tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`);
|
|
1247
|
+
const count = await tags.count();
|
|
1306
1248
|
const values = [];
|
|
1307
|
-
for (
|
|
1308
|
-
values.push(await
|
|
1249
|
+
for (let i = 0; i < count; i++) {
|
|
1250
|
+
values.push(await tags.nth(i).innerText() ?? "");
|
|
1309
1251
|
}
|
|
1310
1252
|
return values;
|
|
1311
1253
|
}
|
|
@@ -1344,26 +1286,26 @@ var init_editorFactory = __esm({
|
|
|
1344
1286
|
init_ButtonGroup();
|
|
1345
1287
|
init_DateEditor();
|
|
1346
1288
|
init_HeaderFilterDictionary();
|
|
1347
|
-
editorFactory = async (parentCssSelector, elementCssSelector,
|
|
1348
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector,
|
|
1349
|
-
const
|
|
1350
|
-
if ((
|
|
1351
|
-
return new TextEditor(parentCssSelector, elementCssSelector,
|
|
1352
|
-
if (
|
|
1353
|
-
if (
|
|
1354
|
-
if (
|
|
1355
|
-
if (
|
|
1356
|
-
return new SelectBoxEditor(parentCssSelector, elementCssSelector,
|
|
1357
|
-
if (
|
|
1358
|
-
if (
|
|
1359
|
-
return new DateEditor(parentCssSelector, elementCssSelector,
|
|
1360
|
-
}
|
|
1361
|
-
if (
|
|
1362
|
-
return new BooleanSelector(parentCssSelector, elementCssSelector,
|
|
1363
|
-
if (
|
|
1364
|
-
return new ButtonGroup(parentCssSelector, elementCssSelector,
|
|
1365
|
-
if (
|
|
1366
|
-
return new HeaderFilterDictionary(parentCssSelector, elementCssSelector,
|
|
1289
|
+
editorFactory = async (parentCssSelector, elementCssSelector, page) => {
|
|
1290
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1291
|
+
const classString = await elementInstance.getClasses();
|
|
1292
|
+
if ((classString.includes("text-control" /* Text */) || classString.includes("text-area-control" /* TextArea */)) && !classString.includes("single-date-range-control" /* SingleDateRange */))
|
|
1293
|
+
return new TextEditor(parentCssSelector, elementCssSelector, page);
|
|
1294
|
+
if (classString.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, page);
|
|
1295
|
+
if (classString.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, page);
|
|
1296
|
+
if (classString.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, page);
|
|
1297
|
+
if (classString.includes("select-control" /* Select */))
|
|
1298
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, page);
|
|
1299
|
+
if (classString.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, page);
|
|
1300
|
+
if (classString.includes("date-control" /* Date */) || classString.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
1301
|
+
return new DateEditor(parentCssSelector, elementCssSelector, page);
|
|
1302
|
+
}
|
|
1303
|
+
if (classString.includes("buttons-group" /* BooleanSelector */))
|
|
1304
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, page);
|
|
1305
|
+
if (classString.includes("button-group-field" /* ButtonGroup */))
|
|
1306
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, page);
|
|
1307
|
+
if (classString.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
|
|
1308
|
+
return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, page);
|
|
1367
1309
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
1368
1310
|
};
|
|
1369
1311
|
}
|
|
@@ -1380,6 +1322,35 @@ var init_Editors = __esm({
|
|
|
1380
1322
|
}
|
|
1381
1323
|
});
|
|
1382
1324
|
|
|
1325
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
1326
|
+
var SubsystemItem;
|
|
1327
|
+
var init_SubsystemItem = __esm({
|
|
1328
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts"() {
|
|
1329
|
+
"use strict";
|
|
1330
|
+
init_waitElementIsVisible();
|
|
1331
|
+
SubsystemItem = class {
|
|
1332
|
+
bySelector;
|
|
1333
|
+
page;
|
|
1334
|
+
constructor({ page, bySelector }) {
|
|
1335
|
+
this.bySelector = bySelector;
|
|
1336
|
+
this.page = page;
|
|
1337
|
+
}
|
|
1338
|
+
getElement() {
|
|
1339
|
+
return this.page.locator(this.bySelector);
|
|
1340
|
+
}
|
|
1341
|
+
async getTitle() {
|
|
1342
|
+
await waitElementIsVisible_default({ locator: this.getElement() });
|
|
1343
|
+
const el = this.getElement();
|
|
1344
|
+
return await el.getAttribute("data-title");
|
|
1345
|
+
}
|
|
1346
|
+
async click() {
|
|
1347
|
+
const el = this.getElement();
|
|
1348
|
+
await el.click();
|
|
1349
|
+
}
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
});
|
|
1353
|
+
|
|
1383
1354
|
// src/utils/createDataTestId.ts
|
|
1384
1355
|
function createDataTestId(formName, itemType, itemName) {
|
|
1385
1356
|
return `${formName}-${itemType}-${itemName}`;
|
|
@@ -1420,45 +1391,145 @@ var init_createDataTestId = __esm({
|
|
|
1420
1391
|
}
|
|
1421
1392
|
});
|
|
1422
1393
|
|
|
1394
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
1395
|
+
var SEARCH_ITEM_SELECTOR, BACK_BUTTON_SELECTOR, SEARCH_INPUT_SELECTOR, byTitleCssSelector, SubsystemsPanel;
|
|
1396
|
+
var init_SubsystemsPanel = __esm({
|
|
1397
|
+
"src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts"() {
|
|
1398
|
+
"use strict";
|
|
1399
|
+
init_AbstractElement();
|
|
1400
|
+
init_SubsystemsPanelHeader();
|
|
1401
|
+
init_wait();
|
|
1402
|
+
init_locators();
|
|
1403
|
+
init_Editors();
|
|
1404
|
+
init_SubsystemItem();
|
|
1405
|
+
init_createDataTestId();
|
|
1406
|
+
init_ClearButtonStrategy();
|
|
1407
|
+
init_waitElementIsVisible();
|
|
1408
|
+
SEARCH_ITEM_SELECTOR = "search-item";
|
|
1409
|
+
BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
1410
|
+
SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
1411
|
+
byTitleCssSelector = (title) => {
|
|
1412
|
+
return `span[data-title="${title}"]`;
|
|
1413
|
+
};
|
|
1414
|
+
SubsystemsPanel = class extends AbstractElement {
|
|
1415
|
+
header;
|
|
1416
|
+
constructor(page) {
|
|
1417
|
+
super(page);
|
|
1418
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.page);
|
|
1419
|
+
}
|
|
1420
|
+
async headerTitle() {
|
|
1421
|
+
const title = await this.header.title();
|
|
1422
|
+
await wait(async () => await title.innerText() != "", this.page);
|
|
1423
|
+
return title.innerText();
|
|
1424
|
+
}
|
|
1425
|
+
getSearchComponent() {
|
|
1426
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.page);
|
|
1427
|
+
}
|
|
1428
|
+
/**
|
|
1429
|
+
* Находит сабсистему по заголовку
|
|
1430
|
+
* @example
|
|
1431
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1432
|
+
* //...
|
|
1433
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
1434
|
+
*/
|
|
1435
|
+
async search(title) {
|
|
1436
|
+
const searchComponent = this.getSearchComponent();
|
|
1437
|
+
await this.searchClear();
|
|
1438
|
+
await searchComponent.setValue(title);
|
|
1439
|
+
await wait(
|
|
1440
|
+
async () => {
|
|
1441
|
+
const findElement = this.itemByTitle(title).getElement();
|
|
1442
|
+
const classes = await findElement.getAttribute("class");
|
|
1443
|
+
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
1444
|
+
},
|
|
1445
|
+
this.page,
|
|
1446
|
+
`Cannot find element: ${title}`
|
|
1447
|
+
);
|
|
1448
|
+
}
|
|
1449
|
+
/**
|
|
1450
|
+
* Очищает поиск сабсистем
|
|
1451
|
+
* @example
|
|
1452
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1453
|
+
* //...
|
|
1454
|
+
* await subsystemsPanel.searchClear();
|
|
1455
|
+
*/
|
|
1456
|
+
async searchClear() {
|
|
1457
|
+
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} ${DX_CLEAR_BUTTON_AREA}`;
|
|
1458
|
+
const clearBtn = this.page.locator(clearBtnSelector);
|
|
1459
|
+
if (await clearBtn.isVisible()) {
|
|
1460
|
+
await clearBtn.click();
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
/**
|
|
1464
|
+
* Возвращает сабсистему по имени
|
|
1465
|
+
* @example
|
|
1466
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1467
|
+
* //...
|
|
1468
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
1469
|
+
*/
|
|
1470
|
+
item(name) {
|
|
1471
|
+
const elementCSS = createSubSystemTestId(name);
|
|
1472
|
+
return new SubsystemItem({ page: this.page, bySelector: `${byTestIdCssSelector(elementCSS, "span")}` });
|
|
1473
|
+
}
|
|
1474
|
+
/**
|
|
1475
|
+
* Возвращает сабсистему по заголовку
|
|
1476
|
+
* @example
|
|
1477
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1478
|
+
* //...
|
|
1479
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
1480
|
+
*/
|
|
1481
|
+
itemByTitle(title) {
|
|
1482
|
+
return new SubsystemItem({ page: this.page, bySelector: byTitleCssSelector(title) });
|
|
1483
|
+
}
|
|
1484
|
+
/**
|
|
1485
|
+
* Возвращается на уровень выше по сабсистемам
|
|
1486
|
+
* @example
|
|
1487
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
1488
|
+
* //...
|
|
1489
|
+
* wait subsystemsPanel.back();
|
|
1490
|
+
*/
|
|
1491
|
+
async back() {
|
|
1492
|
+
const locator = this.page.locator(`#aside .${BACK_BUTTON_SELECTOR}`);
|
|
1493
|
+
await waitElementIsVisible_default({ locator });
|
|
1494
|
+
await locator.click();
|
|
1495
|
+
}
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
});
|
|
1499
|
+
|
|
1423
1500
|
// src/pageObjects/elements/AbstractButton.ts
|
|
1424
1501
|
var D5_BUTTON_IS_PRESSED, AbstractButton;
|
|
1425
1502
|
var init_AbstractButton = __esm({
|
|
1426
1503
|
"src/pageObjects/elements/AbstractButton.ts"() {
|
|
1427
1504
|
"use strict";
|
|
1428
1505
|
init_AbstractElementWithParent();
|
|
1429
|
-
init_actions();
|
|
1430
|
-
init_waitElementIsClickable();
|
|
1431
1506
|
D5_BUTTON_IS_PRESSED = "d5-is-pressed";
|
|
1432
1507
|
AbstractButton = class extends AbstractElementWithParent {
|
|
1433
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1434
|
-
super(parentCssSelector, elementCssSelector,
|
|
1508
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1509
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1510
|
+
}
|
|
1511
|
+
get button() {
|
|
1512
|
+
return this.getLocator();
|
|
1513
|
+
}
|
|
1514
|
+
getLocator() {
|
|
1515
|
+
return super.getLocator();
|
|
1435
1516
|
}
|
|
1436
1517
|
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);
|
|
1518
|
+
await this.button.click();
|
|
1444
1519
|
}
|
|
1445
1520
|
async isDisabled() {
|
|
1446
|
-
|
|
1447
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
1521
|
+
return await this.button.isDisabled();
|
|
1448
1522
|
}
|
|
1449
|
-
async
|
|
1450
|
-
|
|
1451
|
-
const button = await this.getElement();
|
|
1452
|
-
return await button.isDisplayed();
|
|
1453
|
-
} catch {
|
|
1454
|
-
return false;
|
|
1455
|
-
}
|
|
1523
|
+
async isVisible() {
|
|
1524
|
+
return await this.button.isVisible();
|
|
1456
1525
|
}
|
|
1457
1526
|
async isPressed() {
|
|
1458
1527
|
try {
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1528
|
+
if (await this.button.isVisible()) {
|
|
1529
|
+
const classAttribute = await this.button.getAttribute("class");
|
|
1530
|
+
return classAttribute.includes(D5_BUTTON_IS_PRESSED);
|
|
1531
|
+
}
|
|
1532
|
+
return false;
|
|
1462
1533
|
} catch {
|
|
1463
1534
|
return false;
|
|
1464
1535
|
}
|
|
@@ -1468,21 +1539,22 @@ var init_AbstractButton = __esm({
|
|
|
1468
1539
|
});
|
|
1469
1540
|
|
|
1470
1541
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1471
|
-
var
|
|
1542
|
+
var DXButton;
|
|
1472
1543
|
var init_DXButton = __esm({
|
|
1473
1544
|
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
1474
1545
|
"use strict";
|
|
1475
1546
|
init_AbstractButton();
|
|
1476
|
-
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1477
1547
|
DXButton = class extends AbstractButton {
|
|
1478
1548
|
async getText() {
|
|
1479
1549
|
const classes = await this.getClasses();
|
|
1480
|
-
if (!classes
|
|
1550
|
+
if (!classes?.includes("dx-button-has-text")) {
|
|
1551
|
+
return null;
|
|
1552
|
+
}
|
|
1553
|
+
const textEl = this.getLocator().locator(".dx-button-text");
|
|
1554
|
+
if (!await textEl.count()) {
|
|
1481
1555
|
return null;
|
|
1482
1556
|
}
|
|
1483
|
-
|
|
1484
|
-
const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
|
|
1485
|
-
return await textEl.getText();
|
|
1557
|
+
return await textEl.innerText();
|
|
1486
1558
|
}
|
|
1487
1559
|
};
|
|
1488
1560
|
}
|
|
@@ -1498,8 +1570,8 @@ var init_FormButton = __esm({
|
|
|
1498
1570
|
init_DXButton();
|
|
1499
1571
|
FormButton = class extends DXButton {
|
|
1500
1572
|
name;
|
|
1501
|
-
constructor(parentCssSelector, formName, name,
|
|
1502
|
-
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)),
|
|
1573
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
1574
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), page);
|
|
1503
1575
|
this.name = name;
|
|
1504
1576
|
}
|
|
1505
1577
|
buttonNotDisplayedError() {
|
|
@@ -1519,9 +1591,9 @@ var init_AbstractGroup = __esm({
|
|
|
1519
1591
|
"use strict";
|
|
1520
1592
|
init_AbstractElementWithParent();
|
|
1521
1593
|
AbstractGroup = class extends AbstractElementWithParent {
|
|
1522
|
-
async
|
|
1523
|
-
const groupElement =
|
|
1524
|
-
return await groupElement.
|
|
1594
|
+
async isVisible() {
|
|
1595
|
+
const groupElement = this.getLocator();
|
|
1596
|
+
return await groupElement.isVisible();
|
|
1525
1597
|
}
|
|
1526
1598
|
};
|
|
1527
1599
|
}
|
|
@@ -1539,24 +1611,24 @@ var init_Panel = __esm({
|
|
|
1539
1611
|
});
|
|
1540
1612
|
|
|
1541
1613
|
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1542
|
-
var
|
|
1614
|
+
var TabPanelItem, TabPanel;
|
|
1543
1615
|
var init_TabPanel = __esm({
|
|
1544
1616
|
"src/pageObjects/elements/Groups/TabPanel.ts"() {
|
|
1545
1617
|
"use strict";
|
|
1546
1618
|
init_AbstractGroup();
|
|
1547
|
-
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1548
|
-
init_actions();
|
|
1549
1619
|
TabPanelItem = class extends AbstractGroup {
|
|
1550
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1551
|
-
super(parentCssSelector, elementCssSelector,
|
|
1620
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1621
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1622
|
+
}
|
|
1623
|
+
get itemElement() {
|
|
1624
|
+
return this.getLocator();
|
|
1552
1625
|
}
|
|
1553
1626
|
async click() {
|
|
1554
|
-
await
|
|
1627
|
+
await this.itemElement.click();
|
|
1555
1628
|
}
|
|
1556
1629
|
async isActive() {
|
|
1557
|
-
const
|
|
1558
|
-
|
|
1559
|
-
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1630
|
+
const tab = this.itemElement.locator('xpath=ancestor::div[@role="tab"][1]');
|
|
1631
|
+
return await tab.getAttribute("aria-selected") === "true";
|
|
1560
1632
|
}
|
|
1561
1633
|
async getTitle() {
|
|
1562
1634
|
return "";
|
|
@@ -1564,7 +1636,11 @@ var init_TabPanel = __esm({
|
|
|
1564
1636
|
};
|
|
1565
1637
|
TabPanel = class extends AbstractGroup {
|
|
1566
1638
|
item(name) {
|
|
1567
|
-
return new TabPanelItem(
|
|
1639
|
+
return new TabPanelItem(
|
|
1640
|
+
this.getFullCssSelector(),
|
|
1641
|
+
`.tab-panel-item[data-groupname="${name}"]`,
|
|
1642
|
+
this.page
|
|
1643
|
+
);
|
|
1568
1644
|
}
|
|
1569
1645
|
async getTitle() {
|
|
1570
1646
|
return "";
|
|
@@ -1574,37 +1650,35 @@ var init_TabPanel = __esm({
|
|
|
1574
1650
|
});
|
|
1575
1651
|
|
|
1576
1652
|
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1577
|
-
var
|
|
1653
|
+
var ACCORDION_TITLE_CONTAINER, AccordionItem;
|
|
1578
1654
|
var init_AccordionItem = __esm({
|
|
1579
1655
|
"src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
|
|
1580
1656
|
"use strict";
|
|
1581
1657
|
init_AbstractGroup();
|
|
1582
|
-
|
|
1583
|
-
init_actions();
|
|
1584
|
-
ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1658
|
+
ACCORDION_TITLE_CONTAINER = ".accordion-title-container";
|
|
1585
1659
|
AccordionItem = class extends AbstractGroup {
|
|
1586
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1587
|
-
super(parentCssSelector, elementCssSelector,
|
|
1660
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1661
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1588
1662
|
}
|
|
1589
1663
|
async getDataOpenedAccordItemAttr() {
|
|
1590
|
-
const
|
|
1591
|
-
|
|
1664
|
+
const locator = this.getLocator();
|
|
1665
|
+
if (await locator.isVisible()) {
|
|
1666
|
+
return locator.getAttribute("data-opened");
|
|
1667
|
+
}
|
|
1668
|
+
return "";
|
|
1592
1669
|
}
|
|
1593
1670
|
async clickAccordionItemTitle() {
|
|
1594
|
-
|
|
1595
|
-
const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver20.By.className(ACCORDION_TITLE_CONTAINER));
|
|
1596
|
-
await accordTitleElement.click();
|
|
1671
|
+
await this.getLocator().locator(ACCORDION_TITLE_CONTAINER).click();
|
|
1597
1672
|
}
|
|
1598
1673
|
async click() {
|
|
1599
|
-
await
|
|
1674
|
+
await this.getLocator().click();
|
|
1600
1675
|
}
|
|
1601
1676
|
async isExpanded() {
|
|
1602
|
-
|
|
1603
|
-
return dataOpened === "true";
|
|
1677
|
+
return await this.getDataOpenedAccordItemAttr() === "true";
|
|
1604
1678
|
}
|
|
1605
1679
|
async isCollapsed() {
|
|
1606
|
-
const
|
|
1607
|
-
return
|
|
1680
|
+
const opened = await this.getDataOpenedAccordItemAttr();
|
|
1681
|
+
return opened === "false" || opened === null;
|
|
1608
1682
|
}
|
|
1609
1683
|
async expand() {
|
|
1610
1684
|
if (!await this.isExpanded()) {
|
|
@@ -1628,11 +1702,11 @@ var init_Accordion = __esm({
|
|
|
1628
1702
|
init_AbstractGroup();
|
|
1629
1703
|
init_AccordionItem();
|
|
1630
1704
|
Accordion = class extends AbstractGroup {
|
|
1631
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
1632
|
-
super(parentCssSelector, elementCssSelector,
|
|
1705
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
1706
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
1633
1707
|
}
|
|
1634
1708
|
item(name) {
|
|
1635
|
-
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.
|
|
1709
|
+
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.page);
|
|
1636
1710
|
}
|
|
1637
1711
|
};
|
|
1638
1712
|
}
|
|
@@ -1648,14 +1722,14 @@ var init_groupFactory = __esm({
|
|
|
1648
1722
|
init_TabPanel();
|
|
1649
1723
|
init_Accordion();
|
|
1650
1724
|
init_AccordionItem();
|
|
1651
|
-
groupFactory = async (parentCssSelector, elementCssSelector,
|
|
1652
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector,
|
|
1725
|
+
groupFactory = async (parentCssSelector, elementCssSelector, page) => {
|
|
1726
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
|
|
1653
1727
|
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,
|
|
1728
|
+
if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, page);
|
|
1729
|
+
if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, page);
|
|
1730
|
+
if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, page);
|
|
1731
|
+
if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, page);
|
|
1732
|
+
if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, page);
|
|
1659
1733
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1660
1734
|
};
|
|
1661
1735
|
}
|
|
@@ -1674,23 +1748,23 @@ var init_FormGroup = __esm({
|
|
|
1674
1748
|
init_TabPanel();
|
|
1675
1749
|
FormGroup = class extends AbstractElementWithParent {
|
|
1676
1750
|
groupInstance;
|
|
1677
|
-
constructor(parentCssSelector, formName, name,
|
|
1678
|
-
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)),
|
|
1751
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
1752
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), page);
|
|
1679
1753
|
}
|
|
1680
1754
|
async initInstance() {
|
|
1681
1755
|
if (!this.groupInstance) {
|
|
1682
|
-
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.
|
|
1756
|
+
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.page);
|
|
1683
1757
|
}
|
|
1684
1758
|
}
|
|
1685
1759
|
/**
|
|
1686
1760
|
* Возвращает булевое значение доступна ли группа
|
|
1687
1761
|
* @example
|
|
1688
|
-
* expect(await tableList.group('MainSuperPanel').
|
|
1762
|
+
* expect(await tableList.group('MainSuperPanel').isVisible();
|
|
1689
1763
|
*/
|
|
1690
|
-
async
|
|
1764
|
+
async isVisible() {
|
|
1691
1765
|
try {
|
|
1692
1766
|
await this.initInstance();
|
|
1693
|
-
return this.groupInstance.
|
|
1767
|
+
return this.groupInstance.isVisible();
|
|
1694
1768
|
} catch {
|
|
1695
1769
|
return false;
|
|
1696
1770
|
}
|
|
@@ -1766,10 +1840,12 @@ var init_AbstractForm = __esm({
|
|
|
1766
1840
|
AbstractForm = class extends AbstractPage {
|
|
1767
1841
|
containerCssSelector = "";
|
|
1768
1842
|
_formName = "";
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1843
|
+
get container() {
|
|
1844
|
+
return this.page.locator(this.containerCssSelector);
|
|
1845
|
+
}
|
|
1846
|
+
constructor(page) {
|
|
1847
|
+
super(page);
|
|
1848
|
+
}
|
|
1773
1849
|
set formName(name) {
|
|
1774
1850
|
this._formName = name;
|
|
1775
1851
|
}
|
|
@@ -1786,22 +1862,20 @@ var init_AbstractForm = __esm({
|
|
|
1786
1862
|
*/
|
|
1787
1863
|
async exists() {
|
|
1788
1864
|
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
|
-
});
|
|
1865
|
+
const container = this.page.locator(this.containerCssSelector);
|
|
1866
|
+
await waitElementIsVisible_default({ locator: container });
|
|
1798
1867
|
return true;
|
|
1799
1868
|
} catch (error) {
|
|
1800
1869
|
return false;
|
|
1801
1870
|
}
|
|
1802
1871
|
}
|
|
1803
1872
|
button(name) {
|
|
1804
|
-
return new FormButton(
|
|
1873
|
+
return new FormButton(
|
|
1874
|
+
this.containerCssSelector,
|
|
1875
|
+
this.formName,
|
|
1876
|
+
name,
|
|
1877
|
+
this.page
|
|
1878
|
+
);
|
|
1805
1879
|
}
|
|
1806
1880
|
/**
|
|
1807
1881
|
* Находит группу на форме по имени
|
|
@@ -1811,7 +1885,12 @@ var init_AbstractForm = __esm({
|
|
|
1811
1885
|
* expect(await formEdit.group('Name');
|
|
1812
1886
|
*/
|
|
1813
1887
|
group(name) {
|
|
1814
|
-
return new FormGroup(
|
|
1888
|
+
return new FormGroup(
|
|
1889
|
+
this.containerCssSelector,
|
|
1890
|
+
this.formName,
|
|
1891
|
+
name,
|
|
1892
|
+
this.page
|
|
1893
|
+
);
|
|
1815
1894
|
}
|
|
1816
1895
|
};
|
|
1817
1896
|
}
|
|
@@ -1831,11 +1910,10 @@ function getCssRowByIndexSelector(index) {
|
|
|
1831
1910
|
function getCssCellByIndexSelector(index) {
|
|
1832
1911
|
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1833
1912
|
}
|
|
1834
|
-
var
|
|
1913
|
+
var getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
1835
1914
|
var init_utils2 = __esm({
|
|
1836
1915
|
"src/pageObjects/elements/Table/utils.ts"() {
|
|
1837
1916
|
"use strict";
|
|
1838
|
-
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1839
1917
|
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1840
1918
|
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1841
1919
|
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
@@ -1852,19 +1930,18 @@ var init_types3 = __esm({
|
|
|
1852
1930
|
});
|
|
1853
1931
|
|
|
1854
1932
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1855
|
-
var
|
|
1933
|
+
var Cell;
|
|
1856
1934
|
var init_Cell = __esm({
|
|
1857
1935
|
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
1858
1936
|
"use strict";
|
|
1859
|
-
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1860
1937
|
init_AbstractElementWithParent();
|
|
1861
1938
|
init_utils2();
|
|
1862
1939
|
init_types3();
|
|
1863
1940
|
Cell = class extends AbstractElementWithParent {
|
|
1864
1941
|
_index;
|
|
1865
1942
|
getCellIndex;
|
|
1866
|
-
constructor(parentCssSelector, getCellIndex,
|
|
1867
|
-
super(parentCssSelector, getCssCellByIndexSelector(index),
|
|
1943
|
+
constructor(parentCssSelector, getCellIndex, page, index) {
|
|
1944
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), page);
|
|
1868
1945
|
this.getCellIndex = getCellIndex;
|
|
1869
1946
|
this._index = index;
|
|
1870
1947
|
}
|
|
@@ -1873,25 +1950,27 @@ var init_Cell = __esm({
|
|
|
1873
1950
|
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1874
1951
|
}
|
|
1875
1952
|
async getBooleanValue(cellEl) {
|
|
1876
|
-
const booleanEl =
|
|
1877
|
-
|
|
1953
|
+
const booleanEl = cellEl.locator(".boolean-widget");
|
|
1954
|
+
const checked = await booleanEl.getAttribute("aria-checked");
|
|
1955
|
+
return checked === "true" ? 1 : 0;
|
|
1878
1956
|
}
|
|
1879
1957
|
async getTagsValue(cellEl) {
|
|
1880
|
-
const
|
|
1881
|
-
const
|
|
1958
|
+
const tags = cellEl.locator(".multiselect-container .multiselect-cell");
|
|
1959
|
+
const count = await tags.count();
|
|
1882
1960
|
const values = [];
|
|
1883
|
-
for (
|
|
1884
|
-
|
|
1961
|
+
for (let i = 0; i < count; i++) {
|
|
1962
|
+
const text = await tags.nth(i).innerText();
|
|
1963
|
+
if (text) values.push(text.trim());
|
|
1885
1964
|
}
|
|
1886
1965
|
return values.length ? values : null;
|
|
1887
1966
|
}
|
|
1888
1967
|
async getNumberValue(cellEl) {
|
|
1889
|
-
const
|
|
1890
|
-
return
|
|
1968
|
+
const text = (await cellEl.innerText())?.trim() ?? "";
|
|
1969
|
+
return text === "" ? null : Number.parseFloat(text);
|
|
1891
1970
|
}
|
|
1892
1971
|
async getDateValue(cellEl, cellElClass) {
|
|
1893
|
-
const value = (await cellEl.
|
|
1894
|
-
if (value
|
|
1972
|
+
const value = (await cellEl.innerText())?.trim() ?? "";
|
|
1973
|
+
if (!value) return null;
|
|
1895
1974
|
const getDate = (stringDate) => {
|
|
1896
1975
|
const isWithTime = cellElClass.includes("with-time");
|
|
1897
1976
|
try {
|
|
@@ -1917,21 +1996,21 @@ var init_Cell = __esm({
|
|
|
1917
1996
|
}
|
|
1918
1997
|
return getDate(value);
|
|
1919
1998
|
}
|
|
1920
|
-
async
|
|
1999
|
+
async element() {
|
|
1921
2000
|
if (this._index == null) {
|
|
1922
2001
|
this.index = await this.getCellIndex();
|
|
1923
2002
|
}
|
|
1924
|
-
return
|
|
2003
|
+
return this.getLocator();
|
|
1925
2004
|
}
|
|
1926
2005
|
async getValue() {
|
|
1927
|
-
const cellEl = await this.
|
|
1928
|
-
const cellElClass = await cellEl.getAttribute("class");
|
|
2006
|
+
const cellEl = await this.element();
|
|
2007
|
+
const cellElClass = await cellEl.getAttribute("class") ?? "";
|
|
1929
2008
|
if (cellElClass.includes("boolean-column" /* Boolean */)) return this.getBooleanValue(cellEl);
|
|
1930
2009
|
if (cellElClass.includes("tags-column" /* Tags */)) return this.getTagsValue(cellEl);
|
|
1931
2010
|
if (cellElClass.includes("number-column" /* Number */)) return this.getNumberValue(cellEl);
|
|
1932
2011
|
if (cellElClass.includes("date-column" /* Date */)) return this.getDateValue(cellEl, cellElClass);
|
|
1933
|
-
const cellText = await cellEl.
|
|
1934
|
-
return cellText
|
|
2012
|
+
const cellText = (await cellEl.innerText())?.trim() ?? "";
|
|
2013
|
+
return cellText === "" ? null : cellText;
|
|
1935
2014
|
}
|
|
1936
2015
|
getIndex() {
|
|
1937
2016
|
return this._index;
|
|
@@ -1941,17 +2020,14 @@ var init_Cell = __esm({
|
|
|
1941
2020
|
});
|
|
1942
2021
|
|
|
1943
2022
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1944
|
-
var
|
|
2023
|
+
var DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, FIRST_CLICKED_CELL_SELECTOR, Row;
|
|
1945
2024
|
var init_Row = __esm({
|
|
1946
2025
|
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
1947
2026
|
"use strict";
|
|
1948
|
-
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1949
2027
|
init_Cell();
|
|
1950
2028
|
init_utils2();
|
|
1951
2029
|
init_AbstractElementWithParent();
|
|
1952
|
-
init_actions();
|
|
1953
2030
|
init_wait();
|
|
1954
|
-
init_fixElementStaleError();
|
|
1955
2031
|
DX_SELECTION_CLASS = "dx-selection";
|
|
1956
2032
|
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
1957
2033
|
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
@@ -1964,11 +2040,11 @@ var init_Row = __esm({
|
|
|
1964
2040
|
* @param parentCssSelector
|
|
1965
2041
|
* @param fixedTableContentCssSelector
|
|
1966
2042
|
* @param index починається з 0 (в getCssRowByIndexSelector додається +1)
|
|
1967
|
-
* @param
|
|
2043
|
+
* @param page
|
|
1968
2044
|
* @param getColumnBy
|
|
1969
2045
|
*/
|
|
1970
|
-
constructor(parentCssSelector, fixedTableContentCssSelector, index,
|
|
1971
|
-
super(parentCssSelector, getCssRowByIndexSelector(index),
|
|
2046
|
+
constructor(parentCssSelector, fixedTableContentCssSelector, index, page, getColumnBy) {
|
|
2047
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), page);
|
|
1972
2048
|
this.index = index;
|
|
1973
2049
|
this.getColumnBy = getColumnBy;
|
|
1974
2050
|
this.fixedTableContentCssSelector = fixedTableContentCssSelector;
|
|
@@ -1976,10 +2052,8 @@ var init_Row = __esm({
|
|
|
1976
2052
|
_getCell({ index, name, title }) {
|
|
1977
2053
|
return new Cell(
|
|
1978
2054
|
this.getFullCssSelector(),
|
|
1979
|
-
() => {
|
|
1980
|
-
|
|
1981
|
-
},
|
|
1982
|
-
this.driver,
|
|
2055
|
+
() => this.getColumnBy({ title, name }).getIndex(),
|
|
2056
|
+
this.page,
|
|
1983
2057
|
index
|
|
1984
2058
|
);
|
|
1985
2059
|
}
|
|
@@ -1993,61 +2067,56 @@ var init_Row = __esm({
|
|
|
1993
2067
|
return this._getCell({ title });
|
|
1994
2068
|
}
|
|
1995
2069
|
async select(preserve = false) {
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
await safeWait(
|
|
2070
|
+
const rowEl = this.getLocator();
|
|
2071
|
+
const classes = await this.getClasses();
|
|
2072
|
+
const isSelected = classes.includes(DX_SELECTION_CLASS);
|
|
2073
|
+
const clickedElement = rowEl.locator(FIRST_CLICKED_CELL_SELECTOR);
|
|
2074
|
+
if (isSelected && !preserve) {
|
|
2075
|
+
await this.page.keyboard.up("Control");
|
|
2076
|
+
}
|
|
2077
|
+
if (preserve && !isSelected) {
|
|
2078
|
+
await this.page.keyboard.down("Control");
|
|
2079
|
+
await clickedElement.click();
|
|
2080
|
+
return;
|
|
2081
|
+
}
|
|
2082
|
+
await clickedElement.click();
|
|
2083
|
+
await wait(
|
|
2011
2084
|
async () => {
|
|
2012
|
-
const
|
|
2013
|
-
return
|
|
2085
|
+
const classes2 = await this.getClasses();
|
|
2086
|
+
return classes2.includes(DX_SELECTION_CLASS);
|
|
2014
2087
|
},
|
|
2015
|
-
this.
|
|
2088
|
+
this.page,
|
|
2016
2089
|
"Cannot select row"
|
|
2017
2090
|
);
|
|
2018
2091
|
}
|
|
2019
2092
|
async isSelected() {
|
|
2020
|
-
const
|
|
2021
|
-
|
|
2093
|
+
const rowEl = this.getLocator();
|
|
2094
|
+
const ariaSelected = await rowEl.getAttribute("aria-selected");
|
|
2095
|
+
return ariaSelected === "true";
|
|
2022
2096
|
}
|
|
2023
2097
|
getIndex() {
|
|
2024
2098
|
return this.index;
|
|
2025
2099
|
}
|
|
2026
2100
|
async getCells() {
|
|
2027
|
-
const
|
|
2101
|
+
const rowEl = this.getLocator();
|
|
2102
|
+
const cellsCount = await rowEl.locator('td[role="gridcell"]').count();
|
|
2028
2103
|
const result = [];
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
});
|
|
2104
|
+
for (let i = 0; i < cellsCount; i++) {
|
|
2105
|
+
result.push(this.getCellByIndex(i));
|
|
2106
|
+
}
|
|
2033
2107
|
return result;
|
|
2034
2108
|
}
|
|
2035
2109
|
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
|
-
});
|
|
2110
|
+
const buttonSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
|
|
2111
|
+
const button = this.page.locator(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonSelector}`);
|
|
2112
|
+
await button.click();
|
|
2044
2113
|
}
|
|
2045
2114
|
async checkEditingMode(isEditing, msg) {
|
|
2046
|
-
await
|
|
2115
|
+
await wait(
|
|
2047
2116
|
async () => {
|
|
2048
2117
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
2049
2118
|
},
|
|
2050
|
-
this.
|
|
2119
|
+
this.page,
|
|
2051
2120
|
msg
|
|
2052
2121
|
);
|
|
2053
2122
|
}
|
|
@@ -2068,21 +2137,19 @@ var init_Row = __esm({
|
|
|
2068
2137
|
});
|
|
2069
2138
|
|
|
2070
2139
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
2071
|
-
var
|
|
2140
|
+
var Column;
|
|
2072
2141
|
var init_Column = __esm({
|
|
2073
2142
|
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
2074
2143
|
"use strict";
|
|
2075
|
-
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
2076
2144
|
init_utils2();
|
|
2077
2145
|
init_AbstractElementWithParent();
|
|
2078
|
-
init_fixElementStaleError();
|
|
2079
2146
|
Column = class extends AbstractElementWithParent {
|
|
2080
2147
|
_index;
|
|
2081
2148
|
_caption;
|
|
2082
2149
|
_name;
|
|
2083
2150
|
headerCssSelector;
|
|
2084
|
-
constructor({ parentCssSelector, headerCssSelector, name, caption, index,
|
|
2085
|
-
super(parentCssSelector, "",
|
|
2151
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, page }) {
|
|
2152
|
+
super(parentCssSelector, "", page);
|
|
2086
2153
|
this._name = name;
|
|
2087
2154
|
this.index = index;
|
|
2088
2155
|
this._caption = caption;
|
|
@@ -2090,17 +2157,17 @@ var init_Column = __esm({
|
|
|
2090
2157
|
}
|
|
2091
2158
|
set index(index) {
|
|
2092
2159
|
this._index = index;
|
|
2093
|
-
this.elementCssSelector = getColumnByIndexCssSelector(index)
|
|
2160
|
+
this.elementCssSelector = `${this.headerCssSelector} ${getColumnByIndexCssSelector(index)}`;
|
|
2094
2161
|
}
|
|
2095
2162
|
get index() {
|
|
2096
2163
|
return this._index;
|
|
2097
2164
|
}
|
|
2098
|
-
async
|
|
2165
|
+
async element() {
|
|
2099
2166
|
await this.getIndex();
|
|
2100
|
-
return
|
|
2167
|
+
return this.getLocator();
|
|
2101
2168
|
}
|
|
2102
2169
|
async getColumnHeaderIndexBy(cssSelector) {
|
|
2103
|
-
const column =
|
|
2170
|
+
const column = this.page.locator(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`);
|
|
2104
2171
|
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
2105
2172
|
}
|
|
2106
2173
|
async getIndexByCaption() {
|
|
@@ -2110,13 +2177,12 @@ var init_Column = __esm({
|
|
|
2110
2177
|
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
2111
2178
|
}
|
|
2112
2179
|
async caption() {
|
|
2113
|
-
const el = await this.
|
|
2114
|
-
|
|
2180
|
+
const el = await this.element();
|
|
2181
|
+
const text = await el.innerText();
|
|
2182
|
+
return text?.trim() ?? null;
|
|
2115
2183
|
}
|
|
2116
2184
|
async getIndex() {
|
|
2117
|
-
if (this.index != null)
|
|
2118
|
-
return this.index;
|
|
2119
|
-
}
|
|
2185
|
+
if (this.index != null) return this.index;
|
|
2120
2186
|
if (this._caption != null) {
|
|
2121
2187
|
this.index = await this.getIndexByCaption();
|
|
2122
2188
|
return this.index;
|
|
@@ -2125,7 +2191,7 @@ var init_Column = __esm({
|
|
|
2125
2191
|
this.index = await this.getIndexByName();
|
|
2126
2192
|
return this.index;
|
|
2127
2193
|
}
|
|
2128
|
-
throw new Error("
|
|
2194
|
+
throw new Error("Cannot get the index in the column");
|
|
2129
2195
|
}
|
|
2130
2196
|
};
|
|
2131
2197
|
}
|
|
@@ -2139,31 +2205,24 @@ var init_EditorButton = __esm({
|
|
|
2139
2205
|
init_locators();
|
|
2140
2206
|
init_createDataTestId();
|
|
2141
2207
|
init_AbstractElementWithParent();
|
|
2142
|
-
init_waitElementIsClickable();
|
|
2143
|
-
init_actions();
|
|
2144
2208
|
EditorButton = class extends AbstractElementWithParent {
|
|
2145
2209
|
name;
|
|
2146
|
-
constructor(parentCssSelector, name,
|
|
2147
|
-
super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)),
|
|
2210
|
+
constructor(parentCssSelector, name, page) {
|
|
2211
|
+
super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), page);
|
|
2148
2212
|
this.name = name;
|
|
2149
2213
|
}
|
|
2150
2214
|
buttonNotDisplayedError() {
|
|
2151
2215
|
return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
2152
2216
|
}
|
|
2153
2217
|
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);
|
|
2218
|
+
const button = this.getLocator();
|
|
2219
|
+
await button.click();
|
|
2161
2220
|
}
|
|
2162
|
-
async
|
|
2221
|
+
async isVisible() {
|
|
2163
2222
|
try {
|
|
2164
|
-
const button =
|
|
2165
|
-
return await button.
|
|
2166
|
-
} catch
|
|
2223
|
+
const button = this.getLocator();
|
|
2224
|
+
return await button.isVisible();
|
|
2225
|
+
} catch {
|
|
2167
2226
|
return false;
|
|
2168
2227
|
}
|
|
2169
2228
|
}
|
|
@@ -2181,12 +2240,12 @@ var init_AbstractEditor2 = __esm({
|
|
|
2181
2240
|
init_EditorButton();
|
|
2182
2241
|
AbstractEditor = class extends AbstractElementWithParent {
|
|
2183
2242
|
editor;
|
|
2184
|
-
constructor(parentCssSelector, elementCssSelector,
|
|
2185
|
-
super(parentCssSelector, elementCssSelector,
|
|
2243
|
+
constructor(parentCssSelector, elementCssSelector, page) {
|
|
2244
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2186
2245
|
}
|
|
2187
2246
|
async initEditor() {
|
|
2188
2247
|
if (!this.editor) {
|
|
2189
|
-
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.
|
|
2248
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.page);
|
|
2190
2249
|
}
|
|
2191
2250
|
}
|
|
2192
2251
|
/**
|
|
@@ -2254,16 +2313,16 @@ var init_AbstractEditor2 = __esm({
|
|
|
2254
2313
|
return this.editor.isDisabled();
|
|
2255
2314
|
}
|
|
2256
2315
|
/**
|
|
2257
|
-
* Возвращает значение true|false в зависимости
|
|
2316
|
+
* Возвращает значение true|false в зависимости isVisible поле или нет
|
|
2258
2317
|
* @example
|
|
2259
|
-
* expect(await formEdit.field('NumberFld').
|
|
2260
|
-
* expect(await formEdit.field('TextFld').
|
|
2318
|
+
* expect(await formEdit.field('NumberFld').isVisible()).toBe(true);
|
|
2319
|
+
* expect(await formEdit.field('TextFld').isVisible()).toBe(false);
|
|
2261
2320
|
*/
|
|
2262
|
-
async
|
|
2321
|
+
async isVisible() {
|
|
2263
2322
|
try {
|
|
2264
2323
|
await this.initEditor();
|
|
2265
|
-
const element =
|
|
2266
|
-
return await element.
|
|
2324
|
+
const element = this.getLocator();
|
|
2325
|
+
return await element.isVisible();
|
|
2267
2326
|
} catch {
|
|
2268
2327
|
return false;
|
|
2269
2328
|
}
|
|
@@ -2276,86 +2335,49 @@ var init_AbstractEditor2 = __esm({
|
|
|
2276
2335
|
* await form.field('Name').button('editorButton).click()
|
|
2277
2336
|
*/
|
|
2278
2337
|
button(name) {
|
|
2279
|
-
return new EditorButton(this.getFullCssSelector(), name, this.
|
|
2338
|
+
return new EditorButton(this.getFullCssSelector(), name, this.page);
|
|
2339
|
+
}
|
|
2340
|
+
};
|
|
2341
|
+
}
|
|
2342
|
+
});
|
|
2343
|
+
|
|
2344
|
+
// src/pageObjects/elements/FormField.ts
|
|
2345
|
+
var FormField;
|
|
2346
|
+
var init_FormField = __esm({
|
|
2347
|
+
"src/pageObjects/elements/FormField.ts"() {
|
|
2348
|
+
"use strict";
|
|
2349
|
+
init_locators();
|
|
2350
|
+
init_createDataTestId();
|
|
2351
|
+
init_AbstractEditor2();
|
|
2352
|
+
FormField = class extends AbstractEditor {
|
|
2353
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
2354
|
+
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), page);
|
|
2280
2355
|
}
|
|
2281
2356
|
};
|
|
2282
2357
|
}
|
|
2283
2358
|
});
|
|
2284
2359
|
|
|
2285
|
-
// src/pageObjects/elements/FormField.ts
|
|
2286
|
-
var FormField;
|
|
2287
|
-
var init_FormField = __esm({
|
|
2288
|
-
"src/pageObjects/elements/FormField.ts"() {
|
|
2289
|
-
"use strict";
|
|
2290
|
-
init_locators();
|
|
2291
|
-
init_createDataTestId();
|
|
2292
|
-
init_AbstractEditor2();
|
|
2293
|
-
FormField = class extends AbstractEditor {
|
|
2294
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
2295
|
-
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
2296
|
-
}
|
|
2297
|
-
};
|
|
2298
|
-
}
|
|
2299
|
-
});
|
|
2300
|
-
|
|
2301
|
-
// src/utils/typesUtil.ts
|
|
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";
|
|
2323
|
-
};
|
|
2324
|
-
}
|
|
2325
|
-
});
|
|
2326
|
-
|
|
2327
2360
|
// src/pageObjects/elements/AbstractDropDownMenuList.ts
|
|
2328
2361
|
var AbstractDropDownMenuList;
|
|
2329
2362
|
var init_AbstractDropDownMenuList = __esm({
|
|
2330
2363
|
"src/pageObjects/elements/AbstractDropDownMenuList.ts"() {
|
|
2331
2364
|
"use strict";
|
|
2332
2365
|
init_AbstractElementWithParent();
|
|
2333
|
-
init_actions();
|
|
2334
|
-
init_waitElementIsClickable();
|
|
2335
|
-
init_fixElementStaleError();
|
|
2336
2366
|
init_typesUtil();
|
|
2337
2367
|
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);
|
|
2368
|
+
async clickItemBy(locator) {
|
|
2369
|
+
const menuItemElement = this.page.locator(locator);
|
|
2370
|
+
await menuItemElement.click();
|
|
2349
2371
|
}
|
|
2350
|
-
async getElementByPath(
|
|
2351
|
-
let pathList = isString(
|
|
2372
|
+
async getElementByPath(path, getBy, returnLastElement = false) {
|
|
2373
|
+
let pathList = isString(path) ? [path] : path;
|
|
2352
2374
|
let result = null;
|
|
2353
2375
|
let index = 1;
|
|
2354
2376
|
for (let text of pathList) {
|
|
2355
2377
|
if (!returnLastElement || index < pathList.length) {
|
|
2356
|
-
await this.clickItemBy(
|
|
2378
|
+
await this.clickItemBy(getBy(text));
|
|
2357
2379
|
} else {
|
|
2358
|
-
result =
|
|
2380
|
+
result = this.page.locator(getBy(text));
|
|
2359
2381
|
}
|
|
2360
2382
|
index++;
|
|
2361
2383
|
}
|
|
@@ -2380,26 +2402,12 @@ var init_AbstractDropDownMenuList = __esm({
|
|
|
2380
2402
|
}
|
|
2381
2403
|
});
|
|
2382
2404
|
|
|
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
2405
|
// src/pageObjects/elements/DXContextMenuList.ts
|
|
2396
|
-
var
|
|
2406
|
+
var CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
|
|
2397
2407
|
var init_DXContextMenuList = __esm({
|
|
2398
2408
|
"src/pageObjects/elements/DXContextMenuList.ts"() {
|
|
2399
2409
|
"use strict";
|
|
2400
2410
|
init_AbstractDropDownMenuList();
|
|
2401
|
-
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2402
|
-
init_cssToXPath();
|
|
2403
2411
|
init_waitElementIsVisible();
|
|
2404
2412
|
CONTEXT_MENU_CLASS = "dx-context-menu";
|
|
2405
2413
|
CONTEXT_MENU_ITEM_TEXT_CLASS = "dx-menu-item-text";
|
|
@@ -2407,23 +2415,21 @@ var init_DXContextMenuList = __esm({
|
|
|
2407
2415
|
/**
|
|
2408
2416
|
* @param parentCssSelector
|
|
2409
2417
|
* @param classNames - Список класів. Починається з крапки
|
|
2410
|
-
* @param
|
|
2418
|
+
* @param page
|
|
2411
2419
|
*/
|
|
2412
|
-
constructor(parentCssSelector, classNames,
|
|
2413
|
-
super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`,
|
|
2420
|
+
constructor(parentCssSelector, classNames, page) {
|
|
2421
|
+
super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, page);
|
|
2414
2422
|
}
|
|
2415
2423
|
getButtonTitleBy(title) {
|
|
2416
|
-
|
|
2417
|
-
const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
|
|
2418
|
-
return import_selenium_webdriver25.By.xpath(xpath);
|
|
2424
|
+
return `${this.elementCssSelector} span.${CONTEXT_MENU_ITEM_TEXT_CLASS}:has-text("${title}")`;
|
|
2419
2425
|
}
|
|
2420
2426
|
async isVisible() {
|
|
2421
2427
|
try {
|
|
2428
|
+
const el = this.page.locator(`.dx-overlay-wrapper .${CONTEXT_MENU_CLASS}`);
|
|
2422
2429
|
await waitElementIsVisible_default({
|
|
2423
|
-
|
|
2424
|
-
driver: this.driver,
|
|
2425
|
-
errorMessage: "Cannot find dropdown element"
|
|
2430
|
+
locator: el
|
|
2426
2431
|
});
|
|
2432
|
+
return true;
|
|
2427
2433
|
} catch {
|
|
2428
2434
|
return false;
|
|
2429
2435
|
}
|
|
@@ -2442,8 +2448,8 @@ var init_ContextMenu = __esm({
|
|
|
2442
2448
|
ContextMenu = class extends DXContextMenuList {
|
|
2443
2449
|
_formName;
|
|
2444
2450
|
_initFn;
|
|
2445
|
-
constructor(cssClass, formName,
|
|
2446
|
-
super("", cssClass,
|
|
2451
|
+
constructor(cssClass, formName, page) {
|
|
2452
|
+
super("", cssClass, page);
|
|
2447
2453
|
this._formName = formName;
|
|
2448
2454
|
}
|
|
2449
2455
|
setInit(cb) {
|
|
@@ -2451,7 +2457,7 @@ var init_ContextMenu = __esm({
|
|
|
2451
2457
|
return this;
|
|
2452
2458
|
}
|
|
2453
2459
|
getButtonNameBy(name) {
|
|
2454
|
-
return
|
|
2460
|
+
return byTestIdCssSelector(`cm-${this._formName}-${name}`);
|
|
2455
2461
|
}
|
|
2456
2462
|
async clickButtonByTitle(title) {
|
|
2457
2463
|
await this._initFn?.();
|
|
@@ -2466,20 +2472,17 @@ var init_ContextMenu = __esm({
|
|
|
2466
2472
|
});
|
|
2467
2473
|
|
|
2468
2474
|
// src/pageObjects/elements/Table/Table.ts
|
|
2469
|
-
var
|
|
2475
|
+
var Table;
|
|
2470
2476
|
var init_Table = __esm({
|
|
2471
2477
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
2472
2478
|
"use strict";
|
|
2473
|
-
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2474
2479
|
init_createDataTestId();
|
|
2475
2480
|
init_AbstractElementWithParent();
|
|
2476
2481
|
init_Row();
|
|
2477
2482
|
init_Column();
|
|
2478
2483
|
init_FormField();
|
|
2479
2484
|
init_ContextMenu();
|
|
2480
|
-
init_actions();
|
|
2481
2485
|
init_wait();
|
|
2482
|
-
init_withCustomTimeouts();
|
|
2483
2486
|
Table = class extends AbstractElementWithParent {
|
|
2484
2487
|
formName;
|
|
2485
2488
|
headerCssSelector;
|
|
@@ -2493,9 +2496,9 @@ var init_Table = __esm({
|
|
|
2493
2496
|
headerCssSelector,
|
|
2494
2497
|
fixedTableContentCssSelector,
|
|
2495
2498
|
formName,
|
|
2496
|
-
|
|
2499
|
+
page
|
|
2497
2500
|
}) {
|
|
2498
|
-
super(parentCssSelector, `#${createTableId(formName)}`,
|
|
2501
|
+
super(parentCssSelector, `#${createTableId(formName)}`, page);
|
|
2499
2502
|
this.formName = formName;
|
|
2500
2503
|
this.headerCssSelector = headerCssSelector;
|
|
2501
2504
|
this.contextMenuCssSelector = contextMenuCssSelector;
|
|
@@ -2513,7 +2516,7 @@ var init_Table = __esm({
|
|
|
2513
2516
|
* @param index починається з 0
|
|
2514
2517
|
*/
|
|
2515
2518
|
getRowByIndex(index) {
|
|
2516
|
-
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.
|
|
2519
|
+
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.page, this.getColumnBy);
|
|
2517
2520
|
}
|
|
2518
2521
|
/**
|
|
2519
2522
|
* @param index починається з 0
|
|
@@ -2522,26 +2525,26 @@ var init_Table = __esm({
|
|
|
2522
2525
|
this.getRowByIndex(index);
|
|
2523
2526
|
return new Column({
|
|
2524
2527
|
parentCssSelector: this.getFullCssSelector(),
|
|
2525
|
-
|
|
2528
|
+
page: this.page,
|
|
2526
2529
|
index
|
|
2527
2530
|
});
|
|
2528
2531
|
}
|
|
2529
|
-
getColumnByTitle
|
|
2532
|
+
getColumnByTitle(title) {
|
|
2530
2533
|
return new Column({
|
|
2531
2534
|
parentCssSelector: this.getFullCssSelector(),
|
|
2532
2535
|
headerCssSelector: this.headerCssSelector,
|
|
2533
2536
|
caption: title,
|
|
2534
|
-
|
|
2537
|
+
page: this.page
|
|
2535
2538
|
});
|
|
2536
|
-
}
|
|
2537
|
-
getColumnByName
|
|
2539
|
+
}
|
|
2540
|
+
getColumnByName(name) {
|
|
2538
2541
|
return new Column({
|
|
2539
2542
|
parentCssSelector: this.getFullCssSelector(),
|
|
2540
2543
|
headerCssSelector: this.headerCssSelector,
|
|
2541
2544
|
name,
|
|
2542
|
-
|
|
2545
|
+
page: this.page
|
|
2543
2546
|
});
|
|
2544
|
-
}
|
|
2547
|
+
}
|
|
2545
2548
|
/**
|
|
2546
2549
|
* Вибрати рядок по індексу.
|
|
2547
2550
|
* @param index починається з 0
|
|
@@ -2559,48 +2562,31 @@ var init_Table = __esm({
|
|
|
2559
2562
|
await this.selectRowByIndex(index, true);
|
|
2560
2563
|
}
|
|
2561
2564
|
}
|
|
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
|
-
});
|
|
2565
|
+
getRowElements() {
|
|
2566
|
+
const rowsSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
2567
|
+
return this.page.locator(rowsSelector);
|
|
2571
2568
|
}
|
|
2572
2569
|
async getRows() {
|
|
2573
|
-
const
|
|
2570
|
+
const rowCount = await this.getRowElements().count();
|
|
2574
2571
|
const result = [];
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
this.fixedTableContentCssSelector,
|
|
2579
|
-
index,
|
|
2580
|
-
this.driver,
|
|
2581
|
-
this.getColumnBy
|
|
2582
|
-
);
|
|
2583
|
-
result.push(newRow);
|
|
2584
|
-
});
|
|
2572
|
+
for (let i = 0; i < rowCount; i++) {
|
|
2573
|
+
result.push(this.getRowByIndex(i));
|
|
2574
|
+
}
|
|
2585
2575
|
return result;
|
|
2586
2576
|
}
|
|
2587
2577
|
async getColumns() {
|
|
2588
|
-
const
|
|
2589
|
-
|
|
2578
|
+
const columnsLocator = this.page.locator(
|
|
2579
|
+
`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`
|
|
2590
2580
|
);
|
|
2581
|
+
const count = await columnsLocator.count();
|
|
2591
2582
|
const result = [];
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
index,
|
|
2596
|
-
driver: this.driver
|
|
2597
|
-
});
|
|
2598
|
-
result.push(newCol);
|
|
2599
|
-
});
|
|
2583
|
+
for (let i = 0; i < count; i++) {
|
|
2584
|
+
result.push(new Column({ parentCssSelector: this.getFullCssSelector(), page: this.page, index: i }));
|
|
2585
|
+
}
|
|
2600
2586
|
return result;
|
|
2601
2587
|
}
|
|
2602
2588
|
element() {
|
|
2603
|
-
return this.
|
|
2589
|
+
return this.getLocator();
|
|
2604
2590
|
}
|
|
2605
2591
|
/**
|
|
2606
2592
|
* Находит поле когда форма находится в состоянии редактирования
|
|
@@ -2610,7 +2596,7 @@ var init_Table = __esm({
|
|
|
2610
2596
|
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
2611
2597
|
*/
|
|
2612
2598
|
field(name) {
|
|
2613
|
-
return new FormField(this.getFullCssSelector(), this.formName, name, this.
|
|
2599
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.page);
|
|
2614
2600
|
}
|
|
2615
2601
|
/**
|
|
2616
2602
|
* Возвращает список строк которые выделены
|
|
@@ -2622,11 +2608,11 @@ var init_Table = __esm({
|
|
|
2622
2608
|
*/
|
|
2623
2609
|
async getSelectedRows() {
|
|
2624
2610
|
const rows = await this.getRows();
|
|
2625
|
-
|
|
2611
|
+
const result = [];
|
|
2626
2612
|
for (const row of rows) {
|
|
2627
2613
|
if (await row.isSelected()) {
|
|
2614
|
+
result.push(row);
|
|
2628
2615
|
}
|
|
2629
|
-
result.push(row);
|
|
2630
2616
|
}
|
|
2631
2617
|
return result;
|
|
2632
2618
|
}
|
|
@@ -2643,17 +2629,16 @@ var init_Table = __esm({
|
|
|
2643
2629
|
* await form.contextMenu('FieldName', 3).clickButton(['Group', 'ButtonInGroup']);
|
|
2644
2630
|
*/
|
|
2645
2631
|
contextMenu(fieldName, rowIndex) {
|
|
2646
|
-
return new ContextMenu(this.contextMenuCssSelector, this.formName, this.
|
|
2632
|
+
return new ContextMenu(this.contextMenuCssSelector, this.formName, this.page).setInit(async () => {
|
|
2647
2633
|
let row;
|
|
2648
2634
|
if (rowIndex != null) {
|
|
2649
2635
|
row = this.getRowByIndex(rowIndex);
|
|
2650
2636
|
} else {
|
|
2651
2637
|
[row] = await this.getSelectedRows();
|
|
2652
2638
|
}
|
|
2653
|
-
if (!row)
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
await contextMenu(cellElement, this.driver);
|
|
2639
|
+
if (!row) throw new Error("No row available row for context menu");
|
|
2640
|
+
const cellElement = await row.getCell(fieldName).element();
|
|
2641
|
+
await cellElement.click({ button: "right" });
|
|
2657
2642
|
});
|
|
2658
2643
|
}
|
|
2659
2644
|
/**
|
|
@@ -2665,16 +2650,14 @@ var init_Table = __esm({
|
|
|
2665
2650
|
* @returns {Promise<string>} Повертає значення комірки
|
|
2666
2651
|
*
|
|
2667
2652
|
* @example
|
|
2668
|
-
* const table = new Table(
|
|
2653
|
+
* const table = new Table(page);
|
|
2669
2654
|
*
|
|
2670
2655
|
* // Отримання значення комірки 'Name' в першому рядку (індекс 0)
|
|
2671
2656
|
* const cellValue = await table.getCellValueByCellName('Name', 0);
|
|
2672
2657
|
* expect(cellValue).toBe('Очікуване значення');
|
|
2673
2658
|
*/
|
|
2674
2659
|
getCellValueByCellName(cellName, rowIndex) {
|
|
2675
|
-
if (rowIndex == null)
|
|
2676
|
-
throw new Error("Error: getCellValue(): rowIndex is required");
|
|
2677
|
-
}
|
|
2660
|
+
if (rowIndex == null) throw new Error("Error: getCellValue(): rowIndex is required");
|
|
2678
2661
|
const row = this.getRowByIndex(rowIndex);
|
|
2679
2662
|
return row.getCell(cellName).getValue();
|
|
2680
2663
|
}
|
|
@@ -2684,19 +2667,15 @@ var init_Table = __esm({
|
|
|
2684
2667
|
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
2685
2668
|
*
|
|
2686
2669
|
* @example
|
|
2687
|
-
* const table = new Table(
|
|
2670
|
+
* const table = new Table(page);
|
|
2688
2671
|
*
|
|
2689
2672
|
* // Перевірка чи порожня таблиця
|
|
2690
2673
|
* const empty = await table.isEmpty();
|
|
2691
2674
|
* expect(empty).toBe(true);
|
|
2692
2675
|
*/
|
|
2693
2676
|
async isEmpty() {
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
return true;
|
|
2697
|
-
} catch {
|
|
2698
|
-
return false;
|
|
2699
|
-
}
|
|
2677
|
+
const rowCount = await this.getRowElements().count();
|
|
2678
|
+
return rowCount === 0;
|
|
2700
2679
|
}
|
|
2701
2680
|
/**
|
|
2702
2681
|
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
@@ -2707,7 +2686,7 @@ var init_Table = __esm({
|
|
|
2707
2686
|
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
2708
2687
|
*
|
|
2709
2688
|
* @example
|
|
2710
|
-
* const table = new Table(
|
|
2689
|
+
* const table = new Table(page);
|
|
2711
2690
|
*
|
|
2712
2691
|
* // Очікування, поки таблиця не стане порожньою
|
|
2713
2692
|
* await table.waitRowsCount(0);
|
|
@@ -2717,21 +2696,20 @@ var init_Table = __esm({
|
|
|
2717
2696
|
* console.log('Таблиця містить 5 рядків');
|
|
2718
2697
|
*/
|
|
2719
2698
|
async waitRowsCount(count) {
|
|
2720
|
-
await
|
|
2721
|
-
const
|
|
2722
|
-
return
|
|
2723
|
-
}, this.
|
|
2699
|
+
await wait(async () => {
|
|
2700
|
+
const rowsCount = await this.getRowElements().count();
|
|
2701
|
+
return rowsCount === count;
|
|
2702
|
+
}, this.page, `Rows count not equal: ${count}`);
|
|
2724
2703
|
}
|
|
2725
2704
|
};
|
|
2726
2705
|
}
|
|
2727
2706
|
});
|
|
2728
2707
|
|
|
2729
2708
|
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
2730
|
-
var
|
|
2709
|
+
var TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
|
|
2731
2710
|
var init_ToolbarButton = __esm({
|
|
2732
2711
|
"src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
|
|
2733
2712
|
"use strict";
|
|
2734
|
-
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2735
2713
|
init_AbstractButton();
|
|
2736
2714
|
init_locators();
|
|
2737
2715
|
TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
@@ -2741,8 +2719,8 @@ var init_ToolbarButton = __esm({
|
|
|
2741
2719
|
getToolbarButtonTextByTestIdSelector = (testId) => `${byTestIdCssSelector(testId)} .${TOOLBAR_BUTTON_TEXT_CLASS}`;
|
|
2742
2720
|
ToolbarButton = class extends AbstractButton {
|
|
2743
2721
|
name;
|
|
2744
|
-
constructor(parentCssSelector, name,
|
|
2745
|
-
super(parentCssSelector, getToolbarButtonSelector(name),
|
|
2722
|
+
constructor(parentCssSelector, name, page) {
|
|
2723
|
+
super(parentCssSelector, getToolbarButtonSelector(name), page);
|
|
2746
2724
|
this.name = name;
|
|
2747
2725
|
}
|
|
2748
2726
|
buttonNotDisplayedError() {
|
|
@@ -2750,8 +2728,8 @@ var init_ToolbarButton = __esm({
|
|
|
2750
2728
|
}
|
|
2751
2729
|
async getTitle() {
|
|
2752
2730
|
try {
|
|
2753
|
-
const buttonTextContainer =
|
|
2754
|
-
return await buttonTextContainer.
|
|
2731
|
+
const buttonTextContainer = this.page.locator(getToolbarButtonTextSelector(this.name));
|
|
2732
|
+
return await buttonTextContainer.innerText();
|
|
2755
2733
|
} catch (_) {
|
|
2756
2734
|
return null;
|
|
2757
2735
|
}
|
|
@@ -2761,17 +2739,16 @@ var init_ToolbarButton = __esm({
|
|
|
2761
2739
|
});
|
|
2762
2740
|
|
|
2763
2741
|
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
2764
|
-
var
|
|
2742
|
+
var ToolbarGroupButton;
|
|
2765
2743
|
var init_ToolbarGroupButton = __esm({
|
|
2766
2744
|
"src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
|
|
2767
2745
|
"use strict";
|
|
2768
2746
|
init_AbstractButton();
|
|
2769
|
-
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2770
2747
|
init_ToolbarButton();
|
|
2771
2748
|
ToolbarGroupButton = class extends AbstractButton {
|
|
2772
2749
|
name;
|
|
2773
|
-
constructor(parentCssSelector, name,
|
|
2774
|
-
super(parentCssSelector, ``,
|
|
2750
|
+
constructor(parentCssSelector, name, page) {
|
|
2751
|
+
super(parentCssSelector, ``, page);
|
|
2775
2752
|
this.name = name;
|
|
2776
2753
|
}
|
|
2777
2754
|
buttonNotDisplayedError() {
|
|
@@ -2780,8 +2757,8 @@ var init_ToolbarGroupButton = __esm({
|
|
|
2780
2757
|
async getTitle() {
|
|
2781
2758
|
try {
|
|
2782
2759
|
const buttonTestId = await this.getDataTestId();
|
|
2783
|
-
const buttonTextContainer =
|
|
2784
|
-
return await buttonTextContainer.
|
|
2760
|
+
const buttonTextContainer = this.page.locator(getToolbarButtonTextByTestIdSelector(buttonTestId));
|
|
2761
|
+
return await buttonTextContainer.innerText();
|
|
2785
2762
|
} catch (_) {
|
|
2786
2763
|
return null;
|
|
2787
2764
|
}
|
|
@@ -2796,16 +2773,15 @@ var init_AbstractDropDownMenuButton = __esm({
|
|
|
2796
2773
|
"src/pageObjects/elements/AbstractDropDownMenuButton.ts"() {
|
|
2797
2774
|
"use strict";
|
|
2798
2775
|
init_AbstractElementWithParent();
|
|
2799
|
-
init_actions();
|
|
2800
2776
|
AbstractDropDownMenuButton = class extends AbstractElementWithParent {
|
|
2801
2777
|
_list;
|
|
2802
|
-
constructor(parentCssSelector, elementCssSelector, list,
|
|
2803
|
-
super(parentCssSelector, elementCssSelector,
|
|
2778
|
+
constructor(parentCssSelector, elementCssSelector, list, page) {
|
|
2779
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2804
2780
|
this._list = list;
|
|
2805
2781
|
}
|
|
2806
2782
|
async openDropdownMenu() {
|
|
2807
|
-
const dropdown =
|
|
2808
|
-
await click(
|
|
2783
|
+
const dropdown = this.getLocator();
|
|
2784
|
+
await dropdown.click();
|
|
2809
2785
|
await this._list.isVisible();
|
|
2810
2786
|
}
|
|
2811
2787
|
async clickButton(name) {
|
|
@@ -2833,6 +2809,7 @@ var ToolbarMenuItem;
|
|
|
2833
2809
|
var init_ToolbarMenuItem = __esm({
|
|
2834
2810
|
"src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts"() {
|
|
2835
2811
|
"use strict";
|
|
2812
|
+
init_waitElementIsVisible();
|
|
2836
2813
|
ToolbarMenuItem = class {
|
|
2837
2814
|
getMenuItem;
|
|
2838
2815
|
name;
|
|
@@ -2840,26 +2817,44 @@ var init_ToolbarMenuItem = __esm({
|
|
|
2840
2817
|
this.getMenuItem = getMenuItem;
|
|
2841
2818
|
this.name = name;
|
|
2842
2819
|
}
|
|
2820
|
+
isPressed() {
|
|
2821
|
+
throw new Error("Method not implemented.");
|
|
2822
|
+
}
|
|
2823
|
+
getLocator() {
|
|
2824
|
+
throw new Error("Method not implemented.");
|
|
2825
|
+
}
|
|
2843
2826
|
async click() {
|
|
2844
|
-
|
|
2845
|
-
|
|
2827
|
+
try {
|
|
2828
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2829
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
2830
|
+
await menuItemElement.click();
|
|
2831
|
+
} catch (error) {
|
|
2832
|
+
throw new Error(`Cannot click on toolbar menu item: ${this.name}`);
|
|
2833
|
+
}
|
|
2846
2834
|
}
|
|
2847
2835
|
async getTitle() {
|
|
2848
2836
|
try {
|
|
2849
2837
|
const menuItemElement = await this.getMenuItem(this.name);
|
|
2850
|
-
|
|
2838
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
2839
|
+
return await menuItemElement.innerText();
|
|
2851
2840
|
} catch (_) {
|
|
2852
2841
|
return null;
|
|
2853
2842
|
}
|
|
2854
2843
|
}
|
|
2855
2844
|
async isDisabled() {
|
|
2856
|
-
|
|
2857
|
-
|
|
2845
|
+
try {
|
|
2846
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2847
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
2848
|
+
return await menuItemElement.isDisabled();
|
|
2849
|
+
} catch (_) {
|
|
2850
|
+
return false;
|
|
2851
|
+
}
|
|
2858
2852
|
}
|
|
2859
|
-
async
|
|
2853
|
+
async isVisible() {
|
|
2860
2854
|
try {
|
|
2861
2855
|
const menuItemElement = await this.getMenuItem(this.name);
|
|
2862
|
-
|
|
2856
|
+
await waitElementIsVisible_default({ locator: menuItemElement });
|
|
2857
|
+
return await menuItemElement.isVisible();
|
|
2863
2858
|
} catch (_) {
|
|
2864
2859
|
return false;
|
|
2865
2860
|
}
|
|
@@ -2883,8 +2878,8 @@ var init_ToolbarMenu = __esm({
|
|
|
2883
2878
|
getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
2884
2879
|
ToolbarMenuList = class extends DXContextMenuList {
|
|
2885
2880
|
_formName;
|
|
2886
|
-
constructor(parentCssSelector, elementCssSelector, formName,
|
|
2887
|
-
super(parentCssSelector, elementCssSelector,
|
|
2881
|
+
constructor(parentCssSelector, elementCssSelector, formName, page) {
|
|
2882
|
+
super(parentCssSelector, elementCssSelector, page);
|
|
2888
2883
|
this._formName = formName;
|
|
2889
2884
|
}
|
|
2890
2885
|
getButtonNameBy(name) {
|
|
@@ -2892,10 +2887,10 @@ var init_ToolbarMenu = __esm({
|
|
|
2892
2887
|
}
|
|
2893
2888
|
};
|
|
2894
2889
|
ToolbarMenu = class extends AbstractDropDownMenuButton {
|
|
2895
|
-
constructor(parentCssSelector, formName, name,
|
|
2890
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
2896
2891
|
const fullSelector = getFullCssSelector(formName, name);
|
|
2897
|
-
const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName,
|
|
2898
|
-
super(parentCssSelector, fullSelector, list,
|
|
2892
|
+
const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, page);
|
|
2893
|
+
super(parentCssSelector, fullSelector, list, page);
|
|
2899
2894
|
}
|
|
2900
2895
|
checkNameValue(name) {
|
|
2901
2896
|
if (!isString(name) && !isArray(name))
|
|
@@ -2913,13 +2908,13 @@ var init_ToolbarMenu = __esm({
|
|
|
2913
2908
|
this.checkTitleValue(title);
|
|
2914
2909
|
return new ToolbarMenuItem(this.getMenuItemElementByTitle.bind(this), title);
|
|
2915
2910
|
}
|
|
2916
|
-
async
|
|
2911
|
+
async buttonIsVisible(name) {
|
|
2917
2912
|
const button = this.buttonByName(name);
|
|
2918
|
-
return await button.
|
|
2913
|
+
return await button.isVisible();
|
|
2919
2914
|
}
|
|
2920
|
-
async
|
|
2915
|
+
async buttonByTitleIsVisible(title) {
|
|
2921
2916
|
const button = this.buttonByTitle(title);
|
|
2922
|
-
return await button.
|
|
2917
|
+
return await button.isVisible();
|
|
2923
2918
|
}
|
|
2924
2919
|
async buttonTitle(name) {
|
|
2925
2920
|
const button = this.buttonByName(name);
|
|
@@ -2955,14 +2950,15 @@ var init_ToolbarItem = __esm({
|
|
|
2955
2950
|
init_ToolbarButton();
|
|
2956
2951
|
init_locators();
|
|
2957
2952
|
init_ToolbarMenu();
|
|
2953
|
+
init_waitElementIsVisible();
|
|
2958
2954
|
GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
2959
2955
|
toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
2960
2956
|
ToolbarItem = class extends AbstractElementWithParent {
|
|
2961
2957
|
_button;
|
|
2962
2958
|
_formName;
|
|
2963
2959
|
_itemName;
|
|
2964
|
-
constructor(parentCssSelector, formName, itemName,
|
|
2965
|
-
super(parentCssSelector, toolbarItemSelector(formName, itemName),
|
|
2960
|
+
constructor(parentCssSelector, formName, itemName, page) {
|
|
2961
|
+
super(parentCssSelector, toolbarItemSelector(formName, itemName), page);
|
|
2966
2962
|
this._itemName = itemName;
|
|
2967
2963
|
this._formName = formName;
|
|
2968
2964
|
}
|
|
@@ -2970,23 +2966,33 @@ var init_ToolbarItem = __esm({
|
|
|
2970
2966
|
if (this._button) return this._button;
|
|
2971
2967
|
const classNames = await this.getClasses();
|
|
2972
2968
|
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
2973
|
-
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.
|
|
2969
|
+
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.page);
|
|
2974
2970
|
return;
|
|
2975
2971
|
}
|
|
2976
|
-
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.
|
|
2972
|
+
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.page);
|
|
2977
2973
|
}
|
|
2978
2974
|
async click() {
|
|
2979
|
-
|
|
2980
|
-
|
|
2975
|
+
try {
|
|
2976
|
+
await this.init();
|
|
2977
|
+
await waitElementIsVisible_default({ locator: this._button.getLocator() });
|
|
2978
|
+
await this._button.click();
|
|
2979
|
+
} catch (error) {
|
|
2980
|
+
throw new Error(`Cannot click on toolbar item: ${this._itemName}`);
|
|
2981
|
+
}
|
|
2981
2982
|
}
|
|
2982
2983
|
async isDisabled() {
|
|
2983
|
-
|
|
2984
|
-
|
|
2984
|
+
try {
|
|
2985
|
+
await this.init();
|
|
2986
|
+
await waitElementIsVisible_default({ locator: this._button.getLocator() });
|
|
2987
|
+
return await this._button.isDisabled();
|
|
2988
|
+
} catch (error) {
|
|
2989
|
+
return false;
|
|
2990
|
+
}
|
|
2985
2991
|
}
|
|
2986
|
-
async
|
|
2992
|
+
async isVisible() {
|
|
2987
2993
|
try {
|
|
2988
2994
|
await this.init();
|
|
2989
|
-
return this._button.
|
|
2995
|
+
return this._button.isVisible();
|
|
2990
2996
|
} catch (error) {
|
|
2991
2997
|
return false;
|
|
2992
2998
|
}
|
|
@@ -3000,11 +3006,15 @@ var init_ToolbarItem = __esm({
|
|
|
3000
3006
|
}
|
|
3001
3007
|
}
|
|
3002
3008
|
async getTitle() {
|
|
3003
|
-
|
|
3004
|
-
|
|
3009
|
+
try {
|
|
3010
|
+
await this.init();
|
|
3011
|
+
return await this._button.getTitle();
|
|
3012
|
+
} catch (error) {
|
|
3013
|
+
return "";
|
|
3014
|
+
}
|
|
3005
3015
|
}
|
|
3006
3016
|
get menu() {
|
|
3007
|
-
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.
|
|
3017
|
+
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.page);
|
|
3008
3018
|
}
|
|
3009
3019
|
};
|
|
3010
3020
|
}
|
|
@@ -3020,30 +3030,25 @@ var init_FormToolbar = __esm({
|
|
|
3020
3030
|
TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
3021
3031
|
FormToolbar = class extends AbstractElementWithParent {
|
|
3022
3032
|
formName;
|
|
3023
|
-
constructor(parentCssSelector, formName,
|
|
3024
|
-
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`,
|
|
3033
|
+
constructor(parentCssSelector, formName, page) {
|
|
3034
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, page);
|
|
3025
3035
|
this.formName = formName;
|
|
3026
3036
|
}
|
|
3027
3037
|
button(name) {
|
|
3028
|
-
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.
|
|
3038
|
+
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.page);
|
|
3029
3039
|
}
|
|
3030
3040
|
};
|
|
3031
3041
|
}
|
|
3032
3042
|
});
|
|
3033
3043
|
|
|
3034
3044
|
// src/pageObjects/elements/Filters/FilterOperation.ts
|
|
3035
|
-
var
|
|
3045
|
+
var FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
|
|
3036
3046
|
var init_FilterOperation = __esm({
|
|
3037
3047
|
"src/pageObjects/elements/Filters/FilterOperation.ts"() {
|
|
3038
3048
|
"use strict";
|
|
3039
|
-
import_selenium_webdriver29 = require("selenium-webdriver");
|
|
3040
|
-
init_fixElementStaleError();
|
|
3041
3049
|
init_AbstractElementWithParent();
|
|
3042
3050
|
init_locators();
|
|
3043
|
-
init_actions();
|
|
3044
3051
|
init_wait();
|
|
3045
|
-
init_waitElementIsClickable();
|
|
3046
|
-
init_waitElementIsVisible();
|
|
3047
3052
|
FILTER_OPERATIONS = [
|
|
3048
3053
|
"=",
|
|
3049
3054
|
"<>",
|
|
@@ -3065,44 +3070,42 @@ var init_FilterOperation = __esm({
|
|
|
3065
3070
|
getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
|
|
3066
3071
|
FilterOperation = class extends AbstractElementWithParent {
|
|
3067
3072
|
_testId;
|
|
3068
|
-
constructor({ parentCssSelector, filterTestID,
|
|
3069
|
-
super(
|
|
3073
|
+
constructor({ parentCssSelector, filterTestID, page }) {
|
|
3074
|
+
super(
|
|
3075
|
+
parentCssSelector,
|
|
3076
|
+
byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`),
|
|
3077
|
+
page
|
|
3078
|
+
);
|
|
3070
3079
|
this._testId = filterTestID;
|
|
3071
3080
|
}
|
|
3081
|
+
popup() {
|
|
3082
|
+
return this.page.locator(
|
|
3083
|
+
byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)
|
|
3084
|
+
);
|
|
3085
|
+
}
|
|
3072
3086
|
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
|
-
}
|
|
3087
|
+
const widgetButton = this.getLocator();
|
|
3088
|
+
const icon = widgetButton.locator(".dx-icon");
|
|
3089
|
+
await icon.first().click();
|
|
3090
|
+
const popup = this.popup();
|
|
3091
|
+
await popup.waitFor({ state: "visible" });
|
|
3091
3092
|
}
|
|
3092
3093
|
async setOperation(operationName) {
|
|
3093
3094
|
if (!FILTER_OPERATIONS.includes(operationName)) {
|
|
3094
3095
|
throw new Error(`Operation with name "${operationName}" is not correct.`);
|
|
3095
3096
|
}
|
|
3096
3097
|
await this.initOperationWidget();
|
|
3097
|
-
const
|
|
3098
|
-
|
|
3099
|
-
|
|
3098
|
+
const operationItem = this.popup().locator(
|
|
3099
|
+
getWidgetInPopupSelector(operationName)
|
|
3100
|
+
);
|
|
3101
|
+
await operationItem.click();
|
|
3102
|
+
await wait(
|
|
3100
3103
|
async () => {
|
|
3101
3104
|
const currOperationName = await this.getAttribute("data-operation");
|
|
3102
3105
|
if (operationName === "isblank") return true;
|
|
3103
3106
|
return currOperationName === operationName;
|
|
3104
3107
|
},
|
|
3105
|
-
this.
|
|
3108
|
+
this.page,
|
|
3106
3109
|
"Operation is not changed"
|
|
3107
3110
|
);
|
|
3108
3111
|
}
|
|
@@ -3115,12 +3118,12 @@ var init_FilterOperation = __esm({
|
|
|
3115
3118
|
const currValue = await this.getIsBlank();
|
|
3116
3119
|
if (currValue !== value) {
|
|
3117
3120
|
await this.setOperation("isblank");
|
|
3118
|
-
await
|
|
3121
|
+
await wait(
|
|
3119
3122
|
async () => {
|
|
3120
3123
|
const currIsBlank = await this.getIsBlank();
|
|
3121
3124
|
return currIsBlank === value;
|
|
3122
3125
|
},
|
|
3123
|
-
this.
|
|
3126
|
+
this.page,
|
|
3124
3127
|
"Operation is not changed"
|
|
3125
3128
|
);
|
|
3126
3129
|
}
|
|
@@ -3145,8 +3148,8 @@ var init_FormFilterField = __esm({
|
|
|
3145
3148
|
FormFilterField = class extends AbstractEditor {
|
|
3146
3149
|
formName;
|
|
3147
3150
|
name;
|
|
3148
|
-
constructor(parentCssSelector, formName, name,
|
|
3149
|
-
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)),
|
|
3151
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3152
|
+
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), page);
|
|
3150
3153
|
this.formName = formName;
|
|
3151
3154
|
this.name = name;
|
|
3152
3155
|
}
|
|
@@ -3198,7 +3201,7 @@ var init_FormFilterField = __esm({
|
|
|
3198
3201
|
return new FilterOperation({
|
|
3199
3202
|
parentCssSelector: this.parentCssSelector,
|
|
3200
3203
|
filterTestID: createLayoutFilterTestId(this.formName, this.name),
|
|
3201
|
-
|
|
3204
|
+
page: this.page
|
|
3202
3205
|
});
|
|
3203
3206
|
}
|
|
3204
3207
|
/**
|
|
@@ -3259,8 +3262,8 @@ var init_PanelFilterField = __esm({
|
|
|
3259
3262
|
PanelFilterField = class extends AbstractEditor {
|
|
3260
3263
|
formName;
|
|
3261
3264
|
name;
|
|
3262
|
-
constructor(parentCssSelector, formName, name,
|
|
3263
|
-
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)),
|
|
3265
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3266
|
+
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), page);
|
|
3264
3267
|
this.formName = formName;
|
|
3265
3268
|
this.name = name;
|
|
3266
3269
|
}
|
|
@@ -3312,7 +3315,7 @@ var init_PanelFilterField = __esm({
|
|
|
3312
3315
|
return new FilterOperation({
|
|
3313
3316
|
parentCssSelector: this.parentCssSelector,
|
|
3314
3317
|
filterTestID: createDocFilterTestId(this.formName, this.name),
|
|
3315
|
-
|
|
3318
|
+
page: this.page
|
|
3316
3319
|
});
|
|
3317
3320
|
}
|
|
3318
3321
|
/**
|
|
@@ -3362,14 +3365,12 @@ var init_PanelFilterField = __esm({
|
|
|
3362
3365
|
});
|
|
3363
3366
|
|
|
3364
3367
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
3365
|
-
var
|
|
3368
|
+
var drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
3366
3369
|
var init_FilterPanel = __esm({
|
|
3367
3370
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
3368
3371
|
"use strict";
|
|
3369
|
-
import_selenium_webdriver30 = require("selenium-webdriver");
|
|
3370
3372
|
init_AbstractElement();
|
|
3371
3373
|
init_PanelFilterField();
|
|
3372
|
-
init_actions();
|
|
3373
3374
|
drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
|
|
3374
3375
|
FILTER_PANEL_SELECTOR = ".filter-panel";
|
|
3375
3376
|
CLOSE_SELECTOR = ".button-close";
|
|
@@ -3380,11 +3381,10 @@ var init_FilterPanel = __esm({
|
|
|
3380
3381
|
}
|
|
3381
3382
|
async filterPanelButtons() {
|
|
3382
3383
|
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));
|
|
3384
|
+
return this.page.locator(selector).all();
|
|
3385
3385
|
}
|
|
3386
|
-
constructor(formName,
|
|
3387
|
-
super(
|
|
3386
|
+
constructor(formName, page) {
|
|
3387
|
+
super(page, drawerSelector(formName));
|
|
3388
3388
|
this._formName = formName;
|
|
3389
3389
|
}
|
|
3390
3390
|
/**
|
|
@@ -3394,28 +3394,28 @@ var init_FilterPanel = __esm({
|
|
|
3394
3394
|
* await form.filterPanel.filterField('NumberFld');
|
|
3395
3395
|
*/
|
|
3396
3396
|
filterField(name) {
|
|
3397
|
-
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.
|
|
3397
|
+
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.page);
|
|
3398
3398
|
}
|
|
3399
3399
|
async apply() {
|
|
3400
3400
|
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
3401
|
-
await click(
|
|
3401
|
+
await btn.click();
|
|
3402
3402
|
}
|
|
3403
3403
|
async findButtonByTitle(title) {
|
|
3404
3404
|
const buttons = await this.filterPanelButtons();
|
|
3405
3405
|
for (const btn of buttons) {
|
|
3406
|
-
if (await btn.
|
|
3406
|
+
if (await btn.innerText() === title) {
|
|
3407
3407
|
return btn;
|
|
3408
3408
|
}
|
|
3409
3409
|
}
|
|
3410
3410
|
}
|
|
3411
3411
|
async clearAll() {
|
|
3412
3412
|
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
3413
|
-
await click(
|
|
3414
|
-
await this.
|
|
3413
|
+
await btn.click();
|
|
3414
|
+
await this.page.waitForTimeout(300);
|
|
3415
3415
|
}
|
|
3416
3416
|
async close() {
|
|
3417
|
-
const btn =
|
|
3418
|
-
await click(
|
|
3417
|
+
const btn = this.page.locator(`${this.elementCssSelector} ${CLOSE_SELECTOR}`);
|
|
3418
|
+
await btn.click();
|
|
3419
3419
|
}
|
|
3420
3420
|
};
|
|
3421
3421
|
}
|
|
@@ -3430,8 +3430,8 @@ var init_HeaderFilterField = __esm({
|
|
|
3430
3430
|
init_createDataTestId();
|
|
3431
3431
|
init_AbstractEditor2();
|
|
3432
3432
|
HeaderFilterField = class extends AbstractEditor {
|
|
3433
|
-
constructor(parentCssSelector, formName, name,
|
|
3434
|
-
super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)),
|
|
3433
|
+
constructor(parentCssSelector, formName, name, page) {
|
|
3434
|
+
super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), page);
|
|
3435
3435
|
}
|
|
3436
3436
|
async getValue() {
|
|
3437
3437
|
return super.getValue();
|
|
@@ -3456,71 +3456,51 @@ var init_HeaderFilterField = __esm({
|
|
|
3456
3456
|
});
|
|
3457
3457
|
|
|
3458
3458
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
3459
|
-
var
|
|
3459
|
+
var APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
3460
3460
|
var init_ColumnFilter = __esm({
|
|
3461
3461
|
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
3462
3462
|
"use strict";
|
|
3463
|
-
init_actions();
|
|
3464
|
-
import_selenium_webdriver31 = require("selenium-webdriver");
|
|
3465
3463
|
init_HeaderFilterField();
|
|
3466
|
-
init_waitElementIsVisible();
|
|
3467
|
-
init_AbstractElement();
|
|
3468
3464
|
init_FilterOperation();
|
|
3469
3465
|
init_createDataTestId();
|
|
3470
|
-
|
|
3466
|
+
init_waitElementIsVisible();
|
|
3471
3467
|
APPLY_SELECTOR = ".apply-button";
|
|
3472
3468
|
CANCEL_SELECTOR = ".cancel-button";
|
|
3473
3469
|
HEADER_FILTER_ICON = ".indicators-container .filter-icon";
|
|
3474
3470
|
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
3475
3471
|
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
3476
|
-
ColumnFilter = class
|
|
3472
|
+
ColumnFilter = class {
|
|
3477
3473
|
_formName;
|
|
3478
3474
|
_name;
|
|
3479
3475
|
_column;
|
|
3480
|
-
|
|
3481
|
-
|
|
3476
|
+
page;
|
|
3477
|
+
constructor(formName, name, column, page) {
|
|
3482
3478
|
this._formName = formName;
|
|
3483
3479
|
this._name = name;
|
|
3484
3480
|
this._column = column;
|
|
3485
|
-
this.
|
|
3481
|
+
this.page = page;
|
|
3486
3482
|
}
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3483
|
+
getApplyButton() {
|
|
3484
|
+
return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`);
|
|
3490
3485
|
}
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3486
|
+
getCancelButton() {
|
|
3487
|
+
return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`);
|
|
3494
3488
|
}
|
|
3495
3489
|
async apply() {
|
|
3496
|
-
|
|
3497
|
-
await click(btn, this.driver);
|
|
3490
|
+
await this.getApplyButton().click();
|
|
3498
3491
|
}
|
|
3499
3492
|
async cancel() {
|
|
3500
|
-
|
|
3501
|
-
await click(btn, this.driver);
|
|
3493
|
+
await this.getCancelButton().click();
|
|
3502
3494
|
}
|
|
3503
3495
|
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
|
-
});
|
|
3496
|
+
const columnEl = await this._column.element();
|
|
3497
|
+
await columnEl.hover();
|
|
3498
|
+
const headerFilterIcon = columnEl.locator(HEADER_FILTER_ICON);
|
|
3499
|
+
await headerFilterIcon.waitFor({ state: "visible" });
|
|
3500
|
+
await headerFilterIcon.click();
|
|
3501
|
+
const filter = new HeaderFilterField("", this._formName, this._name, this.page);
|
|
3502
|
+
const filterEl = filter.getLocator();
|
|
3503
|
+
await waitElementIsVisible_default({ locator: filterEl });
|
|
3524
3504
|
return filter;
|
|
3525
3505
|
}
|
|
3526
3506
|
/**
|
|
@@ -3547,9 +3527,9 @@ var init_ColumnFilter = __esm({
|
|
|
3547
3527
|
const filterOperation = new FilterOperation({
|
|
3548
3528
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
3549
3529
|
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3550
|
-
|
|
3530
|
+
page: this.page
|
|
3551
3531
|
});
|
|
3552
|
-
const inputEl =
|
|
3532
|
+
const inputEl = filter.getLocator();
|
|
3553
3533
|
if (typeof operation === "string") {
|
|
3554
3534
|
await inputEl.click();
|
|
3555
3535
|
await filterOperation.setOperation(operation);
|
|
@@ -3559,7 +3539,7 @@ var init_ColumnFilter = __esm({
|
|
|
3559
3539
|
await filterOperation.setIsBlank(isBlank);
|
|
3560
3540
|
}
|
|
3561
3541
|
await filter.setValue(value);
|
|
3562
|
-
|
|
3542
|
+
await this.apply();
|
|
3563
3543
|
}
|
|
3564
3544
|
/**
|
|
3565
3545
|
* Очищает значение в поле
|
|
@@ -3586,12 +3566,12 @@ var init_ColumnFilter = __esm({
|
|
|
3586
3566
|
*/
|
|
3587
3567
|
async initOperation() {
|
|
3588
3568
|
const filter = await this.initFilter();
|
|
3589
|
-
const inputEl =
|
|
3569
|
+
const inputEl = filter.getLocator();
|
|
3590
3570
|
await inputEl.click();
|
|
3591
3571
|
return new FilterOperation({
|
|
3592
3572
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
3593
3573
|
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3594
|
-
|
|
3574
|
+
page: this.page
|
|
3595
3575
|
});
|
|
3596
3576
|
}
|
|
3597
3577
|
/**
|
|
@@ -3611,7 +3591,7 @@ var init_ColumnFilter = __esm({
|
|
|
3611
3591
|
*/
|
|
3612
3592
|
async getOperation() {
|
|
3613
3593
|
const filterOperation = await this.initOperation();
|
|
3614
|
-
return
|
|
3594
|
+
return filterOperation.getOperation();
|
|
3615
3595
|
}
|
|
3616
3596
|
/**
|
|
3617
3597
|
* Устанавливает операцию 'isblank' для фильтра
|
|
@@ -3630,7 +3610,7 @@ var init_ColumnFilter = __esm({
|
|
|
3630
3610
|
*/
|
|
3631
3611
|
async getIsBlank() {
|
|
3632
3612
|
const filterOperation = await this.initOperation();
|
|
3633
|
-
return
|
|
3613
|
+
return filterOperation.getIsBlank();
|
|
3634
3614
|
}
|
|
3635
3615
|
async isReadonly() {
|
|
3636
3616
|
const filter = await this.initFilter();
|
|
@@ -3672,8 +3652,8 @@ var init_ListForm = __esm({
|
|
|
3672
3652
|
fixedTableContentCssSelector;
|
|
3673
3653
|
tableContentCssSelector;
|
|
3674
3654
|
contextMenuCssSelector;
|
|
3675
|
-
constructor(
|
|
3676
|
-
super(
|
|
3655
|
+
constructor(page) {
|
|
3656
|
+
super(page);
|
|
3677
3657
|
this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
|
|
3678
3658
|
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
3679
3659
|
this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
|
|
@@ -3688,17 +3668,15 @@ var init_ListForm = __esm({
|
|
|
3688
3668
|
* expect(listForm.table());
|
|
3689
3669
|
*/
|
|
3690
3670
|
table() {
|
|
3691
|
-
return new Table(
|
|
3692
|
-
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
|
|
3700
|
-
}
|
|
3701
|
-
);
|
|
3671
|
+
return new Table({
|
|
3672
|
+
parentCssSelector: this.containerCssSelector,
|
|
3673
|
+
headerCssSelector: this.headerCssSelector,
|
|
3674
|
+
fixedTableContentCssSelector: this.fixedTableContentCssSelector,
|
|
3675
|
+
formName: this.formName,
|
|
3676
|
+
page: this.page,
|
|
3677
|
+
contextMenuCssSelector: this.contextMenuCssSelector,
|
|
3678
|
+
tableContentCssSelector: this.tableContentCssSelector
|
|
3679
|
+
});
|
|
3702
3680
|
}
|
|
3703
3681
|
/**
|
|
3704
3682
|
* Находит таблицу
|
|
@@ -3708,7 +3686,7 @@ var init_ListForm = __esm({
|
|
|
3708
3686
|
* expect(listForm.toolbarButton());
|
|
3709
3687
|
*/
|
|
3710
3688
|
toolbarButton(name) {
|
|
3711
|
-
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.
|
|
3689
|
+
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.page);
|
|
3712
3690
|
return toolbar.button(name);
|
|
3713
3691
|
}
|
|
3714
3692
|
/**
|
|
@@ -3719,11 +3697,11 @@ var init_ListForm = __esm({
|
|
|
3719
3697
|
* expect(listForm.formFilter());
|
|
3720
3698
|
*/
|
|
3721
3699
|
formFilter(name) {
|
|
3722
|
-
return new FormFilterField(this.containerCssSelector, this.formName, name, this.
|
|
3700
|
+
return new FormFilterField(this.containerCssSelector, this.formName, name, this.page);
|
|
3723
3701
|
}
|
|
3724
3702
|
columnFilter(name) {
|
|
3725
3703
|
const column = this.table().getColumnByName(name);
|
|
3726
|
-
return new ColumnFilter(this.formName, name, column, this.
|
|
3704
|
+
return new ColumnFilter(this.formName, name, column, this.page);
|
|
3727
3705
|
}
|
|
3728
3706
|
/**
|
|
3729
3707
|
* Модель панели фильтрации
|
|
@@ -3734,7 +3712,7 @@ var init_ListForm = __esm({
|
|
|
3734
3712
|
* expect(listForm.filterPanel());
|
|
3735
3713
|
*/
|
|
3736
3714
|
get filterPanel() {
|
|
3737
|
-
return new FilterPanel(this.formName, this.
|
|
3715
|
+
return new FilterPanel(this.formName, this.page);
|
|
3738
3716
|
}
|
|
3739
3717
|
};
|
|
3740
3718
|
}
|
|
@@ -3754,8 +3732,8 @@ var init_TreeView = __esm({
|
|
|
3754
3732
|
TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3755
3733
|
FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3756
3734
|
TreeView = class extends ListForm {
|
|
3757
|
-
constructor(
|
|
3758
|
-
super(
|
|
3735
|
+
constructor(page) {
|
|
3736
|
+
super(page);
|
|
3759
3737
|
this.popupContainerCssSelector = `.popup.tree-view-${this.formName}`;
|
|
3760
3738
|
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
3761
3739
|
this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
|
|
@@ -3805,29 +3783,28 @@ var init_createSubFormInstance = __esm({
|
|
|
3805
3783
|
});
|
|
3806
3784
|
|
|
3807
3785
|
// src/pageObjects/elements/Forms/Form.ts
|
|
3808
|
-
var
|
|
3786
|
+
var formTestId, Form;
|
|
3809
3787
|
var init_Form = __esm({
|
|
3810
3788
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
3811
3789
|
"use strict";
|
|
3812
3790
|
init_locators();
|
|
3813
|
-
import_selenium_webdriver32 = require("selenium-webdriver");
|
|
3814
3791
|
init_AbstractForm();
|
|
3815
|
-
init_waitElementIsVisible();
|
|
3816
3792
|
init_createSubFormInstance();
|
|
3793
|
+
init_waitElementIsVisible();
|
|
3817
3794
|
formTestId = (formName) => `form-content-wrapper-${formName}`;
|
|
3818
3795
|
Form = class extends AbstractForm {
|
|
3819
3796
|
popupContainerCssSelector;
|
|
3820
|
-
constructor(
|
|
3821
|
-
super(
|
|
3797
|
+
constructor(page) {
|
|
3798
|
+
super(page);
|
|
3822
3799
|
this.setSubFormMode();
|
|
3823
3800
|
}
|
|
3824
3801
|
async isModal() {
|
|
3825
|
-
const el =
|
|
3802
|
+
const el = this.getContainerElement();
|
|
3826
3803
|
const value = await el.getAttribute("data-ismodal");
|
|
3827
3804
|
return value === "true";
|
|
3828
3805
|
}
|
|
3829
3806
|
async isFullScreen() {
|
|
3830
|
-
const el =
|
|
3807
|
+
const el = this.getContainerElement();
|
|
3831
3808
|
const value = await el.getAttribute("data-isfullscreen");
|
|
3832
3809
|
return value === "true";
|
|
3833
3810
|
}
|
|
@@ -3837,29 +3814,27 @@ var init_Form = __esm({
|
|
|
3837
3814
|
* const listForm = new MyForm();
|
|
3838
3815
|
* //...
|
|
3839
3816
|
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
3817
|
+
* Получение заголовка на форме
|
|
3840
3818
|
*/
|
|
3841
3819
|
async getTitleText() {
|
|
3842
3820
|
const getFullScreenTitle = async () => {
|
|
3843
|
-
|
|
3844
|
-
return titleEl.
|
|
3821
|
+
const titleEl = this.page.locator(".main-toolbar-form-title");
|
|
3822
|
+
return titleEl.innerText();
|
|
3845
3823
|
};
|
|
3846
3824
|
if (await this.isFullScreen()) {
|
|
3847
3825
|
return getFullScreenTitle();
|
|
3848
3826
|
}
|
|
3849
3827
|
if (await this.isModal()) {
|
|
3850
|
-
const titleEl =
|
|
3828
|
+
const titleEl = this.page.locator(`${this.popupContainerCssSelector} .popup-title`);
|
|
3851
3829
|
await waitElementIsVisible_default({
|
|
3852
|
-
|
|
3853
|
-
driver: this.driver,
|
|
3854
|
-
errorMessage: `Form title element is not visible`
|
|
3830
|
+
locator: titleEl
|
|
3855
3831
|
});
|
|
3856
|
-
return titleEl.
|
|
3832
|
+
return titleEl.innerText();
|
|
3857
3833
|
}
|
|
3858
3834
|
return getFullScreenTitle();
|
|
3859
3835
|
}
|
|
3860
3836
|
setSubFormMode() {
|
|
3861
3837
|
const testId = formTestId(this.formName);
|
|
3862
|
-
this.containerBy = byTestId(testId);
|
|
3863
3838
|
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
3864
3839
|
}
|
|
3865
3840
|
/**
|
|
@@ -3873,26 +3848,26 @@ var init_Form = __esm({
|
|
|
3873
3848
|
async subForm(name, options = {}) {
|
|
3874
3849
|
const { isDockPanel = false } = options;
|
|
3875
3850
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
3876
|
-
const
|
|
3877
|
-
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
3851
|
+
const subFormEl = this.page.locator(cssSelector);
|
|
3878
3852
|
await waitElementIsVisible_default({
|
|
3879
|
-
|
|
3880
|
-
driver: this.driver,
|
|
3881
|
-
errorMessage: `Subform "${name}" is not visible`
|
|
3853
|
+
locator: subFormEl
|
|
3882
3854
|
});
|
|
3883
3855
|
const formType = await subFormEl.getAttribute("data-formtype");
|
|
3884
|
-
const formName = await subFormEl.getAttribute("data-formname");
|
|
3885
|
-
|
|
3856
|
+
const formName = await subFormEl.getAttribute("data-formname") ?? "";
|
|
3857
|
+
const SubFormFactoryClass = await classDependencyInjector(formType);
|
|
3886
3858
|
const SubForm = class extends SubFormFactoryClass {
|
|
3887
3859
|
setSubFormMode() {
|
|
3888
3860
|
this.containerCssSelector = cssSelector;
|
|
3889
|
-
this.containerBy =
|
|
3861
|
+
this.containerBy = cssSelector;
|
|
3890
3862
|
}
|
|
3891
3863
|
get formName() {
|
|
3892
3864
|
return formName;
|
|
3893
3865
|
}
|
|
3894
3866
|
};
|
|
3895
|
-
return new SubForm(this.
|
|
3867
|
+
return new SubForm(this.page);
|
|
3868
|
+
}
|
|
3869
|
+
getContainerElement() {
|
|
3870
|
+
return this.page.locator(this.containerCssSelector);
|
|
3896
3871
|
}
|
|
3897
3872
|
};
|
|
3898
3873
|
}
|
|
@@ -3903,20 +3878,18 @@ var FormEdit_exports = {};
|
|
|
3903
3878
|
__export(FormEdit_exports, {
|
|
3904
3879
|
default: () => FormEdit
|
|
3905
3880
|
});
|
|
3906
|
-
var
|
|
3881
|
+
var FormEdit;
|
|
3907
3882
|
var init_FormEdit = __esm({
|
|
3908
3883
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
3909
3884
|
"use strict";
|
|
3910
3885
|
init_Form();
|
|
3911
|
-
import_selenium_webdriver33 = require("selenium-webdriver");
|
|
3912
3886
|
init_FormField();
|
|
3913
|
-
init_actions();
|
|
3914
3887
|
init_wait();
|
|
3915
3888
|
FormEdit = class extends Form {
|
|
3916
3889
|
saveButtonId = "#button-save";
|
|
3917
3890
|
closeButtonId = "#button-cancel";
|
|
3918
|
-
constructor(
|
|
3919
|
-
super(
|
|
3891
|
+
constructor(page) {
|
|
3892
|
+
super(page);
|
|
3920
3893
|
this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
|
|
3921
3894
|
}
|
|
3922
3895
|
async getButtonCssSelector(buttonId) {
|
|
@@ -3933,7 +3906,7 @@ var init_FormEdit = __esm({
|
|
|
3933
3906
|
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
3934
3907
|
*/
|
|
3935
3908
|
field(name) {
|
|
3936
|
-
return new FormField(this.containerCssSelector, this.formName, name, this.
|
|
3909
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.page);
|
|
3937
3910
|
}
|
|
3938
3911
|
/**
|
|
3939
3912
|
* Проверяет не отключена ли кнопка Сохранить
|
|
@@ -3944,7 +3917,7 @@ var init_FormEdit = __esm({
|
|
|
3944
3917
|
*/
|
|
3945
3918
|
async isSaveButtonDisabled() {
|
|
3946
3919
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3947
|
-
const saveButton =
|
|
3920
|
+
const saveButton = this.page.locator(saveButtonCssSelector);
|
|
3948
3921
|
const result = await saveButton.getAttribute("aria-disabled");
|
|
3949
3922
|
return result === "true";
|
|
3950
3923
|
}
|
|
@@ -3957,9 +3930,9 @@ var init_FormEdit = __esm({
|
|
|
3957
3930
|
*/
|
|
3958
3931
|
async saveButtonClick() {
|
|
3959
3932
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3960
|
-
const saveButton =
|
|
3961
|
-
await
|
|
3962
|
-
await click(
|
|
3933
|
+
const saveButton = this.page.locator(saveButtonCssSelector);
|
|
3934
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.page, "Button is disabled");
|
|
3935
|
+
await saveButton.click();
|
|
3963
3936
|
}
|
|
3964
3937
|
/**
|
|
3965
3938
|
* Нажатие на кнопку Закрить
|
|
@@ -3970,8 +3943,91 @@ var init_FormEdit = __esm({
|
|
|
3970
3943
|
*/
|
|
3971
3944
|
async closeButtonClick() {
|
|
3972
3945
|
const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
|
|
3973
|
-
const closeButton =
|
|
3974
|
-
await click(
|
|
3946
|
+
const closeButton = this.page.locator(closeButtonCssSelector);
|
|
3947
|
+
await closeButton.click();
|
|
3948
|
+
}
|
|
3949
|
+
};
|
|
3950
|
+
}
|
|
3951
|
+
});
|
|
3952
|
+
|
|
3953
|
+
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
3954
|
+
var ReportForm;
|
|
3955
|
+
var init_ReportForm = __esm({
|
|
3956
|
+
"src/pageObjects/elements/Forms/ReportForm.ts"() {
|
|
3957
|
+
"use strict";
|
|
3958
|
+
init_FormEdit();
|
|
3959
|
+
ReportForm = class extends FormEdit {
|
|
3960
|
+
constructor(page) {
|
|
3961
|
+
super(page);
|
|
3962
|
+
this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
|
|
3963
|
+
this.saveButtonId = "#button-apply";
|
|
3964
|
+
}
|
|
3965
|
+
/**
|
|
3966
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
3967
|
+
* @example
|
|
3968
|
+
* const formReport = new MyForm();
|
|
3969
|
+
* //...
|
|
3970
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
3971
|
+
*/
|
|
3972
|
+
filterField(name) {
|
|
3973
|
+
return super.field(name);
|
|
3974
|
+
}
|
|
3975
|
+
};
|
|
3976
|
+
}
|
|
3977
|
+
});
|
|
3978
|
+
|
|
3979
|
+
// src/pageObjects/elements/Dialog.ts
|
|
3980
|
+
var DIALOG_CLASS, DIALOG_TITLE_CLASS, DIALOG_TEXT_CLASS, DIALOG_BUTTONS_PANEL_CLASS, buttonByTextXpath, DialogButton, Dialog;
|
|
3981
|
+
var init_Dialog = __esm({
|
|
3982
|
+
"src/pageObjects/elements/Dialog.ts"() {
|
|
3983
|
+
"use strict";
|
|
3984
|
+
init_AbstractElement();
|
|
3985
|
+
init_AbstractButton();
|
|
3986
|
+
DIALOG_CLASS = ".d5-dialog";
|
|
3987
|
+
DIALOG_TITLE_CLASS = ".dialog__title";
|
|
3988
|
+
DIALOG_TEXT_CLASS = ".dialog__text";
|
|
3989
|
+
DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
|
|
3990
|
+
buttonByTextXpath = (text) => `xpath=.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
|
|
3991
|
+
DialogButton = class extends AbstractButton {
|
|
3992
|
+
text;
|
|
3993
|
+
constructor(parentCssSelector, text, page) {
|
|
3994
|
+
super(parentCssSelector, "", page);
|
|
3995
|
+
this.text = text;
|
|
3996
|
+
}
|
|
3997
|
+
getLocator() {
|
|
3998
|
+
const panel = super.getLocator();
|
|
3999
|
+
return panel.locator(buttonByTextXpath(this.text));
|
|
4000
|
+
}
|
|
4001
|
+
buttonNotDisplayedError() {
|
|
4002
|
+
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
4003
|
+
}
|
|
4004
|
+
getTitle() {
|
|
4005
|
+
throw new Error(`Method "getTitle()" is not working.`);
|
|
4006
|
+
}
|
|
4007
|
+
};
|
|
4008
|
+
Dialog = class extends AbstractElement {
|
|
4009
|
+
constructor(page) {
|
|
4010
|
+
super(page, DIALOG_CLASS);
|
|
4011
|
+
}
|
|
4012
|
+
get titleSelector() {
|
|
4013
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
|
|
4014
|
+
}
|
|
4015
|
+
get textSelector() {
|
|
4016
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
|
|
4017
|
+
}
|
|
4018
|
+
get buttonsSelector() {
|
|
4019
|
+
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
4020
|
+
}
|
|
4021
|
+
async title() {
|
|
4022
|
+
const el = this.page.locator(this.titleSelector);
|
|
4023
|
+
return await el.innerText();
|
|
4024
|
+
}
|
|
4025
|
+
async text() {
|
|
4026
|
+
const el = this.page.locator(this.textSelector);
|
|
4027
|
+
return await el.innerText();
|
|
4028
|
+
}
|
|
4029
|
+
button(text) {
|
|
4030
|
+
return new DialogButton(this.buttonsSelector, text, this.page);
|
|
3975
4031
|
}
|
|
3976
4032
|
};
|
|
3977
4033
|
}
|
|
@@ -6783,6 +6839,25 @@ var require_d5lib = __commonJS({
|
|
|
6783
6839
|
}
|
|
6784
6840
|
});
|
|
6785
6841
|
|
|
6842
|
+
// src/api/ApiRequest.ts
|
|
6843
|
+
function ApiRequest(objectName, operation) {
|
|
6844
|
+
const { auth } = config();
|
|
6845
|
+
(0, import_d5lib.config)(auth);
|
|
6846
|
+
const postInstance = (0, import_d5lib.post)(objectName, operation);
|
|
6847
|
+
const invoke = async () => {
|
|
6848
|
+
return postInstance.send(true);
|
|
6849
|
+
};
|
|
6850
|
+
return Object.assign(postInstance, { invoke });
|
|
6851
|
+
}
|
|
6852
|
+
var import_d5lib;
|
|
6853
|
+
var init_ApiRequest = __esm({
|
|
6854
|
+
"src/api/ApiRequest.ts"() {
|
|
6855
|
+
"use strict";
|
|
6856
|
+
init_config();
|
|
6857
|
+
import_d5lib = __toESM(require_d5lib());
|
|
6858
|
+
}
|
|
6859
|
+
});
|
|
6860
|
+
|
|
6786
6861
|
// src/index.ts
|
|
6787
6862
|
var src_exports = {};
|
|
6788
6863
|
__export(src_exports, {
|
|
@@ -6804,405 +6879,38 @@ __export(src_exports, {
|
|
|
6804
6879
|
TreeView: () => TreeView,
|
|
6805
6880
|
byTestId: () => byTestId,
|
|
6806
6881
|
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
6807
|
-
click: () => click,
|
|
6808
6882
|
config: () => config,
|
|
6809
|
-
contextMenu: () => contextMenu,
|
|
6810
|
-
createDriver: () => createDriver,
|
|
6811
6883
|
disabledLocator: () => disabledLocator,
|
|
6812
6884
|
editorFactory: () => editorFactory,
|
|
6813
|
-
elementIsNotPresent: () => elementIsNotPresent,
|
|
6814
6885
|
readonlyLocator: () => readonlyLocator,
|
|
6815
|
-
|
|
6816
|
-
wait: () => safeWait,
|
|
6817
|
-
waitElementIsClickable: () => waitElementIsClickable_default,
|
|
6886
|
+
wait: () => wait,
|
|
6818
6887
|
waitElementIsVisible: () => waitElementIsVisible_default
|
|
6819
6888
|
});
|
|
6820
6889
|
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);
|
|
6890
|
+
var init_src = __esm({
|
|
6891
|
+
"src/index.ts"() {
|
|
6892
|
+
init_config();
|
|
6893
|
+
init_LoginPage();
|
|
6894
|
+
init_locators();
|
|
6895
|
+
init_waitElementIsVisible();
|
|
6896
|
+
init_wait();
|
|
6897
|
+
init_AbstractPage();
|
|
6898
|
+
init_LoginPage();
|
|
6899
|
+
init_SubsystemsPanel();
|
|
6900
|
+
init_FormEdit();
|
|
6901
|
+
init_ListForm();
|
|
6902
|
+
init_TreeView();
|
|
6903
|
+
init_ReportForm();
|
|
6904
|
+
init_Editors();
|
|
6905
|
+
init_FormField();
|
|
6906
|
+
init_FormFilterField();
|
|
6907
|
+
init_PanelFilterField();
|
|
6908
|
+
init_FilterPanel();
|
|
6909
|
+
init_Dialog();
|
|
6910
|
+
init_ApiRequest();
|
|
7191
6911
|
}
|
|
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
|
-
}
|
|
6912
|
+
});
|
|
6913
|
+
init_src();
|
|
7206
6914
|
// Annotate the CommonJS export names for ESM import in node:
|
|
7207
6915
|
0 && (module.exports = {
|
|
7208
6916
|
AbstractPage,
|
|
@@ -7223,17 +6931,11 @@ function ApiRequest(objectName, operation) {
|
|
|
7223
6931
|
TreeView,
|
|
7224
6932
|
byTestId,
|
|
7225
6933
|
byTestIdCssSelector,
|
|
7226
|
-
click,
|
|
7227
6934
|
config,
|
|
7228
|
-
contextMenu,
|
|
7229
|
-
createDriver,
|
|
7230
6935
|
disabledLocator,
|
|
7231
6936
|
editorFactory,
|
|
7232
|
-
elementIsNotPresent,
|
|
7233
6937
|
readonlyLocator,
|
|
7234
|
-
signIn,
|
|
7235
6938
|
wait,
|
|
7236
|
-
waitElementIsClickable,
|
|
7237
6939
|
waitElementIsVisible
|
|
7238
6940
|
});
|
|
7239
6941
|
/*! For license information please see d5lib.js.LICENSE.txt */
|