d5-testing-library 1.4.0 → 1.6.0
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-Z2QDWFFG.mjs +7 -0
- package/dist/ListForm-JAFTOUFG.mjs +7 -0
- package/dist/TreeView-YUECOEFI.mjs +8 -0
- package/dist/chunk-3EQV252X.mjs +656 -0
- package/dist/chunk-4VLJL7OZ.mjs +1204 -0
- package/dist/chunk-CFJ5JWM7.mjs +17 -0
- package/dist/chunk-PNSQQKEY.mjs +66 -0
- package/dist/cjs/d5-testing-library.cjs +2391 -1598
- package/dist/d5-testing-library.d.ts +91 -49
- package/dist/d5-testing-library.legacy-esm.js +47 -1686
- package/dist/d5-testing-library.mjs +47 -1686
- package/package.json +1 -1
|
@@ -1,149 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (!cfg)
|
|
32
|
-
return createConfigProxy(this.appConfig);
|
|
33
|
-
this.appConfig = cfg;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
var configInstance = Config.getInstance();
|
|
37
|
-
function config(cfg) {
|
|
38
|
-
return configInstance.config(cfg);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// src/pageObjects/AbstractElement.ts
|
|
42
|
-
import { By } from "selenium-webdriver";
|
|
43
|
-
|
|
44
|
-
// src/utils/waitElementIsVisible.ts
|
|
45
|
-
import { until } from "selenium-webdriver";
|
|
46
|
-
|
|
47
|
-
// src/utils/wait.ts
|
|
48
|
-
async function wait(condition, driver, errorMessage, timeout) {
|
|
49
|
-
driver = driver ?? config().driver;
|
|
50
|
-
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// src/utils/waitElementIsVisible.ts
|
|
54
|
-
async function waitElementIsVisible({
|
|
55
|
-
element,
|
|
56
|
-
timeout,
|
|
57
|
-
errorMessage,
|
|
58
|
-
driver
|
|
59
|
-
}) {
|
|
60
|
-
driver = driver ?? config().driver;
|
|
61
|
-
const condition = until.elementIsVisible(element);
|
|
62
|
-
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/pageObjects/AbstractElement.ts
|
|
66
|
-
var AbstractElement = class {
|
|
67
|
-
driver;
|
|
68
|
-
elementCssSelector;
|
|
69
|
-
constructor(driver, elementCssSelector) {
|
|
70
|
-
this.driver = driver || config().driver;
|
|
71
|
-
this.elementCssSelector = elementCssSelector;
|
|
72
|
-
}
|
|
73
|
-
getFullCssSelector() {
|
|
74
|
-
return this.elementCssSelector;
|
|
75
|
-
}
|
|
76
|
-
joinRelativeCssSelectors(selectors) {
|
|
77
|
-
return selectors.join(" ");
|
|
78
|
-
}
|
|
79
|
-
async getElement() {
|
|
80
|
-
return this.driver.findElement(By.css(this.getFullCssSelector()));
|
|
81
|
-
}
|
|
82
|
-
async getAttribute(attr) {
|
|
83
|
-
const element = await this.getElement();
|
|
84
|
-
await waitElementIsVisible({
|
|
85
|
-
element,
|
|
86
|
-
driver: this.driver,
|
|
87
|
-
errorMessage: `Element not found: ${this.getFullCssSelector()}`
|
|
88
|
-
});
|
|
89
|
-
return await element.getAttribute(attr);
|
|
90
|
-
}
|
|
91
|
-
async getClasses() {
|
|
92
|
-
return await this.getAttribute("class");
|
|
93
|
-
}
|
|
94
|
-
async getDataTestId() {
|
|
95
|
-
return await this.getAttribute("data-testid");
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
// src/pageObjects/pages/AbstractPage.ts
|
|
100
|
-
var AbstractPage = class extends AbstractElement {
|
|
101
|
-
url;
|
|
102
|
-
host;
|
|
103
|
-
constructor(driver) {
|
|
104
|
-
super(driver);
|
|
105
|
-
this.host = config().auth.host;
|
|
106
|
-
this.url = this.host + this.prependHash(this.path);
|
|
107
|
-
}
|
|
108
|
-
prependHash(urlPath) {
|
|
109
|
-
if (!urlPath.startsWith("/#")) {
|
|
110
|
-
return `/#${urlPath}`;
|
|
111
|
-
}
|
|
112
|
-
return urlPath;
|
|
113
|
-
}
|
|
114
|
-
async goToUrl(url) {
|
|
115
|
-
await this.driver.get(url);
|
|
116
|
-
}
|
|
117
|
-
get path() {
|
|
118
|
-
return "/#";
|
|
119
|
-
}
|
|
120
|
-
async locate() {
|
|
121
|
-
await this.goToUrl(this.url);
|
|
122
|
-
}
|
|
123
|
-
async reloadPage() {
|
|
124
|
-
await this.driver.navigate().refresh();
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
// src/utils/actions.ts
|
|
129
|
-
var click = async (webElement, driver) => {
|
|
130
|
-
driver = driver ?? config().driver;
|
|
131
|
-
if (!await webElement.isDisplayed()) {
|
|
132
|
-
await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
|
|
133
|
-
}
|
|
134
|
-
const actions = driver.actions({ async: true });
|
|
135
|
-
await actions.move({ origin: webElement }).click().perform();
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// src/utils/locators.ts
|
|
139
|
-
import { By as By2 } from "selenium-webdriver";
|
|
140
|
-
var byTestIdCssSelector = (testId, element = "div") => {
|
|
141
|
-
return `${element}[data-testid="${testId}"]`;
|
|
142
|
-
};
|
|
143
|
-
var byTestId = (testId, element = "div") => {
|
|
144
|
-
return By2.css(byTestIdCssSelector(testId, element));
|
|
145
|
-
};
|
|
146
|
-
var readonlyLocator = "readonly";
|
|
1
|
+
import {
|
|
2
|
+
TreeView
|
|
3
|
+
} from "./chunk-CFJ5JWM7.mjs";
|
|
4
|
+
import {
|
|
5
|
+
FilterPanel,
|
|
6
|
+
FormFilterField,
|
|
7
|
+
ListForm,
|
|
8
|
+
PanelFilterField
|
|
9
|
+
} from "./chunk-3EQV252X.mjs";
|
|
10
|
+
import {
|
|
11
|
+
FormEdit
|
|
12
|
+
} from "./chunk-PNSQQKEY.mjs";
|
|
13
|
+
import {
|
|
14
|
+
AbstractButton,
|
|
15
|
+
AbstractElement,
|
|
16
|
+
AbstractElementWithParent,
|
|
17
|
+
AbstractPage,
|
|
18
|
+
ControlClass,
|
|
19
|
+
FormField,
|
|
20
|
+
NumberEditor,
|
|
21
|
+
TextEditor,
|
|
22
|
+
byTestId,
|
|
23
|
+
byTestIdCssSelector,
|
|
24
|
+
click,
|
|
25
|
+
config,
|
|
26
|
+
editorFactory,
|
|
27
|
+
readonlyLocator,
|
|
28
|
+
wait,
|
|
29
|
+
waitElementIsVisible
|
|
30
|
+
} from "./chunk-4VLJL7OZ.mjs";
|
|
147
31
|
|
|
148
32
|
// src/pageObjects/pages/LoginPage.ts
|
|
149
33
|
var LOGIN_PATH = "/login";
|
|
@@ -210,34 +94,11 @@ async function signIn(driver) {
|
|
|
210
94
|
return webDriver;
|
|
211
95
|
}
|
|
212
96
|
|
|
213
|
-
// src/pageObjects/AbstractElementWithParent.ts
|
|
214
|
-
var AbstractElementWithParent = class extends AbstractElement {
|
|
215
|
-
parentCssSelector;
|
|
216
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
217
|
-
super(driver, elementCssSelector);
|
|
218
|
-
this.parentCssSelector = parentCssSelector;
|
|
219
|
-
}
|
|
220
|
-
getFullCssSelector() {
|
|
221
|
-
if (!this.elementCssSelector) {
|
|
222
|
-
return this.parentCssSelector;
|
|
223
|
-
}
|
|
224
|
-
if (!this.parentCssSelector) {
|
|
225
|
-
return this.elementCssSelector;
|
|
226
|
-
}
|
|
227
|
-
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
228
|
-
}
|
|
229
|
-
async isReadonly() {
|
|
230
|
-
const fieldEl = await this.getElement();
|
|
231
|
-
const classSting = await fieldEl.getAttribute("class");
|
|
232
|
-
return classSting.includes(readonlyLocator);
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
|
|
236
97
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
237
|
-
import { By as
|
|
98
|
+
import { By as By2 } from "selenium-webdriver";
|
|
238
99
|
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
239
100
|
async title() {
|
|
240
|
-
return this.driver.findElement(
|
|
101
|
+
return this.driver.findElement(By2.css(this.getFullCssSelector()));
|
|
241
102
|
}
|
|
242
103
|
};
|
|
243
104
|
|
|
@@ -255,1534 +116,33 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
255
116
|
}
|
|
256
117
|
};
|
|
257
118
|
|
|
258
|
-
// src/pageObjects/elements/Forms/
|
|
259
|
-
import { By as
|
|
260
|
-
|
|
261
|
-
// src/utils/createDataTestId.ts
|
|
262
|
-
function createDataTestId(formName, itemType, itemName) {
|
|
263
|
-
return `${formName}-${itemType}-${itemName}`;
|
|
264
|
-
}
|
|
265
|
-
function createFieldTestId(formName, itemName) {
|
|
266
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
267
|
-
}
|
|
268
|
-
function createGroupTestId(formName, itemName) {
|
|
269
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
270
|
-
}
|
|
271
|
-
function createFilterTestId(formName, itemName, layout) {
|
|
272
|
-
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
273
|
-
}
|
|
274
|
-
function createDocFilterTestId(formName, itemName) {
|
|
275
|
-
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
276
|
-
}
|
|
277
|
-
function createLayoutFilterTestId(formName, itemName) {
|
|
278
|
-
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
279
|
-
}
|
|
280
|
-
function createTableId(formName) {
|
|
281
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
282
|
-
}
|
|
283
|
-
function createFormButtonTestId(formName, itemName) {
|
|
284
|
-
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// src/utils/waitElementIsClickable.ts
|
|
288
|
-
async function waitElementIsClickable({
|
|
289
|
-
element,
|
|
290
|
-
timeout,
|
|
291
|
-
errorMessage,
|
|
292
|
-
driver
|
|
293
|
-
}) {
|
|
294
|
-
driver = driver ?? config().driver;
|
|
295
|
-
await wait(async () => {
|
|
296
|
-
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
297
|
-
return await element.isDisplayed() && !isDisabled;
|
|
298
|
-
}, driver, errorMessage, timeout ?? config().timeout);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
302
|
-
var AbstractButton = class extends AbstractElementWithParent {
|
|
303
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
304
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
305
|
-
}
|
|
306
|
-
async click() {
|
|
307
|
-
const button = await this.getElement();
|
|
308
|
-
await waitElementIsClickable({
|
|
309
|
-
element: button,
|
|
310
|
-
errorMessage: this.buttonNotDisplayedError(),
|
|
311
|
-
driver: this.driver
|
|
312
|
-
});
|
|
313
|
-
await click(button, this.driver);
|
|
314
|
-
}
|
|
315
|
-
async isDisabled() {
|
|
316
|
-
const button = await this.getElement();
|
|
317
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
318
|
-
}
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
322
|
-
import { By as By5 } from "selenium-webdriver";
|
|
323
|
-
var DXButton = class extends AbstractButton {
|
|
324
|
-
async getText() {
|
|
325
|
-
const classes = await this.getClasses();
|
|
326
|
-
if (!classes.includes("dx-button-has-text")) {
|
|
327
|
-
return null;
|
|
328
|
-
}
|
|
329
|
-
const el = await this.getElement();
|
|
330
|
-
const textEl = el.findElement(By5.className("dx-button-text"));
|
|
331
|
-
return await textEl.getText();
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
// src/pageObjects/elements/FormButton.ts
|
|
336
|
-
var FormButton = class extends DXButton {
|
|
337
|
-
name;
|
|
338
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
339
|
-
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
|
|
340
|
-
this.name = name;
|
|
341
|
-
}
|
|
342
|
-
buttonNotDisplayedError() {
|
|
343
|
-
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
344
|
-
}
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
348
|
-
var AbstractForm = class extends AbstractPage {
|
|
349
|
-
containerCssSelector = "";
|
|
350
|
-
containerBy;
|
|
351
|
-
popupContainerCssSelector;
|
|
352
|
-
constructor(driver) {
|
|
353
|
-
super(driver);
|
|
354
|
-
const testId = `form-content-wrapper-${this.formName}`;
|
|
355
|
-
this.containerBy = byTestId(testId);
|
|
356
|
-
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
357
|
-
}
|
|
358
|
-
async isModal() {
|
|
359
|
-
const el = await this.getContainerElement();
|
|
360
|
-
const value = await el.getAttribute("data-ismodal");
|
|
361
|
-
return value === "true";
|
|
362
|
-
}
|
|
363
|
-
getContainerElement = () => {
|
|
364
|
-
return this.driver.findElement(this.containerBy);
|
|
365
|
-
};
|
|
366
|
-
get formName() {
|
|
367
|
-
return "";
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Возвращает true если форма есть в DOM
|
|
371
|
-
* @example
|
|
372
|
-
* class MyForm extends FormEdit {}
|
|
373
|
-
* //...
|
|
374
|
-
* const formEdit = new MyForm();
|
|
375
|
-
* expect(await formEdit.exists()).toBe(true);
|
|
376
|
-
*/
|
|
377
|
-
async exists() {
|
|
378
|
-
try {
|
|
379
|
-
let elements = await this.driver.findElements(this.containerBy);
|
|
380
|
-
return elements.length > 0;
|
|
381
|
-
} catch (error) {
|
|
382
|
-
return false;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Получение заголовка на формы
|
|
387
|
-
* @example
|
|
388
|
-
* const listForm = new MyForm();
|
|
389
|
-
* //...
|
|
390
|
-
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
391
|
-
*/
|
|
392
|
-
async getTitleText() {
|
|
393
|
-
if (await this.isModal()) {
|
|
394
|
-
const titleEl2 = await this.driver.findElement(By6.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
395
|
-
return titleEl2.getText();
|
|
396
|
-
}
|
|
397
|
-
let titleEl = await this.driver.findElement(By6.className("main-toolbar-form-title"));
|
|
398
|
-
return titleEl.getText();
|
|
399
|
-
}
|
|
400
|
-
button(name) {
|
|
401
|
-
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
402
|
-
}
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
406
|
-
import { By as By15 } from "selenium-webdriver";
|
|
407
|
-
|
|
408
|
-
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
409
|
-
import { By as By7, Key } from "selenium-webdriver";
|
|
410
|
-
|
|
411
|
-
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
412
|
-
var InputClearStrategy = class {
|
|
413
|
-
async clear(editor) {
|
|
414
|
-
const inputEl = await editor.getInputElement();
|
|
415
|
-
await inputEl.clear();
|
|
416
|
-
}
|
|
417
|
-
};
|
|
418
|
-
|
|
419
|
-
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
420
|
-
var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
421
|
-
clearStrategy = new InputClearStrategy();
|
|
422
|
-
setClearStrategy(strategy) {
|
|
423
|
-
this.clearStrategy = strategy;
|
|
424
|
-
}
|
|
425
|
-
getInputCssSelector() {
|
|
426
|
-
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
427
|
-
}
|
|
428
|
-
async getInputElement() {
|
|
429
|
-
return this.driver.findElement(By7.css(this.getInputCssSelector()));
|
|
430
|
-
}
|
|
431
|
-
async getInputValue() {
|
|
432
|
-
const inputEl = await this.getInputElement();
|
|
433
|
-
return inputEl.getAttribute("value");
|
|
434
|
-
}
|
|
435
|
-
async setInputValue(value) {
|
|
436
|
-
const inputEl = await this.getInputElement();
|
|
437
|
-
await click(inputEl, this.driver);
|
|
438
|
-
await inputEl.sendKeys(value, Key.ENTER);
|
|
439
|
-
}
|
|
440
|
-
async clear() {
|
|
441
|
-
await this.clearStrategy.clear(this);
|
|
442
|
-
}
|
|
443
|
-
};
|
|
444
|
-
|
|
445
|
-
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
446
|
-
var TextEditor = class extends AbstractDXEditorWithInput {
|
|
447
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
448
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
449
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
450
|
-
}
|
|
451
|
-
getValue() {
|
|
452
|
-
return this.getInputValue();
|
|
453
|
-
}
|
|
454
|
-
setValue(value) {
|
|
455
|
-
return this.setInputValue(value);
|
|
456
|
-
}
|
|
457
|
-
};
|
|
458
|
-
|
|
459
|
-
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
460
|
-
var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
461
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
462
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
463
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
464
|
-
}
|
|
465
|
-
async getValue() {
|
|
466
|
-
const value = await super.getInputValue();
|
|
467
|
-
return value == "" ? null : Number.parseFloat(value);
|
|
468
|
-
}
|
|
469
|
-
setValue(value) {
|
|
470
|
-
return this.setInputValue(value);
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
|
|
474
|
-
// src/pageObjects/elements/Editors/types.ts
|
|
475
|
-
var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
476
|
-
ControlClass2["Text"] = "text-control";
|
|
477
|
-
ControlClass2["TextArea"] = "text-area-control";
|
|
478
|
-
ControlClass2["Number"] = "number-control";
|
|
479
|
-
ControlClass2["CheckBox"] = "check-box";
|
|
480
|
-
ControlClass2["Multiselect"] = "multi-select-control";
|
|
481
|
-
ControlClass2["Select"] = "select-control";
|
|
482
|
-
ControlClass2["Switch"] = "switch-control";
|
|
483
|
-
ControlClass2["Date"] = "date-control";
|
|
484
|
-
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
485
|
-
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
486
|
-
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
487
|
-
return ControlClass2;
|
|
488
|
-
})(ControlClass || {});
|
|
489
|
-
|
|
490
|
-
// src/pageObjects/AbstractFormElement.ts
|
|
491
|
-
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
492
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
493
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
494
|
-
}
|
|
495
|
-
};
|
|
496
|
-
|
|
497
|
-
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
498
|
-
var CheckBox = class extends AbstractElementWithParent {
|
|
499
|
-
async getValue() {
|
|
500
|
-
const result = await this.getAttribute("aria-checked");
|
|
501
|
-
if (result === "true")
|
|
502
|
-
return 1;
|
|
503
|
-
if (result === "false")
|
|
504
|
-
return 0;
|
|
505
|
-
return null;
|
|
506
|
-
}
|
|
507
|
-
async setValue(value) {
|
|
508
|
-
const inputEl = await this.getElement();
|
|
509
|
-
const currentValue = await this.getValue();
|
|
510
|
-
if (currentValue !== value) {
|
|
511
|
-
await click(inputEl, this.driver);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
517
|
-
import { By as By9, Key as Key2 } from "selenium-webdriver";
|
|
518
|
-
|
|
519
|
-
// src/utils/xpathHelper.ts
|
|
520
|
-
var XPathHelper = class {
|
|
521
|
-
static getClassAndValueXpath(cssClass, value) {
|
|
522
|
-
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
523
|
-
}
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
527
|
-
import { By as By8 } from "selenium-webdriver";
|
|
528
|
-
var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
529
|
-
var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
530
|
-
var ClearButtonStrategy = class {
|
|
531
|
-
editorContainerClass;
|
|
532
|
-
_driver;
|
|
533
|
-
constructor(editorContainerClass, driver) {
|
|
534
|
-
this.editorContainerClass = editorContainerClass;
|
|
535
|
-
this._driver = driver;
|
|
536
|
-
}
|
|
537
|
-
async isEmptyEditorField() {
|
|
538
|
-
const editorContainer = await this._driver.findElement(By8.css(this.editorContainerClass));
|
|
539
|
-
const classAttribute = await editorContainer.getAttribute("class");
|
|
540
|
-
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
541
|
-
}
|
|
542
|
-
async clear() {
|
|
543
|
-
if (await this.isEmptyEditorField()) {
|
|
544
|
-
throw new Error("This field is already empty");
|
|
545
|
-
}
|
|
546
|
-
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
547
|
-
const clearBtn = await this._driver.findElement(By8.css(clearBtnSelector));
|
|
548
|
-
await click(clearBtn, this._driver);
|
|
549
|
-
}
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
553
|
-
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
554
|
-
var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
555
|
-
var dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
556
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
557
|
-
let optElement = null;
|
|
558
|
-
const timeout = delay ? implicit : 200;
|
|
559
|
-
let err = null;
|
|
560
|
-
try {
|
|
561
|
-
await driver.manage().setTimeouts({ implicit: timeout });
|
|
562
|
-
optElement = await driver.findElement(By9.xpath(combinedValueXpath(optionValue)));
|
|
563
|
-
await click(optElement, driver);
|
|
564
|
-
} catch (e) {
|
|
565
|
-
err = new Error(`Item not found: "${optionValue}"`);
|
|
566
|
-
} finally {
|
|
567
|
-
await driver.manage().setTimeouts({ implicit });
|
|
568
|
-
}
|
|
569
|
-
if (err)
|
|
570
|
-
throw err;
|
|
571
|
-
};
|
|
572
|
-
var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
573
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
574
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
575
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
576
|
-
}
|
|
577
|
-
async setSelectInputValue(value) {
|
|
578
|
-
const inputEl = await this.getInputElement();
|
|
579
|
-
await click(inputEl, this.driver);
|
|
580
|
-
try {
|
|
581
|
-
await dropDownOptionClick(value, this.driver, false);
|
|
582
|
-
} catch {
|
|
583
|
-
await inputEl.sendKeys(value, Key2.ENTER);
|
|
584
|
-
await dropDownOptionClick(value, this.driver);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
async getValue() {
|
|
588
|
-
const value = await super.getInputValue();
|
|
589
|
-
return value == "" ? null : value;
|
|
590
|
-
}
|
|
591
|
-
setValue(value) {
|
|
592
|
-
return this.setSelectInputValue(value);
|
|
593
|
-
}
|
|
594
|
-
};
|
|
595
|
-
|
|
596
|
-
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
597
|
-
var SwitchEditor = class extends AbstractElementWithParent {
|
|
598
|
-
async getValue() {
|
|
599
|
-
const result = await this.getAttribute("aria-label");
|
|
600
|
-
if (result === "ON")
|
|
601
|
-
return 1;
|
|
602
|
-
if (result === "OFF")
|
|
603
|
-
return 0;
|
|
604
|
-
return null;
|
|
605
|
-
}
|
|
606
|
-
async setValue(value) {
|
|
607
|
-
if (value !== 0 && value !== 1) {
|
|
608
|
-
value = value ? 1 : 0;
|
|
609
|
-
}
|
|
610
|
-
const inputEl = await this.getElement();
|
|
611
|
-
const currentValue = await this.getValue();
|
|
612
|
-
if (currentValue === value) {
|
|
613
|
-
return;
|
|
614
|
-
}
|
|
615
|
-
await click(inputEl, this.driver);
|
|
616
|
-
await wait(async () => {
|
|
617
|
-
const updatedValue = await this.getValue();
|
|
618
|
-
return updatedValue !== currentValue;
|
|
619
|
-
}, this.driver);
|
|
620
|
-
}
|
|
621
|
-
};
|
|
622
|
-
|
|
623
|
-
// src/pageObjects/elements/Editors/TagBox.ts
|
|
624
|
-
import { By as By10 } from "selenium-webdriver";
|
|
625
|
-
var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
626
|
-
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
627
|
-
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
628
|
-
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
629
|
-
var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
630
|
-
var TagBox = class extends AbstractDXEditorWithInput {
|
|
631
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
632
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
633
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
634
|
-
}
|
|
635
|
-
async setTagBoxInputValue(values) {
|
|
636
|
-
const lastElement = values[values.length - 1];
|
|
637
|
-
const inputEl = await this.getInputElement();
|
|
638
|
-
await inputEl.click();
|
|
639
|
-
for (const value of values) {
|
|
640
|
-
await this.selectOption(inputEl, value, lastElement);
|
|
641
|
-
}
|
|
642
|
-
await this.confirmSelection();
|
|
643
|
-
}
|
|
644
|
-
async waitOptionSelection() {
|
|
645
|
-
const option = await this.driver.findElement(By10.css(TAG_BOX_LIST_ITEM_SELECTOR));
|
|
646
|
-
await wait(() => option.isDisplayed(), this.driver);
|
|
647
|
-
}
|
|
648
|
-
async selectOption(inputEl, value, lastElement) {
|
|
649
|
-
try {
|
|
650
|
-
await dropDownOptionClick(value, this.driver, false);
|
|
651
|
-
} catch {
|
|
652
|
-
await inputEl.sendKeys(value);
|
|
653
|
-
await dropDownOptionClick(value, this.driver);
|
|
654
|
-
}
|
|
655
|
-
await this.waitOptionSelection();
|
|
656
|
-
if (value !== lastElement) {
|
|
657
|
-
await inputEl.clear();
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
async confirmSelection() {
|
|
661
|
-
const btnOk = await this.driver.findElement(By10.css(BTN_OK_SELECTOR));
|
|
662
|
-
await click(btnOk, this.driver);
|
|
663
|
-
}
|
|
664
|
-
async getTagBoxInputValue() {
|
|
665
|
-
if (await this.isTagBoxEmpty()) {
|
|
666
|
-
return [];
|
|
667
|
-
}
|
|
668
|
-
const tags = await this.driver.findElements(
|
|
669
|
-
By10.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
|
|
670
|
-
);
|
|
671
|
-
const values = [];
|
|
672
|
-
for (const tag of tags) {
|
|
673
|
-
values.push(await tag.getAttribute("textContent"));
|
|
674
|
-
}
|
|
675
|
-
return values;
|
|
676
|
-
}
|
|
677
|
-
async isTagBoxEmpty() {
|
|
678
|
-
const classAttribute = await this.getClasses();
|
|
679
|
-
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
680
|
-
}
|
|
681
|
-
async getValue() {
|
|
682
|
-
const value = await this.getTagBoxInputValue();
|
|
683
|
-
return value.length ? value : null;
|
|
684
|
-
}
|
|
685
|
-
async setValue(values) {
|
|
686
|
-
if (!Array.isArray(values)) {
|
|
687
|
-
throw new Error("The provided value is not an array");
|
|
688
|
-
}
|
|
689
|
-
await this.setTagBoxInputValue(values);
|
|
690
|
-
}
|
|
691
|
-
async remove(itemText) {
|
|
692
|
-
const tagValues = await this.getValue();
|
|
693
|
-
const tagExists = tagValues.includes(itemText);
|
|
694
|
-
if (!tagExists) {
|
|
695
|
-
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
696
|
-
}
|
|
697
|
-
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
698
|
-
const clearBtn = await this.driver.findElement(
|
|
699
|
-
By10.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
700
|
-
);
|
|
701
|
-
await click(clearBtn, this.driver);
|
|
702
|
-
}
|
|
703
|
-
};
|
|
704
|
-
|
|
705
|
-
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
706
|
-
import { By as By11 } from "selenium-webdriver";
|
|
707
|
-
var ITEM_CLASS = "dx-buttongroup-item";
|
|
708
|
-
var SELECTED_CLASS = "dx-state-selected";
|
|
709
|
-
var ButtonGroup = class extends AbstractElementWithParent {
|
|
710
|
-
getItems() {
|
|
711
|
-
return this.driver.findElements(By11.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
712
|
-
}
|
|
713
|
-
getDataValue(el) {
|
|
714
|
-
return el.getAttribute("data-value");
|
|
715
|
-
}
|
|
716
|
-
async getValue() {
|
|
717
|
-
const selectedEl = await this.driver.findElement(By11.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
718
|
-
return this.getDataValue(selectedEl);
|
|
719
|
-
}
|
|
720
|
-
async setValue(value) {
|
|
721
|
-
const items = await this.getItems();
|
|
722
|
-
let buttonEl = void 0;
|
|
723
|
-
for (const item of items) {
|
|
724
|
-
const text = await this.getDataValue(item);
|
|
725
|
-
if (text == value) {
|
|
726
|
-
buttonEl = item;
|
|
727
|
-
break;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
if (!buttonEl)
|
|
731
|
-
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
732
|
-
await click(buttonEl, this.driver);
|
|
733
|
-
}
|
|
734
|
-
};
|
|
735
|
-
|
|
736
|
-
// src/pageObjects/elements/Editors/BooleanSelector.ts
|
|
737
|
-
var BooleanSelector = class extends ButtonGroup {
|
|
738
|
-
// @ts-ignore
|
|
739
|
-
async getValue() {
|
|
740
|
-
const value = await super.getValue();
|
|
741
|
-
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
742
|
-
}
|
|
743
|
-
// @ts-ignore
|
|
744
|
-
async setValue(value) {
|
|
745
|
-
const val = value == null ? "null" : value ? "1" : "0";
|
|
746
|
-
await super.setValue(val);
|
|
747
|
-
}
|
|
748
|
-
};
|
|
749
|
-
|
|
750
|
-
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
751
|
-
import { By as By13 } from "selenium-webdriver";
|
|
752
|
-
|
|
753
|
-
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
754
|
-
import { By as By12, Key as Key3 } from "selenium-webdriver";
|
|
755
|
-
|
|
756
|
-
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
757
|
-
var formatDMYDate = (date) => {
|
|
758
|
-
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
759
|
-
return `${day}${month}${year}`;
|
|
760
|
-
};
|
|
761
|
-
|
|
762
|
-
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
763
|
-
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
764
|
-
var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
765
|
-
var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
766
|
-
var BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
767
|
-
var BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
768
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
769
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
770
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
771
|
-
}
|
|
772
|
-
async setDateValue(value) {
|
|
773
|
-
const actions = this.driver.actions({ async: true });
|
|
774
|
-
const dateField = await this.driver.findElement(By12.css(`${this.getFullCssSelector()}`));
|
|
775
|
-
const dateFieldDataTestID = await this.getDataTestId();
|
|
776
|
-
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
777
|
-
const dateInputEl = await this.getInputElement();
|
|
778
|
-
await dateInputEl.clear();
|
|
779
|
-
if (Array.isArray(value)) {
|
|
780
|
-
const formattedDates = value.map(formatDMYDate);
|
|
781
|
-
const button = await dateField.findElement(By12.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
782
|
-
await button.click();
|
|
783
|
-
const calendarPopoverElement = await this.driver.findElement(By12.css(calendarPopoverSelector));
|
|
784
|
-
const dateFromInput = await calendarPopoverElement.findElement(By12.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
785
|
-
const dateToInput = await calendarPopoverElement.findElement(By12.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
786
|
-
await dateFromInput.click();
|
|
787
|
-
await dateFromInput.sendKeys(formattedDates[0]);
|
|
788
|
-
await dateToInput.click();
|
|
789
|
-
await actions.move({ origin: dateInputEl }).sendKeys(Key3.HOME).perform();
|
|
790
|
-
await dateToInput.sendKeys(formattedDates[1]);
|
|
791
|
-
await actions.move({ origin: dateInputEl }).sendKeys(Key3.ENTER).perform();
|
|
792
|
-
const btnOk = await this.driver.findElement(By12.css(`.${BTN_SAVE_SELECTOR}`));
|
|
793
|
-
await btnOk.click();
|
|
794
|
-
} else {
|
|
795
|
-
const formattedDate = formatDMYDate(value);
|
|
796
|
-
await click(dateInputEl, this.driver);
|
|
797
|
-
await actions.move({ origin: dateInputEl }).sendKeys(Key3.HOME).perform();
|
|
798
|
-
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, Key3.ENTER).perform();
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
};
|
|
802
|
-
|
|
803
|
-
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
804
|
-
var SingleDateEditor = class extends BaseDateEditor {
|
|
805
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
806
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
807
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
808
|
-
}
|
|
809
|
-
async getDateElement() {
|
|
810
|
-
return this.driver.findElement(By13.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
811
|
-
}
|
|
812
|
-
async getDateValue() {
|
|
813
|
-
const inputEl = await this.getDateElement();
|
|
814
|
-
return inputEl.getAttribute("value");
|
|
815
|
-
}
|
|
816
|
-
async getValue() {
|
|
817
|
-
const value = await this.getDateValue();
|
|
818
|
-
return value == "" ? null : new Date(value);
|
|
819
|
-
}
|
|
820
|
-
setValue(value) {
|
|
821
|
-
if (typeof value === "object") {
|
|
822
|
-
return this.setDateValue(value);
|
|
823
|
-
}
|
|
824
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
825
|
-
}
|
|
826
|
-
};
|
|
827
|
-
|
|
828
|
-
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
829
|
-
import { By as By14 } from "selenium-webdriver";
|
|
830
|
-
var DateRangeEditor = class extends BaseDateEditor {
|
|
831
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
832
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
833
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
834
|
-
}
|
|
835
|
-
async getDateElement() {
|
|
836
|
-
return this.driver.findElement(By14.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
837
|
-
}
|
|
838
|
-
async getDateValue() {
|
|
839
|
-
const inputEl = await this.getDateElement();
|
|
840
|
-
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
841
|
-
const dateToStr = await inputEl.getAttribute("dateto");
|
|
842
|
-
const dateFrom = new Date(dateFromStr);
|
|
843
|
-
const dateTo = new Date(dateToStr);
|
|
844
|
-
return [dateFrom, dateTo];
|
|
845
|
-
}
|
|
846
|
-
async getValue() {
|
|
847
|
-
const values = await this.getDateValue();
|
|
848
|
-
return !values.length ? null : values;
|
|
849
|
-
}
|
|
850
|
-
setValue(value) {
|
|
851
|
-
if (typeof value === "object") {
|
|
852
|
-
return this.setDateValue(value);
|
|
853
|
-
}
|
|
854
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
855
|
-
}
|
|
856
|
-
};
|
|
857
|
-
|
|
858
|
-
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
859
|
-
var DateEditor = class extends AbstractDXEditorWithInput {
|
|
860
|
-
editorInstance = null;
|
|
861
|
-
initPromise;
|
|
862
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
863
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
864
|
-
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
865
|
-
}
|
|
866
|
-
async init(parentCssSelector, elementCssSelector, driver) {
|
|
867
|
-
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
868
|
-
}
|
|
869
|
-
async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
|
|
870
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
871
|
-
const classString = await elementInstance.getClasses();
|
|
872
|
-
switch (true) {
|
|
873
|
-
case classString.includes("date-control" /* Date */):
|
|
874
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
875
|
-
break;
|
|
876
|
-
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
877
|
-
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
878
|
-
break;
|
|
879
|
-
default:
|
|
880
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
async ensureInitialized() {
|
|
884
|
-
if (!this.editorInstance) {
|
|
885
|
-
await this.initPromise;
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
async setValue(value) {
|
|
889
|
-
await this.ensureInitialized();
|
|
890
|
-
if (this.editorInstance) {
|
|
891
|
-
await this.editorInstance.setValue(value);
|
|
892
|
-
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
893
|
-
}
|
|
894
|
-
throw new Error("Editor instance is not initialized.");
|
|
895
|
-
}
|
|
896
|
-
async getValue() {
|
|
897
|
-
await this.ensureInitialized();
|
|
898
|
-
if (this.editorInstance) {
|
|
899
|
-
return this.editorInstance.getValue();
|
|
900
|
-
}
|
|
901
|
-
throw new Error("Editor instance is not initialized.");
|
|
902
|
-
}
|
|
903
|
-
};
|
|
904
|
-
|
|
905
|
-
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
906
|
-
var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
907
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
908
|
-
const classSting = await elementInstance.getClasses();
|
|
909
|
-
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
910
|
-
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
911
|
-
if (classSting.includes("number-control" /* Number */))
|
|
912
|
-
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
913
|
-
if (classSting.includes("check-box" /* CheckBox */))
|
|
914
|
-
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
915
|
-
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
916
|
-
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
917
|
-
if (classSting.includes("select-control" /* Select */))
|
|
918
|
-
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
919
|
-
if (classSting.includes("switch-control" /* Switch */))
|
|
920
|
-
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
921
|
-
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
922
|
-
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
923
|
-
}
|
|
924
|
-
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
925
|
-
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
926
|
-
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
927
|
-
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
928
|
-
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
929
|
-
};
|
|
930
|
-
|
|
931
|
-
// src/pageObjects/elements/AbstractEditor.ts
|
|
932
|
-
var AbstractEditor = class extends AbstractElementWithParent {
|
|
933
|
-
editor;
|
|
934
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
935
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
936
|
-
}
|
|
937
|
-
async initEditor() {
|
|
938
|
-
if (!this.editor) {
|
|
939
|
-
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
/**
|
|
943
|
-
* Возвращает значение в поле
|
|
944
|
-
* @example
|
|
945
|
-
* expect(await formEdit.field('NumberFld').getValue()).toBe(10);
|
|
946
|
-
* expect(await formEdit.field('TextFld').getValue()).toBe('TestValue');
|
|
947
|
-
*/
|
|
948
|
-
async getValue() {
|
|
949
|
-
await this.initEditor();
|
|
950
|
-
return this.editor.getValue();
|
|
951
|
-
}
|
|
952
|
-
/**
|
|
953
|
-
* Устанавливает значение в поле
|
|
954
|
-
* @example
|
|
955
|
-
* await formEdit.field('NumberFld').setValue(123);
|
|
956
|
-
* await formEdit.field('TextFld').setValue('TestValue');
|
|
957
|
-
*/
|
|
958
|
-
async setValue(value) {
|
|
959
|
-
await this.initEditor();
|
|
960
|
-
return this.editor.setValue(value);
|
|
961
|
-
}
|
|
962
|
-
/**
|
|
963
|
-
* Очищает значение в поле
|
|
964
|
-
* @example
|
|
965
|
-
* await formEdit.field('NumberFld').clear();
|
|
966
|
-
*/
|
|
967
|
-
async clear() {
|
|
968
|
-
await this.initEditor();
|
|
969
|
-
if (!this.editor.clear) {
|
|
970
|
-
throw new Error("The clear method is not available for this field type.");
|
|
971
|
-
}
|
|
972
|
-
return this.editor.clear();
|
|
973
|
-
}
|
|
974
|
-
/**
|
|
975
|
-
* Удаляет тег по переданному тексту
|
|
976
|
-
* @example
|
|
977
|
-
* await formEdit.field('TagBox').remove('test');
|
|
978
|
-
*/
|
|
979
|
-
async remove(itemText) {
|
|
980
|
-
await this.initEditor();
|
|
981
|
-
if (!this.editor.remove) {
|
|
982
|
-
throw new Error("This method is only available for the TagBox field.");
|
|
983
|
-
}
|
|
984
|
-
return this.editor.remove(itemText);
|
|
985
|
-
}
|
|
986
|
-
/**
|
|
987
|
-
* Возвращает значение true|false в зависимости readOnly поле или нет
|
|
988
|
-
* @example
|
|
989
|
-
* expect(await formEdit.field('NumberFld').isReadonly()).toBe(true);
|
|
990
|
-
* expect(await formEdit.field('TextFld').isReadonly()).toBe(false);
|
|
991
|
-
*/
|
|
992
|
-
async isReadonly() {
|
|
993
|
-
await this.initEditor();
|
|
994
|
-
return this.editor.isReadonly();
|
|
995
|
-
}
|
|
996
|
-
};
|
|
997
|
-
|
|
998
|
-
// src/pageObjects/elements/FormField.ts
|
|
999
|
-
var FormField = class extends AbstractEditor {
|
|
1000
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
1001
|
-
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
1002
|
-
}
|
|
1003
|
-
};
|
|
1004
|
-
|
|
1005
|
-
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
1006
|
-
var AbstractGroup = class extends AbstractElementWithParent {
|
|
1007
|
-
async isDisplayed() {
|
|
1008
|
-
const groupElement = await this.getElement();
|
|
1009
|
-
return await groupElement.isDisplayed();
|
|
1010
|
-
}
|
|
1011
|
-
};
|
|
1012
|
-
|
|
1013
|
-
// src/pageObjects/elements/Groups/Panel.ts
|
|
1014
|
-
var Panel = class extends AbstractGroup {
|
|
1015
|
-
};
|
|
1016
|
-
|
|
1017
|
-
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
1018
|
-
var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1019
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1020
|
-
const classSting = await elementInstance.getClasses();
|
|
1021
|
-
if (classSting.includes("panel-group"))
|
|
1022
|
-
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1023
|
-
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1024
|
-
};
|
|
1025
|
-
|
|
1026
|
-
// src/pageObjects/elements/FormGroup.ts
|
|
1027
|
-
var FormGroup = class extends AbstractElementWithParent {
|
|
1028
|
-
editor;
|
|
1029
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
1030
|
-
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
1031
|
-
}
|
|
1032
|
-
async initEditor() {
|
|
1033
|
-
if (!this.editor) {
|
|
1034
|
-
this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1035
|
-
}
|
|
1036
|
-
}
|
|
1037
|
-
/**
|
|
1038
|
-
* Возвращает булевое значение доступна ли группа
|
|
1039
|
-
* @example
|
|
1040
|
-
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
1041
|
-
*/
|
|
1042
|
-
async isDisplayed() {
|
|
1043
|
-
try {
|
|
1044
|
-
await this.initEditor();
|
|
1045
|
-
return this.editor.isDisplayed();
|
|
1046
|
-
} catch {
|
|
1047
|
-
return false;
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
};
|
|
1051
|
-
|
|
1052
|
-
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
1053
|
-
var FormEdit = class extends AbstractForm {
|
|
1054
|
-
saveButtonBy = By15.id("button-save");
|
|
1055
|
-
closeButtonBy = By15.id("button-cancel");
|
|
119
|
+
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
120
|
+
import { By as By3 } from "selenium-webdriver";
|
|
121
|
+
var ReportForm = class extends FormEdit {
|
|
1056
122
|
constructor(driver) {
|
|
1057
123
|
super(driver);
|
|
1058
|
-
this.popupContainerCssSelector = `.popup .form-
|
|
1059
|
-
|
|
1060
|
-
/**
|
|
1061
|
-
* Находит поле формы редактирования по имени
|
|
1062
|
-
* @example
|
|
1063
|
-
* const formEdit = new MyForm();
|
|
1064
|
-
* //...
|
|
1065
|
-
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
1066
|
-
*/
|
|
1067
|
-
field(name) {
|
|
1068
|
-
return new FormField(this.containerCssSelector, this.formName, name, this.driver);
|
|
1069
|
-
}
|
|
1070
|
-
/**
|
|
1071
|
-
* Проверяет не отключена ли кнопка Сохранить
|
|
1072
|
-
* @example
|
|
1073
|
-
* const formEdit = new MyForm();
|
|
1074
|
-
* //...
|
|
1075
|
-
* await formEdit.isSaveButtonDisabled();
|
|
1076
|
-
*/
|
|
1077
|
-
async isSaveButtonDisabled() {
|
|
1078
|
-
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
1079
|
-
const result = await saveButton.getAttribute("aria-disabled");
|
|
1080
|
-
return result === "true";
|
|
1081
|
-
}
|
|
1082
|
-
/**
|
|
1083
|
-
* Находит группу формы редактирования по имени
|
|
1084
|
-
* @example
|
|
1085
|
-
* const formEdit = new MyForm();
|
|
1086
|
-
* //...
|
|
1087
|
-
* expect(await formEdit.group('Name');
|
|
1088
|
-
*/
|
|
1089
|
-
group(name) {
|
|
1090
|
-
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1091
|
-
}
|
|
1092
|
-
/**
|
|
1093
|
-
* Нажатие на кнопку Сохранить
|
|
1094
|
-
* @example
|
|
1095
|
-
* const formEdit = new MyForm();
|
|
1096
|
-
* //...
|
|
1097
|
-
* await formEdit.saveButtonClick();
|
|
1098
|
-
*/
|
|
1099
|
-
async saveButtonClick() {
|
|
1100
|
-
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
1101
|
-
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
1102
|
-
await click(saveButton, this.driver);
|
|
1103
|
-
}
|
|
1104
|
-
/**
|
|
1105
|
-
* Нажатие на кнопку Закрить
|
|
1106
|
-
* @example
|
|
1107
|
-
* const formEdit = new MyForm();
|
|
1108
|
-
* //...
|
|
1109
|
-
* await formEdit.closeButtonClick();
|
|
1110
|
-
*/
|
|
1111
|
-
async closeButtonClick() {
|
|
1112
|
-
const closeButton = await this.driver.findElement(this.closeButtonBy);
|
|
1113
|
-
await click(closeButton, this.driver);
|
|
1114
|
-
}
|
|
1115
|
-
};
|
|
1116
|
-
|
|
1117
|
-
// src/pageObjects/elements/Table/Table.ts
|
|
1118
|
-
import { By as By20 } from "selenium-webdriver";
|
|
1119
|
-
|
|
1120
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1121
|
-
import { By as By18 } from "selenium-webdriver";
|
|
1122
|
-
|
|
1123
|
-
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1124
|
-
import { By as By17 } from "selenium-webdriver";
|
|
1125
|
-
|
|
1126
|
-
// src/pageObjects/elements/Table/utils.ts
|
|
1127
|
-
import { By as By16 } from "selenium-webdriver";
|
|
1128
|
-
function getCssRowByIndexSelector(index) {
|
|
1129
|
-
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
1130
|
-
}
|
|
1131
|
-
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1132
|
-
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1133
|
-
var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
1134
|
-
function getCssCellByIndexSelector(index) {
|
|
1135
|
-
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1136
|
-
}
|
|
1137
|
-
var transformInputIndex = (index) => index + 1;
|
|
1138
|
-
var transformOutputIndex = (index) => +index - 1;
|
|
1139
|
-
|
|
1140
|
-
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1141
|
-
var Cell = class extends AbstractElementWithParent {
|
|
1142
|
-
_index;
|
|
1143
|
-
getCellIndex;
|
|
1144
|
-
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
1145
|
-
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
1146
|
-
this.getCellIndex = getCellIndex;
|
|
1147
|
-
this._index = index;
|
|
1148
|
-
}
|
|
1149
|
-
set index(index) {
|
|
1150
|
-
this._index = index;
|
|
1151
|
-
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1152
|
-
}
|
|
1153
|
-
async getBooleanValue(cellEl) {
|
|
1154
|
-
const booleanEl = await cellEl.findElement(By17.className("boolean-widget"));
|
|
1155
|
-
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
1156
|
-
}
|
|
1157
|
-
async getTagsValue(cellEl) {
|
|
1158
|
-
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
1159
|
-
const tags = await cellEl.findElements(By17.css(tagsCssSelector));
|
|
1160
|
-
const values = [];
|
|
1161
|
-
for (const tag of tags) {
|
|
1162
|
-
values.push(await tag.getAttribute("textContent"));
|
|
1163
|
-
}
|
|
1164
|
-
return values;
|
|
1165
|
-
}
|
|
1166
|
-
async getElement() {
|
|
1167
|
-
if (this._index == null) {
|
|
1168
|
-
this.index = await this.getCellIndex();
|
|
1169
|
-
}
|
|
1170
|
-
return super.getElement();
|
|
1171
|
-
}
|
|
1172
|
-
async getValue() {
|
|
1173
|
-
const cellEl = await this.getElement();
|
|
1174
|
-
const cellElClass = await cellEl.getAttribute("class");
|
|
1175
|
-
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
1176
|
-
return this.getBooleanValue(cellEl);
|
|
1177
|
-
if (cellElClass.includes("tags-column" /* Tags */))
|
|
1178
|
-
return this.getTagsValue(cellEl);
|
|
1179
|
-
return cellEl.getText();
|
|
1180
|
-
}
|
|
1181
|
-
getIndex() {
|
|
1182
|
-
return this._index;
|
|
1183
|
-
}
|
|
1184
|
-
};
|
|
1185
|
-
|
|
1186
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1187
|
-
var DX_SELECTION_CLASS = "dx-selection";
|
|
1188
|
-
var DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
1189
|
-
var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
1190
|
-
var Row = class extends AbstractElementWithParent {
|
|
1191
|
-
index;
|
|
1192
|
-
getColumnBy;
|
|
1193
|
-
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
1194
|
-
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
1195
|
-
this.index = index;
|
|
1196
|
-
this.getColumnBy = getColumnBy;
|
|
1197
|
-
}
|
|
1198
|
-
_getCell({ index, name, title }) {
|
|
1199
|
-
return new Cell(
|
|
1200
|
-
this.getFullCssSelector(),
|
|
1201
|
-
() => {
|
|
1202
|
-
return this.getColumnBy({ title, name }).getIndex();
|
|
1203
|
-
},
|
|
1204
|
-
index,
|
|
1205
|
-
this.driver
|
|
1206
|
-
);
|
|
1207
|
-
}
|
|
1208
|
-
getCellByIndex(index) {
|
|
1209
|
-
return this._getCell({ index });
|
|
1210
|
-
}
|
|
1211
|
-
getCell(name) {
|
|
1212
|
-
return this._getCell({ name });
|
|
1213
|
-
}
|
|
1214
|
-
getCellByTitle(title) {
|
|
1215
|
-
return this._getCell({ title });
|
|
1216
|
-
}
|
|
1217
|
-
async select() {
|
|
1218
|
-
const rowEl = await this.getElement();
|
|
1219
|
-
await click(rowEl, this.driver);
|
|
1220
|
-
await wait(
|
|
1221
|
-
async () => {
|
|
1222
|
-
const classes = await this.getClasses();
|
|
1223
|
-
return classes.includes(DX_SELECTION_CLASS);
|
|
1224
|
-
},
|
|
1225
|
-
this.driver,
|
|
1226
|
-
"Cannot select row"
|
|
1227
|
-
);
|
|
1228
|
-
}
|
|
1229
|
-
async isSelected() {
|
|
1230
|
-
const result = await this.getAttribute("aria-selected");
|
|
1231
|
-
return result === "true";
|
|
1232
|
-
}
|
|
1233
|
-
getIndex() {
|
|
1234
|
-
return this.index;
|
|
1235
|
-
}
|
|
1236
|
-
async getCells() {
|
|
1237
|
-
const cells = await this.driver.findElements(By18.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
1238
|
-
const result = [];
|
|
1239
|
-
cells.forEach((_, index) => {
|
|
1240
|
-
const newCell = this.getCellByIndex(index);
|
|
1241
|
-
result.push(newCell);
|
|
1242
|
-
});
|
|
1243
|
-
return result;
|
|
1244
|
-
}
|
|
1245
|
-
async clickInlineButton(buttonClass) {
|
|
1246
|
-
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
1247
|
-
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1248
|
-
this.index
|
|
1249
|
-
)}"] .${buttonClass}`;
|
|
1250
|
-
const button = await this.driver.findElement(
|
|
1251
|
-
By18.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
1252
|
-
);
|
|
1253
|
-
return click(button, this.driver);
|
|
1254
|
-
}
|
|
1255
|
-
async checkEditingMode(isEditing, msg) {
|
|
1256
|
-
await wait(
|
|
1257
|
-
async () => {
|
|
1258
|
-
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1259
|
-
},
|
|
1260
|
-
this.driver,
|
|
1261
|
-
msg
|
|
1262
|
-
);
|
|
1263
|
-
}
|
|
1264
|
-
async edit() {
|
|
1265
|
-
await this.clickInlineButton("edit");
|
|
1266
|
-
await this.checkEditingMode(true, "Row did not switch to edit mode");
|
|
1267
|
-
}
|
|
1268
|
-
async save() {
|
|
1269
|
-
await this.clickInlineButton("save");
|
|
1270
|
-
await this.checkEditingMode(false, "Row did not saved");
|
|
1271
|
-
}
|
|
1272
|
-
async cancel() {
|
|
1273
|
-
await this.clickInlineButton("cancel");
|
|
1274
|
-
await this.checkEditingMode(false, "Row did not switch to normal mode");
|
|
1275
|
-
}
|
|
1276
|
-
};
|
|
1277
|
-
|
|
1278
|
-
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1279
|
-
import { By as By19 } from "selenium-webdriver";
|
|
1280
|
-
var Column = class extends AbstractElementWithParent {
|
|
1281
|
-
_index;
|
|
1282
|
-
_caption;
|
|
1283
|
-
_name;
|
|
1284
|
-
headerCssSelector;
|
|
1285
|
-
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
1286
|
-
super(parentCssSelector, "", driver);
|
|
1287
|
-
this._name = name;
|
|
1288
|
-
this.index = index;
|
|
1289
|
-
this._caption = caption;
|
|
1290
|
-
this.headerCssSelector = headerCssSelector;
|
|
1291
|
-
}
|
|
1292
|
-
set index(index) {
|
|
1293
|
-
this._index = index;
|
|
1294
|
-
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
1295
|
-
}
|
|
1296
|
-
get index() {
|
|
1297
|
-
return this._index;
|
|
1298
|
-
}
|
|
1299
|
-
async getElement() {
|
|
1300
|
-
await this.getIndex();
|
|
1301
|
-
return super.getElement();
|
|
1302
|
-
}
|
|
1303
|
-
async getColumnHeaderIndexBy(cssSelector) {
|
|
1304
|
-
const column = await this.driver.findElement(
|
|
1305
|
-
By19.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`)
|
|
1306
|
-
);
|
|
1307
|
-
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1308
|
-
}
|
|
1309
|
-
async getIndexByCaption() {
|
|
1310
|
-
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
1311
|
-
}
|
|
1312
|
-
async getIndexByName() {
|
|
1313
|
-
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
1314
|
-
}
|
|
1315
|
-
async caption() {
|
|
1316
|
-
const el = await this.getElement();
|
|
1317
|
-
return el.getText();
|
|
1318
|
-
}
|
|
1319
|
-
async getIndex() {
|
|
1320
|
-
if (this.index != null) {
|
|
1321
|
-
return this.index;
|
|
1322
|
-
}
|
|
1323
|
-
if (this._caption != null) {
|
|
1324
|
-
this.index = await this.getIndexByCaption();
|
|
1325
|
-
return this.index;
|
|
1326
|
-
}
|
|
1327
|
-
if (this._name != null) {
|
|
1328
|
-
this.index = await this.getIndexByName();
|
|
1329
|
-
return this.index;
|
|
1330
|
-
}
|
|
1331
|
-
throw new Error("Cant get the index in the column");
|
|
1332
|
-
}
|
|
1333
|
-
};
|
|
1334
|
-
|
|
1335
|
-
// src/pageObjects/elements/Table/Table.ts
|
|
1336
|
-
var Table = class extends AbstractElementWithParent {
|
|
1337
|
-
formName;
|
|
1338
|
-
headerCssSelector;
|
|
1339
|
-
constructor(parentCssSelector, headerCssSelector, formName, driver) {
|
|
1340
|
-
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
1341
|
-
this.formName = formName;
|
|
1342
|
-
this.headerCssSelector = headerCssSelector;
|
|
1343
|
-
}
|
|
1344
|
-
getColumnBy = (args) => {
|
|
1345
|
-
if (args.title) {
|
|
1346
|
-
return this.getColumnByTitle(args.title);
|
|
1347
|
-
}
|
|
1348
|
-
return this.getColumnByName(args.name);
|
|
1349
|
-
};
|
|
1350
|
-
getRowByIndex(index) {
|
|
1351
|
-
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1352
|
-
}
|
|
1353
|
-
getColumnByIndex(index) {
|
|
1354
|
-
return new Column({
|
|
1355
|
-
parentCssSelector: this.getFullCssSelector(),
|
|
1356
|
-
driver: this.driver,
|
|
1357
|
-
index
|
|
1358
|
-
});
|
|
1359
|
-
}
|
|
1360
|
-
getColumnByTitle = (title) => {
|
|
1361
|
-
return new Column({
|
|
1362
|
-
parentCssSelector: this.getFullCssSelector(),
|
|
1363
|
-
headerCssSelector: this.headerCssSelector,
|
|
1364
|
-
caption: title,
|
|
1365
|
-
driver: this.driver
|
|
1366
|
-
});
|
|
1367
|
-
};
|
|
1368
|
-
getColumnByName = (name) => {
|
|
1369
|
-
return new Column({
|
|
1370
|
-
parentCssSelector: this.getFullCssSelector(),
|
|
1371
|
-
headerCssSelector: this.headerCssSelector,
|
|
1372
|
-
name,
|
|
1373
|
-
driver: this.driver
|
|
1374
|
-
});
|
|
1375
|
-
};
|
|
1376
|
-
selectRowByIndex(index) {
|
|
1377
|
-
return this.getRowByIndex(index).select();
|
|
1378
|
-
}
|
|
1379
|
-
async getRows() {
|
|
1380
|
-
const rows = await this.driver.findElements(By20.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1381
|
-
const result = [];
|
|
1382
|
-
rows.forEach((_, index) => {
|
|
1383
|
-
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1384
|
-
result.push(newRow);
|
|
1385
|
-
});
|
|
1386
|
-
return result;
|
|
1387
|
-
}
|
|
1388
|
-
async getColumns() {
|
|
1389
|
-
const columns = await this.driver.findElements(
|
|
1390
|
-
By20.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
|
|
1391
|
-
);
|
|
1392
|
-
const result = [];
|
|
1393
|
-
columns.forEach((_, index) => {
|
|
1394
|
-
const newCol = new Column({
|
|
1395
|
-
parentCssSelector: this.getFullCssSelector(),
|
|
1396
|
-
index,
|
|
1397
|
-
driver: this.driver
|
|
1398
|
-
});
|
|
1399
|
-
result.push(newCol);
|
|
1400
|
-
});
|
|
1401
|
-
return result;
|
|
1402
|
-
}
|
|
1403
|
-
element() {
|
|
1404
|
-
return this.getElement();
|
|
124
|
+
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
125
|
+
this.saveButtonBy = By3.id("button-apply");
|
|
1405
126
|
}
|
|
1406
127
|
/**
|
|
1407
|
-
*
|
|
128
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
1408
129
|
* @example
|
|
1409
|
-
* const
|
|
130
|
+
* const formReport = new MyForm();
|
|
1410
131
|
* //...
|
|
1411
|
-
* expect(await
|
|
1412
|
-
*/
|
|
1413
|
-
field(name) {
|
|
1414
|
-
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1415
|
-
}
|
|
1416
|
-
};
|
|
1417
|
-
|
|
1418
|
-
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
1419
|
-
var ToolbarGroupButton = class extends AbstractButton {
|
|
1420
|
-
name;
|
|
1421
|
-
constructor(parentCssSelector, name, driver) {
|
|
1422
|
-
super(parentCssSelector, ``, driver);
|
|
1423
|
-
this.name = name;
|
|
1424
|
-
}
|
|
1425
|
-
buttonNotDisplayedError() {
|
|
1426
|
-
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1427
|
-
}
|
|
1428
|
-
};
|
|
1429
|
-
|
|
1430
|
-
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
1431
|
-
var TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1432
|
-
var ToolbarButton = class extends AbstractButton {
|
|
1433
|
-
name;
|
|
1434
|
-
constructor(parentCssSelector, name, driver) {
|
|
1435
|
-
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1436
|
-
this.name = name;
|
|
1437
|
-
}
|
|
1438
|
-
buttonNotDisplayedError() {
|
|
1439
|
-
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1440
|
-
}
|
|
1441
|
-
};
|
|
1442
|
-
|
|
1443
|
-
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1444
|
-
import { By as By21 } from "selenium-webdriver";
|
|
1445
|
-
|
|
1446
|
-
// src/utils/typesUtil.ts
|
|
1447
|
-
var types = {
|
|
1448
|
-
"[object Array]": "array",
|
|
1449
|
-
"[object Date]": "date",
|
|
1450
|
-
"[object Object]": "object",
|
|
1451
|
-
"[object String]": "string",
|
|
1452
|
-
"[object Null]": "null"
|
|
1453
|
-
};
|
|
1454
|
-
var type = function(object) {
|
|
1455
|
-
const typeOfObject = Object.prototype.toString.call(object);
|
|
1456
|
-
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
1457
|
-
};
|
|
1458
|
-
var isArray = function(value) {
|
|
1459
|
-
return type(value) === "array";
|
|
1460
|
-
};
|
|
1461
|
-
var isString = function(object) {
|
|
1462
|
-
return typeof object === "string";
|
|
1463
|
-
};
|
|
1464
|
-
|
|
1465
|
-
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1466
|
-
var SPINDOWN_CLASS = ".dx-icon-spindown";
|
|
1467
|
-
var buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
|
|
1468
|
-
var getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
1469
|
-
var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-menu-item-text") and contains(text(), "${text}")]`;
|
|
1470
|
-
var ToolbarMenu = class extends AbstractElementWithParent {
|
|
1471
|
-
_formName;
|
|
1472
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
1473
|
-
super(parentCssSelector, getFullCssSelector(formName, name), driver);
|
|
1474
|
-
this._formName = formName;
|
|
1475
|
-
}
|
|
1476
|
-
async toggle() {
|
|
1477
|
-
const dropdown = await this.getElement();
|
|
1478
|
-
await click(dropdown, this.driver);
|
|
1479
|
-
}
|
|
1480
|
-
getCssSelectorToButton(name) {
|
|
1481
|
-
return byTestId(`ftb-${this._formName}-${name}`);
|
|
1482
|
-
}
|
|
1483
|
-
buttonNotDisplayedError(name) {
|
|
1484
|
-
return `Toolbar menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1485
|
-
}
|
|
1486
|
-
async goToButton(name, selector) {
|
|
1487
|
-
const toolbarMenuItem = this.driver.findElement(selector);
|
|
1488
|
-
await waitElementIsClickable({
|
|
1489
|
-
element: toolbarMenuItem,
|
|
1490
|
-
errorMessage: this.buttonNotDisplayedError(name),
|
|
1491
|
-
driver: this.driver
|
|
1492
|
-
});
|
|
1493
|
-
await click(toolbarMenuItem, this.driver);
|
|
1494
|
-
}
|
|
1495
|
-
async clickButton(name) {
|
|
1496
|
-
await this.toggle();
|
|
1497
|
-
if (isString(name)) {
|
|
1498
|
-
const selector = this.getCssSelectorToButton(name);
|
|
1499
|
-
await this.goToButton(name, selector);
|
|
1500
|
-
}
|
|
1501
|
-
if (isArray(name)) {
|
|
1502
|
-
for (let n of name) {
|
|
1503
|
-
const selector = this.getCssSelectorToButton(n);
|
|
1504
|
-
await this.goToButton(n, selector);
|
|
1505
|
-
}
|
|
1506
|
-
}
|
|
1507
|
-
}
|
|
1508
|
-
async clickButtonByTitle(title) {
|
|
1509
|
-
await this.toggle();
|
|
1510
|
-
if (isString(title)) {
|
|
1511
|
-
const selector = By21.xpath(buttonByTextXpath(title));
|
|
1512
|
-
await this.goToButton(title, selector);
|
|
1513
|
-
}
|
|
1514
|
-
if (isArray(title)) {
|
|
1515
|
-
for (let t of title) {
|
|
1516
|
-
const selector = By21.xpath(buttonByTextXpath(t));
|
|
1517
|
-
await this.goToButton(t, selector);
|
|
1518
|
-
}
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
};
|
|
1522
|
-
|
|
1523
|
-
// src/pageObjects/elements/TableToolbar/ToolbarItem.ts
|
|
1524
|
-
var GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
1525
|
-
var toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
1526
|
-
var ToolbarItem = class extends AbstractElementWithParent {
|
|
1527
|
-
_button;
|
|
1528
|
-
_formName;
|
|
1529
|
-
_itemName;
|
|
1530
|
-
constructor(parentCssSelector, formName, itemName, driver) {
|
|
1531
|
-
super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
|
|
1532
|
-
this._itemName = itemName;
|
|
1533
|
-
this._formName = formName;
|
|
1534
|
-
}
|
|
1535
|
-
async init() {
|
|
1536
|
-
if (this._button)
|
|
1537
|
-
return this._button;
|
|
1538
|
-
const classNames = await this.getClasses();
|
|
1539
|
-
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
1540
|
-
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
|
|
1541
|
-
return;
|
|
1542
|
-
}
|
|
1543
|
-
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
|
|
1544
|
-
}
|
|
1545
|
-
async click() {
|
|
1546
|
-
await this.init();
|
|
1547
|
-
await this._button.click();
|
|
1548
|
-
}
|
|
1549
|
-
async isDisabled() {
|
|
1550
|
-
await this.init();
|
|
1551
|
-
return await this._button.isDisabled();
|
|
1552
|
-
}
|
|
1553
|
-
get menu() {
|
|
1554
|
-
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
|
|
1555
|
-
}
|
|
1556
|
-
};
|
|
1557
|
-
|
|
1558
|
-
// src/pageObjects/elements/TableToolbar/FormToolbar.ts
|
|
1559
|
-
var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1560
|
-
var FormToolbar = class extends AbstractElementWithParent {
|
|
1561
|
-
formName;
|
|
1562
|
-
constructor(parentCssSelector, formName, driver) {
|
|
1563
|
-
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1564
|
-
this.formName = formName;
|
|
1565
|
-
}
|
|
1566
|
-
button(name) {
|
|
1567
|
-
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1568
|
-
}
|
|
1569
|
-
};
|
|
1570
|
-
|
|
1571
|
-
// src/pageObjects/elements/Filters/FormFilterField.ts
|
|
1572
|
-
var FormFilterField = class extends AbstractEditor {
|
|
1573
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
1574
|
-
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
|
|
1575
|
-
}
|
|
1576
|
-
/**
|
|
1577
|
-
* Возвращает значение в поле
|
|
1578
|
-
* @example
|
|
1579
|
-
* expect(await form.formFilter('NumberFld').getValue()).toBe(10);
|
|
1580
|
-
* expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
|
|
1581
|
-
*/
|
|
1582
|
-
async getValue() {
|
|
1583
|
-
return super.getValue();
|
|
1584
|
-
}
|
|
1585
|
-
/**
|
|
1586
|
-
* Устанавливает значение в поле
|
|
1587
|
-
* @example
|
|
1588
|
-
* await form.formFilter('NumberFld').setValue(123);
|
|
1589
|
-
* await form.formFilter('TextFld').setValue('TestValue');
|
|
1590
|
-
*/
|
|
1591
|
-
async setValue(value) {
|
|
1592
|
-
return super.setValue(value);
|
|
1593
|
-
}
|
|
1594
|
-
/**
|
|
1595
|
-
* Очищает значение в поле
|
|
1596
|
-
* @example
|
|
1597
|
-
* await form.formFilter('NumberFld').clear();
|
|
1598
|
-
*/
|
|
1599
|
-
async clear() {
|
|
1600
|
-
return super.clear();
|
|
1601
|
-
}
|
|
1602
|
-
/**
|
|
1603
|
-
* Удаляет тег по переданному тексту
|
|
1604
|
-
* @example
|
|
1605
|
-
* await form.formFilter('TagBox').remove('test');
|
|
1606
|
-
*/
|
|
1607
|
-
async remove(itemText) {
|
|
1608
|
-
return super.remove(itemText);
|
|
1609
|
-
}
|
|
1610
|
-
};
|
|
1611
|
-
|
|
1612
|
-
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
1613
|
-
import { By as By22 } from "selenium-webdriver";
|
|
1614
|
-
|
|
1615
|
-
// src/pageObjects/elements/Filters/PanelFilterField.ts
|
|
1616
|
-
var PanelFilterField = class extends AbstractEditor {
|
|
1617
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
1618
|
-
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
|
|
1619
|
-
}
|
|
1620
|
-
/**
|
|
1621
|
-
* Возвращает значение в поле
|
|
1622
|
-
* @example
|
|
1623
|
-
* expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
|
|
1624
|
-
* expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
|
|
1625
|
-
*/
|
|
1626
|
-
async getValue() {
|
|
1627
|
-
return super.getValue();
|
|
1628
|
-
}
|
|
1629
|
-
/**
|
|
1630
|
-
* Устанавливает значение в поле
|
|
1631
|
-
* @example
|
|
1632
|
-
* await form.filterPanel.filterField('NumberFld').setValue(123);
|
|
1633
|
-
* await form.filterPanel.filterField('TextFld').setValue('TestValue');
|
|
1634
|
-
*/
|
|
1635
|
-
async setValue(value) {
|
|
1636
|
-
return super.setValue(value);
|
|
1637
|
-
}
|
|
1638
|
-
/**
|
|
1639
|
-
* Очищает значение в поле
|
|
1640
|
-
* @example
|
|
1641
|
-
* await form.filterPanel.filterField('NumberFld').clear();
|
|
1642
|
-
*/
|
|
1643
|
-
async clear() {
|
|
1644
|
-
return super.clear();
|
|
1645
|
-
}
|
|
1646
|
-
/**
|
|
1647
|
-
* Удаляет тег по переданному тексту
|
|
1648
|
-
* @example
|
|
1649
|
-
* await form.filterPanel.filterField('TagBox').remove('test');
|
|
1650
|
-
*/
|
|
1651
|
-
async remove(itemText) {
|
|
1652
|
-
return super.remove(itemText);
|
|
1653
|
-
}
|
|
1654
|
-
};
|
|
1655
|
-
|
|
1656
|
-
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
1657
|
-
var drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
|
|
1658
|
-
var FILTER_PANEL_SELECTOR = ".filter-panel";
|
|
1659
|
-
var CLOSE_SELECTOR = ".button-close";
|
|
1660
|
-
var FilterPanel = class extends AbstractElement {
|
|
1661
|
-
_formName;
|
|
1662
|
-
get filterPanelSelector() {
|
|
1663
|
-
return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
|
|
1664
|
-
}
|
|
1665
|
-
async filterPanelButtons() {
|
|
1666
|
-
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
1667
|
-
const el = await this.getElement();
|
|
1668
|
-
return el.findElements(By22.css(selector));
|
|
1669
|
-
}
|
|
1670
|
-
constructor(formName, driver) {
|
|
1671
|
-
super(driver, drawerSelector(formName));
|
|
1672
|
-
this._formName = formName;
|
|
1673
|
-
}
|
|
1674
|
-
/**
|
|
1675
|
-
* Возвращает фильтр на панели фильтрации
|
|
1676
|
-
* @returns {PanelFilterField}
|
|
1677
|
-
* @example
|
|
1678
|
-
* await form.filterPanel.filterField('NumberFld');
|
|
132
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
1679
133
|
*/
|
|
1680
134
|
filterField(name) {
|
|
1681
|
-
return
|
|
1682
|
-
}
|
|
1683
|
-
async apply() {
|
|
1684
|
-
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
1685
|
-
await click(btn, this.driver);
|
|
1686
|
-
}
|
|
1687
|
-
async findButtonByTitle(title) {
|
|
1688
|
-
const buttons = await this.filterPanelButtons();
|
|
1689
|
-
for (const btn of buttons) {
|
|
1690
|
-
if (await btn.getText() === title) {
|
|
1691
|
-
return btn;
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1694
|
-
}
|
|
1695
|
-
async clearAll() {
|
|
1696
|
-
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
1697
|
-
await click(btn, this.driver);
|
|
1698
|
-
await this.driver.sleep(300);
|
|
1699
|
-
}
|
|
1700
|
-
async close() {
|
|
1701
|
-
const btn = await this.driver.findElement(By22.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
1702
|
-
await click(btn, this.driver);
|
|
1703
|
-
}
|
|
1704
|
-
};
|
|
1705
|
-
|
|
1706
|
-
// src/pageObjects/elements/Forms/ListForm.ts
|
|
1707
|
-
var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1708
|
-
var ListForm = class extends AbstractForm {
|
|
1709
|
-
headerCssSelector;
|
|
1710
|
-
constructor(driver) {
|
|
1711
|
-
super(driver);
|
|
1712
|
-
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
1713
|
-
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
1714
|
-
}
|
|
1715
|
-
/**
|
|
1716
|
-
* Находит таблицу
|
|
1717
|
-
* @example
|
|
1718
|
-
* const listForm = new MyForm();
|
|
1719
|
-
* //...
|
|
1720
|
-
* expect(listForm.table());
|
|
1721
|
-
*/
|
|
1722
|
-
table() {
|
|
1723
|
-
return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
|
|
1724
|
-
}
|
|
1725
|
-
/**
|
|
1726
|
-
* Находит группу на лист форме по имени
|
|
1727
|
-
* @example
|
|
1728
|
-
* const formEdit = new MyForm();
|
|
1729
|
-
* //...
|
|
1730
|
-
* expect(await formEdit.group('Name');
|
|
1731
|
-
*/
|
|
1732
|
-
group(name) {
|
|
1733
|
-
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1734
|
-
}
|
|
1735
|
-
/**
|
|
1736
|
-
* Находит таблицу
|
|
1737
|
-
* @example
|
|
1738
|
-
* const listForm = new MyForm();
|
|
1739
|
-
* //...
|
|
1740
|
-
* expect(listForm.toolbarButton());
|
|
1741
|
-
*/
|
|
1742
|
-
toolbarButton(name) {
|
|
1743
|
-
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1744
|
-
return toolbar.button(name);
|
|
1745
|
-
}
|
|
1746
|
-
/**
|
|
1747
|
-
* Фильтр который расположен на форме
|
|
1748
|
-
* @example
|
|
1749
|
-
* const listForm = new MyForm();
|
|
1750
|
-
* //...
|
|
1751
|
-
* expect(listForm.formFilter());
|
|
1752
|
-
*/
|
|
1753
|
-
formFilter(name) {
|
|
1754
|
-
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
1755
|
-
}
|
|
1756
|
-
/**
|
|
1757
|
-
* Модель панели фильтрации
|
|
1758
|
-
* @returns {FilterPanel}
|
|
1759
|
-
* @example
|
|
1760
|
-
* const listForm = new MyForm();
|
|
1761
|
-
* //...
|
|
1762
|
-
* expect(listForm.filterPanel());
|
|
1763
|
-
*/
|
|
1764
|
-
get filterPanel() {
|
|
1765
|
-
return new FilterPanel(this.formName, this.driver);
|
|
1766
|
-
}
|
|
1767
|
-
};
|
|
1768
|
-
|
|
1769
|
-
// src/pageObjects/elements/Forms/TreeView.ts
|
|
1770
|
-
var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
|
|
1771
|
-
var TreeView = class extends ListForm {
|
|
1772
|
-
constructor(driver) {
|
|
1773
|
-
super(driver);
|
|
1774
|
-
this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
|
|
1775
|
-
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
135
|
+
return super.field(name);
|
|
1776
136
|
}
|
|
1777
137
|
};
|
|
1778
138
|
|
|
1779
139
|
// src/pageObjects/elements/Dialog.ts
|
|
1780
|
-
import { By as
|
|
140
|
+
import { By as By4 } from "selenium-webdriver";
|
|
1781
141
|
var DIALOG_CLASS = ".d5-dialog";
|
|
1782
142
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
1783
143
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
1784
144
|
var DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
|
|
1785
|
-
var
|
|
145
|
+
var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
|
|
1786
146
|
var DialogButton = class extends AbstractButton {
|
|
1787
147
|
text;
|
|
1788
148
|
constructor(parentCssSelector, text, driver) {
|
|
@@ -1791,7 +151,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
1791
151
|
}
|
|
1792
152
|
async getElement() {
|
|
1793
153
|
const panel = await super.getElement();
|
|
1794
|
-
return panel.findElement(
|
|
154
|
+
return panel.findElement(By4.xpath(buttonByTextXpath(this.text)));
|
|
1795
155
|
}
|
|
1796
156
|
buttonNotDisplayedError() {
|
|
1797
157
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -1811,11 +171,11 @@ var Dialog = class extends AbstractElement {
|
|
|
1811
171
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
1812
172
|
}
|
|
1813
173
|
async title() {
|
|
1814
|
-
const el = await this.driver.findElement(
|
|
174
|
+
const el = await this.driver.findElement(By4.css(this.titleSelector));
|
|
1815
175
|
return await el.getText();
|
|
1816
176
|
}
|
|
1817
177
|
async text() {
|
|
1818
|
-
const el = await this.driver.findElement(
|
|
178
|
+
const el = await this.driver.findElement(By4.css(this.textSelector));
|
|
1819
179
|
return await el.getText();
|
|
1820
180
|
}
|
|
1821
181
|
button(text) {
|
|
@@ -1834,6 +194,7 @@ export {
|
|
|
1834
194
|
LoginPage,
|
|
1835
195
|
NumberEditor,
|
|
1836
196
|
PanelFilterField,
|
|
197
|
+
ReportForm,
|
|
1837
198
|
SubsystemsPanel,
|
|
1838
199
|
TextEditor,
|
|
1839
200
|
TreeView,
|