d5-testing-library 1.8.0-alpha.0 → 1.8.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormEdit-ZFZMJYWV.mjs +7 -0
- package/dist/ListForm-FXCLXRJW.mjs +7 -0
- package/dist/TreeView-DE2BPJG2.mjs +8 -0
- package/dist/chunk-6RIWBBNU.mjs +21 -0
- package/dist/{chunk-CKCSBNKD.mjs → chunk-MZW4BBF3.mjs} +16 -7
- package/dist/{chunk-JITTN2NY.mjs → chunk-NXQ4TYFN.mjs} +167 -27
- package/dist/{chunk-WUPIBFH7.mjs → chunk-PS3VVRTQ.mjs} +345 -28
- package/dist/cjs/d5-testing-library.cjs +596 -85
- package/dist/d5-testing-library.d.ts +140 -8
- package/dist/d5-testing-library.legacy-esm.js +10 -11
- package/dist/d5-testing-library.mjs +10 -11
- package/package.json +4 -4
- package/dist/FormEdit-XOCYARDX.mjs +0 -7
- package/dist/ListForm-R7WQIGBI.mjs +0 -7
- package/dist/TreeView-STUAAR65.mjs +0 -8
- package/dist/chunk-Q67RHZDP.mjs +0 -17
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
wait,
|
|
17
17
|
waitElementIsClickable,
|
|
18
18
|
waitElementIsVisible
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-NXQ4TYFN.mjs";
|
|
20
20
|
|
|
21
21
|
// src/pageObjects/elements/Table/Table.ts
|
|
22
22
|
import { By as By5 } from "selenium-webdriver";
|
|
@@ -94,10 +94,12 @@ var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
|
94
94
|
var Row = class extends AbstractElementWithParent {
|
|
95
95
|
index;
|
|
96
96
|
getColumnBy;
|
|
97
|
-
|
|
97
|
+
fixedTableContentCssSelector;
|
|
98
|
+
constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
|
|
98
99
|
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
99
100
|
this.index = index;
|
|
100
101
|
this.getColumnBy = getColumnBy;
|
|
102
|
+
this.fixedTableContentCssSelector = fixedTableContentCssSelector;
|
|
101
103
|
}
|
|
102
104
|
_getCell({ index, name, title }) {
|
|
103
105
|
return new Cell(
|
|
@@ -147,12 +149,11 @@ var Row = class extends AbstractElementWithParent {
|
|
|
147
149
|
return result;
|
|
148
150
|
}
|
|
149
151
|
async clickInlineButton(buttonClass) {
|
|
150
|
-
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
151
152
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
152
153
|
this.index
|
|
153
154
|
)}"] .${buttonClass}`;
|
|
154
155
|
const button = await fixElementStaleError(
|
|
155
|
-
By3.css(`${this.parentCssSelector} ${
|
|
156
|
+
By3.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
|
|
156
157
|
this.driver
|
|
157
158
|
);
|
|
158
159
|
return click(button, this.driver);
|
|
@@ -239,10 +240,14 @@ var Column = class extends AbstractElementWithParent {
|
|
|
239
240
|
var Table = class extends AbstractElementWithParent {
|
|
240
241
|
formName;
|
|
241
242
|
headerCssSelector;
|
|
242
|
-
|
|
243
|
+
fixedTableContentCssSelector;
|
|
244
|
+
tableContentCssSelector;
|
|
245
|
+
constructor(parentCssSelector, headerCssSelector, tableContentCssSelector, fixedTableContentCssSelector, formName, driver) {
|
|
243
246
|
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
244
247
|
this.formName = formName;
|
|
245
248
|
this.headerCssSelector = headerCssSelector;
|
|
249
|
+
this.fixedTableContentCssSelector = fixedTableContentCssSelector;
|
|
250
|
+
this.tableContentCssSelector = tableContentCssSelector;
|
|
246
251
|
}
|
|
247
252
|
getColumnBy = (args) => {
|
|
248
253
|
if (args.title) {
|
|
@@ -251,7 +256,7 @@ var Table = class extends AbstractElementWithParent {
|
|
|
251
256
|
return this.getColumnByName(args.name);
|
|
252
257
|
};
|
|
253
258
|
getRowByIndex(index) {
|
|
254
|
-
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
259
|
+
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
|
|
255
260
|
}
|
|
256
261
|
getColumnByIndex(index) {
|
|
257
262
|
return new Column({
|
|
@@ -280,10 +285,17 @@ var Table = class extends AbstractElementWithParent {
|
|
|
280
285
|
return this.getRowByIndex(index).select();
|
|
281
286
|
}
|
|
282
287
|
async getRows() {
|
|
283
|
-
const
|
|
288
|
+
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
289
|
+
const rows = await this.driver.findElements(By5.css(rowsFullCssSelector));
|
|
284
290
|
const result = [];
|
|
285
291
|
rows.forEach((_, index) => {
|
|
286
|
-
const newRow = new Row(
|
|
292
|
+
const newRow = new Row(
|
|
293
|
+
this.getFullCssSelector(),
|
|
294
|
+
this.fixedTableContentCssSelector,
|
|
295
|
+
index,
|
|
296
|
+
this.driver,
|
|
297
|
+
this.getColumnBy
|
|
298
|
+
);
|
|
287
299
|
result.push(newRow);
|
|
288
300
|
});
|
|
289
301
|
return result;
|
|
@@ -367,9 +379,10 @@ var isString = function(object) {
|
|
|
367
379
|
|
|
368
380
|
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
369
381
|
var SPINDOWN_CLASS = ".dx-icon-spindown";
|
|
382
|
+
var CONTEXT_MENU_CLASS = "dx-context-menu";
|
|
370
383
|
var buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
|
|
371
384
|
var getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
372
|
-
var buttonByTextXpath = (text) =>
|
|
385
|
+
var buttonByTextXpath = (text) => `//div[contains(@class, '${CONTEXT_MENU_CLASS}')]//span[contains(@class, 'dx-menu-item-text') and text()='${text}']`;
|
|
373
386
|
var ToolbarMenu = class extends AbstractElementWithParent {
|
|
374
387
|
_formName;
|
|
375
388
|
constructor(parentCssSelector, formName, name, driver) {
|
|
@@ -445,6 +458,14 @@ var ToolbarItem = class extends AbstractElementWithParent {
|
|
|
445
458
|
await this.init();
|
|
446
459
|
return await this._button.isDisabled();
|
|
447
460
|
}
|
|
461
|
+
async isDisplayed() {
|
|
462
|
+
try {
|
|
463
|
+
await this.init();
|
|
464
|
+
return this._button.isDisplayed();
|
|
465
|
+
} catch (error) {
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
448
469
|
get menu() {
|
|
449
470
|
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
|
|
450
471
|
}
|
|
@@ -463,10 +484,105 @@ var FormToolbar = class extends AbstractElementWithParent {
|
|
|
463
484
|
}
|
|
464
485
|
};
|
|
465
486
|
|
|
487
|
+
// src/pageObjects/elements/Filters/FilterOperation.ts
|
|
488
|
+
import { By as By7 } from "selenium-webdriver";
|
|
489
|
+
var FILTER_OPERATIONS = [
|
|
490
|
+
"=",
|
|
491
|
+
"<>",
|
|
492
|
+
"<",
|
|
493
|
+
">",
|
|
494
|
+
"<=",
|
|
495
|
+
">=",
|
|
496
|
+
"contains",
|
|
497
|
+
"between",
|
|
498
|
+
"isanyof",
|
|
499
|
+
"isnotanyof",
|
|
500
|
+
"isblank",
|
|
501
|
+
"isnotblank",
|
|
502
|
+
"startwith",
|
|
503
|
+
"bywords"
|
|
504
|
+
];
|
|
505
|
+
var BUTTON_OPERATION_WIDGET = "operation-widget";
|
|
506
|
+
var OPERATIONS_WIDGET_POPUP = "operation-type-widget-popup";
|
|
507
|
+
var getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
|
|
508
|
+
var FilterOperation = class extends AbstractElementWithParent {
|
|
509
|
+
_testId;
|
|
510
|
+
constructor({ parentCssSelector, filterTestID, driver }) {
|
|
511
|
+
super(parentCssSelector, `${byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`)}`, driver);
|
|
512
|
+
this._testId = filterTestID;
|
|
513
|
+
}
|
|
514
|
+
async initOperationWidget() {
|
|
515
|
+
const widgetButtonEl = await this.getElement();
|
|
516
|
+
await waitElementIsClickable({
|
|
517
|
+
element: widgetButtonEl,
|
|
518
|
+
errorMessage: "Widget operation is not clickable",
|
|
519
|
+
driver: this.driver
|
|
520
|
+
});
|
|
521
|
+
const clickableElement = await widgetButtonEl.findElement(By7.className("dx-icon"));
|
|
522
|
+
await click(clickableElement, this.driver);
|
|
523
|
+
try {
|
|
524
|
+
const widgetPopupEl = await this.driver.findElement(By7.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
|
|
525
|
+
await waitElementIsVisible({
|
|
526
|
+
element: widgetPopupEl,
|
|
527
|
+
errorMessage: `Operation widget popup is not visible`,
|
|
528
|
+
driver: this.driver
|
|
529
|
+
});
|
|
530
|
+
} catch (_) {
|
|
531
|
+
throw `Operation widget popup is not visible`;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
async setOperation(operationName) {
|
|
535
|
+
if (!FILTER_OPERATIONS.includes(operationName)) {
|
|
536
|
+
throw new Error(`Operation with name "${operationName}" is not correct.`);
|
|
537
|
+
}
|
|
538
|
+
await this.initOperationWidget();
|
|
539
|
+
const operationEl = await fixElementStaleError(By7.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
|
|
540
|
+
await click(operationEl, this.driver);
|
|
541
|
+
await wait(
|
|
542
|
+
async () => {
|
|
543
|
+
const currOperationName = await this.getAttribute("data-operation");
|
|
544
|
+
if (operationName === "isblank")
|
|
545
|
+
return true;
|
|
546
|
+
return currOperationName === operationName;
|
|
547
|
+
},
|
|
548
|
+
this.driver,
|
|
549
|
+
"Operation is not changed"
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
async getOperation() {
|
|
553
|
+
const result = await this.getAttribute("data-operation");
|
|
554
|
+
if (!result)
|
|
555
|
+
throw new Error("Operation not found");
|
|
556
|
+
return result;
|
|
557
|
+
}
|
|
558
|
+
async setIsBlank(value) {
|
|
559
|
+
const currValue = await this.getIsBlank();
|
|
560
|
+
if (currValue !== value) {
|
|
561
|
+
await this.setOperation("isblank");
|
|
562
|
+
await wait(
|
|
563
|
+
async () => {
|
|
564
|
+
const currIsBlank = await this.getIsBlank();
|
|
565
|
+
return currIsBlank === value;
|
|
566
|
+
},
|
|
567
|
+
this.driver,
|
|
568
|
+
"Operation is not changed"
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
async getIsBlank() {
|
|
573
|
+
const result = await this.getAttribute("data-hasblank");
|
|
574
|
+
return result === "true";
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
|
|
466
578
|
// src/pageObjects/elements/Filters/FormFilterField.ts
|
|
467
579
|
var FormFilterField = class extends AbstractEditor {
|
|
580
|
+
formName;
|
|
581
|
+
name;
|
|
468
582
|
constructor(parentCssSelector, formName, name, driver) {
|
|
469
583
|
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
|
|
584
|
+
this.formName = formName;
|
|
585
|
+
this.name = name;
|
|
470
586
|
}
|
|
471
587
|
/**
|
|
472
588
|
* Возвращает значение в поле
|
|
@@ -482,8 +598,15 @@ var FormFilterField = class extends AbstractEditor {
|
|
|
482
598
|
* @example
|
|
483
599
|
* await form.formFilter('NumberFld').setValue(123);
|
|
484
600
|
* await form.formFilter('TextFld').setValue('TestValue');
|
|
601
|
+
* await form.formFilter('TextFld').setValue('TestValue', '=', true);
|
|
485
602
|
*/
|
|
486
|
-
async setValue(value) {
|
|
603
|
+
async setValue(value, operation, isBlank) {
|
|
604
|
+
if (typeof operation === "string") {
|
|
605
|
+
await this.setOperation(operation);
|
|
606
|
+
}
|
|
607
|
+
if (typeof isBlank === "boolean") {
|
|
608
|
+
await this.setIsBlank(isBlank);
|
|
609
|
+
}
|
|
487
610
|
return super.setValue(value);
|
|
488
611
|
}
|
|
489
612
|
/**
|
|
@@ -502,15 +625,64 @@ var FormFilterField = class extends AbstractEditor {
|
|
|
502
625
|
async remove(itemText) {
|
|
503
626
|
return super.remove(itemText);
|
|
504
627
|
}
|
|
628
|
+
/**
|
|
629
|
+
* Инициализация операции фильтра
|
|
630
|
+
*/
|
|
631
|
+
async initOperation() {
|
|
632
|
+
return new FilterOperation({
|
|
633
|
+
parentCssSelector: this.parentCssSelector,
|
|
634
|
+
filterTestID: createLayoutFilterTestId(this.formName, this.name)
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Устанавливает операцию для фильтра
|
|
639
|
+
* @example
|
|
640
|
+
* await form.formFilter('TagBox').setOperation("=");
|
|
641
|
+
*/
|
|
642
|
+
async setOperation(operationName) {
|
|
643
|
+
const filterOperation = await this.initOperation();
|
|
644
|
+
await filterOperation.setOperation(operationName);
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Возвращает операцию фильтра
|
|
648
|
+
* @example
|
|
649
|
+
* expect(await form.formFilter('NumberFld').getOperation()).toBe("=");
|
|
650
|
+
*/
|
|
651
|
+
async getOperation() {
|
|
652
|
+
const filterOperation = await this.initOperation();
|
|
653
|
+
return await filterOperation.getOperation();
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Устанавливает операцию 'isblank' для фильтра
|
|
657
|
+
* @example
|
|
658
|
+
* await form.formFilter('TagBox').setIsBlank(true);
|
|
659
|
+
*/
|
|
660
|
+
async setIsBlank(value) {
|
|
661
|
+
const filterOperation = await this.initOperation();
|
|
662
|
+
await filterOperation.setIsBlank(value);
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Возвращает true|false, если операция 'isblank' установлена для фильтра
|
|
666
|
+
* @example
|
|
667
|
+
* expect(await form.formFilter('NumberFld').getIsBlank()).toBe(false);
|
|
668
|
+
*/
|
|
669
|
+
async getIsBlank() {
|
|
670
|
+
const filterOperation = await this.initOperation();
|
|
671
|
+
return await filterOperation.getIsBlank();
|
|
672
|
+
}
|
|
505
673
|
};
|
|
506
674
|
|
|
507
675
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
508
|
-
import { By as
|
|
676
|
+
import { By as By8 } from "selenium-webdriver";
|
|
509
677
|
|
|
510
678
|
// src/pageObjects/elements/Filters/PanelFilterField.ts
|
|
511
679
|
var PanelFilterField = class extends AbstractEditor {
|
|
680
|
+
formName;
|
|
681
|
+
name;
|
|
512
682
|
constructor(parentCssSelector, formName, name, driver) {
|
|
513
683
|
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
|
|
684
|
+
this.formName = formName;
|
|
685
|
+
this.name = name;
|
|
514
686
|
}
|
|
515
687
|
/**
|
|
516
688
|
* Возвращает значение в поле
|
|
@@ -526,8 +698,15 @@ var PanelFilterField = class extends AbstractEditor {
|
|
|
526
698
|
* @example
|
|
527
699
|
* await form.filterPanel.filterField('NumberFld').setValue(123);
|
|
528
700
|
* await form.filterPanel.filterField('TextFld').setValue('TestValue');
|
|
701
|
+
* await form.filterPanel.filterField('TextFld').setValue('TestValue', '=', true);
|
|
529
702
|
*/
|
|
530
|
-
async setValue(value) {
|
|
703
|
+
async setValue(value, operation, isBlank) {
|
|
704
|
+
if (typeof operation === "string") {
|
|
705
|
+
await this.setOperation(operation);
|
|
706
|
+
}
|
|
707
|
+
if (typeof isBlank === "boolean") {
|
|
708
|
+
await this.setIsBlank(isBlank);
|
|
709
|
+
}
|
|
531
710
|
return super.setValue(value);
|
|
532
711
|
}
|
|
533
712
|
/**
|
|
@@ -546,6 +725,51 @@ var PanelFilterField = class extends AbstractEditor {
|
|
|
546
725
|
async remove(itemText) {
|
|
547
726
|
return super.remove(itemText);
|
|
548
727
|
}
|
|
728
|
+
/**
|
|
729
|
+
* Инициализация операции фильтра
|
|
730
|
+
*/
|
|
731
|
+
async initOperation() {
|
|
732
|
+
return new FilterOperation({
|
|
733
|
+
parentCssSelector: this.parentCssSelector,
|
|
734
|
+
filterTestID: createDocFilterTestId(this.formName, this.name)
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Устанавливает операцию для фильтра
|
|
739
|
+
* @example
|
|
740
|
+
* await form.filterPanel.filterField('TagBox').setOperation("=");
|
|
741
|
+
*/
|
|
742
|
+
async setOperation(operationName) {
|
|
743
|
+
const filterOperation = await this.initOperation();
|
|
744
|
+
await filterOperation.setOperation(operationName);
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Возвращает операцию фильтра
|
|
748
|
+
* @example
|
|
749
|
+
* expect(await form.filterPanel.filterField('NumberFld').getOperation()).toBe("=");
|
|
750
|
+
*/
|
|
751
|
+
async getOperation() {
|
|
752
|
+
const filterOperation = await this.initOperation();
|
|
753
|
+
return await filterOperation.getOperation();
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* Устанавливает операцию 'isblank' для фильтра
|
|
757
|
+
* @example
|
|
758
|
+
* await form.filterPanel.filterField('TagBox').setIsBlank(true);
|
|
759
|
+
*/
|
|
760
|
+
async setIsBlank(value) {
|
|
761
|
+
const filterOperation = await this.initOperation();
|
|
762
|
+
await filterOperation.setIsBlank(value);
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Возвращает true|false, если операция 'isblank' установлена для фильтра
|
|
766
|
+
* @example
|
|
767
|
+
* expect(await form.filterPanel.filterField('NumberFld').getIsBlank()).toBe(false);
|
|
768
|
+
*/
|
|
769
|
+
async getIsBlank() {
|
|
770
|
+
const filterOperation = await this.initOperation();
|
|
771
|
+
return await filterOperation.getIsBlank();
|
|
772
|
+
}
|
|
549
773
|
};
|
|
550
774
|
|
|
551
775
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
@@ -560,7 +784,7 @@ var FilterPanel = class extends AbstractElement {
|
|
|
560
784
|
async filterPanelButtons() {
|
|
561
785
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
562
786
|
const el = await this.getElement();
|
|
563
|
-
return el.findElements(
|
|
787
|
+
return el.findElements(By8.css(selector));
|
|
564
788
|
}
|
|
565
789
|
constructor(formName, driver) {
|
|
566
790
|
super(driver, drawerSelector(formName));
|
|
@@ -593,13 +817,13 @@ var FilterPanel = class extends AbstractElement {
|
|
|
593
817
|
await this.driver.sleep(300);
|
|
594
818
|
}
|
|
595
819
|
async close() {
|
|
596
|
-
const btn = await this.driver.findElement(
|
|
820
|
+
const btn = await this.driver.findElement(By8.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
597
821
|
await click(btn, this.driver);
|
|
598
822
|
}
|
|
599
823
|
};
|
|
600
824
|
|
|
601
825
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
602
|
-
import { By as
|
|
826
|
+
import { By as By9 } from "selenium-webdriver";
|
|
603
827
|
|
|
604
828
|
// src/pageObjects/elements/Filters/HeaderFilterField.ts
|
|
605
829
|
var HeaderFilterField = class extends AbstractEditor {
|
|
@@ -639,11 +863,11 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
639
863
|
}
|
|
640
864
|
async getApplyButton() {
|
|
641
865
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
|
|
642
|
-
return this.driver.findElement(
|
|
866
|
+
return this.driver.findElement(By9.css(selector));
|
|
643
867
|
}
|
|
644
868
|
async getCancelButton() {
|
|
645
869
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
|
|
646
|
-
return this.driver.findElement(
|
|
870
|
+
return this.driver.findElement(By9.css(selector));
|
|
647
871
|
}
|
|
648
872
|
async apply() {
|
|
649
873
|
const btn = await this.getApplyButton();
|
|
@@ -657,17 +881,34 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
657
881
|
const columnEl = await this._column.getElement();
|
|
658
882
|
const actions = this.driver.actions({ async: true });
|
|
659
883
|
await actions.move({ origin: columnEl }).perform();
|
|
660
|
-
const elements = await columnEl.findElements(
|
|
661
|
-
|
|
662
|
-
await
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
884
|
+
const elements = await columnEl.findElements(By9.css(HEADER_FILTER_ICON));
|
|
885
|
+
let headerFilterIcon = null;
|
|
886
|
+
await wait(
|
|
887
|
+
async () => {
|
|
888
|
+
let result = false;
|
|
889
|
+
for (let element of elements) {
|
|
890
|
+
if (await element.isDisplayed()) {
|
|
891
|
+
headerFilterIcon = element;
|
|
892
|
+
result = true;
|
|
893
|
+
break;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
return result;
|
|
897
|
+
},
|
|
898
|
+
this.driver,
|
|
899
|
+
`HeaderFilter "${this._name}" is not visible`
|
|
900
|
+
);
|
|
667
901
|
if (!headerFilterIcon)
|
|
668
902
|
throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
669
903
|
await headerFilterIcon.click();
|
|
670
|
-
|
|
904
|
+
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
905
|
+
const filterEl = await filter.getElement();
|
|
906
|
+
await waitElementIsVisible({
|
|
907
|
+
element: filterEl,
|
|
908
|
+
driver: this.driver,
|
|
909
|
+
errorMessage: `Header filter is not visible`
|
|
910
|
+
});
|
|
911
|
+
return filter;
|
|
671
912
|
}
|
|
672
913
|
/**
|
|
673
914
|
* Возвращает значение в поле
|
|
@@ -686,9 +927,22 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
686
927
|
* @example
|
|
687
928
|
* await form.columnFilter('NumberFld').setValue(123);
|
|
688
929
|
* await form.columnFilter('TextFld').setValue('TestValue');
|
|
930
|
+
* await form.columnFilter('TextFld').setValue('TestValue', '=', true);
|
|
689
931
|
*/
|
|
690
|
-
async setValue(value) {
|
|
932
|
+
async setValue(value, operation, isBlank) {
|
|
691
933
|
const filter = await this.initFilter();
|
|
934
|
+
const inputEl = await filter.getElement();
|
|
935
|
+
await inputEl.click();
|
|
936
|
+
const filterOperation = new FilterOperation({
|
|
937
|
+
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
938
|
+
filterTestID: createHeaderFilterTestId(this._formName, this._name)
|
|
939
|
+
});
|
|
940
|
+
if (typeof operation === "string") {
|
|
941
|
+
await filterOperation.setOperation(operation);
|
|
942
|
+
}
|
|
943
|
+
if (typeof isBlank === "boolean") {
|
|
944
|
+
await filterOperation.setIsBlank(isBlank);
|
|
945
|
+
}
|
|
692
946
|
await filter.setValue(value);
|
|
693
947
|
return this.apply();
|
|
694
948
|
}
|
|
@@ -712,16 +966,72 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
712
966
|
await filter.remove(itemText);
|
|
713
967
|
return this.apply();
|
|
714
968
|
}
|
|
969
|
+
/**
|
|
970
|
+
* Инициализация операции фильтра
|
|
971
|
+
*/
|
|
972
|
+
async initOperation() {
|
|
973
|
+
const filter = await this.initFilter();
|
|
974
|
+
const inputEl = await filter.getElement();
|
|
975
|
+
await inputEl.click();
|
|
976
|
+
return new FilterOperation({
|
|
977
|
+
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
978
|
+
filterTestID: createHeaderFilterTestId(this._formName, this._name)
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* Устанавливает операцию для фильтра
|
|
983
|
+
* @example
|
|
984
|
+
* await form.columnFilter('TagBox').setOperation("=");
|
|
985
|
+
*/
|
|
986
|
+
async setOperation(operationName) {
|
|
987
|
+
const filterOperation = await this.initOperation();
|
|
988
|
+
await filterOperation.setOperation(operationName);
|
|
989
|
+
await this.apply();
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Возвращает операцию фильтра
|
|
993
|
+
* @example
|
|
994
|
+
* expect(await form.columnFilter('NumberFld').getOperation()).toBe("=");
|
|
995
|
+
*/
|
|
996
|
+
async getOperation() {
|
|
997
|
+
const filterOperation = await this.initOperation();
|
|
998
|
+
return await filterOperation.getOperation();
|
|
999
|
+
}
|
|
1000
|
+
/**
|
|
1001
|
+
* Устанавливает операцию 'isblank' для фильтра
|
|
1002
|
+
* @example
|
|
1003
|
+
* await form.columnFilter('TagBox').setIsBlank(true);
|
|
1004
|
+
*/
|
|
1005
|
+
async setIsBlank(value) {
|
|
1006
|
+
const filterOperation = await this.initOperation();
|
|
1007
|
+
await filterOperation.setIsBlank(value);
|
|
1008
|
+
await this.apply();
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Возвращает true|false, если операция 'isblank' установлена для фильтра
|
|
1012
|
+
* @example
|
|
1013
|
+
* expect(await form.columnFilter('NumberFld').getIsBlank()).toBe(false);
|
|
1014
|
+
*/
|
|
1015
|
+
async getIsBlank() {
|
|
1016
|
+
const filterOperation = await this.initOperation();
|
|
1017
|
+
return await filterOperation.getIsBlank();
|
|
1018
|
+
}
|
|
715
1019
|
};
|
|
716
1020
|
|
|
717
1021
|
// src/pageObjects/elements/Forms/ListForm.ts
|
|
718
1022
|
var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1023
|
+
var DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1024
|
+
var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
719
1025
|
var ListForm = class extends Form {
|
|
720
1026
|
headerCssSelector;
|
|
1027
|
+
fixedTableContentCssSelector;
|
|
1028
|
+
tableContentCssSelector;
|
|
721
1029
|
constructor(driver) {
|
|
722
1030
|
super(driver);
|
|
723
|
-
this.popupContainerCssSelector = `.popup
|
|
1031
|
+
this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
|
|
724
1032
|
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
1033
|
+
this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
|
|
1034
|
+
this.tableContentCssSelector = DATAGRID_CONTENT_CSS_SELECTOR;
|
|
725
1035
|
}
|
|
726
1036
|
/**
|
|
727
1037
|
* Находит таблицу
|
|
@@ -731,7 +1041,14 @@ var ListForm = class extends Form {
|
|
|
731
1041
|
* expect(listForm.table());
|
|
732
1042
|
*/
|
|
733
1043
|
table() {
|
|
734
|
-
return new Table(
|
|
1044
|
+
return new Table(
|
|
1045
|
+
this.containerCssSelector,
|
|
1046
|
+
this.headerCssSelector,
|
|
1047
|
+
this.tableContentCssSelector,
|
|
1048
|
+
this.fixedTableContentCssSelector,
|
|
1049
|
+
this.formName,
|
|
1050
|
+
this.driver
|
|
1051
|
+
);
|
|
735
1052
|
}
|
|
736
1053
|
/**
|
|
737
1054
|
* Находит таблицу
|