d5-testing-library 1.9.0-alpha.2 → 1.9.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/FormEdit-V2BBOANS.mjs +7 -0
- package/dist/ListForm-UBIG4ZP2.mjs +7 -0
- package/dist/TreeView-MIKFUI4Q.mjs +8 -0
- package/dist/{chunk-S62QEWWA.mjs → chunk-27XBX275.mjs} +121 -27
- package/dist/{chunk-32KSAOFJ.mjs → chunk-FRCMUAAY.mjs} +334 -64
- package/dist/{chunk-XGIXXZD6.mjs → chunk-GQKGCUVL.mjs} +1 -1
- package/dist/{chunk-75FRHQCI.mjs → chunk-ZWHGIJ3K.mjs} +4 -4
- package/dist/cjs/d5-testing-library.cjs +564 -160
- package/dist/cjs/d5-testing-library.d.ts +61 -2
- package/dist/d5-testing-library.d.mts +61 -2
- package/dist/d5-testing-library.legacy-esm.js +18 -5
- package/dist/d5-testing-library.mjs +18 -5
- package/package.json +7 -7
- package/dist/FormEdit-QNZOB7PA.mjs +0 -7
- package/dist/ListForm-MXGUBMWS.mjs +0 -7
- package/dist/TreeView-VZBOZCFW.mjs +0 -8
package/README.md
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//
|
|
@@ -17,14 +17,15 @@ import {
|
|
|
17
17
|
safeWait,
|
|
18
18
|
staleElementAction,
|
|
19
19
|
waitElementIsClickable_default,
|
|
20
|
-
waitElementIsVisible_default
|
|
21
|
-
|
|
20
|
+
waitElementIsVisible_default,
|
|
21
|
+
withCustomTimeouts_default
|
|
22
|
+
} from "./chunk-FRCMUAAY.mjs";
|
|
22
23
|
|
|
23
24
|
// src/pageObjects/elements/Table/Table.ts
|
|
24
25
|
import { By as By6 } from "selenium-webdriver";
|
|
25
26
|
|
|
26
27
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
27
|
-
import { By as By3 } from "selenium-webdriver";
|
|
28
|
+
import { By as By3, Key } from "selenium-webdriver";
|
|
28
29
|
|
|
29
30
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
30
31
|
import { By as By2 } from "selenium-webdriver";
|
|
@@ -82,7 +83,7 @@ var Cell = class extends AbstractElementWithParent {
|
|
|
82
83
|
const [datePart, timePart] = value.split(", ");
|
|
83
84
|
const [day, month, year] = datePart.split(".").map(Number);
|
|
84
85
|
const [hours, minutes] = timePart.split(":").map(Number);
|
|
85
|
-
return new Date(
|
|
86
|
+
return new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
86
87
|
} else {
|
|
87
88
|
const [day, month, year] = value.split(".").map(Number);
|
|
88
89
|
return new Date(Date.UTC(year, month - 1, day));
|
|
@@ -153,9 +154,18 @@ var Row = class extends AbstractElementWithParent {
|
|
|
153
154
|
getCellByTitle(title) {
|
|
154
155
|
return this._getCell({ title });
|
|
155
156
|
}
|
|
156
|
-
async select() {
|
|
157
|
+
async select(preserve = false) {
|
|
157
158
|
await staleElementAction(async () => {
|
|
158
159
|
const rowEl = await this.getElement();
|
|
160
|
+
const isSelected = (await this.getClasses()).includes(DX_SELECTION_CLASS);
|
|
161
|
+
if (isSelected && !preserve) {
|
|
162
|
+
await this.driver.actions({ async: true }).keyUp(Key.CONTROL).perform();
|
|
163
|
+
}
|
|
164
|
+
if (preserve && !isSelected) {
|
|
165
|
+
await this.driver.actions({ async: true }).keyDown(Key.CONTROL).perform();
|
|
166
|
+
await click(rowEl, this.driver);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
159
169
|
await click(rowEl, this.driver);
|
|
160
170
|
});
|
|
161
171
|
await safeWait(
|
|
@@ -366,7 +376,7 @@ var DXContextMenuList = class extends AbstractDropDownMenuList {
|
|
|
366
376
|
async isVisible() {
|
|
367
377
|
try {
|
|
368
378
|
await waitElementIsVisible_default({
|
|
369
|
-
element: await this.driver.findElement(By5.css(`.dx-overlay-wrapper .dx-
|
|
379
|
+
element: await this.driver.findElement(By5.css(`.dx-overlay-wrapper .dx-context-menu`)),
|
|
370
380
|
driver: this.driver,
|
|
371
381
|
errorMessage: "Cannot find dropdown element"
|
|
372
382
|
});
|
|
@@ -467,13 +477,32 @@ var Table = class extends AbstractElementWithParent {
|
|
|
467
477
|
/**
|
|
468
478
|
* Вибрати рядок по індексу.
|
|
469
479
|
* @param index починається з 0
|
|
480
|
+
* @param preserve boolean який изначає, чи повинні раніше вибрані рядки залишатися вибраними
|
|
470
481
|
*/
|
|
471
|
-
selectRowByIndex(index) {
|
|
472
|
-
return this.getRowByIndex(index).select();
|
|
482
|
+
selectRowByIndex(index, preserve = false) {
|
|
483
|
+
return this.getRowByIndex(index).select(preserve);
|
|
473
484
|
}
|
|
474
|
-
|
|
485
|
+
/**
|
|
486
|
+
* Вибрати масив рядків по індексу.
|
|
487
|
+
* @param indexes починається з 0
|
|
488
|
+
*/
|
|
489
|
+
async selectRowsByIndexes(indexes) {
|
|
490
|
+
for (const index of indexes) {
|
|
491
|
+
await this.selectRowByIndex(index, true);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
getRowElements(timeout) {
|
|
475
495
|
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
476
|
-
|
|
496
|
+
return withCustomTimeouts_default({
|
|
497
|
+
driver: this.driver,
|
|
498
|
+
timeout,
|
|
499
|
+
callback: () => {
|
|
500
|
+
return this.driver.findElements(By6.css(rowsFullCssSelector));
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
async getRows() {
|
|
505
|
+
const rows = await this.getRowElements();
|
|
477
506
|
const result = [];
|
|
478
507
|
rows.forEach((_, index) => {
|
|
479
508
|
const newRow = new Row(
|
|
@@ -559,6 +588,72 @@ var Table = class extends AbstractElementWithParent {
|
|
|
559
588
|
await contextMenu(cellElement, this.driver);
|
|
560
589
|
});
|
|
561
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* Отримує значення комірки таблиці за ім'ям комірки та індексом рядка.
|
|
593
|
+
*
|
|
594
|
+
* @param {string} cellName - Ім'я комірки (поля) в таблиці
|
|
595
|
+
* @param {number} rowIndex - Індекс рядка (починається з 0)
|
|
596
|
+
* @throws {Error} Викидає помилку, якщо rowIndex не вказано
|
|
597
|
+
* @returns {Promise<string>} Повертає значення комірки
|
|
598
|
+
*
|
|
599
|
+
* @example
|
|
600
|
+
* const table = new Table(driver);
|
|
601
|
+
*
|
|
602
|
+
* // Отримання значення комірки 'Name' в першому рядку (індекс 0)
|
|
603
|
+
* const cellValue = await table.getCellValueByCellName('Name', 0);
|
|
604
|
+
* expect(cellValue).toBe('Очікуване значення');
|
|
605
|
+
*/
|
|
606
|
+
getCellValueByCellName(cellName, rowIndex) {
|
|
607
|
+
if (rowIndex == null) {
|
|
608
|
+
throw new Error("Error: getCellValue(): rowIndex is required");
|
|
609
|
+
}
|
|
610
|
+
const row = this.getRowByIndex(rowIndex);
|
|
611
|
+
return row.getCell(cellName).getValue();
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
|
|
615
|
+
*
|
|
616
|
+
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
617
|
+
*
|
|
618
|
+
* @example
|
|
619
|
+
* const table = new Table(driver);
|
|
620
|
+
*
|
|
621
|
+
* // Перевірка чи порожня таблиця
|
|
622
|
+
* const empty = await table.isEmpty();
|
|
623
|
+
* expect(empty).toBe(true);
|
|
624
|
+
*/
|
|
625
|
+
async isEmpty() {
|
|
626
|
+
try {
|
|
627
|
+
await this.waitRowsCount(0);
|
|
628
|
+
return true;
|
|
629
|
+
} catch {
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
635
|
+
* Використовується для синхронізації тестів з динамічним завантаженням даних.
|
|
636
|
+
*
|
|
637
|
+
* @param {number} count - Очікувана кількість рядків у таблиці
|
|
638
|
+
* @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
|
|
639
|
+
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
640
|
+
*
|
|
641
|
+
* @example
|
|
642
|
+
* const table = new Table(driver);
|
|
643
|
+
*
|
|
644
|
+
* // Очікування, поки таблиця не стане порожньою
|
|
645
|
+
* await table.waitRowsCount(0);
|
|
646
|
+
*
|
|
647
|
+
* // Очікування, поки в таблиці не з'явиться 5 рядків
|
|
648
|
+
* await table.waitRowsCount(5);
|
|
649
|
+
* console.log('Таблиця містить 5 рядків');
|
|
650
|
+
*/
|
|
651
|
+
async waitRowsCount(count) {
|
|
652
|
+
await safeWait(async () => {
|
|
653
|
+
const rows = await this.getRowElements(1e3);
|
|
654
|
+
return rows.length === count;
|
|
655
|
+
}, this.driver, `Rows count not equal: ${count}`);
|
|
656
|
+
}
|
|
562
657
|
};
|
|
563
658
|
|
|
564
659
|
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
@@ -776,6 +871,14 @@ var ToolbarItem = class extends AbstractElementWithParent {
|
|
|
776
871
|
return false;
|
|
777
872
|
}
|
|
778
873
|
}
|
|
874
|
+
async isPressed() {
|
|
875
|
+
try {
|
|
876
|
+
await this.init();
|
|
877
|
+
return this._button.isPressed();
|
|
878
|
+
} catch (error) {
|
|
879
|
+
return false;
|
|
880
|
+
}
|
|
881
|
+
}
|
|
779
882
|
async getTitle() {
|
|
780
883
|
await this.init();
|
|
781
884
|
return await this._button.getTitle();
|
|
@@ -1161,7 +1264,7 @@ var HeaderFilterField = class extends AbstractEditor {
|
|
|
1161
1264
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
1162
1265
|
var APPLY_SELECTOR = ".apply-button";
|
|
1163
1266
|
var CANCEL_SELECTOR = ".cancel-button";
|
|
1164
|
-
var HEADER_FILTER_ICON = ".
|
|
1267
|
+
var HEADER_FILTER_ICON = ".indicators-container .filter-icon";
|
|
1165
1268
|
var HEADER_FILTER_CONTAINER = ".header-filter";
|
|
1166
1269
|
var HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
1167
1270
|
var ColumnFilter = class extends AbstractElement {
|
|
@@ -1195,24 +1298,15 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
1195
1298
|
const columnEl = await this._column.getElement();
|
|
1196
1299
|
const actions = this.driver.actions({ async: true });
|
|
1197
1300
|
await actions.move({ origin: columnEl }).perform();
|
|
1198
|
-
const
|
|
1199
|
-
let headerFilterIcon =
|
|
1301
|
+
const headerFilterIconBy = By11.css(HEADER_FILTER_ICON);
|
|
1302
|
+
let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
|
|
1200
1303
|
await safeWait(
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
for (let element of elements) {
|
|
1204
|
-
if (await element.isDisplayed()) {
|
|
1205
|
-
headerFilterIcon = element;
|
|
1206
|
-
result = true;
|
|
1207
|
-
break;
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
return result;
|
|
1304
|
+
() => {
|
|
1305
|
+
return headerFilterIcon.isDisplayed();
|
|
1211
1306
|
},
|
|
1212
1307
|
this.driver,
|
|
1213
1308
|
`HeaderFilter "${this._name}" is not visible`
|
|
1214
1309
|
);
|
|
1215
|
-
if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
1216
1310
|
await click(headerFilterIcon, this.driver);
|
|
1217
1311
|
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
1218
1312
|
const filterEl = await filter.getElement();
|
|
@@ -1335,9 +1429,9 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
1335
1429
|
};
|
|
1336
1430
|
|
|
1337
1431
|
// src/pageObjects/elements/Forms/ListForm.ts
|
|
1338
|
-
var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content
|
|
1339
|
-
var DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content
|
|
1340
|
-
var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-
|
|
1432
|
+
var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
1433
|
+
var DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
1434
|
+
var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-sticky-columns .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
1341
1435
|
var CONTEXT_MENU_CSS_SELECTOR = ".dx-datagrid";
|
|
1342
1436
|
var ListForm = class extends Form {
|
|
1343
1437
|
headerCssSelector;
|