d5-testing-library 1.9.0-alpha.11 → 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.
@@ -0,0 +1,7 @@
1
+ import {
2
+ FormEdit
3
+ } from "./chunk-GKKE46HC.mjs";
4
+ import "./chunk-7Q4DN33H.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-3BW4OQJU.mjs";
4
+ import "./chunk-7Q4DN33H.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-EZHIWNAS.mjs";
4
+ import "./chunk-3BW4OQJU.mjs";
5
+ import "./chunk-7Q4DN33H.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -17,8 +17,9 @@ import {
17
17
  safeWait,
18
18
  staleElementAction,
19
19
  waitElementIsClickable_default,
20
- waitElementIsVisible_default
21
- } from "./chunk-BVVGX5JV.mjs";
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
- async getRows() {
494
+ getRowElements(timeout) {
494
495
  const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
495
- const rows = await this.driver.findElements(By6.css(rowsFullCssSelector));
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
- if (count === 0) {
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 = ".dx-column-indicators .dx-header-filter";
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 elements = await columnEl.findElements(By11.css(HEADER_FILTER_ICON));
1256
- let headerFilterIcon = null;
1301
+ const headerFilterIconBy = By11.css(HEADER_FILTER_ICON);
1302
+ let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
1257
1303
  await safeWait(
1258
- async () => {
1259
- let result = false;
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 driver.manage().setTimeouts({ implicit: timeout });
365
- optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
366
- await click(optElement, driver);
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 driver.manage().setTimeouts({ implicit: timeout });
718
- const calendarPopoverElement = await driver.findElement(By11.css(calendarPopoverSelector));
719
- const customOptionList = calendarPopoverElement.findElement(By11.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
720
- optElement = await customOptionList.findElement(By11.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
721
- await click(optElement, driver);
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-ZXNRKZ6M.mjs")).default;
1309
+ SubFormFactoryClass = (await import("./ListForm-USO4QHZ7.mjs")).default;
1298
1310
  break;
1299
1311
  case "3" /* TREE */:
1300
- SubFormFactoryClass = (await import("./TreeView-MHMEFMAT.mjs")).default;
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-NTNY3YFF.mjs")).default;
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,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ListForm
3
- } from "./chunk-TUQMPYW7.mjs";
3
+ } from "./chunk-3BW4OQJU.mjs";
4
4
 
5
5
  // src/pageObjects/elements/Forms/TreeView.ts
6
6
  var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
@@ -3,7 +3,7 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  safeWait
6
- } from "./chunk-BVVGX5JV.mjs";
6
+ } from "./chunk-7Q4DN33H.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
@@ -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 driver.manage().setTimeouts({ implicit: timeout });
534
- optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
535
- await click(optElement, driver);
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 driver.manage().setTimeouts({ implicit: timeout });
975
- const calendarPopoverElement = await driver.findElement(import_selenium_webdriver15.By.css(calendarPopoverSelector));
976
- const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver15.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
977
- optElement = await customOptionList.findElement(import_selenium_webdriver15.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
978
- await click(optElement, driver);
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
- async getRows() {
2282
+ getRowElements(timeout) {
2262
2283
  const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
2263
- const rows = await this.driver.findElements(import_selenium_webdriver25.By.css(rowsFullCssSelector));
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
- if (count === 0) {
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 = ".dx-column-indicators .dx-header-filter";
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 elements = await columnEl.findElements(import_selenium_webdriver30.By.css(HEADER_FILTER_ICON));
3141
- let headerFilterIcon = null;
3206
+ const headerFilterIconBy = import_selenium_webdriver30.By.css(HEADER_FILTER_ICON);
3207
+ let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
3142
3208
  await safeWait(
3143
- async () => {
3144
- let result = false;
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();
@@ -3685,6 +3742,7 @@ init_locators();
3685
3742
  var import_selenium_webdriver4 = require("selenium-webdriver");
3686
3743
  var import_node_path = __toESM(require("path"));
3687
3744
  var import_node_fs = __toESM(require("fs"));
3745
+ var import_node_os = __toESM(require("os"));
3688
3746
  init_config();
3689
3747
  var import_chrome = __toESM(require("selenium-webdriver/chrome"));
3690
3748
  var import_firefox = __toESM(require("selenium-webdriver/firefox"));
@@ -3694,8 +3752,9 @@ function chromeOptions(builder, options) {
3694
3752
  ChromeOptions.addArguments(`--headless=new`);
3695
3753
  ChromeOptions.addArguments(`--disable-gpu`);
3696
3754
  ChromeOptions.addArguments(`--disable-dev-shm-usage`);
3755
+ ChromeOptions.addArguments(`--window-size=1920,1080`);
3697
3756
  }
3698
- const userDataDir = import_node_path.default.resolve("./.chrome-cache");
3757
+ const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
3699
3758
  if (!import_node_fs.default.existsSync(userDataDir)) {
3700
3759
  import_node_fs.default.mkdirSync(userDataDir, { recursive: true });
3701
3760
  }
@@ -3727,7 +3786,9 @@ var createDriver = async (browser) => {
3727
3786
  const driver = await builder.build();
3728
3787
  const manage = driver.manage();
3729
3788
  await manage.setTimeouts({ implicit: config().timeout });
3730
- await manage.window().maximize();
3789
+ if (!headless) {
3790
+ await manage.window().maximize();
3791
+ }
3731
3792
  return driver;
3732
3793
  };
3733
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-EMZGYTYY.mjs";
3
+ } from "./chunk-EZHIWNAS.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-TUQMPYW7.mjs";
9
+ } from "./chunk-3BW4OQJU.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-IL7WDMOX.mjs";
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-BVVGX5JV.mjs";
35
+ } from "./chunk-7Q4DN33H.mjs";
36
36
 
37
37
  // src/pageObjects/pages/LoginPage.ts
38
38
  import { By } from "selenium-webdriver";
@@ -80,6 +80,7 @@ var LoginPage = class extends AbstractPage {
80
80
  import { Builder } from "selenium-webdriver";
81
81
  import path from "node:path";
82
82
  import fs from "node:fs";
83
+ import os from "node:os";
83
84
  import Chrome from "selenium-webdriver/chrome";
84
85
  import Firefox from "selenium-webdriver/firefox";
85
86
  function chromeOptions(builder, options) {
@@ -88,8 +89,9 @@ function chromeOptions(builder, options) {
88
89
  ChromeOptions.addArguments(`--headless=new`);
89
90
  ChromeOptions.addArguments(`--disable-gpu`);
90
91
  ChromeOptions.addArguments(`--disable-dev-shm-usage`);
92
+ ChromeOptions.addArguments(`--window-size=1920,1080`);
91
93
  }
92
- const userDataDir = path.resolve("./.chrome-cache");
94
+ const userDataDir = path.join(os.tmpdir(), ".chrome-cache");
93
95
  if (!fs.existsSync(userDataDir)) {
94
96
  fs.mkdirSync(userDataDir, { recursive: true });
95
97
  }
@@ -121,7 +123,9 @@ var createDriver = async (browser) => {
121
123
  const driver = await builder.build();
122
124
  const manage = driver.manage();
123
125
  await manage.setTimeouts({ implicit: config().timeout });
124
- await manage.window().maximize();
126
+ if (!headless) {
127
+ await manage.window().maximize();
128
+ }
125
129
  return driver;
126
130
  };
127
131
 
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  TreeView
3
- } from "./chunk-EMZGYTYY.mjs";
3
+ } from "./chunk-EZHIWNAS.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-TUQMPYW7.mjs";
9
+ } from "./chunk-3BW4OQJU.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-IL7WDMOX.mjs";
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-BVVGX5JV.mjs";
35
+ } from "./chunk-7Q4DN33H.mjs";
36
36
 
37
37
  // src/pageObjects/pages/LoginPage.ts
38
38
  import { By } from "selenium-webdriver";
@@ -80,6 +80,7 @@ var LoginPage = class extends AbstractPage {
80
80
  import { Builder } from "selenium-webdriver";
81
81
  import path from "node:path";
82
82
  import fs from "node:fs";
83
+ import os from "node:os";
83
84
  import Chrome from "selenium-webdriver/chrome";
84
85
  import Firefox from "selenium-webdriver/firefox";
85
86
  function chromeOptions(builder, options) {
@@ -88,8 +89,9 @@ function chromeOptions(builder, options) {
88
89
  ChromeOptions.addArguments(`--headless=new`);
89
90
  ChromeOptions.addArguments(`--disable-gpu`);
90
91
  ChromeOptions.addArguments(`--disable-dev-shm-usage`);
92
+ ChromeOptions.addArguments(`--window-size=1920,1080`);
91
93
  }
92
- const userDataDir = path.resolve("./.chrome-cache");
94
+ const userDataDir = path.join(os.tmpdir(), ".chrome-cache");
93
95
  if (!fs.existsSync(userDataDir)) {
94
96
  fs.mkdirSync(userDataDir, { recursive: true });
95
97
  }
@@ -121,7 +123,9 @@ var createDriver = async (browser) => {
121
123
  const driver = await builder.build();
122
124
  const manage = driver.manage();
123
125
  await manage.setTimeouts({ implicit: config().timeout });
124
- await manage.window().maximize();
126
+ if (!headless) {
127
+ await manage.window().maximize();
128
+ }
125
129
  return driver;
126
130
  };
127
131
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "d5-testing-library",
3
- "version": "1.9.0-alpha.11",
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.29.0",
41
+ "selenium-webdriver": "4.33.0",
42
42
  "typescript": "5.8.2"
43
43
  },
44
44
  "devDependencies": {
45
- "@babel/core": "7.26.9",
45
+ "@babel/core": "7.27.4",
46
46
  "@types/node": "20.11.16",
47
- "@types/jest": "29.5.14",
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": "29.7.0",
53
- "ts-jest": "29.2.6",
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.29.0"
57
+ "selenium-webdriver": "4.33.0"
58
58
  },
59
59
  "jest": {
60
60
  "preset": "ts-jest",
@@ -1,7 +0,0 @@
1
- import {
2
- FormEdit
3
- } from "./chunk-IL7WDMOX.mjs";
4
- import "./chunk-BVVGX5JV.mjs";
5
- export {
6
- FormEdit as default
7
- };
@@ -1,7 +0,0 @@
1
- import {
2
- ListForm
3
- } from "./chunk-TUQMPYW7.mjs";
4
- import "./chunk-BVVGX5JV.mjs";
5
- export {
6
- ListForm as default
7
- };
@@ -1,8 +0,0 @@
1
- import {
2
- TreeView
3
- } from "./chunk-EMZGYTYY.mjs";
4
- import "./chunk-TUQMPYW7.mjs";
5
- import "./chunk-BVVGX5JV.mjs";
6
- export {
7
- TreeView as default
8
- };