d5-testing-library 1.6.0 → 1.7.0-alpha.1
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-XOCYARDX.mjs +7 -0
- package/dist/ListForm-R7WQIGBI.mjs +7 -0
- package/dist/TreeView-STUAAR65.mjs +8 -0
- package/dist/{chunk-PNSQQKEY.mjs → chunk-CKCSBNKD.mjs} +1 -1
- package/dist/{chunk-4VLJL7OZ.mjs → chunk-JITTN2NY.mjs} +35 -13
- package/dist/{chunk-CFJ5JWM7.mjs → chunk-Q67RHZDP.mjs} +1 -1
- package/dist/{chunk-3EQV252X.mjs → chunk-WUPIBFH7.mjs} +127 -4
- package/dist/cjs/d5-testing-library.cjs +1365 -1093
- package/dist/d5-testing-library.d.ts +158 -56
- package/dist/d5-testing-library.legacy-esm.js +118 -10
- package/dist/d5-testing-library.mjs +118 -10
- package/package.json +4 -2
- package/dist/FormEdit-Z2QDWFFG.mjs +0 -7
- package/dist/ListForm-JAFTOUFG.mjs +0 -7
- package/dist/TreeView-YUECOEFI.mjs +0 -8
|
@@ -275,126 +275,120 @@ var init_AbstractElementWithParent = __esm({
|
|
|
275
275
|
}
|
|
276
276
|
});
|
|
277
277
|
|
|
278
|
-
// src/
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
function createFieldTestId(formName, itemName) {
|
|
283
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
284
|
-
}
|
|
285
|
-
function createGroupTestId(formName, itemName) {
|
|
286
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
287
|
-
}
|
|
288
|
-
function createFilterTestId(formName, itemName, layout) {
|
|
289
|
-
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
290
|
-
}
|
|
291
|
-
function createDocFilterTestId(formName, itemName) {
|
|
292
|
-
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
293
|
-
}
|
|
294
|
-
function createLayoutFilterTestId(formName, itemName) {
|
|
295
|
-
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
296
|
-
}
|
|
297
|
-
function createTableId(formName) {
|
|
298
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
299
|
-
}
|
|
300
|
-
function createFormButtonTestId(formName, itemName) {
|
|
301
|
-
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
302
|
-
}
|
|
303
|
-
var init_createDataTestId = __esm({
|
|
304
|
-
"src/utils/createDataTestId.ts"() {
|
|
278
|
+
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
279
|
+
var InputClearStrategy;
|
|
280
|
+
var init_InputClearStrategy = __esm({
|
|
281
|
+
"src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
|
|
305
282
|
"use strict";
|
|
283
|
+
InputClearStrategy = class {
|
|
284
|
+
async clear(editor) {
|
|
285
|
+
const inputEl = await editor.getInputElement();
|
|
286
|
+
await inputEl.clear();
|
|
287
|
+
}
|
|
288
|
+
};
|
|
306
289
|
}
|
|
307
290
|
});
|
|
308
291
|
|
|
309
|
-
// src/
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
errorMessage,
|
|
314
|
-
driver
|
|
315
|
-
}) {
|
|
316
|
-
driver = driver ?? config().driver;
|
|
317
|
-
await wait(async () => {
|
|
318
|
-
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
319
|
-
return await element.isDisplayed() && !isDisabled;
|
|
320
|
-
}, driver, errorMessage, timeout ?? config().timeout);
|
|
321
|
-
}
|
|
322
|
-
var init_waitElementIsClickable = __esm({
|
|
323
|
-
"src/utils/waitElementIsClickable.ts"() {
|
|
292
|
+
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
293
|
+
var import_selenium_webdriver7, AbstractDXEditorWithInput;
|
|
294
|
+
var init_AbstractEditor = __esm({
|
|
295
|
+
"src/pageObjects/elements/Editors/AbstractEditor.ts"() {
|
|
324
296
|
"use strict";
|
|
325
|
-
|
|
326
|
-
|
|
297
|
+
import_selenium_webdriver7 = require("selenium-webdriver");
|
|
298
|
+
init_actions();
|
|
299
|
+
init_InputClearStrategy();
|
|
300
|
+
init_AbstractElementWithParent();
|
|
301
|
+
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
302
|
+
clearStrategy = new InputClearStrategy();
|
|
303
|
+
setClearStrategy(strategy) {
|
|
304
|
+
this.clearStrategy = strategy;
|
|
305
|
+
}
|
|
306
|
+
getInputCssSelector() {
|
|
307
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
308
|
+
}
|
|
309
|
+
async getInputElement() {
|
|
310
|
+
return this.driver.findElement(import_selenium_webdriver7.By.css(this.getInputCssSelector()));
|
|
311
|
+
}
|
|
312
|
+
async getInputValue() {
|
|
313
|
+
const inputEl = await this.getInputElement();
|
|
314
|
+
return inputEl.getAttribute("value");
|
|
315
|
+
}
|
|
316
|
+
async setInputValue(value) {
|
|
317
|
+
const inputEl = await this.getInputElement();
|
|
318
|
+
await click(inputEl, this.driver);
|
|
319
|
+
await inputEl.sendKeys(value, import_selenium_webdriver7.Key.ENTER);
|
|
320
|
+
}
|
|
321
|
+
async clear() {
|
|
322
|
+
await this.clearStrategy.clear(this);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
327
325
|
}
|
|
328
326
|
});
|
|
329
327
|
|
|
330
|
-
// src/pageObjects/elements/
|
|
331
|
-
var
|
|
332
|
-
var
|
|
333
|
-
"src/pageObjects/elements/
|
|
328
|
+
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
329
|
+
var TextEditor;
|
|
330
|
+
var init_TextEditor = __esm({
|
|
331
|
+
"src/pageObjects/elements/Editors/TextEditor.ts"() {
|
|
334
332
|
"use strict";
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
AbstractButton = class extends AbstractElementWithParent {
|
|
333
|
+
init_AbstractEditor();
|
|
334
|
+
init_InputClearStrategy();
|
|
335
|
+
TextEditor = class extends AbstractDXEditorWithInput {
|
|
339
336
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
340
337
|
super(parentCssSelector, elementCssSelector, driver);
|
|
338
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
341
339
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
await waitElementIsClickable({
|
|
345
|
-
element: button,
|
|
346
|
-
errorMessage: this.buttonNotDisplayedError(),
|
|
347
|
-
driver: this.driver
|
|
348
|
-
});
|
|
349
|
-
await click(button, this.driver);
|
|
340
|
+
getValue() {
|
|
341
|
+
return this.getInputValue();
|
|
350
342
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
343
|
+
setValue(value) {
|
|
344
|
+
return this.setInputValue(value);
|
|
354
345
|
}
|
|
355
346
|
};
|
|
356
347
|
}
|
|
357
348
|
});
|
|
358
349
|
|
|
359
|
-
// src/pageObjects/elements/
|
|
360
|
-
var
|
|
361
|
-
var
|
|
362
|
-
"src/pageObjects/elements/
|
|
350
|
+
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
351
|
+
var NumberEditor;
|
|
352
|
+
var init_NumberEditor = __esm({
|
|
353
|
+
"src/pageObjects/elements/Editors/NumberEditor.ts"() {
|
|
363
354
|
"use strict";
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
355
|
+
init_AbstractEditor();
|
|
356
|
+
init_InputClearStrategy();
|
|
357
|
+
NumberEditor = class extends AbstractDXEditorWithInput {
|
|
358
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
359
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
360
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
361
|
+
}
|
|
362
|
+
async getValue() {
|
|
363
|
+
const value = await super.getInputValue();
|
|
364
|
+
return value == "" ? null : Number.parseFloat(value);
|
|
365
|
+
}
|
|
366
|
+
setValue(value) {
|
|
367
|
+
return this.setInputValue(value);
|
|
375
368
|
}
|
|
376
369
|
};
|
|
377
370
|
}
|
|
378
371
|
});
|
|
379
372
|
|
|
380
|
-
// src/pageObjects/elements/
|
|
381
|
-
var
|
|
382
|
-
var
|
|
383
|
-
"src/pageObjects/elements/
|
|
373
|
+
// src/pageObjects/elements/Editors/types.ts
|
|
374
|
+
var ControlClass;
|
|
375
|
+
var init_types = __esm({
|
|
376
|
+
"src/pageObjects/elements/Editors/types.ts"() {
|
|
384
377
|
"use strict";
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
378
|
+
ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
379
|
+
ControlClass2["Text"] = "text-control";
|
|
380
|
+
ControlClass2["TextArea"] = "text-area-control";
|
|
381
|
+
ControlClass2["Number"] = "number-control";
|
|
382
|
+
ControlClass2["CheckBox"] = "check-box";
|
|
383
|
+
ControlClass2["Multiselect"] = "multi-select-control";
|
|
384
|
+
ControlClass2["Select"] = "select-control";
|
|
385
|
+
ControlClass2["Switch"] = "switch-control";
|
|
386
|
+
ControlClass2["Date"] = "date-control";
|
|
387
|
+
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
388
|
+
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
389
|
+
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
390
|
+
return ControlClass2;
|
|
391
|
+
})(ControlClass || {});
|
|
398
392
|
}
|
|
399
393
|
});
|
|
400
394
|
|
|
@@ -412,1234 +406,1262 @@ var init_AbstractFormElement = __esm({
|
|
|
412
406
|
}
|
|
413
407
|
});
|
|
414
408
|
|
|
415
|
-
// src/pageObjects/elements/
|
|
416
|
-
var
|
|
417
|
-
var
|
|
418
|
-
"src/pageObjects/elements/
|
|
409
|
+
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
410
|
+
var CheckBox;
|
|
411
|
+
var init_CheckBox = __esm({
|
|
412
|
+
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
419
413
|
"use strict";
|
|
414
|
+
init_actions();
|
|
420
415
|
init_AbstractElementWithParent();
|
|
421
|
-
|
|
422
|
-
async
|
|
423
|
-
const
|
|
424
|
-
|
|
416
|
+
CheckBox = class extends AbstractElementWithParent {
|
|
417
|
+
async getValue() {
|
|
418
|
+
const result = await this.getAttribute("aria-checked");
|
|
419
|
+
if (result === "true")
|
|
420
|
+
return 1;
|
|
421
|
+
if (result === "false")
|
|
422
|
+
return 0;
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
425
|
+
async setValue(value) {
|
|
426
|
+
const inputEl = await this.getElement();
|
|
427
|
+
const currentValue = await this.getValue();
|
|
428
|
+
if (currentValue !== value) {
|
|
429
|
+
await click(inputEl, this.driver);
|
|
430
|
+
}
|
|
425
431
|
}
|
|
426
432
|
};
|
|
427
433
|
}
|
|
428
434
|
});
|
|
429
435
|
|
|
430
|
-
// src/
|
|
431
|
-
var
|
|
432
|
-
var
|
|
433
|
-
"src/
|
|
436
|
+
// src/utils/xpathHelper.ts
|
|
437
|
+
var XPathHelper;
|
|
438
|
+
var init_xpathHelper = __esm({
|
|
439
|
+
"src/utils/xpathHelper.ts"() {
|
|
434
440
|
"use strict";
|
|
435
|
-
|
|
436
|
-
|
|
441
|
+
XPathHelper = class {
|
|
442
|
+
static getClassAndValueXpath(cssClass, value) {
|
|
443
|
+
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
444
|
+
}
|
|
437
445
|
};
|
|
438
446
|
}
|
|
439
447
|
});
|
|
440
448
|
|
|
441
|
-
// src/pageObjects/elements/
|
|
442
|
-
var
|
|
443
|
-
var
|
|
444
|
-
"src/pageObjects/elements/
|
|
449
|
+
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
450
|
+
var import_selenium_webdriver8, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
|
|
451
|
+
var init_ClearButtonStrategy = __esm({
|
|
452
|
+
"src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
|
|
445
453
|
"use strict";
|
|
446
|
-
|
|
454
|
+
import_selenium_webdriver8 = require("selenium-webdriver");
|
|
447
455
|
init_actions();
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
456
|
+
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
457
|
+
DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
458
|
+
ClearButtonStrategy = class {
|
|
459
|
+
editorContainerClass;
|
|
460
|
+
_driver;
|
|
461
|
+
constructor(editorContainerClass, driver) {
|
|
462
|
+
this.editorContainerClass = editorContainerClass;
|
|
463
|
+
this._driver = driver;
|
|
451
464
|
}
|
|
452
|
-
async
|
|
453
|
-
|
|
465
|
+
async isEmptyEditorField() {
|
|
466
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver8.By.css(this.editorContainerClass));
|
|
467
|
+
const classAttribute = await editorContainer.getAttribute("class");
|
|
468
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
454
469
|
}
|
|
455
|
-
async
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
async getTitle() {
|
|
464
|
-
return "";
|
|
470
|
+
async clear() {
|
|
471
|
+
if (await this.isEmptyEditorField()) {
|
|
472
|
+
throw new Error("This field is already empty");
|
|
473
|
+
}
|
|
474
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
475
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
|
|
476
|
+
await click(clearBtn, this._driver);
|
|
465
477
|
}
|
|
466
478
|
};
|
|
467
479
|
}
|
|
468
480
|
});
|
|
469
481
|
|
|
470
|
-
// src/pageObjects/elements/
|
|
471
|
-
var
|
|
472
|
-
var
|
|
473
|
-
"src/pageObjects/elements/
|
|
482
|
+
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
483
|
+
var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
484
|
+
var init_SelectBoxEditor = __esm({
|
|
485
|
+
"src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
|
|
474
486
|
"use strict";
|
|
475
|
-
|
|
476
|
-
|
|
487
|
+
init_AbstractEditor();
|
|
488
|
+
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
489
|
+
init_xpathHelper();
|
|
477
490
|
init_actions();
|
|
478
|
-
|
|
479
|
-
|
|
491
|
+
init_ClearButtonStrategy();
|
|
492
|
+
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
493
|
+
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
494
|
+
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
495
|
+
const { implicit } = await driver.manage().getTimeouts();
|
|
496
|
+
let optElement = null;
|
|
497
|
+
const timeout = delay ? implicit : 200;
|
|
498
|
+
let err = null;
|
|
499
|
+
try {
|
|
500
|
+
await driver.manage().setTimeouts({ implicit: timeout });
|
|
501
|
+
optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
|
|
502
|
+
await click(optElement, driver);
|
|
503
|
+
} catch (e) {
|
|
504
|
+
err = new Error(`Item not found: "${optionValue}"`);
|
|
505
|
+
} finally {
|
|
506
|
+
await driver.manage().setTimeouts({ implicit });
|
|
507
|
+
}
|
|
508
|
+
if (err)
|
|
509
|
+
throw err;
|
|
510
|
+
};
|
|
511
|
+
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
480
512
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
481
513
|
super(parentCssSelector, elementCssSelector, driver);
|
|
514
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
482
515
|
}
|
|
483
|
-
async
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
}
|
|
492
|
-
async click() {
|
|
493
|
-
await click(await this.getElement(), this.driver);
|
|
494
|
-
}
|
|
495
|
-
async isExpanded() {
|
|
496
|
-
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
497
|
-
return dataOpened === "true";
|
|
498
|
-
}
|
|
499
|
-
async isCollapsed() {
|
|
500
|
-
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
501
|
-
return dataOpened === "false" || !dataOpened;
|
|
502
|
-
}
|
|
503
|
-
async expand() {
|
|
504
|
-
if (!await this.isExpanded()) {
|
|
505
|
-
await this.clickAccordionItemTitle();
|
|
516
|
+
async setSelectInputValue(value) {
|
|
517
|
+
const inputEl = await this.getInputElement();
|
|
518
|
+
await click(inputEl, this.driver);
|
|
519
|
+
try {
|
|
520
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
521
|
+
} catch {
|
|
522
|
+
await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
|
|
523
|
+
await dropDownOptionClick(value, this.driver);
|
|
506
524
|
}
|
|
507
525
|
}
|
|
508
|
-
async
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
526
|
+
async getValue() {
|
|
527
|
+
const value = await super.getInputValue();
|
|
528
|
+
return value == "" ? null : value;
|
|
529
|
+
}
|
|
530
|
+
setValue(value) {
|
|
531
|
+
return this.setSelectInputValue(value);
|
|
512
532
|
}
|
|
513
533
|
};
|
|
514
534
|
}
|
|
515
535
|
});
|
|
516
536
|
|
|
517
|
-
// src/pageObjects/elements/
|
|
518
|
-
var
|
|
519
|
-
var
|
|
520
|
-
"src/pageObjects/elements/
|
|
537
|
+
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
538
|
+
var SwitchEditor;
|
|
539
|
+
var init_SwitchEditor = __esm({
|
|
540
|
+
"src/pageObjects/elements/Editors/SwitchEditor.ts"() {
|
|
521
541
|
"use strict";
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
542
|
+
init_actions();
|
|
543
|
+
init_AbstractElementWithParent();
|
|
544
|
+
init_wait();
|
|
545
|
+
SwitchEditor = class extends AbstractElementWithParent {
|
|
546
|
+
async getValue() {
|
|
547
|
+
const result = await this.getAttribute("aria-label");
|
|
548
|
+
if (result === "ON")
|
|
549
|
+
return 1;
|
|
550
|
+
if (result === "OFF")
|
|
551
|
+
return 0;
|
|
552
|
+
return null;
|
|
527
553
|
}
|
|
528
|
-
|
|
529
|
-
|
|
554
|
+
async setValue(value) {
|
|
555
|
+
if (value !== 0 && value !== 1) {
|
|
556
|
+
value = value ? 1 : 0;
|
|
557
|
+
}
|
|
558
|
+
const inputEl = await this.getElement();
|
|
559
|
+
const currentValue = await this.getValue();
|
|
560
|
+
if (currentValue === value) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
await click(inputEl, this.driver);
|
|
564
|
+
await wait(async () => {
|
|
565
|
+
const updatedValue = await this.getValue();
|
|
566
|
+
return updatedValue !== currentValue;
|
|
567
|
+
}, this.driver);
|
|
530
568
|
}
|
|
531
569
|
};
|
|
532
570
|
}
|
|
533
571
|
});
|
|
534
572
|
|
|
535
|
-
// src/pageObjects/elements/
|
|
536
|
-
var
|
|
537
|
-
var
|
|
538
|
-
"src/pageObjects/elements/
|
|
539
|
-
"use strict";
|
|
540
|
-
init_AbstractFormElement();
|
|
541
|
-
init_Panel();
|
|
542
|
-
init_TabPanel();
|
|
543
|
-
init_Accordion();
|
|
544
|
-
init_AccordionItem();
|
|
545
|
-
groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
546
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
547
|
-
const classSting = await elementInstance.getClasses();
|
|
548
|
-
if (classSting.includes("tab-panel-group"))
|
|
549
|
-
return new TabPanel(parentCssSelector, elementCssSelector, driver);
|
|
550
|
-
if (classSting.includes("tab-panel-item"))
|
|
551
|
-
return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
|
|
552
|
-
if (classSting.includes("panel-group"))
|
|
553
|
-
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
554
|
-
if (classSting.includes("accordion-group"))
|
|
555
|
-
return new Accordion(parentCssSelector, elementCssSelector, driver);
|
|
556
|
-
if (classSting.includes("d5-accordion-item"))
|
|
557
|
-
return new AccordionItem(parentCssSelector, elementCssSelector, driver);
|
|
558
|
-
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
559
|
-
};
|
|
560
|
-
}
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
// src/pageObjects/elements/FormGroup.ts
|
|
564
|
-
var FormGroup;
|
|
565
|
-
var init_FormGroup = __esm({
|
|
566
|
-
"src/pageObjects/elements/FormGroup.ts"() {
|
|
573
|
+
// src/pageObjects/elements/Editors/TagBox.ts
|
|
574
|
+
var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
|
|
575
|
+
var init_TagBox = __esm({
|
|
576
|
+
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
567
577
|
"use strict";
|
|
568
|
-
|
|
578
|
+
init_AbstractEditor();
|
|
579
|
+
import_selenium_webdriver10 = require("selenium-webdriver");
|
|
580
|
+
init_actions();
|
|
569
581
|
init_locators();
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
582
|
+
init_SelectBoxEditor();
|
|
583
|
+
init_ClearButtonStrategy();
|
|
584
|
+
init_fixElementStaleError();
|
|
585
|
+
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
586
|
+
DX_TAG_CONTAINER = "dx-tag-container";
|
|
587
|
+
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
588
|
+
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
589
|
+
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
590
|
+
TagBox = class extends AbstractDXEditorWithInput {
|
|
591
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
592
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
593
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
577
594
|
}
|
|
578
|
-
async
|
|
579
|
-
|
|
580
|
-
|
|
595
|
+
async setTagBoxInputValue(values) {
|
|
596
|
+
const lastElement = values[values.length - 1];
|
|
597
|
+
const inputEl = await this.getInputElement();
|
|
598
|
+
await inputEl.click();
|
|
599
|
+
for (const value of values) {
|
|
600
|
+
await this.selectOption(inputEl, value, lastElement);
|
|
581
601
|
}
|
|
602
|
+
await this.confirmSelection();
|
|
582
603
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
*/
|
|
588
|
-
async isDisplayed() {
|
|
604
|
+
async waitOptionSelection() {
|
|
605
|
+
await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
606
|
+
}
|
|
607
|
+
async selectOption(inputEl, value, lastElement) {
|
|
589
608
|
try {
|
|
590
|
-
await this.
|
|
591
|
-
return this.groupInstance.isDisplayed();
|
|
609
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
592
610
|
} catch {
|
|
593
|
-
|
|
611
|
+
await inputEl.sendKeys(value);
|
|
612
|
+
await dropDownOptionClick(value, this.driver);
|
|
613
|
+
}
|
|
614
|
+
await this.waitOptionSelection();
|
|
615
|
+
if (value !== lastElement) {
|
|
616
|
+
await inputEl.clear();
|
|
594
617
|
}
|
|
595
618
|
}
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
* @example
|
|
600
|
-
* expect(await tableList.group('TabPanel').itemClick('Tab');
|
|
601
|
-
* expect(await tableList.group('Accordion').itemClick('AccordionItem');
|
|
602
|
-
*/
|
|
603
|
-
async itemClick(name) {
|
|
604
|
-
await this.initInstance();
|
|
605
|
-
const item = this.groupInstance.item?.(name);
|
|
606
|
-
await item?.click();
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Метод работает если группа - это элемент аккордеона или вкладка таб панели
|
|
610
|
-
* @example
|
|
611
|
-
* expect(await tableList.group('Tab').click();
|
|
612
|
-
* expect(await tableList.group('AccordionItem').click();
|
|
613
|
-
*/
|
|
614
|
-
async click() {
|
|
615
|
-
await this.initInstance();
|
|
616
|
-
await this.groupInstance.click?.();
|
|
619
|
+
async confirmSelection() {
|
|
620
|
+
const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
|
|
621
|
+
await click(btnOk, this.driver);
|
|
617
622
|
}
|
|
618
|
-
async
|
|
619
|
-
await this.
|
|
620
|
-
|
|
621
|
-
await this.groupInstance.collapse();
|
|
623
|
+
async getTagBoxInputValue() {
|
|
624
|
+
if (await this.isTagBoxEmpty()) {
|
|
625
|
+
return [];
|
|
622
626
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
627
|
+
const tags = await this.driver.findElements(
|
|
628
|
+
import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
|
|
629
|
+
);
|
|
630
|
+
const values = [];
|
|
631
|
+
for (const tag of tags) {
|
|
632
|
+
values.push(await tag.getAttribute("textContent"));
|
|
628
633
|
}
|
|
634
|
+
return values;
|
|
629
635
|
}
|
|
630
|
-
async
|
|
631
|
-
await this.
|
|
632
|
-
|
|
633
|
-
return await this.groupInstance.isExpanded();
|
|
634
|
-
}
|
|
635
|
-
return false;
|
|
636
|
+
async isTagBoxEmpty() {
|
|
637
|
+
const classAttribute = await this.getClasses();
|
|
638
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
636
639
|
}
|
|
637
|
-
async
|
|
638
|
-
await this.
|
|
639
|
-
|
|
640
|
-
|
|
640
|
+
async getValue() {
|
|
641
|
+
const value = await this.getTagBoxInputValue();
|
|
642
|
+
return value.length ? value : null;
|
|
643
|
+
}
|
|
644
|
+
async setValue(values) {
|
|
645
|
+
if (!Array.isArray(values)) {
|
|
646
|
+
throw new Error("The provided value is not an array");
|
|
641
647
|
}
|
|
642
|
-
|
|
648
|
+
await this.setTagBoxInputValue(values);
|
|
649
|
+
}
|
|
650
|
+
async remove(itemText) {
|
|
651
|
+
const tagValues = await this.getValue();
|
|
652
|
+
const tagExists = tagValues.includes(itemText);
|
|
653
|
+
if (!tagExists) {
|
|
654
|
+
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
655
|
+
}
|
|
656
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
657
|
+
const clearBtn = await this.driver.findElement(
|
|
658
|
+
import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
659
|
+
);
|
|
660
|
+
await click(clearBtn, this.driver);
|
|
643
661
|
}
|
|
644
662
|
};
|
|
645
663
|
}
|
|
646
664
|
});
|
|
647
665
|
|
|
648
|
-
// src/pageObjects/elements/
|
|
649
|
-
var
|
|
650
|
-
var
|
|
651
|
-
"src/pageObjects/elements/
|
|
666
|
+
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
667
|
+
var import_selenium_webdriver11, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
|
|
668
|
+
var init_ButtonGroup = __esm({
|
|
669
|
+
"src/pageObjects/elements/Editors/ButtonGroup.ts"() {
|
|
652
670
|
"use strict";
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
return this.driver.findElement(this.containerBy);
|
|
662
|
-
};
|
|
663
|
-
set formName(name) {
|
|
664
|
-
this._formName = name;
|
|
665
|
-
}
|
|
666
|
-
get formName() {
|
|
667
|
-
return this._formName;
|
|
671
|
+
init_actions();
|
|
672
|
+
import_selenium_webdriver11 = require("selenium-webdriver");
|
|
673
|
+
init_AbstractElementWithParent();
|
|
674
|
+
ITEM_CLASS = "dx-buttongroup-item";
|
|
675
|
+
SELECTED_CLASS = "dx-state-selected";
|
|
676
|
+
ButtonGroup = class extends AbstractElementWithParent {
|
|
677
|
+
getItems() {
|
|
678
|
+
return this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
668
679
|
}
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
* @example
|
|
672
|
-
* class MyForm extends FormEdit {}
|
|
673
|
-
* //...
|
|
674
|
-
* const formEdit = new MyForm();
|
|
675
|
-
* expect(await formEdit.exists()).toBe(true);
|
|
676
|
-
*/
|
|
677
|
-
async exists() {
|
|
678
|
-
try {
|
|
679
|
-
let elements = await this.driver.findElements(this.containerBy);
|
|
680
|
-
return elements.length > 0;
|
|
681
|
-
} catch (error) {
|
|
682
|
-
return false;
|
|
683
|
-
}
|
|
680
|
+
getDataValue(el) {
|
|
681
|
+
return el.getAttribute("data-value");
|
|
684
682
|
}
|
|
685
|
-
|
|
686
|
-
|
|
683
|
+
async getValue() {
|
|
684
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
685
|
+
return this.getDataValue(selectedEl);
|
|
687
686
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
687
|
+
async setValue(value) {
|
|
688
|
+
const items = await this.getItems();
|
|
689
|
+
let buttonEl = void 0;
|
|
690
|
+
for (const item of items) {
|
|
691
|
+
const text = await this.getDataValue(item);
|
|
692
|
+
if (text == value) {
|
|
693
|
+
buttonEl = item;
|
|
694
|
+
break;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
if (!buttonEl)
|
|
698
|
+
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
699
|
+
await click(buttonEl, this.driver);
|
|
697
700
|
}
|
|
698
701
|
};
|
|
699
702
|
}
|
|
700
703
|
});
|
|
701
704
|
|
|
702
|
-
// src/pageObjects/elements/
|
|
703
|
-
var
|
|
704
|
-
|
|
705
|
+
// src/pageObjects/elements/Editors/BooleanSelector.ts
|
|
706
|
+
var BooleanSelector;
|
|
707
|
+
var init_BooleanSelector = __esm({
|
|
708
|
+
"src/pageObjects/elements/Editors/BooleanSelector.ts"() {
|
|
705
709
|
"use strict";
|
|
710
|
+
init_ButtonGroup();
|
|
711
|
+
BooleanSelector = class extends ButtonGroup {
|
|
712
|
+
// @ts-ignore
|
|
713
|
+
async getValue() {
|
|
714
|
+
const value = await super.getValue();
|
|
715
|
+
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
716
|
+
}
|
|
717
|
+
// @ts-ignore
|
|
718
|
+
async setValue(value) {
|
|
719
|
+
const val = value == null ? "null" : value ? "1" : "0";
|
|
720
|
+
await super.setValue(val);
|
|
721
|
+
}
|
|
722
|
+
};
|
|
706
723
|
}
|
|
707
724
|
});
|
|
708
725
|
|
|
709
|
-
// src/pageObjects/elements/
|
|
710
|
-
|
|
711
|
-
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
712
|
-
}
|
|
713
|
-
function getCssCellByIndexSelector(index) {
|
|
714
|
-
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
715
|
-
}
|
|
716
|
-
var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
726
|
+
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
727
|
+
var formatDMYDate;
|
|
717
728
|
var init_utils = __esm({
|
|
718
|
-
"src/pageObjects/elements/
|
|
729
|
+
"src/pageObjects/elements/Editors/Date/utils.ts"() {
|
|
719
730
|
"use strict";
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
transformInputIndex = (index) => index + 1;
|
|
725
|
-
transformOutputIndex = (index) => +index - 1;
|
|
731
|
+
formatDMYDate = (date) => {
|
|
732
|
+
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
733
|
+
return `${day}${month}${year}`;
|
|
734
|
+
};
|
|
726
735
|
}
|
|
727
736
|
});
|
|
728
737
|
|
|
729
|
-
// src/pageObjects/elements/
|
|
730
|
-
var
|
|
731
|
-
|
|
738
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
739
|
+
var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
|
|
740
|
+
var init_BaseDateEditor = __esm({
|
|
741
|
+
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
732
742
|
"use strict";
|
|
743
|
+
init_AbstractEditor();
|
|
744
|
+
init_InputClearStrategy();
|
|
745
|
+
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
746
|
+
init_locators();
|
|
747
|
+
init_actions();
|
|
748
|
+
init_utils();
|
|
749
|
+
BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
750
|
+
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
751
|
+
BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
752
|
+
BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
753
|
+
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
754
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
755
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
756
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
757
|
+
}
|
|
758
|
+
async setDateValue(value) {
|
|
759
|
+
const actions = this.driver.actions({ async: true });
|
|
760
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()}`));
|
|
761
|
+
const dateFieldDataTestID = await this.getDataTestId();
|
|
762
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
763
|
+
const dateInputEl = await this.getInputElement();
|
|
764
|
+
await dateInputEl.clear();
|
|
765
|
+
if (Array.isArray(value)) {
|
|
766
|
+
const formattedDates = value.map(formatDMYDate);
|
|
767
|
+
const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
768
|
+
await button.click();
|
|
769
|
+
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(calendarPopoverSelector));
|
|
770
|
+
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
771
|
+
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
772
|
+
await dateFromInput.click();
|
|
773
|
+
await dateFromInput.sendKeys(formattedDates[0]);
|
|
774
|
+
await dateToInput.click();
|
|
775
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
776
|
+
await dateToInput.sendKeys(formattedDates[1]);
|
|
777
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.ENTER).perform();
|
|
778
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
779
|
+
await btnOk.click();
|
|
780
|
+
} else {
|
|
781
|
+
const formattedDate = formatDMYDate(value);
|
|
782
|
+
await click(dateInputEl, this.driver);
|
|
783
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
784
|
+
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
};
|
|
733
788
|
}
|
|
734
789
|
});
|
|
735
790
|
|
|
736
|
-
// src/pageObjects/elements/
|
|
737
|
-
var
|
|
738
|
-
var
|
|
739
|
-
"src/pageObjects/elements/
|
|
791
|
+
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
792
|
+
var import_selenium_webdriver13, SingleDateEditor;
|
|
793
|
+
var init_SingleDateEditor = __esm({
|
|
794
|
+
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
740
795
|
"use strict";
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
749
|
-
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
750
|
-
this.getCellIndex = getCellIndex;
|
|
751
|
-
this._index = index;
|
|
752
|
-
}
|
|
753
|
-
set index(index) {
|
|
754
|
-
this._index = index;
|
|
755
|
-
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
756
|
-
}
|
|
757
|
-
async getBooleanValue(cellEl) {
|
|
758
|
-
const booleanEl = await cellEl.findElement(import_selenium_webdriver10.By.className("boolean-widget"));
|
|
759
|
-
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
796
|
+
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
797
|
+
init_InputClearStrategy();
|
|
798
|
+
init_BaseDateEditor();
|
|
799
|
+
SingleDateEditor = class extends BaseDateEditor {
|
|
800
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
801
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
802
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
760
803
|
}
|
|
761
|
-
async
|
|
762
|
-
|
|
763
|
-
const tags = await cellEl.findElements(import_selenium_webdriver10.By.css(tagsCssSelector));
|
|
764
|
-
const values = [];
|
|
765
|
-
for (const tag of tags) {
|
|
766
|
-
values.push(await tag.getAttribute("textContent"));
|
|
767
|
-
}
|
|
768
|
-
return values;
|
|
804
|
+
async getDateElement() {
|
|
805
|
+
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
769
806
|
}
|
|
770
|
-
async
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
}
|
|
774
|
-
return super.getElement();
|
|
807
|
+
async getDateValue() {
|
|
808
|
+
const inputEl = await this.getDateElement();
|
|
809
|
+
return inputEl.getAttribute("value");
|
|
775
810
|
}
|
|
776
811
|
async getValue() {
|
|
777
|
-
const
|
|
778
|
-
|
|
779
|
-
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
780
|
-
return this.getBooleanValue(cellEl);
|
|
781
|
-
if (cellElClass.includes("tags-column" /* Tags */))
|
|
782
|
-
return this.getTagsValue(cellEl);
|
|
783
|
-
return cellEl.getText();
|
|
812
|
+
const value = await this.getDateValue();
|
|
813
|
+
return value == "" ? null : new Date(value);
|
|
784
814
|
}
|
|
785
|
-
|
|
786
|
-
|
|
815
|
+
setValue(value) {
|
|
816
|
+
if (typeof value === "object") {
|
|
817
|
+
return this.setDateValue(value);
|
|
818
|
+
}
|
|
819
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
787
820
|
}
|
|
788
821
|
};
|
|
789
822
|
}
|
|
790
823
|
});
|
|
791
824
|
|
|
792
|
-
// src/pageObjects/elements/
|
|
793
|
-
var
|
|
794
|
-
var
|
|
795
|
-
"src/pageObjects/elements/
|
|
825
|
+
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
826
|
+
var import_selenium_webdriver14, DateRangeEditor;
|
|
827
|
+
var init_DateRangeEditor = __esm({
|
|
828
|
+
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
796
829
|
"use strict";
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
805
|
-
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
806
|
-
Row = class extends AbstractElementWithParent {
|
|
807
|
-
index;
|
|
808
|
-
getColumnBy;
|
|
809
|
-
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
810
|
-
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
811
|
-
this.index = index;
|
|
812
|
-
this.getColumnBy = getColumnBy;
|
|
813
|
-
}
|
|
814
|
-
_getCell({ index, name, title }) {
|
|
815
|
-
return new Cell(
|
|
816
|
-
this.getFullCssSelector(),
|
|
817
|
-
() => {
|
|
818
|
-
return this.getColumnBy({ title, name }).getIndex();
|
|
819
|
-
},
|
|
820
|
-
index,
|
|
821
|
-
this.driver
|
|
822
|
-
);
|
|
823
|
-
}
|
|
824
|
-
getCellByIndex(index) {
|
|
825
|
-
return this._getCell({ index });
|
|
826
|
-
}
|
|
827
|
-
getCell(name) {
|
|
828
|
-
return this._getCell({ name });
|
|
829
|
-
}
|
|
830
|
-
getCellByTitle(title) {
|
|
831
|
-
return this._getCell({ title });
|
|
832
|
-
}
|
|
833
|
-
async select() {
|
|
834
|
-
const rowEl = await this.getElement();
|
|
835
|
-
await click(rowEl, this.driver);
|
|
836
|
-
await wait(
|
|
837
|
-
async () => {
|
|
838
|
-
const classes = await this.getClasses();
|
|
839
|
-
return classes.includes(DX_SELECTION_CLASS);
|
|
840
|
-
},
|
|
841
|
-
this.driver,
|
|
842
|
-
"Cannot select row"
|
|
843
|
-
);
|
|
844
|
-
}
|
|
845
|
-
async isSelected() {
|
|
846
|
-
const result = await this.getAttribute("aria-selected");
|
|
847
|
-
return result === "true";
|
|
848
|
-
}
|
|
849
|
-
getIndex() {
|
|
850
|
-
return this.index;
|
|
851
|
-
}
|
|
852
|
-
async getCells() {
|
|
853
|
-
const cells = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
854
|
-
const result = [];
|
|
855
|
-
cells.forEach((_, index) => {
|
|
856
|
-
const newCell = this.getCellByIndex(index);
|
|
857
|
-
result.push(newCell);
|
|
858
|
-
});
|
|
859
|
-
return result;
|
|
860
|
-
}
|
|
861
|
-
async clickInlineButton(buttonClass) {
|
|
862
|
-
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
863
|
-
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
864
|
-
this.index
|
|
865
|
-
)}"] .${buttonClass}`;
|
|
866
|
-
const button = await this.driver.findElement(
|
|
867
|
-
import_selenium_webdriver11.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
868
|
-
);
|
|
869
|
-
return click(button, this.driver);
|
|
830
|
+
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
831
|
+
init_InputClearStrategy();
|
|
832
|
+
init_BaseDateEditor();
|
|
833
|
+
DateRangeEditor = class extends BaseDateEditor {
|
|
834
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
835
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
836
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
870
837
|
}
|
|
871
|
-
async
|
|
872
|
-
|
|
873
|
-
async () => {
|
|
874
|
-
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
875
|
-
},
|
|
876
|
-
this.driver,
|
|
877
|
-
msg
|
|
878
|
-
);
|
|
838
|
+
async getDateElement() {
|
|
839
|
+
return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
879
840
|
}
|
|
880
|
-
async
|
|
881
|
-
await this.
|
|
882
|
-
await
|
|
841
|
+
async getDateValue() {
|
|
842
|
+
const inputEl = await this.getDateElement();
|
|
843
|
+
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
844
|
+
const dateToStr = await inputEl.getAttribute("dateto");
|
|
845
|
+
const dateFrom = new Date(dateFromStr);
|
|
846
|
+
const dateTo = new Date(dateToStr);
|
|
847
|
+
return [dateFrom, dateTo];
|
|
883
848
|
}
|
|
884
|
-
async
|
|
885
|
-
await this.
|
|
886
|
-
|
|
849
|
+
async getValue() {
|
|
850
|
+
const values = await this.getDateValue();
|
|
851
|
+
return !values.length ? null : values;
|
|
887
852
|
}
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
853
|
+
setValue(value) {
|
|
854
|
+
if (typeof value === "object") {
|
|
855
|
+
return this.setDateValue(value);
|
|
856
|
+
}
|
|
857
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
891
858
|
}
|
|
892
859
|
};
|
|
893
860
|
}
|
|
894
861
|
});
|
|
895
862
|
|
|
896
|
-
// src/pageObjects/elements/
|
|
897
|
-
var
|
|
898
|
-
var
|
|
899
|
-
"src/pageObjects/elements/
|
|
863
|
+
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
864
|
+
var DateEditor;
|
|
865
|
+
var init_DateEditor = __esm({
|
|
866
|
+
"src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
|
|
900
867
|
"use strict";
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
this._name = name;
|
|
913
|
-
this.index = index;
|
|
914
|
-
this._caption = caption;
|
|
915
|
-
this.headerCssSelector = headerCssSelector;
|
|
916
|
-
}
|
|
917
|
-
set index(index) {
|
|
918
|
-
this._index = index;
|
|
919
|
-
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
920
|
-
}
|
|
921
|
-
get index() {
|
|
922
|
-
return this._index;
|
|
923
|
-
}
|
|
924
|
-
async getElement() {
|
|
925
|
-
await this.getIndex();
|
|
926
|
-
return super.getElement();
|
|
927
|
-
}
|
|
928
|
-
async getColumnHeaderIndexBy(cssSelector) {
|
|
929
|
-
const column = await fixElementStaleError(import_selenium_webdriver12.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
|
|
930
|
-
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
931
|
-
}
|
|
932
|
-
async getIndexByCaption() {
|
|
933
|
-
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
868
|
+
init_SingleDateEditor();
|
|
869
|
+
init_DateRangeEditor();
|
|
870
|
+
init_AbstractFormElement();
|
|
871
|
+
init_AbstractEditor();
|
|
872
|
+
init_types();
|
|
873
|
+
DateEditor = class extends AbstractDXEditorWithInput {
|
|
874
|
+
editorInstance = null;
|
|
875
|
+
initPromise;
|
|
876
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
877
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
878
|
+
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
934
879
|
}
|
|
935
|
-
async
|
|
936
|
-
|
|
880
|
+
async init(parentCssSelector, elementCssSelector, driver) {
|
|
881
|
+
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
937
882
|
}
|
|
938
|
-
async
|
|
939
|
-
const
|
|
940
|
-
|
|
883
|
+
async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
|
|
884
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
885
|
+
const classString = await elementInstance.getClasses();
|
|
886
|
+
switch (true) {
|
|
887
|
+
case classString.includes("date-control" /* Date */):
|
|
888
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
889
|
+
break;
|
|
890
|
+
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
891
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
892
|
+
break;
|
|
893
|
+
default:
|
|
894
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
895
|
+
}
|
|
941
896
|
}
|
|
942
|
-
async
|
|
943
|
-
if (this.
|
|
944
|
-
|
|
897
|
+
async ensureInitialized() {
|
|
898
|
+
if (!this.editorInstance) {
|
|
899
|
+
await this.initPromise;
|
|
945
900
|
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
901
|
+
}
|
|
902
|
+
async setValue(value) {
|
|
903
|
+
await this.ensureInitialized();
|
|
904
|
+
if (this.editorInstance) {
|
|
905
|
+
await this.editorInstance.setValue(value);
|
|
906
|
+
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
949
907
|
}
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
908
|
+
throw new Error("Editor instance is not initialized.");
|
|
909
|
+
}
|
|
910
|
+
async getValue() {
|
|
911
|
+
await this.ensureInitialized();
|
|
912
|
+
if (this.editorInstance) {
|
|
913
|
+
return this.editorInstance.getValue();
|
|
953
914
|
}
|
|
954
|
-
throw new Error("
|
|
915
|
+
throw new Error("Editor instance is not initialized.");
|
|
955
916
|
}
|
|
956
917
|
};
|
|
957
918
|
}
|
|
958
919
|
});
|
|
959
920
|
|
|
960
|
-
// src/pageObjects/elements/Editors/
|
|
961
|
-
var
|
|
962
|
-
var
|
|
963
|
-
"src/pageObjects/elements/Editors/
|
|
921
|
+
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
922
|
+
var editorFactory;
|
|
923
|
+
var init_editorFactory = __esm({
|
|
924
|
+
"src/pageObjects/elements/Editors/editorFactory.ts"() {
|
|
964
925
|
"use strict";
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
926
|
+
init_types();
|
|
927
|
+
init_AbstractFormElement();
|
|
928
|
+
init_TextEditor();
|
|
929
|
+
init_NumberEditor();
|
|
930
|
+
init_CheckBox();
|
|
931
|
+
init_SelectBoxEditor();
|
|
932
|
+
init_SwitchEditor();
|
|
933
|
+
init_TagBox();
|
|
934
|
+
init_BooleanSelector();
|
|
935
|
+
init_ButtonGroup();
|
|
936
|
+
init_DateEditor();
|
|
937
|
+
editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
938
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
939
|
+
const classSting = await elementInstance.getClasses();
|
|
940
|
+
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
941
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
942
|
+
if (classSting.includes("number-control" /* Number */))
|
|
943
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
944
|
+
if (classSting.includes("check-box" /* CheckBox */))
|
|
945
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
946
|
+
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
947
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
948
|
+
if (classSting.includes("select-control" /* Select */))
|
|
949
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
950
|
+
if (classSting.includes("switch-control" /* Switch */))
|
|
951
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
952
|
+
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
953
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
969
954
|
}
|
|
955
|
+
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
956
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
957
|
+
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
958
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
959
|
+
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
970
960
|
};
|
|
971
961
|
}
|
|
972
962
|
});
|
|
973
963
|
|
|
974
|
-
// src/pageObjects/elements/Editors/
|
|
975
|
-
var
|
|
976
|
-
|
|
977
|
-
|
|
964
|
+
// src/pageObjects/elements/Editors/index.ts
|
|
965
|
+
var init_Editors = __esm({
|
|
966
|
+
"src/pageObjects/elements/Editors/index.ts"() {
|
|
967
|
+
"use strict";
|
|
968
|
+
init_TextEditor();
|
|
969
|
+
init_NumberEditor();
|
|
970
|
+
init_editorFactory();
|
|
971
|
+
init_types();
|
|
972
|
+
}
|
|
973
|
+
});
|
|
974
|
+
|
|
975
|
+
// src/utils/createDataTestId.ts
|
|
976
|
+
function createDataTestId(formName, itemType, itemName) {
|
|
977
|
+
return `${formName}-${itemType}-${itemName}`;
|
|
978
|
+
}
|
|
979
|
+
function createFieldTestId(formName, itemName) {
|
|
980
|
+
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
981
|
+
}
|
|
982
|
+
function createGroupTestId(formName, itemName) {
|
|
983
|
+
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
984
|
+
}
|
|
985
|
+
function createFilterTestId(formName, itemName, layout) {
|
|
986
|
+
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
987
|
+
}
|
|
988
|
+
function createDocFilterTestId(formName, itemName) {
|
|
989
|
+
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
990
|
+
}
|
|
991
|
+
function createHeaderFilterTestId(formName, itemName) {
|
|
992
|
+
return createFilterTestId(formName, itemName, "header-filter" /* HEADER_FILTER */);
|
|
993
|
+
}
|
|
994
|
+
function createLayoutFilterTestId(formName, itemName) {
|
|
995
|
+
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
996
|
+
}
|
|
997
|
+
function createTableId(formName) {
|
|
998
|
+
return `${"table" /* TABLE */}-${formName}`;
|
|
999
|
+
}
|
|
1000
|
+
function createFormButtonTestId(formName, itemName) {
|
|
1001
|
+
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
1002
|
+
}
|
|
1003
|
+
function createSubSystemTestId(itemName) {
|
|
1004
|
+
return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
|
|
1005
|
+
}
|
|
1006
|
+
var init_createDataTestId = __esm({
|
|
1007
|
+
"src/utils/createDataTestId.ts"() {
|
|
1008
|
+
"use strict";
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
|
|
1012
|
+
// src/utils/waitElementIsClickable.ts
|
|
1013
|
+
async function waitElementIsClickable({
|
|
1014
|
+
element,
|
|
1015
|
+
timeout,
|
|
1016
|
+
errorMessage,
|
|
1017
|
+
driver
|
|
1018
|
+
}) {
|
|
1019
|
+
driver = driver ?? config().driver;
|
|
1020
|
+
await wait(async () => {
|
|
1021
|
+
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
1022
|
+
return await element.isDisplayed() && !isDisabled;
|
|
1023
|
+
}, driver, errorMessage, timeout ?? config().timeout);
|
|
1024
|
+
}
|
|
1025
|
+
var init_waitElementIsClickable = __esm({
|
|
1026
|
+
"src/utils/waitElementIsClickable.ts"() {
|
|
1027
|
+
"use strict";
|
|
1028
|
+
init_config();
|
|
1029
|
+
init_wait();
|
|
1030
|
+
}
|
|
1031
|
+
});
|
|
1032
|
+
|
|
1033
|
+
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1034
|
+
var AbstractButton;
|
|
1035
|
+
var init_AbstractButton = __esm({
|
|
1036
|
+
"src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
|
|
978
1037
|
"use strict";
|
|
979
|
-
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
980
|
-
init_actions();
|
|
981
|
-
init_InputClearStrategy();
|
|
982
1038
|
init_AbstractElementWithParent();
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
getInputCssSelector() {
|
|
989
|
-
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
990
|
-
}
|
|
991
|
-
async getInputElement() {
|
|
992
|
-
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
|
|
993
|
-
}
|
|
994
|
-
async getInputValue() {
|
|
995
|
-
const inputEl = await this.getInputElement();
|
|
996
|
-
return inputEl.getAttribute("value");
|
|
1039
|
+
init_actions();
|
|
1040
|
+
init_waitElementIsClickable();
|
|
1041
|
+
AbstractButton = class extends AbstractElementWithParent {
|
|
1042
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1043
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
997
1044
|
}
|
|
998
|
-
async
|
|
999
|
-
const
|
|
1000
|
-
await
|
|
1001
|
-
|
|
1045
|
+
async click() {
|
|
1046
|
+
const button = await this.getElement();
|
|
1047
|
+
await waitElementIsClickable({
|
|
1048
|
+
element: button,
|
|
1049
|
+
errorMessage: this.buttonNotDisplayedError(),
|
|
1050
|
+
driver: this.driver
|
|
1051
|
+
});
|
|
1052
|
+
await click(button, this.driver);
|
|
1002
1053
|
}
|
|
1003
|
-
async
|
|
1004
|
-
await this.
|
|
1054
|
+
async isDisabled() {
|
|
1055
|
+
const button = await this.getElement();
|
|
1056
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
1005
1057
|
}
|
|
1006
1058
|
};
|
|
1007
1059
|
}
|
|
1008
1060
|
});
|
|
1009
1061
|
|
|
1010
|
-
// src/pageObjects/elements/
|
|
1011
|
-
var
|
|
1012
|
-
var
|
|
1013
|
-
"src/pageObjects/elements/
|
|
1062
|
+
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1063
|
+
var import_selenium_webdriver16, DXButton;
|
|
1064
|
+
var init_DXButton = __esm({
|
|
1065
|
+
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
1014
1066
|
"use strict";
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1067
|
+
init_AbstractButton();
|
|
1068
|
+
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1069
|
+
DXButton = class extends AbstractButton {
|
|
1070
|
+
async getText() {
|
|
1071
|
+
const classes = await this.getClasses();
|
|
1072
|
+
if (!classes.includes("dx-button-has-text")) {
|
|
1073
|
+
return null;
|
|
1074
|
+
}
|
|
1075
|
+
const el = await this.getElement();
|
|
1076
|
+
const textEl = el.findElement(import_selenium_webdriver16.By.className("dx-button-text"));
|
|
1077
|
+
return await textEl.getText();
|
|
1021
1078
|
}
|
|
1022
|
-
|
|
1023
|
-
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
});
|
|
1082
|
+
|
|
1083
|
+
// src/pageObjects/elements/FormButton.ts
|
|
1084
|
+
var FormButton;
|
|
1085
|
+
var init_FormButton = __esm({
|
|
1086
|
+
"src/pageObjects/elements/FormButton.ts"() {
|
|
1087
|
+
"use strict";
|
|
1088
|
+
init_locators();
|
|
1089
|
+
init_createDataTestId();
|
|
1090
|
+
init_DXButton();
|
|
1091
|
+
FormButton = class extends DXButton {
|
|
1092
|
+
name;
|
|
1093
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1094
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
|
|
1095
|
+
this.name = name;
|
|
1024
1096
|
}
|
|
1025
|
-
|
|
1026
|
-
return this.
|
|
1097
|
+
buttonNotDisplayedError() {
|
|
1098
|
+
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1027
1099
|
}
|
|
1028
1100
|
};
|
|
1029
1101
|
}
|
|
1030
1102
|
});
|
|
1031
1103
|
|
|
1032
|
-
// src/pageObjects/elements/
|
|
1033
|
-
var
|
|
1034
|
-
var
|
|
1035
|
-
"src/pageObjects/elements/
|
|
1104
|
+
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
1105
|
+
var AbstractGroup;
|
|
1106
|
+
var init_AbstractGroup = __esm({
|
|
1107
|
+
"src/pageObjects/elements/Groups/AbstractGroup.ts"() {
|
|
1036
1108
|
"use strict";
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
1043
|
-
}
|
|
1044
|
-
async getValue() {
|
|
1045
|
-
const value = await super.getInputValue();
|
|
1046
|
-
return value == "" ? null : Number.parseFloat(value);
|
|
1047
|
-
}
|
|
1048
|
-
setValue(value) {
|
|
1049
|
-
return this.setInputValue(value);
|
|
1109
|
+
init_AbstractElementWithParent();
|
|
1110
|
+
AbstractGroup = class extends AbstractElementWithParent {
|
|
1111
|
+
async isDisplayed() {
|
|
1112
|
+
const groupElement = await this.getElement();
|
|
1113
|
+
return await groupElement.isDisplayed();
|
|
1050
1114
|
}
|
|
1051
1115
|
};
|
|
1052
1116
|
}
|
|
1053
1117
|
});
|
|
1054
1118
|
|
|
1055
|
-
// src/pageObjects/elements/
|
|
1056
|
-
var
|
|
1057
|
-
var
|
|
1058
|
-
"src/pageObjects/elements/
|
|
1119
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
1120
|
+
var Panel;
|
|
1121
|
+
var init_Panel = __esm({
|
|
1122
|
+
"src/pageObjects/elements/Groups/Panel.ts"() {
|
|
1059
1123
|
"use strict";
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
ControlClass2["Number"] = "number-control";
|
|
1064
|
-
ControlClass2["CheckBox"] = "check-box";
|
|
1065
|
-
ControlClass2["Multiselect"] = "multi-select-control";
|
|
1066
|
-
ControlClass2["Select"] = "select-control";
|
|
1067
|
-
ControlClass2["Switch"] = "switch-control";
|
|
1068
|
-
ControlClass2["Date"] = "date-control";
|
|
1069
|
-
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
1070
|
-
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
1071
|
-
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
1072
|
-
return ControlClass2;
|
|
1073
|
-
})(ControlClass || {});
|
|
1124
|
+
init_AbstractGroup();
|
|
1125
|
+
Panel = class extends AbstractGroup {
|
|
1126
|
+
};
|
|
1074
1127
|
}
|
|
1075
1128
|
});
|
|
1076
1129
|
|
|
1077
|
-
// src/pageObjects/elements/
|
|
1078
|
-
var
|
|
1079
|
-
var
|
|
1080
|
-
"src/pageObjects/elements/
|
|
1130
|
+
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1131
|
+
var import_selenium_webdriver17, TabPanelItem, TabPanel;
|
|
1132
|
+
var init_TabPanel = __esm({
|
|
1133
|
+
"src/pageObjects/elements/Groups/TabPanel.ts"() {
|
|
1081
1134
|
"use strict";
|
|
1135
|
+
init_AbstractGroup();
|
|
1136
|
+
import_selenium_webdriver17 = require("selenium-webdriver");
|
|
1082
1137
|
init_actions();
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
const result = await this.getAttribute("aria-checked");
|
|
1087
|
-
if (result === "true")
|
|
1088
|
-
return 1;
|
|
1089
|
-
if (result === "false")
|
|
1090
|
-
return 0;
|
|
1091
|
-
return null;
|
|
1138
|
+
TabPanelItem = class extends AbstractGroup {
|
|
1139
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1140
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1092
1141
|
}
|
|
1093
|
-
async
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1142
|
+
async click() {
|
|
1143
|
+
await click(await this.getElement(), this.driver);
|
|
1144
|
+
}
|
|
1145
|
+
async isActive() {
|
|
1146
|
+
const tabPanelItemElement = await this.getElement();
|
|
1147
|
+
const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver17.By.xpath('ancestor::div[@role="tab"][1]'));
|
|
1148
|
+
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1149
|
+
}
|
|
1150
|
+
async getTitle() {
|
|
1151
|
+
return "";
|
|
1099
1152
|
}
|
|
1100
1153
|
};
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
"src/utils/xpathHelper.ts"() {
|
|
1108
|
-
"use strict";
|
|
1109
|
-
XPathHelper = class {
|
|
1110
|
-
static getClassAndValueXpath(cssClass, value) {
|
|
1111
|
-
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
1154
|
+
TabPanel = class extends AbstractGroup {
|
|
1155
|
+
item(name) {
|
|
1156
|
+
return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
|
|
1157
|
+
}
|
|
1158
|
+
async getTitle() {
|
|
1159
|
+
return "";
|
|
1112
1160
|
}
|
|
1113
1161
|
};
|
|
1114
1162
|
}
|
|
1115
1163
|
});
|
|
1116
1164
|
|
|
1117
|
-
// src/pageObjects/elements/
|
|
1118
|
-
var
|
|
1119
|
-
var
|
|
1120
|
-
"src/pageObjects/elements/
|
|
1165
|
+
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1166
|
+
var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
|
|
1167
|
+
var init_AccordionItem = __esm({
|
|
1168
|
+
"src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
|
|
1121
1169
|
"use strict";
|
|
1122
|
-
|
|
1170
|
+
init_AbstractGroup();
|
|
1171
|
+
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1123
1172
|
init_actions();
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
_driver;
|
|
1129
|
-
constructor(editorContainerClass, driver) {
|
|
1130
|
-
this.editorContainerClass = editorContainerClass;
|
|
1131
|
-
this._driver = driver;
|
|
1173
|
+
ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1174
|
+
AccordionItem = class extends AbstractGroup {
|
|
1175
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1176
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1132
1177
|
}
|
|
1133
|
-
async
|
|
1134
|
-
const
|
|
1135
|
-
|
|
1136
|
-
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
1178
|
+
async getDataOpenedAccordItemAttr() {
|
|
1179
|
+
const accordionElement = await this.getElement();
|
|
1180
|
+
return await accordionElement.getAttribute("data-opened");
|
|
1137
1181
|
}
|
|
1138
|
-
async
|
|
1139
|
-
|
|
1140
|
-
|
|
1182
|
+
async clickAccordionItemTitle() {
|
|
1183
|
+
const accordionElement = await this.getElement();
|
|
1184
|
+
const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver18.By.className(ACCORDION_TITLE_CONTAINER));
|
|
1185
|
+
await accordTitleElement.click();
|
|
1186
|
+
}
|
|
1187
|
+
async click() {
|
|
1188
|
+
await click(await this.getElement(), this.driver);
|
|
1189
|
+
}
|
|
1190
|
+
async isExpanded() {
|
|
1191
|
+
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
1192
|
+
return dataOpened === "true";
|
|
1193
|
+
}
|
|
1194
|
+
async isCollapsed() {
|
|
1195
|
+
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
1196
|
+
return dataOpened === "false" || !dataOpened;
|
|
1197
|
+
}
|
|
1198
|
+
async expand() {
|
|
1199
|
+
if (!await this.isExpanded()) {
|
|
1200
|
+
await this.clickAccordionItemTitle();
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
async collapse() {
|
|
1204
|
+
if (await this.isExpanded()) {
|
|
1205
|
+
await this.clickAccordionItemTitle();
|
|
1141
1206
|
}
|
|
1142
|
-
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
1143
|
-
const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
|
|
1144
|
-
await click(clearBtn, this._driver);
|
|
1145
1207
|
}
|
|
1146
1208
|
};
|
|
1147
1209
|
}
|
|
1148
1210
|
});
|
|
1149
1211
|
|
|
1150
|
-
// src/pageObjects/elements/
|
|
1151
|
-
var
|
|
1152
|
-
var
|
|
1153
|
-
"src/pageObjects/elements/
|
|
1212
|
+
// src/pageObjects/elements/Groups/Accordion/Accordion.ts
|
|
1213
|
+
var Accordion;
|
|
1214
|
+
var init_Accordion = __esm({
|
|
1215
|
+
"src/pageObjects/elements/Groups/Accordion/Accordion.ts"() {
|
|
1154
1216
|
"use strict";
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
init_actions();
|
|
1159
|
-
init_ClearButtonStrategy();
|
|
1160
|
-
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
1161
|
-
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
1162
|
-
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
1163
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
1164
|
-
let optElement = null;
|
|
1165
|
-
const timeout = delay ? implicit : 200;
|
|
1166
|
-
let err = null;
|
|
1167
|
-
try {
|
|
1168
|
-
await driver.manage().setTimeouts({ implicit: timeout });
|
|
1169
|
-
optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
|
|
1170
|
-
await click(optElement, driver);
|
|
1171
|
-
} catch (e) {
|
|
1172
|
-
err = new Error(`Item not found: "${optionValue}"`);
|
|
1173
|
-
} finally {
|
|
1174
|
-
await driver.manage().setTimeouts({ implicit });
|
|
1175
|
-
}
|
|
1176
|
-
if (err)
|
|
1177
|
-
throw err;
|
|
1178
|
-
};
|
|
1179
|
-
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
1217
|
+
init_AbstractGroup();
|
|
1218
|
+
init_AccordionItem();
|
|
1219
|
+
Accordion = class extends AbstractGroup {
|
|
1180
1220
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1181
1221
|
super(parentCssSelector, elementCssSelector, driver);
|
|
1182
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1183
|
-
}
|
|
1184
|
-
async setSelectInputValue(value) {
|
|
1185
|
-
const inputEl = await this.getInputElement();
|
|
1186
|
-
await click(inputEl, this.driver);
|
|
1187
|
-
try {
|
|
1188
|
-
await dropDownOptionClick(value, this.driver, false);
|
|
1189
|
-
} catch {
|
|
1190
|
-
await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
|
|
1191
|
-
await dropDownOptionClick(value, this.driver);
|
|
1192
|
-
}
|
|
1193
|
-
}
|
|
1194
|
-
async getValue() {
|
|
1195
|
-
const value = await super.getInputValue();
|
|
1196
|
-
return value == "" ? null : value;
|
|
1197
1222
|
}
|
|
1198
|
-
|
|
1199
|
-
return this.
|
|
1223
|
+
item(name) {
|
|
1224
|
+
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
|
|
1200
1225
|
}
|
|
1201
1226
|
};
|
|
1202
1227
|
}
|
|
1203
1228
|
});
|
|
1204
1229
|
|
|
1205
|
-
// src/pageObjects/elements/
|
|
1206
|
-
var
|
|
1207
|
-
var
|
|
1208
|
-
"src/pageObjects/elements/
|
|
1230
|
+
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
1231
|
+
var groupFactory;
|
|
1232
|
+
var init_groupFactory = __esm({
|
|
1233
|
+
"src/pageObjects/elements/Groups/groupFactory.ts"() {
|
|
1209
1234
|
"use strict";
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
return;
|
|
1230
|
-
}
|
|
1231
|
-
await click(inputEl, this.driver);
|
|
1232
|
-
await wait(async () => {
|
|
1233
|
-
const updatedValue = await this.getValue();
|
|
1234
|
-
return updatedValue !== currentValue;
|
|
1235
|
-
}, this.driver);
|
|
1236
|
-
}
|
|
1235
|
+
init_AbstractFormElement();
|
|
1236
|
+
init_Panel();
|
|
1237
|
+
init_TabPanel();
|
|
1238
|
+
init_Accordion();
|
|
1239
|
+
init_AccordionItem();
|
|
1240
|
+
groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1241
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1242
|
+
const classSting = await elementInstance.getClasses();
|
|
1243
|
+
if (classSting.includes("tab-panel-group"))
|
|
1244
|
+
return new TabPanel(parentCssSelector, elementCssSelector, driver);
|
|
1245
|
+
if (classSting.includes("tab-panel-item"))
|
|
1246
|
+
return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
|
|
1247
|
+
if (classSting.includes("panel-group"))
|
|
1248
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1249
|
+
if (classSting.includes("accordion-group"))
|
|
1250
|
+
return new Accordion(parentCssSelector, elementCssSelector, driver);
|
|
1251
|
+
if (classSting.includes("d5-accordion-item"))
|
|
1252
|
+
return new AccordionItem(parentCssSelector, elementCssSelector, driver);
|
|
1253
|
+
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1237
1254
|
};
|
|
1238
1255
|
}
|
|
1239
1256
|
});
|
|
1240
1257
|
|
|
1241
|
-
// src/pageObjects/elements/
|
|
1242
|
-
var
|
|
1243
|
-
var
|
|
1244
|
-
"src/pageObjects/elements/
|
|
1258
|
+
// src/pageObjects/elements/FormGroup.ts
|
|
1259
|
+
var FormGroup;
|
|
1260
|
+
var init_FormGroup = __esm({
|
|
1261
|
+
"src/pageObjects/elements/FormGroup.ts"() {
|
|
1245
1262
|
"use strict";
|
|
1246
|
-
|
|
1247
|
-
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1248
|
-
init_actions();
|
|
1263
|
+
init_AbstractElementWithParent();
|
|
1249
1264
|
init_locators();
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
TagBox = class extends AbstractDXEditorWithInput {
|
|
1259
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1260
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
1261
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1265
|
+
init_createDataTestId();
|
|
1266
|
+
init_groupFactory();
|
|
1267
|
+
init_AccordionItem();
|
|
1268
|
+
init_TabPanel();
|
|
1269
|
+
FormGroup = class extends AbstractElementWithParent {
|
|
1270
|
+
groupInstance;
|
|
1271
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1272
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
1262
1273
|
}
|
|
1263
|
-
async
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
await inputEl.click();
|
|
1267
|
-
for (const value of values) {
|
|
1268
|
-
await this.selectOption(inputEl, value, lastElement);
|
|
1274
|
+
async initInstance() {
|
|
1275
|
+
if (!this.groupInstance) {
|
|
1276
|
+
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1269
1277
|
}
|
|
1270
|
-
await this.confirmSelection();
|
|
1271
1278
|
}
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1279
|
+
/**
|
|
1280
|
+
* Возвращает булевое значение доступна ли группа
|
|
1281
|
+
* @example
|
|
1282
|
+
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
1283
|
+
*/
|
|
1284
|
+
async isDisplayed() {
|
|
1276
1285
|
try {
|
|
1277
|
-
await
|
|
1286
|
+
await this.initInstance();
|
|
1287
|
+
return this.groupInstance.isDisplayed();
|
|
1278
1288
|
} catch {
|
|
1279
|
-
|
|
1280
|
-
await dropDownOptionClick(value, this.driver);
|
|
1281
|
-
}
|
|
1282
|
-
await this.waitOptionSelection();
|
|
1283
|
-
if (value !== lastElement) {
|
|
1284
|
-
await inputEl.clear();
|
|
1289
|
+
return false;
|
|
1285
1290
|
}
|
|
1286
1291
|
}
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1292
|
+
/**
|
|
1293
|
+
* Клик по элементам группы.
|
|
1294
|
+
* Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
|
|
1295
|
+
* @example
|
|
1296
|
+
* expect(await tableList.group('TabPanel').itemClick('Tab');
|
|
1297
|
+
* expect(await tableList.group('Accordion').itemClick('AccordionItem');
|
|
1298
|
+
*/
|
|
1299
|
+
async itemClick(name) {
|
|
1300
|
+
await this.initInstance();
|
|
1301
|
+
const item = this.groupInstance.item?.(name);
|
|
1302
|
+
await item?.click();
|
|
1290
1303
|
}
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1304
|
+
/**
|
|
1305
|
+
* Метод работает если группа - это элемент аккордеона или вкладка таб панели
|
|
1306
|
+
* @example
|
|
1307
|
+
* expect(await tableList.group('Tab').click();
|
|
1308
|
+
* expect(await tableList.group('AccordionItem').click();
|
|
1309
|
+
*/
|
|
1310
|
+
async click() {
|
|
1311
|
+
await this.initInstance();
|
|
1312
|
+
await this.groupInstance.click?.();
|
|
1313
|
+
}
|
|
1314
|
+
async collapse() {
|
|
1315
|
+
await this.initInstance();
|
|
1316
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1317
|
+
await this.groupInstance.collapse();
|
|
1301
1318
|
}
|
|
1302
|
-
return values;
|
|
1303
1319
|
}
|
|
1304
|
-
async
|
|
1305
|
-
|
|
1306
|
-
|
|
1320
|
+
async expand() {
|
|
1321
|
+
await this.initInstance();
|
|
1322
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1323
|
+
await this.groupInstance.expand();
|
|
1324
|
+
}
|
|
1307
1325
|
}
|
|
1308
|
-
async
|
|
1309
|
-
|
|
1310
|
-
|
|
1326
|
+
async isExpanded() {
|
|
1327
|
+
await this.initInstance();
|
|
1328
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1329
|
+
return await this.groupInstance.isExpanded();
|
|
1330
|
+
}
|
|
1331
|
+
return false;
|
|
1311
1332
|
}
|
|
1312
|
-
async
|
|
1313
|
-
|
|
1314
|
-
|
|
1333
|
+
async isCollapsed() {
|
|
1334
|
+
await this.initInstance();
|
|
1335
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1336
|
+
return await this.groupInstance.isCollapsed();
|
|
1315
1337
|
}
|
|
1316
|
-
|
|
1338
|
+
return false;
|
|
1317
1339
|
}
|
|
1318
|
-
async
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
1340
|
+
async isActive() {
|
|
1341
|
+
await this.initInstance();
|
|
1342
|
+
if (this.groupInstance instanceof TabPanelItem) {
|
|
1343
|
+
return await this.groupInstance.isActive();
|
|
1323
1344
|
}
|
|
1324
|
-
|
|
1325
|
-
const clearBtn = await this.driver.findElement(
|
|
1326
|
-
import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
1327
|
-
);
|
|
1328
|
-
await click(clearBtn, this.driver);
|
|
1345
|
+
return false;
|
|
1329
1346
|
}
|
|
1330
1347
|
};
|
|
1331
1348
|
}
|
|
1332
1349
|
});
|
|
1333
1350
|
|
|
1334
|
-
// src/pageObjects/elements/
|
|
1335
|
-
var
|
|
1336
|
-
var
|
|
1337
|
-
"src/pageObjects/elements/
|
|
1351
|
+
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
1352
|
+
var AbstractForm;
|
|
1353
|
+
var init_AbstractForm = __esm({
|
|
1354
|
+
"src/pageObjects/elements/Forms/AbstractForm.ts"() {
|
|
1338
1355
|
"use strict";
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1356
|
+
init_AbstractPage();
|
|
1357
|
+
init_FormButton();
|
|
1358
|
+
init_FormGroup();
|
|
1359
|
+
AbstractForm = class extends AbstractPage {
|
|
1360
|
+
containerCssSelector = "";
|
|
1361
|
+
_formName = "";
|
|
1362
|
+
containerBy;
|
|
1363
|
+
getContainerElement = () => {
|
|
1364
|
+
return this.driver.findElement(this.containerBy);
|
|
1365
|
+
};
|
|
1366
|
+
set formName(name) {
|
|
1367
|
+
this._formName = name;
|
|
1350
1368
|
}
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
return this.getDataValue(selectedEl);
|
|
1369
|
+
get formName() {
|
|
1370
|
+
return this._formName;
|
|
1354
1371
|
}
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1372
|
+
/**
|
|
1373
|
+
* Возвращает true если форма есть в DOM
|
|
1374
|
+
* @example
|
|
1375
|
+
* class MyForm extends FormEdit {}
|
|
1376
|
+
* //...
|
|
1377
|
+
* const formEdit = new MyForm();
|
|
1378
|
+
* expect(await formEdit.exists()).toBe(true);
|
|
1379
|
+
*/
|
|
1380
|
+
async exists() {
|
|
1381
|
+
try {
|
|
1382
|
+
let elements = await this.driver.findElements(this.containerBy);
|
|
1383
|
+
return elements.length > 0;
|
|
1384
|
+
} catch (error) {
|
|
1385
|
+
return false;
|
|
1364
1386
|
}
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1387
|
+
}
|
|
1388
|
+
button(name) {
|
|
1389
|
+
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
1390
|
+
}
|
|
1391
|
+
/**
|
|
1392
|
+
* Находит группу на форме по имени
|
|
1393
|
+
* @example
|
|
1394
|
+
* const formEdit = new MyForm();
|
|
1395
|
+
* //...
|
|
1396
|
+
* expect(await formEdit.group('Name');
|
|
1397
|
+
*/
|
|
1398
|
+
group(name) {
|
|
1399
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1368
1400
|
}
|
|
1369
1401
|
};
|
|
1370
1402
|
}
|
|
1371
1403
|
});
|
|
1372
1404
|
|
|
1373
|
-
// src/pageObjects/elements/
|
|
1374
|
-
var
|
|
1375
|
-
|
|
1376
|
-
"src/pageObjects/elements/Editors/BooleanSelector.ts"() {
|
|
1405
|
+
// src/pageObjects/elements/Forms/types.ts
|
|
1406
|
+
var init_types2 = __esm({
|
|
1407
|
+
"src/pageObjects/elements/Forms/types.ts"() {
|
|
1377
1408
|
"use strict";
|
|
1378
|
-
init_ButtonGroup();
|
|
1379
|
-
BooleanSelector = class extends ButtonGroup {
|
|
1380
|
-
// @ts-ignore
|
|
1381
|
-
async getValue() {
|
|
1382
|
-
const value = await super.getValue();
|
|
1383
|
-
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
1384
|
-
}
|
|
1385
|
-
// @ts-ignore
|
|
1386
|
-
async setValue(value) {
|
|
1387
|
-
const val = value == null ? "null" : value ? "1" : "0";
|
|
1388
|
-
await super.setValue(val);
|
|
1389
|
-
}
|
|
1390
|
-
};
|
|
1391
1409
|
}
|
|
1392
1410
|
});
|
|
1393
1411
|
|
|
1394
|
-
// src/pageObjects/elements/
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1412
|
+
// src/pageObjects/elements/Table/utils.ts
|
|
1413
|
+
function getCssRowByIndexSelector(index) {
|
|
1414
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
1415
|
+
}
|
|
1416
|
+
function getCssCellByIndexSelector(index) {
|
|
1417
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1418
|
+
}
|
|
1419
|
+
var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
1420
|
+
var init_utils2 = __esm({
|
|
1421
|
+
"src/pageObjects/elements/Table/utils.ts"() {
|
|
1422
|
+
"use strict";
|
|
1423
|
+
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1424
|
+
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1425
|
+
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1426
|
+
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
1427
|
+
transformInputIndex = (index) => index + 1;
|
|
1428
|
+
transformOutputIndex = (index) => +index - 1;
|
|
1429
|
+
}
|
|
1430
|
+
});
|
|
1431
|
+
|
|
1432
|
+
// src/pageObjects/elements/Table/types.ts
|
|
1433
|
+
var init_types3 = __esm({
|
|
1434
|
+
"src/pageObjects/elements/Table/types.ts"() {
|
|
1398
1435
|
"use strict";
|
|
1399
|
-
formatDMYDate = (date) => {
|
|
1400
|
-
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
1401
|
-
return `${day}${month}${year}`;
|
|
1402
|
-
};
|
|
1403
1436
|
}
|
|
1404
1437
|
});
|
|
1405
1438
|
|
|
1406
|
-
// src/pageObjects/elements/
|
|
1407
|
-
var
|
|
1408
|
-
var
|
|
1409
|
-
"src/pageObjects/elements/
|
|
1439
|
+
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1440
|
+
var import_selenium_webdriver20, Cell;
|
|
1441
|
+
var init_Cell = __esm({
|
|
1442
|
+
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
1410
1443
|
"use strict";
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1414
|
-
init_locators();
|
|
1415
|
-
init_actions();
|
|
1444
|
+
import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1445
|
+
init_AbstractElementWithParent();
|
|
1416
1446
|
init_utils2();
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
this.
|
|
1447
|
+
init_types3();
|
|
1448
|
+
Cell = class extends AbstractElementWithParent {
|
|
1449
|
+
_index;
|
|
1450
|
+
getCellIndex;
|
|
1451
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
1452
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
1453
|
+
this.getCellIndex = getCellIndex;
|
|
1454
|
+
this._index = index;
|
|
1425
1455
|
}
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
const dateFieldDataTestID = await this.getDataTestId();
|
|
1430
|
-
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
1431
|
-
const dateInputEl = await this.getInputElement();
|
|
1432
|
-
await dateInputEl.clear();
|
|
1433
|
-
if (Array.isArray(value)) {
|
|
1434
|
-
const formattedDates = value.map(formatDMYDate);
|
|
1435
|
-
const button = await dateField.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
1436
|
-
await button.click();
|
|
1437
|
-
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver18.By.css(calendarPopoverSelector));
|
|
1438
|
-
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
1439
|
-
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
1440
|
-
await dateFromInput.click();
|
|
1441
|
-
await dateFromInput.sendKeys(formattedDates[0]);
|
|
1442
|
-
await dateToInput.click();
|
|
1443
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
|
|
1444
|
-
await dateToInput.sendKeys(formattedDates[1]);
|
|
1445
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.ENTER).perform();
|
|
1446
|
-
const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
1447
|
-
await btnOk.click();
|
|
1448
|
-
} else {
|
|
1449
|
-
const formattedDate = formatDMYDate(value);
|
|
1450
|
-
await click(dateInputEl, this.driver);
|
|
1451
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
|
|
1452
|
-
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
|
|
1453
|
-
}
|
|
1456
|
+
set index(index) {
|
|
1457
|
+
this._index = index;
|
|
1458
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1454
1459
|
}
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
1460
|
-
var import_selenium_webdriver19, SingleDateEditor;
|
|
1461
|
-
var init_SingleDateEditor = __esm({
|
|
1462
|
-
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
1463
|
-
"use strict";
|
|
1464
|
-
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1465
|
-
init_InputClearStrategy();
|
|
1466
|
-
init_BaseDateEditor();
|
|
1467
|
-
SingleDateEditor = class extends BaseDateEditor {
|
|
1468
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1469
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
1470
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
1460
|
+
async getBooleanValue(cellEl) {
|
|
1461
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver20.By.className("boolean-widget"));
|
|
1462
|
+
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
1471
1463
|
}
|
|
1472
|
-
async
|
|
1473
|
-
|
|
1464
|
+
async getTagsValue(cellEl) {
|
|
1465
|
+
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
1466
|
+
const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
|
|
1467
|
+
const values = [];
|
|
1468
|
+
for (const tag of tags) {
|
|
1469
|
+
values.push(await tag.getAttribute("textContent"));
|
|
1470
|
+
}
|
|
1471
|
+
return values;
|
|
1474
1472
|
}
|
|
1475
|
-
async
|
|
1476
|
-
|
|
1477
|
-
|
|
1473
|
+
async getElement() {
|
|
1474
|
+
if (this._index == null) {
|
|
1475
|
+
this.index = await this.getCellIndex();
|
|
1476
|
+
}
|
|
1477
|
+
return super.getElement();
|
|
1478
1478
|
}
|
|
1479
1479
|
async getValue() {
|
|
1480
|
-
const
|
|
1481
|
-
|
|
1480
|
+
const cellEl = await this.getElement();
|
|
1481
|
+
const cellElClass = await cellEl.getAttribute("class");
|
|
1482
|
+
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
1483
|
+
return this.getBooleanValue(cellEl);
|
|
1484
|
+
if (cellElClass.includes("tags-column" /* Tags */))
|
|
1485
|
+
return this.getTagsValue(cellEl);
|
|
1486
|
+
return cellEl.getText();
|
|
1482
1487
|
}
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
return this.setDateValue(value);
|
|
1486
|
-
}
|
|
1487
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
1488
|
+
getIndex() {
|
|
1489
|
+
return this._index;
|
|
1488
1490
|
}
|
|
1489
1491
|
};
|
|
1490
1492
|
}
|
|
1491
1493
|
});
|
|
1492
1494
|
|
|
1493
|
-
// src/pageObjects/elements/
|
|
1494
|
-
var
|
|
1495
|
-
var
|
|
1496
|
-
"src/pageObjects/elements/
|
|
1495
|
+
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1496
|
+
var import_selenium_webdriver21, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
|
|
1497
|
+
var init_Row = __esm({
|
|
1498
|
+
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
1497
1499
|
"use strict";
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1500
|
+
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1501
|
+
init_Cell();
|
|
1502
|
+
init_utils2();
|
|
1503
|
+
init_AbstractElementWithParent();
|
|
1504
|
+
init_actions();
|
|
1505
|
+
init_wait();
|
|
1506
|
+
init_fixElementStaleError();
|
|
1507
|
+
DX_SELECTION_CLASS = "dx-selection";
|
|
1508
|
+
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
1509
|
+
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
1510
|
+
Row = class extends AbstractElementWithParent {
|
|
1511
|
+
index;
|
|
1512
|
+
getColumnBy;
|
|
1513
|
+
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
1514
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
1515
|
+
this.index = index;
|
|
1516
|
+
this.getColumnBy = getColumnBy;
|
|
1505
1517
|
}
|
|
1506
|
-
|
|
1507
|
-
return
|
|
1518
|
+
_getCell({ index, name, title }) {
|
|
1519
|
+
return new Cell(
|
|
1520
|
+
this.getFullCssSelector(),
|
|
1521
|
+
() => {
|
|
1522
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
1523
|
+
},
|
|
1524
|
+
index,
|
|
1525
|
+
this.driver
|
|
1526
|
+
);
|
|
1508
1527
|
}
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
1512
|
-
const dateToStr = await inputEl.getAttribute("dateto");
|
|
1513
|
-
const dateFrom = new Date(dateFromStr);
|
|
1514
|
-
const dateTo = new Date(dateToStr);
|
|
1515
|
-
return [dateFrom, dateTo];
|
|
1528
|
+
getCellByIndex(index) {
|
|
1529
|
+
return this._getCell({ index });
|
|
1516
1530
|
}
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
return !values.length ? null : values;
|
|
1531
|
+
getCell(name) {
|
|
1532
|
+
return this._getCell({ name });
|
|
1520
1533
|
}
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
return this.setDateValue(value);
|
|
1524
|
-
}
|
|
1525
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
1534
|
+
getCellByTitle(title) {
|
|
1535
|
+
return this._getCell({ title });
|
|
1526
1536
|
}
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
init_AbstractFormElement();
|
|
1539
|
-
init_AbstractEditor();
|
|
1540
|
-
init_types3();
|
|
1541
|
-
DateEditor = class extends AbstractDXEditorWithInput {
|
|
1542
|
-
editorInstance = null;
|
|
1543
|
-
initPromise;
|
|
1544
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1545
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
1546
|
-
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
1537
|
+
async select() {
|
|
1538
|
+
const rowEl = await this.getElement();
|
|
1539
|
+
await click(rowEl, this.driver);
|
|
1540
|
+
await wait(
|
|
1541
|
+
async () => {
|
|
1542
|
+
const classes = await this.getClasses();
|
|
1543
|
+
return classes.includes(DX_SELECTION_CLASS);
|
|
1544
|
+
},
|
|
1545
|
+
this.driver,
|
|
1546
|
+
"Cannot select row"
|
|
1547
|
+
);
|
|
1547
1548
|
}
|
|
1548
|
-
async
|
|
1549
|
-
await this.
|
|
1549
|
+
async isSelected() {
|
|
1550
|
+
const result = await this.getAttribute("aria-selected");
|
|
1551
|
+
return result === "true";
|
|
1550
1552
|
}
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1553
|
+
getIndex() {
|
|
1554
|
+
return this.index;
|
|
1555
|
+
}
|
|
1556
|
+
async getCells() {
|
|
1557
|
+
const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
1558
|
+
const result = [];
|
|
1559
|
+
cells.forEach((_, index) => {
|
|
1560
|
+
const newCell = this.getCellByIndex(index);
|
|
1561
|
+
result.push(newCell);
|
|
1562
|
+
});
|
|
1563
|
+
return result;
|
|
1564
|
+
}
|
|
1565
|
+
async clickInlineButton(buttonClass) {
|
|
1566
|
+
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
1567
|
+
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1568
|
+
this.index
|
|
1569
|
+
)}"] .${buttonClass}`;
|
|
1570
|
+
const button = await fixElementStaleError(
|
|
1571
|
+
import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`),
|
|
1572
|
+
this.driver
|
|
1573
|
+
);
|
|
1574
|
+
return click(button, this.driver);
|
|
1575
|
+
}
|
|
1576
|
+
async checkEditingMode(isEditing, msg) {
|
|
1577
|
+
await wait(
|
|
1578
|
+
async () => {
|
|
1579
|
+
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1580
|
+
},
|
|
1581
|
+
this.driver,
|
|
1582
|
+
msg
|
|
1583
|
+
);
|
|
1564
1584
|
}
|
|
1565
|
-
async
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
}
|
|
1585
|
+
async edit() {
|
|
1586
|
+
await this.clickInlineButton("edit");
|
|
1587
|
+
await this.checkEditingMode(true, "Row did not switch to edit mode");
|
|
1569
1588
|
}
|
|
1570
|
-
async
|
|
1571
|
-
await this.
|
|
1572
|
-
|
|
1573
|
-
await this.editorInstance.setValue(value);
|
|
1574
|
-
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1575
|
-
}
|
|
1576
|
-
throw new Error("Editor instance is not initialized.");
|
|
1589
|
+
async save() {
|
|
1590
|
+
await this.clickInlineButton("save");
|
|
1591
|
+
await this.checkEditingMode(false, "Row did not saved");
|
|
1577
1592
|
}
|
|
1578
|
-
async
|
|
1579
|
-
await this.
|
|
1580
|
-
|
|
1581
|
-
return this.editorInstance.getValue();
|
|
1582
|
-
}
|
|
1583
|
-
throw new Error("Editor instance is not initialized.");
|
|
1593
|
+
async cancel() {
|
|
1594
|
+
await this.clickInlineButton("cancel");
|
|
1595
|
+
await this.checkEditingMode(false, "Row did not switch to normal mode");
|
|
1584
1596
|
}
|
|
1585
1597
|
};
|
|
1586
1598
|
}
|
|
1587
1599
|
});
|
|
1588
1600
|
|
|
1589
|
-
// src/pageObjects/elements/
|
|
1590
|
-
var
|
|
1591
|
-
var
|
|
1592
|
-
"src/pageObjects/elements/
|
|
1601
|
+
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1602
|
+
var import_selenium_webdriver22, Column;
|
|
1603
|
+
var init_Column = __esm({
|
|
1604
|
+
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
1593
1605
|
"use strict";
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
return
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
return
|
|
1620
|
-
|
|
1621
|
-
|
|
1606
|
+
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1607
|
+
init_utils2();
|
|
1608
|
+
init_AbstractElementWithParent();
|
|
1609
|
+
init_fixElementStaleError();
|
|
1610
|
+
Column = class extends AbstractElementWithParent {
|
|
1611
|
+
_index;
|
|
1612
|
+
_caption;
|
|
1613
|
+
_name;
|
|
1614
|
+
headerCssSelector;
|
|
1615
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
1616
|
+
super(parentCssSelector, "", driver);
|
|
1617
|
+
this._name = name;
|
|
1618
|
+
this.index = index;
|
|
1619
|
+
this._caption = caption;
|
|
1620
|
+
this.headerCssSelector = headerCssSelector;
|
|
1621
|
+
}
|
|
1622
|
+
set index(index) {
|
|
1623
|
+
this._index = index;
|
|
1624
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
1625
|
+
}
|
|
1626
|
+
get index() {
|
|
1627
|
+
return this._index;
|
|
1628
|
+
}
|
|
1629
|
+
async getElement() {
|
|
1630
|
+
await this.getIndex();
|
|
1631
|
+
return super.getElement();
|
|
1632
|
+
}
|
|
1633
|
+
async getColumnHeaderIndexBy(cssSelector) {
|
|
1634
|
+
const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
|
|
1635
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1636
|
+
}
|
|
1637
|
+
async getIndexByCaption() {
|
|
1638
|
+
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
1639
|
+
}
|
|
1640
|
+
async getIndexByName() {
|
|
1641
|
+
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
1642
|
+
}
|
|
1643
|
+
async caption() {
|
|
1644
|
+
const el = await this.getElement();
|
|
1645
|
+
return el.getText();
|
|
1646
|
+
}
|
|
1647
|
+
async getIndex() {
|
|
1648
|
+
if (this.index != null) {
|
|
1649
|
+
return this.index;
|
|
1650
|
+
}
|
|
1651
|
+
if (this._caption != null) {
|
|
1652
|
+
this.index = await this.getIndexByCaption();
|
|
1653
|
+
return this.index;
|
|
1654
|
+
}
|
|
1655
|
+
if (this._name != null) {
|
|
1656
|
+
this.index = await this.getIndexByName();
|
|
1657
|
+
return this.index;
|
|
1658
|
+
}
|
|
1659
|
+
throw new Error("Cant get the index in the column");
|
|
1622
1660
|
}
|
|
1623
|
-
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
1624
|
-
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
1625
|
-
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
1626
|
-
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
1627
|
-
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
1628
1661
|
};
|
|
1629
1662
|
}
|
|
1630
1663
|
});
|
|
1631
1664
|
|
|
1632
|
-
// src/pageObjects/elements/Editors/index.ts
|
|
1633
|
-
var init_Editors = __esm({
|
|
1634
|
-
"src/pageObjects/elements/Editors/index.ts"() {
|
|
1635
|
-
"use strict";
|
|
1636
|
-
init_TextEditor();
|
|
1637
|
-
init_NumberEditor();
|
|
1638
|
-
init_editorFactory();
|
|
1639
|
-
init_types3();
|
|
1640
|
-
}
|
|
1641
|
-
});
|
|
1642
|
-
|
|
1643
1665
|
// src/pageObjects/elements/AbstractEditor.ts
|
|
1644
1666
|
var AbstractEditor;
|
|
1645
1667
|
var init_AbstractEditor2 = __esm({
|
|
@@ -1732,11 +1754,11 @@ var init_FormField = __esm({
|
|
|
1732
1754
|
});
|
|
1733
1755
|
|
|
1734
1756
|
// src/pageObjects/elements/Table/Table.ts
|
|
1735
|
-
var
|
|
1757
|
+
var import_selenium_webdriver23, Table;
|
|
1736
1758
|
var init_Table = __esm({
|
|
1737
1759
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
1738
1760
|
"use strict";
|
|
1739
|
-
|
|
1761
|
+
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1740
1762
|
init_createDataTestId();
|
|
1741
1763
|
init_AbstractElementWithParent();
|
|
1742
1764
|
init_Row();
|
|
@@ -1786,7 +1808,7 @@ var init_Table = __esm({
|
|
|
1786
1808
|
return this.getRowByIndex(index).select();
|
|
1787
1809
|
}
|
|
1788
1810
|
async getRows() {
|
|
1789
|
-
const rows = await this.driver.findElements(
|
|
1811
|
+
const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1790
1812
|
const result = [];
|
|
1791
1813
|
rows.forEach((_, index) => {
|
|
1792
1814
|
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
@@ -1796,7 +1818,7 @@ var init_Table = __esm({
|
|
|
1796
1818
|
}
|
|
1797
1819
|
async getColumns() {
|
|
1798
1820
|
const columns = await this.driver.findElements(
|
|
1799
|
-
|
|
1821
|
+
import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
|
|
1800
1822
|
);
|
|
1801
1823
|
const result = [];
|
|
1802
1824
|
columns.forEach((_, index) => {
|
|
@@ -1891,11 +1913,11 @@ var init_typesUtil = __esm({
|
|
|
1891
1913
|
});
|
|
1892
1914
|
|
|
1893
1915
|
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1894
|
-
var
|
|
1916
|
+
var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
|
|
1895
1917
|
var init_ToolbarMenu = __esm({
|
|
1896
1918
|
"src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
|
|
1897
1919
|
"use strict";
|
|
1898
|
-
|
|
1920
|
+
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
1899
1921
|
init_typesUtil();
|
|
1900
1922
|
init_AbstractElementWithParent();
|
|
1901
1923
|
init_locators();
|
|
@@ -1946,7 +1968,7 @@ var init_ToolbarMenu = __esm({
|
|
|
1946
1968
|
throw new Error(`"title" must be a string or array of string`);
|
|
1947
1969
|
let lTitle = isString(title) ? [title] : title;
|
|
1948
1970
|
for (let t of lTitle) {
|
|
1949
|
-
await this.goToButton(t,
|
|
1971
|
+
await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
|
|
1950
1972
|
}
|
|
1951
1973
|
}
|
|
1952
1974
|
};
|
|
@@ -2121,11 +2143,11 @@ var init_PanelFilterField = __esm({
|
|
|
2121
2143
|
});
|
|
2122
2144
|
|
|
2123
2145
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
2124
|
-
var
|
|
2146
|
+
var import_selenium_webdriver25, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
2125
2147
|
var init_FilterPanel = __esm({
|
|
2126
2148
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
2127
2149
|
"use strict";
|
|
2128
|
-
|
|
2150
|
+
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2129
2151
|
init_AbstractElement();
|
|
2130
2152
|
init_PanelFilterField();
|
|
2131
2153
|
init_actions();
|
|
@@ -2140,7 +2162,7 @@ var init_FilterPanel = __esm({
|
|
|
2140
2162
|
async filterPanelButtons() {
|
|
2141
2163
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
2142
2164
|
const el = await this.getElement();
|
|
2143
|
-
return el.findElements(
|
|
2165
|
+
return el.findElements(import_selenium_webdriver25.By.css(selector));
|
|
2144
2166
|
}
|
|
2145
2167
|
constructor(formName, driver) {
|
|
2146
2168
|
super(driver, drawerSelector(formName));
|
|
@@ -2173,9 +2195,142 @@ var init_FilterPanel = __esm({
|
|
|
2173
2195
|
await this.driver.sleep(300);
|
|
2174
2196
|
}
|
|
2175
2197
|
async close() {
|
|
2176
|
-
const btn = await this.driver.findElement(
|
|
2198
|
+
const btn = await this.driver.findElement(import_selenium_webdriver25.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
2199
|
+
await click(btn, this.driver);
|
|
2200
|
+
}
|
|
2201
|
+
};
|
|
2202
|
+
}
|
|
2203
|
+
});
|
|
2204
|
+
|
|
2205
|
+
// src/pageObjects/elements/Filters/HeaderFilterField.ts
|
|
2206
|
+
var HeaderFilterField;
|
|
2207
|
+
var init_HeaderFilterField = __esm({
|
|
2208
|
+
"src/pageObjects/elements/Filters/HeaderFilterField.ts"() {
|
|
2209
|
+
"use strict";
|
|
2210
|
+
init_locators();
|
|
2211
|
+
init_createDataTestId();
|
|
2212
|
+
init_AbstractEditor2();
|
|
2213
|
+
HeaderFilterField = class extends AbstractEditor {
|
|
2214
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
2215
|
+
super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
|
|
2216
|
+
}
|
|
2217
|
+
async getValue() {
|
|
2218
|
+
return super.getValue();
|
|
2219
|
+
}
|
|
2220
|
+
async setValue(value) {
|
|
2221
|
+
return super.setValue(value);
|
|
2222
|
+
}
|
|
2223
|
+
async clear() {
|
|
2224
|
+
return super.clear();
|
|
2225
|
+
}
|
|
2226
|
+
async remove(itemText) {
|
|
2227
|
+
return super.remove(itemText);
|
|
2228
|
+
}
|
|
2229
|
+
};
|
|
2230
|
+
}
|
|
2231
|
+
});
|
|
2232
|
+
|
|
2233
|
+
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
2234
|
+
var import_selenium_webdriver26, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
2235
|
+
var init_ColumnFilter = __esm({
|
|
2236
|
+
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
2237
|
+
"use strict";
|
|
2238
|
+
init_actions();
|
|
2239
|
+
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2240
|
+
init_HeaderFilterField();
|
|
2241
|
+
init_waitElementIsVisible();
|
|
2242
|
+
init_AbstractElement();
|
|
2243
|
+
APPLY_SELECTOR = ".apply-button";
|
|
2244
|
+
CANCEL_SELECTOR = ".cancel-button";
|
|
2245
|
+
HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
|
|
2246
|
+
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
2247
|
+
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
2248
|
+
ColumnFilter = class extends AbstractElement {
|
|
2249
|
+
_formName;
|
|
2250
|
+
_name;
|
|
2251
|
+
_column;
|
|
2252
|
+
constructor(formName, name, column, driver) {
|
|
2253
|
+
super(driver, HEADER_FILTER_CONTAINER);
|
|
2254
|
+
this._formName = formName;
|
|
2255
|
+
this._name = name;
|
|
2256
|
+
this._column = column;
|
|
2257
|
+
this.driver = driver;
|
|
2258
|
+
}
|
|
2259
|
+
async getApplyButton() {
|
|
2260
|
+
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
|
|
2261
|
+
return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
|
|
2262
|
+
}
|
|
2263
|
+
async getCancelButton() {
|
|
2264
|
+
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
|
|
2265
|
+
return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
|
|
2266
|
+
}
|
|
2267
|
+
async apply() {
|
|
2268
|
+
const btn = await this.getApplyButton();
|
|
2177
2269
|
await click(btn, this.driver);
|
|
2178
2270
|
}
|
|
2271
|
+
async cancel() {
|
|
2272
|
+
const btn = await this.getCancelButton();
|
|
2273
|
+
await click(btn, this.driver);
|
|
2274
|
+
}
|
|
2275
|
+
async initFilter() {
|
|
2276
|
+
const columnEl = await this._column.getElement();
|
|
2277
|
+
const actions = this.driver.actions({ async: true });
|
|
2278
|
+
await actions.move({ origin: columnEl }).perform();
|
|
2279
|
+
const elements = await columnEl.findElements(import_selenium_webdriver26.By.css(HEADER_FILTER_ICON));
|
|
2280
|
+
const headerFilterIcon = elements[1];
|
|
2281
|
+
await waitElementIsVisible({
|
|
2282
|
+
element: headerFilterIcon,
|
|
2283
|
+
driver: this.driver,
|
|
2284
|
+
errorMessage: `HeaderFilter "${this._name}" is not visible`
|
|
2285
|
+
});
|
|
2286
|
+
if (!headerFilterIcon)
|
|
2287
|
+
throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
2288
|
+
await headerFilterIcon.click();
|
|
2289
|
+
return new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
2290
|
+
}
|
|
2291
|
+
/**
|
|
2292
|
+
* Возвращает значение в поле
|
|
2293
|
+
* @example
|
|
2294
|
+
* expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
|
|
2295
|
+
* expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
|
|
2296
|
+
*/
|
|
2297
|
+
async getValue() {
|
|
2298
|
+
const filter = await this.initFilter();
|
|
2299
|
+
const result = await filter.getValue();
|
|
2300
|
+
await this.cancel();
|
|
2301
|
+
return result;
|
|
2302
|
+
}
|
|
2303
|
+
/**
|
|
2304
|
+
* Устанавливает значение в поле
|
|
2305
|
+
* @example
|
|
2306
|
+
* await form.columnFilter('NumberFld').setValue(123);
|
|
2307
|
+
* await form.columnFilter('TextFld').setValue('TestValue');
|
|
2308
|
+
*/
|
|
2309
|
+
async setValue(value) {
|
|
2310
|
+
const filter = await this.initFilter();
|
|
2311
|
+
await filter.setValue(value);
|
|
2312
|
+
return this.apply();
|
|
2313
|
+
}
|
|
2314
|
+
/**
|
|
2315
|
+
* Очищает значение в поле
|
|
2316
|
+
* @example
|
|
2317
|
+
* await form.columnFilter('NumberFld').clear();
|
|
2318
|
+
*/
|
|
2319
|
+
async clear() {
|
|
2320
|
+
const filter = await this.initFilter();
|
|
2321
|
+
await filter.clear();
|
|
2322
|
+
return this.apply();
|
|
2323
|
+
}
|
|
2324
|
+
/**
|
|
2325
|
+
* Удаляет тег по переданному тексту
|
|
2326
|
+
* @example
|
|
2327
|
+
* await form.columnFilter('TagBox').remove('test');
|
|
2328
|
+
*/
|
|
2329
|
+
async remove(itemText) {
|
|
2330
|
+
const filter = await this.initFilter();
|
|
2331
|
+
await filter.remove(itemText);
|
|
2332
|
+
return this.apply();
|
|
2333
|
+
}
|
|
2179
2334
|
};
|
|
2180
2335
|
}
|
|
2181
2336
|
});
|
|
@@ -2194,6 +2349,7 @@ var init_ListForm = __esm({
|
|
|
2194
2349
|
init_FormToolbar();
|
|
2195
2350
|
init_FormFilterField();
|
|
2196
2351
|
init_FilterPanel();
|
|
2352
|
+
init_ColumnFilter();
|
|
2197
2353
|
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
2198
2354
|
ListForm = class extends Form {
|
|
2199
2355
|
headerCssSelector;
|
|
@@ -2233,6 +2389,10 @@ var init_ListForm = __esm({
|
|
|
2233
2389
|
formFilter(name) {
|
|
2234
2390
|
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
2235
2391
|
}
|
|
2392
|
+
columnFilter(name) {
|
|
2393
|
+
const column = this.table().getColumnByName(name);
|
|
2394
|
+
return new ColumnFilter(this.formName, name, column, this.driver);
|
|
2395
|
+
}
|
|
2236
2396
|
/**
|
|
2237
2397
|
* Модель панели фильтрации
|
|
2238
2398
|
* @returns {FilterPanel}
|
|
@@ -2297,18 +2457,18 @@ var init_createSubFormInstance = __esm({
|
|
|
2297
2457
|
"src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
|
|
2298
2458
|
"use strict";
|
|
2299
2459
|
init_locators();
|
|
2300
|
-
|
|
2460
|
+
init_types2();
|
|
2301
2461
|
subFormTestId = (name) => `subform-${name}`;
|
|
2302
2462
|
}
|
|
2303
2463
|
});
|
|
2304
2464
|
|
|
2305
2465
|
// src/pageObjects/elements/Forms/Form.ts
|
|
2306
|
-
var
|
|
2466
|
+
var import_selenium_webdriver27, formTestId, Form;
|
|
2307
2467
|
var init_Form = __esm({
|
|
2308
2468
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
2309
2469
|
"use strict";
|
|
2310
2470
|
init_locators();
|
|
2311
|
-
|
|
2471
|
+
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2312
2472
|
init_AbstractForm();
|
|
2313
2473
|
init_waitElementIsVisible();
|
|
2314
2474
|
init_createSubFormInstance();
|
|
@@ -2333,10 +2493,10 @@ var init_Form = __esm({
|
|
|
2333
2493
|
*/
|
|
2334
2494
|
async getTitleText() {
|
|
2335
2495
|
if (await this.isModal()) {
|
|
2336
|
-
const titleEl2 = await this.driver.findElement(
|
|
2496
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
2337
2497
|
return titleEl2.getText();
|
|
2338
2498
|
}
|
|
2339
|
-
let titleEl = await this.driver.findElement(
|
|
2499
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver27.By.className("main-toolbar-form-title"));
|
|
2340
2500
|
return titleEl.getText();
|
|
2341
2501
|
}
|
|
2342
2502
|
setSubFormMode() {
|
|
@@ -2354,7 +2514,7 @@ var init_Form = __esm({
|
|
|
2354
2514
|
*/
|
|
2355
2515
|
async subForm(name) {
|
|
2356
2516
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
|
|
2357
|
-
const byCssSelector =
|
|
2517
|
+
const byCssSelector = import_selenium_webdriver27.By.css(cssSelector);
|
|
2358
2518
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
2359
2519
|
await waitElementIsVisible({
|
|
2360
2520
|
element: subFormEl,
|
|
@@ -2384,18 +2544,18 @@ var FormEdit_exports = {};
|
|
|
2384
2544
|
__export(FormEdit_exports, {
|
|
2385
2545
|
default: () => FormEdit
|
|
2386
2546
|
});
|
|
2387
|
-
var
|
|
2547
|
+
var import_selenium_webdriver28, FormEdit;
|
|
2388
2548
|
var init_FormEdit = __esm({
|
|
2389
2549
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
2390
2550
|
"use strict";
|
|
2391
2551
|
init_Form();
|
|
2392
|
-
|
|
2552
|
+
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2393
2553
|
init_FormField();
|
|
2394
2554
|
init_actions();
|
|
2395
2555
|
init_wait();
|
|
2396
2556
|
FormEdit = class extends Form {
|
|
2397
|
-
saveButtonBy =
|
|
2398
|
-
closeButtonBy =
|
|
2557
|
+
saveButtonBy = import_selenium_webdriver28.By.id("button-save");
|
|
2558
|
+
closeButtonBy = import_selenium_webdriver28.By.id("button-cancel");
|
|
2399
2559
|
constructor(driver) {
|
|
2400
2560
|
super(driver);
|
|
2401
2561
|
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
@@ -2578,8 +2738,45 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
|
2578
2738
|
};
|
|
2579
2739
|
|
|
2580
2740
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2741
|
+
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
2581
2742
|
init_wait();
|
|
2582
2743
|
init_locators();
|
|
2744
|
+
init_Editors();
|
|
2745
|
+
|
|
2746
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
2747
|
+
init_actions();
|
|
2748
|
+
init_fixElementStaleError();
|
|
2749
|
+
var SubsystemItem = class {
|
|
2750
|
+
bySelector;
|
|
2751
|
+
driver;
|
|
2752
|
+
constructor({ driver, bySelector }) {
|
|
2753
|
+
this.bySelector = bySelector;
|
|
2754
|
+
this.driver = driver;
|
|
2755
|
+
}
|
|
2756
|
+
async getElement() {
|
|
2757
|
+
return fixElementStaleError(this.bySelector, this.driver);
|
|
2758
|
+
}
|
|
2759
|
+
async getTitle() {
|
|
2760
|
+
const el = await this.getElement();
|
|
2761
|
+
return await el.getAttribute("data-title");
|
|
2762
|
+
}
|
|
2763
|
+
async click() {
|
|
2764
|
+
const el = await this.getElement();
|
|
2765
|
+
await click(el, this.driver);
|
|
2766
|
+
}
|
|
2767
|
+
};
|
|
2768
|
+
|
|
2769
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2770
|
+
init_createDataTestId();
|
|
2771
|
+
init_actions();
|
|
2772
|
+
init_ClearButtonStrategy();
|
|
2773
|
+
init_waitElementIsVisible();
|
|
2774
|
+
var SEARCH_ITEM_SELECTOR = "search-item";
|
|
2775
|
+
var BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
2776
|
+
var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
2777
|
+
var byTitleCssSelector = (title) => {
|
|
2778
|
+
return `span[data-title="${title}"]`;
|
|
2779
|
+
};
|
|
2583
2780
|
var SubsystemsPanel = class extends AbstractElement {
|
|
2584
2781
|
header;
|
|
2585
2782
|
constructor(driver) {
|
|
@@ -2591,6 +2788,81 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
2591
2788
|
await wait(async () => await title.getText() != "", this.driver);
|
|
2592
2789
|
return title.getText();
|
|
2593
2790
|
}
|
|
2791
|
+
getSearchComponent() {
|
|
2792
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
|
|
2793
|
+
}
|
|
2794
|
+
/**
|
|
2795
|
+
* Находит сабсистему по заголовку
|
|
2796
|
+
* @example
|
|
2797
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2798
|
+
* //...
|
|
2799
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
2800
|
+
*/
|
|
2801
|
+
async search(title) {
|
|
2802
|
+
const searchComponent = this.getSearchComponent();
|
|
2803
|
+
await searchComponent.setValue(title);
|
|
2804
|
+
await wait(
|
|
2805
|
+
async () => {
|
|
2806
|
+
const findElement = await this.itemByTitle(title).getElement();
|
|
2807
|
+
const classes = await findElement.getAttribute("class");
|
|
2808
|
+
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
2809
|
+
},
|
|
2810
|
+
this.driver,
|
|
2811
|
+
`Cannot find element: ${title}`
|
|
2812
|
+
);
|
|
2813
|
+
}
|
|
2814
|
+
/**
|
|
2815
|
+
* Очищает поиск сабсистем
|
|
2816
|
+
* @example
|
|
2817
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2818
|
+
* //...
|
|
2819
|
+
* await subsystemsPanel.searchClear();
|
|
2820
|
+
*/
|
|
2821
|
+
async searchClear() {
|
|
2822
|
+
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
2823
|
+
const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
|
|
2824
|
+
if (await clearBtn.isDisplayed()) {
|
|
2825
|
+
await click(clearBtn, this.driver);
|
|
2826
|
+
}
|
|
2827
|
+
}
|
|
2828
|
+
/**
|
|
2829
|
+
* Возвращает сабсистему по имени
|
|
2830
|
+
* @example
|
|
2831
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2832
|
+
* //...
|
|
2833
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
2834
|
+
*/
|
|
2835
|
+
item(name) {
|
|
2836
|
+
const elementCSS = createSubSystemTestId(name);
|
|
2837
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
|
|
2838
|
+
}
|
|
2839
|
+
/**
|
|
2840
|
+
* Возвращает сабсистему по заголовку
|
|
2841
|
+
* @example
|
|
2842
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2843
|
+
* //...
|
|
2844
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
2845
|
+
*/
|
|
2846
|
+
itemByTitle(title) {
|
|
2847
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
|
|
2848
|
+
}
|
|
2849
|
+
/**
|
|
2850
|
+
* Возвращается на уровень выше по сабсистемам
|
|
2851
|
+
* @example
|
|
2852
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2853
|
+
* //...
|
|
2854
|
+
* wait subsystemsPanel.back();
|
|
2855
|
+
*/
|
|
2856
|
+
async back() {
|
|
2857
|
+
const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
|
|
2858
|
+
await waitElementIsVisible(
|
|
2859
|
+
{
|
|
2860
|
+
element: backButton,
|
|
2861
|
+
driver: this.driver
|
|
2862
|
+
}
|
|
2863
|
+
);
|
|
2864
|
+
await click(backButton, this.driver);
|
|
2865
|
+
}
|
|
2594
2866
|
};
|
|
2595
2867
|
|
|
2596
2868
|
// src/index.ts
|
|
@@ -2599,13 +2871,13 @@ init_ListForm();
|
|
|
2599
2871
|
init_TreeView();
|
|
2600
2872
|
|
|
2601
2873
|
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
2602
|
-
var
|
|
2874
|
+
var import_selenium_webdriver29 = require("selenium-webdriver");
|
|
2603
2875
|
init_FormEdit();
|
|
2604
2876
|
var ReportForm = class extends FormEdit {
|
|
2605
2877
|
constructor(driver) {
|
|
2606
2878
|
super(driver);
|
|
2607
2879
|
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
2608
|
-
this.saveButtonBy =
|
|
2880
|
+
this.saveButtonBy = import_selenium_webdriver29.By.id("button-apply");
|
|
2609
2881
|
}
|
|
2610
2882
|
/**
|
|
2611
2883
|
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
@@ -2628,7 +2900,7 @@ init_FilterPanel();
|
|
|
2628
2900
|
|
|
2629
2901
|
// src/pageObjects/elements/Dialog.ts
|
|
2630
2902
|
init_AbstractElement();
|
|
2631
|
-
var
|
|
2903
|
+
var import_selenium_webdriver30 = require("selenium-webdriver");
|
|
2632
2904
|
init_AbstractButton();
|
|
2633
2905
|
var DIALOG_CLASS = ".d5-dialog";
|
|
2634
2906
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
@@ -2643,7 +2915,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
2643
2915
|
}
|
|
2644
2916
|
async getElement() {
|
|
2645
2917
|
const panel = await super.getElement();
|
|
2646
|
-
return panel.findElement(
|
|
2918
|
+
return panel.findElement(import_selenium_webdriver30.By.xpath(buttonByTextXpath2(this.text)));
|
|
2647
2919
|
}
|
|
2648
2920
|
buttonNotDisplayedError() {
|
|
2649
2921
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -2663,11 +2935,11 @@ var Dialog = class extends AbstractElement {
|
|
|
2663
2935
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
2664
2936
|
}
|
|
2665
2937
|
async title() {
|
|
2666
|
-
const el = await this.driver.findElement(
|
|
2938
|
+
const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.titleSelector));
|
|
2667
2939
|
return await el.getText();
|
|
2668
2940
|
}
|
|
2669
2941
|
async text() {
|
|
2670
|
-
const el = await this.driver.findElement(
|
|
2942
|
+
const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.textSelector));
|
|
2671
2943
|
return await el.getText();
|
|
2672
2944
|
}
|
|
2673
2945
|
button(text) {
|