d5-testing-library 1.9.0-alpha.12 → 1.9.0-alpha.13
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-IXS2Z4YR.mjs +7 -0
- package/dist/ListForm-USO4QHZ7.mjs +7 -0
- package/dist/TreeView-AIQ3JONR.mjs +8 -0
- package/dist/{chunk-TUQMPYW7.mjs → chunk-3BW4OQJU.mjs} +58 -21
- package/dist/{chunk-BVVGX5JV.mjs → chunk-7Q4DN33H.mjs} +34 -21
- package/dist/{chunk-EMZGYTYY.mjs → chunk-EZHIWNAS.mjs} +1 -1
- package/dist/{chunk-IL7WDMOX.mjs → chunk-GKKE46HC.mjs} +1 -1
- package/dist/cjs/d5-testing-library.cjs +98 -38
- package/dist/cjs/d5-testing-library.d.ts +32 -0
- package/dist/d5-testing-library.d.mts +32 -0
- package/dist/d5-testing-library.legacy-esm.js +8 -5
- package/dist/d5-testing-library.mjs +8 -5
- package/package.json +7 -7
- package/dist/FormEdit-NTNY3YFF.mjs +0 -7
- package/dist/ListForm-ZXNRKZ6M.mjs +0 -7
- package/dist/TreeView-MHMEFMAT.mjs +0 -8
|
@@ -17,8 +17,9 @@ import {
|
|
|
17
17
|
safeWait,
|
|
18
18
|
staleElementAction,
|
|
19
19
|
waitElementIsClickable_default,
|
|
20
|
-
waitElementIsVisible_default
|
|
21
|
-
|
|
20
|
+
waitElementIsVisible_default,
|
|
21
|
+
withCustomTimeouts_default
|
|
22
|
+
} from "./chunk-7Q4DN33H.mjs";
|
|
22
23
|
|
|
23
24
|
// src/pageObjects/elements/Table/Table.ts
|
|
24
25
|
import { By as By6 } from "selenium-webdriver";
|
|
@@ -490,9 +491,18 @@ var Table = class extends AbstractElementWithParent {
|
|
|
490
491
|
await this.selectRowByIndex(index, true);
|
|
491
492
|
}
|
|
492
493
|
}
|
|
493
|
-
|
|
494
|
+
getRowElements(timeout) {
|
|
494
495
|
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
495
|
-
|
|
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();
|
|
496
506
|
const result = [];
|
|
497
507
|
rows.forEach((_, index) => {
|
|
498
508
|
const newRow = new Row(
|
|
@@ -600,11 +610,47 @@ var Table = class extends AbstractElementWithParent {
|
|
|
600
610
|
const row = this.getRowByIndex(rowIndex);
|
|
601
611
|
return row.getCell(cellName).getValue();
|
|
602
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
|
+
*/
|
|
603
651
|
async waitRowsCount(count) {
|
|
604
652
|
await safeWait(async () => {
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
const rows = await this.getRows();
|
|
653
|
+
const rows = await this.getRowElements(1e3);
|
|
608
654
|
return rows.length === count;
|
|
609
655
|
}, this.driver, `Rows count not equal: ${count}`);
|
|
610
656
|
}
|
|
@@ -1218,7 +1264,7 @@ var HeaderFilterField = class extends AbstractEditor {
|
|
|
1218
1264
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
1219
1265
|
var APPLY_SELECTOR = ".apply-button";
|
|
1220
1266
|
var CANCEL_SELECTOR = ".cancel-button";
|
|
1221
|
-
var HEADER_FILTER_ICON = ".
|
|
1267
|
+
var HEADER_FILTER_ICON = ".indicators .header-filter-indicator-icon";
|
|
1222
1268
|
var HEADER_FILTER_CONTAINER = ".header-filter";
|
|
1223
1269
|
var HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
1224
1270
|
var ColumnFilter = class extends AbstractElement {
|
|
@@ -1252,24 +1298,15 @@ var ColumnFilter = class extends AbstractElement {
|
|
|
1252
1298
|
const columnEl = await this._column.getElement();
|
|
1253
1299
|
const actions = this.driver.actions({ async: true });
|
|
1254
1300
|
await actions.move({ origin: columnEl }).perform();
|
|
1255
|
-
const
|
|
1256
|
-
let headerFilterIcon =
|
|
1301
|
+
const headerFilterIconBy = By11.css(HEADER_FILTER_ICON);
|
|
1302
|
+
let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
|
|
1257
1303
|
await safeWait(
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
for (let element of elements) {
|
|
1261
|
-
if (await element.isDisplayed()) {
|
|
1262
|
-
headerFilterIcon = element;
|
|
1263
|
-
result = true;
|
|
1264
|
-
break;
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
return result;
|
|
1304
|
+
() => {
|
|
1305
|
+
return headerFilterIcon.isDisplayed();
|
|
1268
1306
|
},
|
|
1269
1307
|
this.driver,
|
|
1270
1308
|
`HeaderFilter "${this._name}" is not visible`
|
|
1271
1309
|
);
|
|
1272
|
-
if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
1273
1310
|
await click(headerFilterIcon, this.driver);
|
|
1274
1311
|
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
1275
1312
|
const filterEl = await filter.getElement();
|
|
@@ -352,22 +352,34 @@ var ClearButtonStrategy = class {
|
|
|
352
352
|
}
|
|
353
353
|
};
|
|
354
354
|
|
|
355
|
+
// src/utils/withCustomTimeouts.ts
|
|
356
|
+
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
357
|
+
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
358
|
+
try {
|
|
359
|
+
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
360
|
+
return await callback();
|
|
361
|
+
} finally {
|
|
362
|
+
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
var withCustomTimeouts_default = withCustomTimeouts;
|
|
366
|
+
|
|
355
367
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
356
368
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
357
369
|
var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
358
370
|
var dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
359
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
360
|
-
let optElement = null;
|
|
361
|
-
const timeout = delay ? implicit : 200;
|
|
362
371
|
let err = null;
|
|
363
372
|
try {
|
|
364
|
-
await
|
|
365
|
-
|
|
366
|
-
|
|
373
|
+
await withCustomTimeouts_default({
|
|
374
|
+
driver,
|
|
375
|
+
timeout: delay ? void 0 : 200,
|
|
376
|
+
callback: async () => {
|
|
377
|
+
let optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
|
|
378
|
+
await click(optElement, driver);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
367
381
|
} catch (e) {
|
|
368
382
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
369
|
-
} finally {
|
|
370
|
-
await driver.manage().setTimeouts({ implicit });
|
|
371
383
|
}
|
|
372
384
|
if (err)
|
|
373
385
|
throw err;
|
|
@@ -708,21 +720,21 @@ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
|
708
720
|
var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
709
721
|
var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
710
722
|
var dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
|
|
711
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
712
|
-
let optElement = null;
|
|
713
|
-
const timeout = delay ? implicit : 600;
|
|
714
723
|
let err = null;
|
|
715
724
|
try {
|
|
716
725
|
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
717
|
-
await
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
726
|
+
await withCustomTimeouts_default({
|
|
727
|
+
driver,
|
|
728
|
+
timeout: delay ? void 0 : 600,
|
|
729
|
+
callback: async () => {
|
|
730
|
+
const calendarPopoverElement = await driver.findElement(By11.css(calendarPopoverSelector));
|
|
731
|
+
const customOptionList = calendarPopoverElement.findElement(By11.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
732
|
+
const optElement = await customOptionList.findElement(By11.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
733
|
+
await click(optElement, driver);
|
|
734
|
+
}
|
|
735
|
+
});
|
|
722
736
|
} catch (e) {
|
|
723
737
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
724
|
-
} finally {
|
|
725
|
-
await driver.manage().setTimeouts({ implicit });
|
|
726
738
|
}
|
|
727
739
|
if (err)
|
|
728
740
|
throw err;
|
|
@@ -1294,15 +1306,15 @@ async function classDependencyInjector(formType) {
|
|
|
1294
1306
|
let SubFormFactoryClass;
|
|
1295
1307
|
switch (formType) {
|
|
1296
1308
|
case "1" /* LIST */:
|
|
1297
|
-
SubFormFactoryClass = (await import("./ListForm-
|
|
1309
|
+
SubFormFactoryClass = (await import("./ListForm-USO4QHZ7.mjs")).default;
|
|
1298
1310
|
break;
|
|
1299
1311
|
case "3" /* TREE */:
|
|
1300
|
-
SubFormFactoryClass = (await import("./TreeView-
|
|
1312
|
+
SubFormFactoryClass = (await import("./TreeView-AIQ3JONR.mjs")).default;
|
|
1301
1313
|
break;
|
|
1302
1314
|
case "2" /* EDIT */:
|
|
1303
1315
|
case "99" /* FREE_FORM */:
|
|
1304
1316
|
case "4" /* REPORT */:
|
|
1305
|
-
SubFormFactoryClass = (await import("./FormEdit-
|
|
1317
|
+
SubFormFactoryClass = (await import("./FormEdit-IXS2Z4YR.mjs")).default;
|
|
1306
1318
|
break;
|
|
1307
1319
|
default:
|
|
1308
1320
|
throw new Error(`Unsupported form type ${formType}`);
|
|
@@ -1401,6 +1413,7 @@ export {
|
|
|
1401
1413
|
NumberEditor,
|
|
1402
1414
|
ControlClass,
|
|
1403
1415
|
DX_CLEAR_BUTTON_AREA,
|
|
1416
|
+
withCustomTimeouts_default,
|
|
1404
1417
|
editorFactory,
|
|
1405
1418
|
createDocFilterTestId,
|
|
1406
1419
|
createHeaderFilterTestId,
|
|
@@ -512,6 +512,24 @@ var init_ClearButtonStrategy = __esm({
|
|
|
512
512
|
}
|
|
513
513
|
});
|
|
514
514
|
|
|
515
|
+
// src/utils/withCustomTimeouts.ts
|
|
516
|
+
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
517
|
+
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
518
|
+
try {
|
|
519
|
+
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
520
|
+
return await callback();
|
|
521
|
+
} finally {
|
|
522
|
+
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
var withCustomTimeouts_default;
|
|
526
|
+
var init_withCustomTimeouts = __esm({
|
|
527
|
+
"src/utils/withCustomTimeouts.ts"() {
|
|
528
|
+
"use strict";
|
|
529
|
+
withCustomTimeouts_default = withCustomTimeouts;
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
|
|
515
533
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
516
534
|
var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
517
535
|
var init_SelectBoxEditor = __esm({
|
|
@@ -522,21 +540,22 @@ var init_SelectBoxEditor = __esm({
|
|
|
522
540
|
init_xpathHelper();
|
|
523
541
|
init_actions();
|
|
524
542
|
init_ClearButtonStrategy();
|
|
543
|
+
init_withCustomTimeouts();
|
|
525
544
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
526
545
|
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
527
546
|
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
528
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
529
|
-
let optElement = null;
|
|
530
|
-
const timeout = delay ? implicit : 200;
|
|
531
547
|
let err = null;
|
|
532
548
|
try {
|
|
533
|
-
await
|
|
534
|
-
|
|
535
|
-
|
|
549
|
+
await withCustomTimeouts_default({
|
|
550
|
+
driver,
|
|
551
|
+
timeout: delay ? void 0 : 200,
|
|
552
|
+
callback: async () => {
|
|
553
|
+
let optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
|
|
554
|
+
await click(optElement, driver);
|
|
555
|
+
}
|
|
556
|
+
});
|
|
536
557
|
} catch (e) {
|
|
537
558
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
538
|
-
} finally {
|
|
539
|
-
await driver.manage().setTimeouts({ implicit });
|
|
540
559
|
}
|
|
541
560
|
if (err)
|
|
542
561
|
throw err;
|
|
@@ -957,6 +976,7 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
957
976
|
init_locators();
|
|
958
977
|
init_ClearButtonStrategy();
|
|
959
978
|
init_fixElementStaleError();
|
|
979
|
+
init_withCustomTimeouts();
|
|
960
980
|
TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
961
981
|
DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
962
982
|
DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
@@ -965,21 +985,21 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
965
985
|
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
966
986
|
combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
967
987
|
dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
|
|
968
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
969
|
-
let optElement = null;
|
|
970
|
-
const timeout = delay ? implicit : 600;
|
|
971
988
|
let err = null;
|
|
972
989
|
try {
|
|
973
990
|
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
974
|
-
await
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
991
|
+
await withCustomTimeouts_default({
|
|
992
|
+
driver,
|
|
993
|
+
timeout: delay ? void 0 : 600,
|
|
994
|
+
callback: async () => {
|
|
995
|
+
const calendarPopoverElement = await driver.findElement(import_selenium_webdriver15.By.css(calendarPopoverSelector));
|
|
996
|
+
const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver15.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
997
|
+
const optElement = await customOptionList.findElement(import_selenium_webdriver15.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
998
|
+
await click(optElement, driver);
|
|
999
|
+
}
|
|
1000
|
+
});
|
|
979
1001
|
} catch (e) {
|
|
980
1002
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
981
|
-
} finally {
|
|
982
|
-
await driver.manage().setTimeouts({ implicit });
|
|
983
1003
|
}
|
|
984
1004
|
if (err)
|
|
985
1005
|
throw err;
|
|
@@ -2179,6 +2199,7 @@ var init_Table = __esm({
|
|
|
2179
2199
|
init_ContextMenu();
|
|
2180
2200
|
init_actions();
|
|
2181
2201
|
init_wait();
|
|
2202
|
+
init_withCustomTimeouts();
|
|
2182
2203
|
Table = class extends AbstractElementWithParent {
|
|
2183
2204
|
formName;
|
|
2184
2205
|
headerCssSelector;
|
|
@@ -2258,9 +2279,18 @@ var init_Table = __esm({
|
|
|
2258
2279
|
await this.selectRowByIndex(index, true);
|
|
2259
2280
|
}
|
|
2260
2281
|
}
|
|
2261
|
-
|
|
2282
|
+
getRowElements(timeout) {
|
|
2262
2283
|
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
2263
|
-
|
|
2284
|
+
return withCustomTimeouts_default({
|
|
2285
|
+
driver: this.driver,
|
|
2286
|
+
timeout,
|
|
2287
|
+
callback: () => {
|
|
2288
|
+
return this.driver.findElements(import_selenium_webdriver25.By.css(rowsFullCssSelector));
|
|
2289
|
+
}
|
|
2290
|
+
});
|
|
2291
|
+
}
|
|
2292
|
+
async getRows() {
|
|
2293
|
+
const rows = await this.getRowElements();
|
|
2264
2294
|
const result = [];
|
|
2265
2295
|
rows.forEach((_, index) => {
|
|
2266
2296
|
const newRow = new Row(
|
|
@@ -2368,11 +2398,47 @@ var init_Table = __esm({
|
|
|
2368
2398
|
const row = this.getRowByIndex(rowIndex);
|
|
2369
2399
|
return row.getCell(cellName).getValue();
|
|
2370
2400
|
}
|
|
2401
|
+
/**
|
|
2402
|
+
* Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
|
|
2403
|
+
*
|
|
2404
|
+
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
2405
|
+
*
|
|
2406
|
+
* @example
|
|
2407
|
+
* const table = new Table(driver);
|
|
2408
|
+
*
|
|
2409
|
+
* // Перевірка чи порожня таблиця
|
|
2410
|
+
* const empty = await table.isEmpty();
|
|
2411
|
+
* expect(empty).toBe(true);
|
|
2412
|
+
*/
|
|
2413
|
+
async isEmpty() {
|
|
2414
|
+
try {
|
|
2415
|
+
await this.waitRowsCount(0);
|
|
2416
|
+
return true;
|
|
2417
|
+
} catch {
|
|
2418
|
+
return false;
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
2421
|
+
/**
|
|
2422
|
+
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
2423
|
+
* Використовується для синхронізації тестів з динамічним завантаженням даних.
|
|
2424
|
+
*
|
|
2425
|
+
* @param {number} count - Очікувана кількість рядків у таблиці
|
|
2426
|
+
* @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
|
|
2427
|
+
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
2428
|
+
*
|
|
2429
|
+
* @example
|
|
2430
|
+
* const table = new Table(driver);
|
|
2431
|
+
*
|
|
2432
|
+
* // Очікування, поки таблиця не стане порожньою
|
|
2433
|
+
* await table.waitRowsCount(0);
|
|
2434
|
+
*
|
|
2435
|
+
* // Очікування, поки в таблиці не з'явиться 5 рядків
|
|
2436
|
+
* await table.waitRowsCount(5);
|
|
2437
|
+
* console.log('Таблиця містить 5 рядків');
|
|
2438
|
+
*/
|
|
2371
2439
|
async waitRowsCount(count) {
|
|
2372
2440
|
await safeWait(async () => {
|
|
2373
|
-
|
|
2374
|
-
}
|
|
2375
|
-
const rows = await this.getRows();
|
|
2441
|
+
const rows = await this.getRowElements(1e3);
|
|
2376
2442
|
return rows.length === count;
|
|
2377
2443
|
}, this.driver, `Rows count not equal: ${count}`);
|
|
2378
2444
|
}
|
|
@@ -3103,7 +3169,7 @@ var init_ColumnFilter = __esm({
|
|
|
3103
3169
|
init_wait();
|
|
3104
3170
|
APPLY_SELECTOR = ".apply-button";
|
|
3105
3171
|
CANCEL_SELECTOR = ".cancel-button";
|
|
3106
|
-
HEADER_FILTER_ICON = ".
|
|
3172
|
+
HEADER_FILTER_ICON = ".indicators .header-filter-indicator-icon";
|
|
3107
3173
|
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
3108
3174
|
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
3109
3175
|
ColumnFilter = class extends AbstractElement {
|
|
@@ -3137,24 +3203,15 @@ var init_ColumnFilter = __esm({
|
|
|
3137
3203
|
const columnEl = await this._column.getElement();
|
|
3138
3204
|
const actions = this.driver.actions({ async: true });
|
|
3139
3205
|
await actions.move({ origin: columnEl }).perform();
|
|
3140
|
-
const
|
|
3141
|
-
let headerFilterIcon =
|
|
3206
|
+
const headerFilterIconBy = import_selenium_webdriver30.By.css(HEADER_FILTER_ICON);
|
|
3207
|
+
let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
|
|
3142
3208
|
await safeWait(
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
for (let element of elements) {
|
|
3146
|
-
if (await element.isDisplayed()) {
|
|
3147
|
-
headerFilterIcon = element;
|
|
3148
|
-
result = true;
|
|
3149
|
-
break;
|
|
3150
|
-
}
|
|
3151
|
-
}
|
|
3152
|
-
return result;
|
|
3209
|
+
() => {
|
|
3210
|
+
return headerFilterIcon.isDisplayed();
|
|
3153
3211
|
},
|
|
3154
3212
|
this.driver,
|
|
3155
3213
|
`HeaderFilter "${this._name}" is not visible`
|
|
3156
3214
|
);
|
|
3157
|
-
if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
3158
3215
|
await click(headerFilterIcon, this.driver);
|
|
3159
3216
|
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
3160
3217
|
const filterEl = await filter.getElement();
|
|
@@ -3695,6 +3752,7 @@ function chromeOptions(builder, options) {
|
|
|
3695
3752
|
ChromeOptions.addArguments(`--headless=new`);
|
|
3696
3753
|
ChromeOptions.addArguments(`--disable-gpu`);
|
|
3697
3754
|
ChromeOptions.addArguments(`--disable-dev-shm-usage`);
|
|
3755
|
+
ChromeOptions.addArguments(`--window-size=1920,1080`);
|
|
3698
3756
|
}
|
|
3699
3757
|
const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
|
|
3700
3758
|
if (!import_node_fs.default.existsSync(userDataDir)) {
|
|
@@ -3728,7 +3786,9 @@ var createDriver = async (browser) => {
|
|
|
3728
3786
|
const driver = await builder.build();
|
|
3729
3787
|
const manage = driver.manage();
|
|
3730
3788
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
3731
|
-
|
|
3789
|
+
if (!headless) {
|
|
3790
|
+
await manage.window().maximize();
|
|
3791
|
+
}
|
|
3732
3792
|
return driver;
|
|
3733
3793
|
};
|
|
3734
3794
|
|
|
@@ -655,6 +655,7 @@ declare class Table extends AbstractElementWithParent {
|
|
|
655
655
|
* @param indexes починається з 0
|
|
656
656
|
*/
|
|
657
657
|
selectRowsByIndexes(indexes: number[]): Promise<void>;
|
|
658
|
+
protected getRowElements(timeout?: number): Promise<selenium_webdriver.WebElement[]>;
|
|
658
659
|
getRows(): Promise<Row[]>;
|
|
659
660
|
getColumns(): Promise<Column[]>;
|
|
660
661
|
element(): Promise<selenium_webdriver.WebElement>;
|
|
@@ -704,6 +705,37 @@ declare class Table extends AbstractElementWithParent {
|
|
|
704
705
|
* expect(cellValue).toBe('Очікуване значення');
|
|
705
706
|
*/
|
|
706
707
|
getCellValueByCellName(cellName: string, rowIndex: number): Promise<string | number | string[] | Date>;
|
|
708
|
+
/**
|
|
709
|
+
* Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
|
|
710
|
+
*
|
|
711
|
+
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
712
|
+
*
|
|
713
|
+
* @example
|
|
714
|
+
* const table = new Table(driver);
|
|
715
|
+
*
|
|
716
|
+
* // Перевірка чи порожня таблиця
|
|
717
|
+
* const empty = await table.isEmpty();
|
|
718
|
+
* expect(empty).toBe(true);
|
|
719
|
+
*/
|
|
720
|
+
isEmpty(): Promise<boolean>;
|
|
721
|
+
/**
|
|
722
|
+
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
723
|
+
* Використовується для синхронізації тестів з динамічним завантаженням даних.
|
|
724
|
+
*
|
|
725
|
+
* @param {number} count - Очікувана кількість рядків у таблиці
|
|
726
|
+
* @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
|
|
727
|
+
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
728
|
+
*
|
|
729
|
+
* @example
|
|
730
|
+
* const table = new Table(driver);
|
|
731
|
+
*
|
|
732
|
+
* // Очікування, поки таблиця не стане порожньою
|
|
733
|
+
* await table.waitRowsCount(0);
|
|
734
|
+
*
|
|
735
|
+
* // Очікування, поки в таблиці не з'явиться 5 рядків
|
|
736
|
+
* await table.waitRowsCount(5);
|
|
737
|
+
* console.log('Таблиця містить 5 рядків');
|
|
738
|
+
*/
|
|
707
739
|
waitRowsCount(count: number): Promise<void>;
|
|
708
740
|
}
|
|
709
741
|
|
|
@@ -655,6 +655,7 @@ declare class Table extends AbstractElementWithParent {
|
|
|
655
655
|
* @param indexes починається з 0
|
|
656
656
|
*/
|
|
657
657
|
selectRowsByIndexes(indexes: number[]): Promise<void>;
|
|
658
|
+
protected getRowElements(timeout?: number): Promise<selenium_webdriver.WebElement[]>;
|
|
658
659
|
getRows(): Promise<Row[]>;
|
|
659
660
|
getColumns(): Promise<Column[]>;
|
|
660
661
|
element(): Promise<selenium_webdriver.WebElement>;
|
|
@@ -704,6 +705,37 @@ declare class Table extends AbstractElementWithParent {
|
|
|
704
705
|
* expect(cellValue).toBe('Очікуване значення');
|
|
705
706
|
*/
|
|
706
707
|
getCellValueByCellName(cellName: string, rowIndex: number): Promise<string | number | string[] | Date>;
|
|
708
|
+
/**
|
|
709
|
+
* Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
|
|
710
|
+
*
|
|
711
|
+
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
712
|
+
*
|
|
713
|
+
* @example
|
|
714
|
+
* const table = new Table(driver);
|
|
715
|
+
*
|
|
716
|
+
* // Перевірка чи порожня таблиця
|
|
717
|
+
* const empty = await table.isEmpty();
|
|
718
|
+
* expect(empty).toBe(true);
|
|
719
|
+
*/
|
|
720
|
+
isEmpty(): Promise<boolean>;
|
|
721
|
+
/**
|
|
722
|
+
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
723
|
+
* Використовується для синхронізації тестів з динамічним завантаженням даних.
|
|
724
|
+
*
|
|
725
|
+
* @param {number} count - Очікувана кількість рядків у таблиці
|
|
726
|
+
* @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
|
|
727
|
+
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
728
|
+
*
|
|
729
|
+
* @example
|
|
730
|
+
* const table = new Table(driver);
|
|
731
|
+
*
|
|
732
|
+
* // Очікування, поки таблиця не стане порожньою
|
|
733
|
+
* await table.waitRowsCount(0);
|
|
734
|
+
*
|
|
735
|
+
* // Очікування, поки в таблиці не з'явиться 5 рядків
|
|
736
|
+
* await table.waitRowsCount(5);
|
|
737
|
+
* console.log('Таблиця містить 5 рядків');
|
|
738
|
+
*/
|
|
707
739
|
waitRowsCount(count: number): Promise<void>;
|
|
708
740
|
}
|
|
709
741
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TreeView
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EZHIWNAS.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FilterPanel,
|
|
6
6
|
FormFilterField,
|
|
7
7
|
ListForm,
|
|
8
8
|
PanelFilterField
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3BW4OQJU.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FormEdit
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GKKE46HC.mjs";
|
|
13
13
|
import {
|
|
14
14
|
AbstractButton,
|
|
15
15
|
AbstractElement,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
safeWait,
|
|
33
33
|
waitElementIsClickable_default,
|
|
34
34
|
waitElementIsVisible_default
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-7Q4DN33H.mjs";
|
|
36
36
|
|
|
37
37
|
// src/pageObjects/pages/LoginPage.ts
|
|
38
38
|
import { By } from "selenium-webdriver";
|
|
@@ -89,6 +89,7 @@ function chromeOptions(builder, options) {
|
|
|
89
89
|
ChromeOptions.addArguments(`--headless=new`);
|
|
90
90
|
ChromeOptions.addArguments(`--disable-gpu`);
|
|
91
91
|
ChromeOptions.addArguments(`--disable-dev-shm-usage`);
|
|
92
|
+
ChromeOptions.addArguments(`--window-size=1920,1080`);
|
|
92
93
|
}
|
|
93
94
|
const userDataDir = path.join(os.tmpdir(), ".chrome-cache");
|
|
94
95
|
if (!fs.existsSync(userDataDir)) {
|
|
@@ -122,7 +123,9 @@ var createDriver = async (browser) => {
|
|
|
122
123
|
const driver = await builder.build();
|
|
123
124
|
const manage = driver.manage();
|
|
124
125
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
125
|
-
|
|
126
|
+
if (!headless) {
|
|
127
|
+
await manage.window().maximize();
|
|
128
|
+
}
|
|
126
129
|
return driver;
|
|
127
130
|
};
|
|
128
131
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TreeView
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EZHIWNAS.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FilterPanel,
|
|
6
6
|
FormFilterField,
|
|
7
7
|
ListForm,
|
|
8
8
|
PanelFilterField
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3BW4OQJU.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FormEdit
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GKKE46HC.mjs";
|
|
13
13
|
import {
|
|
14
14
|
AbstractButton,
|
|
15
15
|
AbstractElement,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
safeWait,
|
|
33
33
|
waitElementIsClickable_default,
|
|
34
34
|
waitElementIsVisible_default
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-7Q4DN33H.mjs";
|
|
36
36
|
|
|
37
37
|
// src/pageObjects/pages/LoginPage.ts
|
|
38
38
|
import { By } from "selenium-webdriver";
|
|
@@ -89,6 +89,7 @@ function chromeOptions(builder, options) {
|
|
|
89
89
|
ChromeOptions.addArguments(`--headless=new`);
|
|
90
90
|
ChromeOptions.addArguments(`--disable-gpu`);
|
|
91
91
|
ChromeOptions.addArguments(`--disable-dev-shm-usage`);
|
|
92
|
+
ChromeOptions.addArguments(`--window-size=1920,1080`);
|
|
92
93
|
}
|
|
93
94
|
const userDataDir = path.join(os.tmpdir(), ".chrome-cache");
|
|
94
95
|
if (!fs.existsSync(userDataDir)) {
|
|
@@ -122,7 +123,9 @@ var createDriver = async (browser) => {
|
|
|
122
123
|
const driver = await builder.build();
|
|
123
124
|
const manage = driver.manage();
|
|
124
125
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
125
|
-
|
|
126
|
+
if (!headless) {
|
|
127
|
+
await manage.window().maximize();
|
|
128
|
+
}
|
|
126
129
|
return driver;
|
|
127
130
|
};
|
|
128
131
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "d5-testing-library",
|
|
3
|
-
"version": "1.9.0-alpha.
|
|
3
|
+
"version": "1.9.0-alpha.13",
|
|
4
4
|
"description": "e2e testing D5 projects",
|
|
5
5
|
"main": "dist/cjs/d5-testing-library.cjs",
|
|
6
6
|
"module": "dist/d5-testing-library.legacy-esm.js",
|
|
@@ -38,23 +38,23 @@
|
|
|
38
38
|
"author": "",
|
|
39
39
|
"license": "ISC",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"selenium-webdriver": "4.
|
|
41
|
+
"selenium-webdriver": "4.33.0",
|
|
42
42
|
"typescript": "5.8.2"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@babel/core": "7.
|
|
45
|
+
"@babel/core": "7.27.4",
|
|
46
46
|
"@types/node": "20.11.16",
|
|
47
|
-
"@types/jest": "
|
|
47
|
+
"@types/jest": "30.0.0",
|
|
48
48
|
"@types/selenium-webdriver": "4.1.28",
|
|
49
49
|
"commander": "12.1.0",
|
|
50
50
|
"esbuild-extra": "0.4.0",
|
|
51
51
|
"rimraf": "5.0.10",
|
|
52
|
-
"jest": "
|
|
53
|
-
"ts-jest": "29.
|
|
52
|
+
"jest": "30.0.0",
|
|
53
|
+
"ts-jest": "29.4.0",
|
|
54
54
|
"tsup": "8.4.0"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
|
-
"selenium-webdriver": "4.
|
|
57
|
+
"selenium-webdriver": "4.33.0"
|
|
58
58
|
},
|
|
59
59
|
"jest": {
|
|
60
60
|
"preset": "ts-jest",
|