d5-testing-library 1.9.0-alpha.9 → 1.9.0

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.
@@ -1,3 +1,35 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
+ }) : x)(function(x) {
10
+ if (typeof require !== "undefined") return require.apply(this, arguments);
11
+ throw Error('Dynamic require of "' + x + '" is not supported');
12
+ });
13
+ var __commonJS = (cb, mod) => function __require2() {
14
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") {
18
+ for (let key of __getOwnPropNames(from))
19
+ if (!__hasOwnProp.call(to, key) && key !== except)
20
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
+ // If the importer is in node compatibility mode or this is not an ESM
26
+ // file that has been converted to a CommonJS file using a Babel-
27
+ // compatible transform (i.e. "__esModule" has not been set), then set
28
+ // "default" to the CommonJS "module.exports" for node compatibility.
29
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
+ mod
31
+ ));
32
+
1
33
  // src/config.ts
2
34
  var Config = class _Config {
3
35
  static instance;
@@ -86,6 +118,9 @@ var AbstractElement = class {
86
118
  async getDataTestId() {
87
119
  return await this.getAttribute("data-testid");
88
120
  }
121
+ async getDataDateMode() {
122
+ return await this.getAttribute("data-datemode");
123
+ }
89
124
  };
90
125
 
91
126
  // src/pageObjects/pages/AbstractPage.ts
@@ -170,6 +205,7 @@ var byTestId = (testId, element = "div") => {
170
205
  return By2.css(byTestIdCssSelector(testId, element));
171
206
  };
172
207
  var readonlyLocator = "readonly";
208
+ var disabledLocator = "disabled";
173
209
 
174
210
  // src/utils/waitElementIsClickable.ts
175
211
  async function waitElementIsClickable({
@@ -217,6 +253,10 @@ var AbstractElementWithParent = class extends AbstractElement {
217
253
  const classSting = await this.getClasses();
218
254
  return classSting.includes(readonlyLocator);
219
255
  }
256
+ async isDisabled() {
257
+ const classSting = await this.getClasses();
258
+ return classSting.includes(disabledLocator);
259
+ }
220
260
  };
221
261
 
222
262
  // src/pageObjects/elements/Editors/AbstractEditor.ts
@@ -352,22 +392,34 @@ var ClearButtonStrategy = class {
352
392
  }
353
393
  };
354
394
 
395
+ // src/utils/withCustomTimeouts.ts
396
+ async function withCustomTimeouts({ driver, timeout, callback }) {
397
+ const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
398
+ try {
399
+ await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
400
+ return await callback();
401
+ } finally {
402
+ await driver.manage().setTimeouts({ implicit: defaultTimeout });
403
+ }
404
+ }
405
+ var withCustomTimeouts_default = withCustomTimeouts;
406
+
355
407
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
356
408
  var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
357
409
  var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
358
410
  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
411
  let err = null;
363
412
  try {
364
- await driver.manage().setTimeouts({ implicit: timeout });
365
- optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
366
- await click(optElement, driver);
413
+ await withCustomTimeouts_default({
414
+ driver,
415
+ timeout: delay ? void 0 : 200,
416
+ callback: async () => {
417
+ let optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
418
+ await click(optElement, driver);
419
+ }
420
+ });
367
421
  } catch (e) {
368
422
  err = new Error(`Item not found: "${optionValue}"`);
369
- } finally {
370
- await driver.manage().setTimeouts({ implicit });
371
423
  }
372
424
  if (err)
373
425
  throw err;
@@ -554,47 +606,273 @@ var BooleanSelector = class extends ButtonGroup {
554
606
  };
555
607
 
556
608
  // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
557
- import { By as By9 } from "selenium-webdriver";
609
+ import { By as By10 } from "selenium-webdriver";
558
610
 
559
611
  // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
560
- import { By as By8, Key as Key3 } from "selenium-webdriver";
612
+ import { By as By9, Key as Key3 } from "selenium-webdriver";
561
613
 
562
614
  // src/pageObjects/elements/Editors/Date/utils.ts
563
- var formatDMYDate = (date) => {
564
- const [year, month, day] = date.toJSON().split("T")[0].split("-");
565
- return `${day}${month}${year}`;
615
+ var formatDMYDate = (date, isTimeAllowed = false) => {
616
+ const [year, month, day] = date.toISOString().split("T")[0].split("-");
617
+ if (!isTimeAllowed) {
618
+ return `${day}${month}${year}`;
619
+ }
620
+ const hours = String(date.getHours()).padStart(2, "0");
621
+ const minutes = String(date.getMinutes()).padStart(2, "0");
622
+ return `${day}${month}${year}${hours}${minutes}`;
623
+ };
624
+ var formatToDateTime = (dateString) => {
625
+ const [datePart, timePart] = dateString.split("T");
626
+ const [year, month, day] = datePart.split("-").map(Number);
627
+ const [hours, minutes] = timePart.split(":").map(Number);
628
+ return new Date(year, month - 1, day, hours, minutes, 0, 0);
629
+ };
630
+ var getYearMonthDay = (date) => {
631
+ const [year, month, day] = date.toISOString().split("T")[0].split("-");
632
+ return { year: +year, month: +month, day: +day };
566
633
  };
567
634
 
568
- // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
635
+ // src/pageObjects/elements/Editors/Date/DateSelectMode.ts
636
+ var DateSelectMode = class {
637
+ static isWeek(t) {
638
+ return t === "week" /* Week */;
639
+ }
640
+ static isMonth(t) {
641
+ return t === "month" /* Month */;
642
+ }
643
+ static isWeekOrMonth(t) {
644
+ return this.isWeek(t) || this.isMonth(t);
645
+ }
646
+ };
647
+
648
+ // src/pageObjects/elements/Editors/Date/Calendar.ts
649
+ import { By as By8 } from "selenium-webdriver";
569
650
  var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
570
651
  var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
571
652
  var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
572
653
  var BTN_SAVE_SELECTOR = "DateRange__button-save";
654
+ var CALENDAR_CAPTION_SELECTOR = "dx-calendar-caption-button";
655
+ var CALENDAR_CELL_SELECTOR = "dx-calendar-cell";
656
+ var CALENDAR_PREVIOUS_SELECTOR = "dx-calendar-navigator-previous-month";
657
+ var CALENDAR_NEXT_SELECTOR = "dx-calendar-navigator-next-month";
658
+ var TEXT_EDITOR_SELECTOR = "dx-texteditor-input";
659
+ var movesToCalendarEndForWeek = 3;
660
+ var movesToCalendarEndForMonth = 1;
661
+ var Calendar = class extends AbstractElementWithParent {
662
+ _parentCssSelector;
663
+ constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
664
+ super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
665
+ this._parentCssSelector = parentCssSelector;
666
+ }
667
+ async init() {
668
+ const dateField = await this.driver.findElement(By8.css(this._parentCssSelector));
669
+ const button = await dateField.findElement(By8.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
670
+ await click(button, this.driver);
671
+ }
672
+ /**
673
+ * Переходимо на найвищий рівень календаря
674
+ */
675
+ async moveToCalendarEnd(count) {
676
+ while (count >= 0) {
677
+ const calendarElement = await this.getElement();
678
+ const button = await calendarElement.findElement(By8.css(`.${CALENDAR_CAPTION_SELECTOR}`));
679
+ await click(button, this.driver);
680
+ count--;
681
+ }
682
+ }
683
+ /**
684
+ * Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
685
+ */
686
+ async choosePeriodForYear(targetYear) {
687
+ let found = false;
688
+ while (!found) {
689
+ const calendarElement = await this.getElement();
690
+ const periodCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
691
+ for (const cell of periodCells) {
692
+ const text = await cell.getText();
693
+ if (text) {
694
+ const [start, end] = text.split("-").map(Number);
695
+ if (targetYear >= start && targetYear <= end) {
696
+ await click(cell, this.driver);
697
+ found = true;
698
+ break;
699
+ }
700
+ }
701
+ }
702
+ if (!found) {
703
+ const firstPeriod = await periodCells[0].getText();
704
+ const [start] = firstPeriod.split("-").map(Number);
705
+ if (targetYear < start) {
706
+ const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
707
+ await click(prevBtn, this.driver);
708
+ } else {
709
+ const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
710
+ await click(nextBtn, this.driver);
711
+ }
712
+ }
713
+ }
714
+ }
715
+ /**
716
+ * Пошук та клік по конкретному року з навігацією
717
+ */
718
+ async chooseYear(targetYear) {
719
+ let found = false;
720
+ while (!found) {
721
+ const calendarElement = await this.getElement();
722
+ const yearCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
723
+ for (const cell of yearCells) {
724
+ const text = await cell.getText();
725
+ const cellYear = Number(text);
726
+ if (!isNaN(cellYear) && cellYear === targetYear) {
727
+ await click(cell, this.driver);
728
+ found = true;
729
+ break;
730
+ }
731
+ }
732
+ if (!found) {
733
+ const firstYearText = await yearCells[0].getText();
734
+ const lastYearText = await yearCells[yearCells.length - 1].getText();
735
+ const firstYear = Number(firstYearText);
736
+ const lastYear = Number(lastYearText);
737
+ if (targetYear < firstYear) {
738
+ const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
739
+ await click(prevBtn, this.driver);
740
+ } else if (targetYear > lastYear) {
741
+ const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
742
+ await click(nextBtn, this.driver);
743
+ } else {
744
+ throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
745
+ }
746
+ }
747
+ }
748
+ }
749
+ /**
750
+ * Пошук та клік по конкретному місяцю
751
+ */
752
+ async chooseMonth(year, month) {
753
+ const calendarElement = await this.getElement();
754
+ const monthCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
755
+ for (const cell of monthCells) {
756
+ const dataValue = await cell.getAttribute("data-value");
757
+ if (dataValue) {
758
+ const [cellYear, cellMonth] = dataValue.split("/").map(Number);
759
+ if (cellYear === year && cellMonth === month) {
760
+ await click(cell, this.driver);
761
+ return;
762
+ }
763
+ }
764
+ }
765
+ throw new Error(`Month ${month} for year ${year} not found`);
766
+ }
767
+ /**
768
+ * Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
769
+ */
770
+ async chooseDay(year, month, day) {
771
+ const calendarElement = await this.getElement();
772
+ const dayCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
773
+ for (const cell of dayCells) {
774
+ const dataValue = await cell.getAttribute("data-value");
775
+ if (dataValue) {
776
+ const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
777
+ if (cellYear === year && cellMonth === month && cellDay === day) {
778
+ await click(cell, this.driver);
779
+ return;
780
+ }
781
+ }
782
+ }
783
+ throw new Error(`Day ${day}.${month}.${year} not found`);
784
+ }
785
+ /**
786
+ * Встановлення дати для тижня
787
+ */
788
+ async setValueForWeek(date) {
789
+ const { year, month, day } = getYearMonthDay(date);
790
+ await this.moveToCalendarEnd(movesToCalendarEndForWeek);
791
+ await this.choosePeriodForYear(year);
792
+ await this.chooseYear(year);
793
+ await this.chooseMonth(year, month);
794
+ await this.chooseDay(year, month, day);
795
+ await this.save();
796
+ }
797
+ /**
798
+ * Встановлення дати для місяця
799
+ */
800
+ async setValueForMonth(date) {
801
+ const { year, month } = getYearMonthDay(date);
802
+ await this.moveToCalendarEnd(movesToCalendarEndForMonth);
803
+ await this.chooseYear(year);
804
+ await this.chooseMonth(year, month);
805
+ await this.save();
806
+ }
807
+ async getDateFromInput() {
808
+ const calendarPopoverElement = await this.getElement();
809
+ return calendarPopoverElement.findElement(
810
+ By8.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
811
+ );
812
+ }
813
+ async getDateToInput() {
814
+ const calendarPopoverElement = await this.getElement();
815
+ return calendarPopoverElement.findElement(
816
+ By8.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
817
+ );
818
+ }
819
+ async save() {
820
+ const btnOk = await this.driver.findElement(By8.css(`.${BTN_SAVE_SELECTOR}`));
821
+ await click(btnOk, this.driver);
822
+ }
823
+ };
824
+
825
+ // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
826
+ var DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
573
827
  var BaseDateEditor = class extends AbstractDXEditorWithInput {
574
828
  constructor(parentCssSelector, elementCssSelector, driver) {
575
829
  super(parentCssSelector, elementCssSelector, driver);
576
830
  this.setClearStrategy(new InputClearStrategy());
577
831
  }
578
- async setArrayValue(value) {
579
- const dateField = await this.driver.findElement(By8.css(`${this.getFullCssSelector()}`));
832
+ async getIsAllowedTime() {
833
+ const dateField = await this.driver.findElement(By9.css(`${this.getFullCssSelector()}`));
834
+ const classString = await dateField.getAttribute("class");
835
+ return classString.includes(DATETIME_ALLOWED_SELECTOR);
836
+ }
837
+ async initCalendar() {
580
838
  const dateFieldDataTestID = await this.getDataTestId();
581
- const button = await dateField.findElement(By8.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
582
- await click(button, this.driver);
583
- const calendarPopoverElement = await this.driver.findElement(By8.css(byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`)));
584
- const dateFromInput = await calendarPopoverElement.findElement(
585
- By8.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`)
586
- );
587
- const dateToInput = await calendarPopoverElement.findElement(
588
- By8.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`)
589
- );
839
+ const calendar = new Calendar({
840
+ parentCssSelector: this.getFullCssSelector(),
841
+ dateFieldDataTestID,
842
+ driver: this.driver
843
+ });
844
+ await calendar.init();
845
+ return calendar;
846
+ }
847
+ async setValueForWeek(value) {
848
+ const calendar = await this.initCalendar();
849
+ await calendar.setValueForWeek(value);
850
+ }
851
+ async setValueForMonth(value) {
852
+ const calendar = await this.initCalendar();
853
+ await calendar.setValueForMonth(value);
854
+ }
855
+ async setArrayValue(value) {
856
+ const calendar = await this.initCalendar();
857
+ const dateFromInput = await calendar.getDateFromInput();
858
+ const dateToInput = await calendar.getDateToInput();
590
859
  await this.setSingleValue(value[0], dateFromInput);
591
860
  await this.setSingleValue(value[1], dateToInput);
592
- const btnOk = await this.driver.findElement(By8.css(`.${BTN_SAVE_SELECTOR}`));
593
- await click(btnOk, this.driver);
861
+ await calendar.save();
594
862
  }
595
863
  async setSingleValue(value, inputEl) {
864
+ const dateMode = await this.getDataDateMode();
865
+ if (DateSelectMode.isWeek(dateMode)) {
866
+ await this.setValueForWeek(value);
867
+ return;
868
+ }
869
+ if (DateSelectMode.isMonth(dateMode)) {
870
+ await this.setValueForMonth(value);
871
+ return;
872
+ }
596
873
  const actions = this.driver.actions({ async: true });
597
- const formattedDate = formatDMYDate(value);
874
+ const isTimeAllowed = await this.getIsAllowedTime();
875
+ const formattedDate = formatDMYDate(value, isTimeAllowed);
598
876
  await click(inputEl, this.driver);
599
877
  await actions.move({ origin: inputEl }).sendKeys(Key3.HOME).perform();
600
878
  await actions.move({ origin: inputEl }).sendKeys(formattedDate, Key3.ENTER).perform();
@@ -615,7 +893,7 @@ var SingleDateEditor = class extends BaseDateEditor {
615
893
  this.setClearStrategy(new InputClearStrategy());
616
894
  }
617
895
  async getDateElement() {
618
- return this.driver.findElement(By9.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
896
+ return this.driver.findElement(By10.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
619
897
  }
620
898
  async getDateValue() {
621
899
  const inputEl = await this.getDateElement();
@@ -623,6 +901,10 @@ var SingleDateEditor = class extends BaseDateEditor {
623
901
  }
624
902
  async getValue() {
625
903
  const value = await this.getDateValue();
904
+ const isTimeAllowed = await this.getIsAllowedTime();
905
+ if (isTimeAllowed) {
906
+ return value == "" ? null : formatToDateTime(value);
907
+ }
626
908
  return value == "" ? null : new Date(value);
627
909
  }
628
910
  setValue(value) {
@@ -634,14 +916,14 @@ var SingleDateEditor = class extends BaseDateEditor {
634
916
  };
635
917
 
636
918
  // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
637
- import { By as By10 } from "selenium-webdriver";
919
+ import { By as By11 } from "selenium-webdriver";
638
920
  var DateRangeEditor = class extends BaseDateEditor {
639
921
  constructor(parentCssSelector, elementCssSelector, driver) {
640
922
  super(parentCssSelector, elementCssSelector, driver);
641
923
  this.setClearStrategy(new InputClearStrategy());
642
924
  }
643
925
  async getDateElement() {
644
- return this.driver.findElement(By10.css(this.getFullCssSelector() + " .dx-texteditor-input"));
926
+ return this.driver.findElement(By11.css(this.getFullCssSelector() + " .dx-texteditor-input"));
645
927
  }
646
928
  async getDateValue() {
647
929
  const inputEl = await this.getDateElement();
@@ -699,7 +981,7 @@ var DateEditor = class extends AbstractDXEditorWithInput {
699
981
  };
700
982
 
701
983
  // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
702
- import { By as By11, Key as Key4 } from "selenium-webdriver";
984
+ import { By as By12, Key as Key4 } from "selenium-webdriver";
703
985
  var TAGS_SELECTOR2 = ".dx-tag .tag-text";
704
986
  var DX_TAG_CONTAINER2 = "dx-tag-container";
705
987
  var DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
@@ -708,21 +990,21 @@ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
708
990
  var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
709
991
  var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
710
992
  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
993
  let err = null;
715
994
  try {
716
995
  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);
996
+ await withCustomTimeouts_default({
997
+ driver,
998
+ timeout: delay ? void 0 : 600,
999
+ callback: async () => {
1000
+ const calendarPopoverElement = await driver.findElement(By12.css(calendarPopoverSelector));
1001
+ const customOptionList = calendarPopoverElement.findElement(By12.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
1002
+ const optElement = await customOptionList.findElement(By12.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
1003
+ await click(optElement, driver);
1004
+ }
1005
+ });
722
1006
  } catch (e) {
723
1007
  err = new Error(`Item not found: "${optionValue}"`);
724
- } finally {
725
- await driver.manage().setTimeouts({ implicit });
726
1008
  }
727
1009
  if (err)
728
1010
  throw err;
@@ -741,7 +1023,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
741
1023
  }
742
1024
  }
743
1025
  async waitOptionSelection() {
744
- await fixElementStaleError(By11.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
1026
+ await fixElementStaleError(By12.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
745
1027
  }
746
1028
  async selectOption(inputEl, value, lastElement) {
747
1029
  try {
@@ -765,7 +1047,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
765
1047
  return [];
766
1048
  }
767
1049
  const tags = await this.driver.findElements(
768
- By11.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
1050
+ By12.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
769
1051
  );
770
1052
  const values = [];
771
1053
  for (const tag of tags) {
@@ -942,6 +1224,16 @@ var AbstractEditor = class extends AbstractElementWithParent {
942
1224
  await this.initEditor();
943
1225
  return this.editor.isReadonly();
944
1226
  }
1227
+ /**
1228
+ * Возвращает значение true|false в зависимости isDisabled поле или нет
1229
+ * @example
1230
+ * expect(await formEdit.field('NumberFld').isDisabled()).toBe(true);
1231
+ * expect(await formEdit.field('TextFld').isDisabled()).toBe(false);
1232
+ */
1233
+ async isDisabled() {
1234
+ await this.initEditor();
1235
+ return this.editor.isDisabled();
1236
+ }
945
1237
  /**
946
1238
  * Возвращает значение true|false в зависимости isDisplayed поле или нет
947
1239
  * @example
@@ -977,7 +1269,7 @@ var FormField = class extends AbstractEditor {
977
1269
  };
978
1270
 
979
1271
  // src/pageObjects/elements/Forms/Form.ts
980
- import { By as By15 } from "selenium-webdriver";
1272
+ import { By as By16 } from "selenium-webdriver";
981
1273
 
982
1274
  // src/pageObjects/elements/AbstractButton.ts
983
1275
  var D5_BUTTON_IS_PRESSED = "d5-is-pressed";
@@ -1018,7 +1310,7 @@ var AbstractButton = class extends AbstractElementWithParent {
1018
1310
  };
1019
1311
 
1020
1312
  // src/pageObjects/elements/DXComponents/DXButton.ts
1021
- import { By as By12 } from "selenium-webdriver";
1313
+ import { By as By13 } from "selenium-webdriver";
1022
1314
  var DXButton = class extends AbstractButton {
1023
1315
  async getText() {
1024
1316
  const classes = await this.getClasses();
@@ -1026,7 +1318,7 @@ var DXButton = class extends AbstractButton {
1026
1318
  return null;
1027
1319
  }
1028
1320
  const el = await this.getElement();
1029
- const textEl = el.findElement(By12.className("dx-button-text"));
1321
+ const textEl = el.findElement(By13.className("dx-button-text"));
1030
1322
  return await textEl.getText();
1031
1323
  }
1032
1324
  };
@@ -1059,7 +1351,7 @@ var Panel = class extends AbstractGroup {
1059
1351
  };
1060
1352
 
1061
1353
  // src/pageObjects/elements/Groups/TabPanel.ts
1062
- import { By as By13 } from "selenium-webdriver";
1354
+ import { By as By14 } from "selenium-webdriver";
1063
1355
  var TabPanelItem = class extends AbstractGroup {
1064
1356
  constructor(parentCssSelector, elementCssSelector, driver) {
1065
1357
  super(parentCssSelector, elementCssSelector, driver);
@@ -1069,7 +1361,7 @@ var TabPanelItem = class extends AbstractGroup {
1069
1361
  }
1070
1362
  async isActive() {
1071
1363
  const tabPanelItemElement = await this.getElement();
1072
- const grandparentTab = await tabPanelItemElement.findElement(By13.xpath('ancestor::div[@role="tab"][1]'));
1364
+ const grandparentTab = await tabPanelItemElement.findElement(By14.xpath('ancestor::div[@role="tab"][1]'));
1073
1365
  return await grandparentTab.getAttribute("aria-selected") === "true";
1074
1366
  }
1075
1367
  async getTitle() {
@@ -1086,7 +1378,7 @@ var TabPanel = class extends AbstractGroup {
1086
1378
  };
1087
1379
 
1088
1380
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1089
- import { By as By14 } from "selenium-webdriver";
1381
+ import { By as By15 } from "selenium-webdriver";
1090
1382
  var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1091
1383
  var AccordionItem = class extends AbstractGroup {
1092
1384
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1098,7 +1390,7 @@ var AccordionItem = class extends AbstractGroup {
1098
1390
  }
1099
1391
  async clickAccordionItemTitle() {
1100
1392
  const accordionElement = await this.getElement();
1101
- const accordTitleElement = await accordionElement.findElement(By14.className(ACCORDION_TITLE_CONTAINER));
1393
+ const accordTitleElement = await accordionElement.findElement(By15.className(ACCORDION_TITLE_CONTAINER));
1102
1394
  await accordTitleElement.click();
1103
1395
  }
1104
1396
  async click() {
@@ -1252,7 +1544,15 @@ var AbstractForm = class extends AbstractPage {
1252
1544
  async exists() {
1253
1545
  try {
1254
1546
  let elements = await this.driver.findElements(this.containerBy);
1255
- return elements.length > 0;
1547
+ if (elements.length === 0) {
1548
+ return false;
1549
+ }
1550
+ await waitElementIsVisible_default({
1551
+ element: elements[0],
1552
+ errorMessage: "Element exists in DOM but is not visible",
1553
+ driver: this.driver
1554
+ });
1555
+ return true;
1256
1556
  } catch (error) {
1257
1557
  return false;
1258
1558
  }
@@ -1286,15 +1586,15 @@ async function classDependencyInjector(formType) {
1286
1586
  let SubFormFactoryClass;
1287
1587
  switch (formType) {
1288
1588
  case "1" /* LIST */:
1289
- SubFormFactoryClass = (await import("./ListForm-M2NWQRYX.mjs")).default;
1589
+ SubFormFactoryClass = (await import("./ListForm-KIHLT7EU.mjs")).default;
1290
1590
  break;
1291
1591
  case "3" /* TREE */:
1292
- SubFormFactoryClass = (await import("./TreeView-SI5MHDCO.mjs")).default;
1592
+ SubFormFactoryClass = (await import("./TreeView-TFBZB2UK.mjs")).default;
1293
1593
  break;
1294
1594
  case "2" /* EDIT */:
1295
1595
  case "99" /* FREE_FORM */:
1296
1596
  case "4" /* REPORT */:
1297
- SubFormFactoryClass = (await import("./FormEdit-377LRKDA.mjs")).default;
1597
+ SubFormFactoryClass = (await import("./FormEdit-VFV53QIZ.mjs")).default;
1298
1598
  break;
1299
1599
  default:
1300
1600
  throw new Error(`Unsupported form type ${formType}`);
@@ -1315,6 +1615,11 @@ var Form = class extends AbstractForm {
1315
1615
  const value = await el.getAttribute("data-ismodal");
1316
1616
  return value === "true";
1317
1617
  }
1618
+ async isFullScreen() {
1619
+ const el = await this.getContainerElement();
1620
+ const value = await el.getAttribute("data-isfullscreen");
1621
+ return value === "true";
1622
+ }
1318
1623
  /**
1319
1624
  * Получение заголовка на формы
1320
1625
  * @example
@@ -1323,17 +1628,23 @@ var Form = class extends AbstractForm {
1323
1628
  * expect(await listForm.getTitleText()).toBe('MyFormTitle');
1324
1629
  */
1325
1630
  async getTitleText() {
1631
+ const getFullScreenTitle = async () => {
1632
+ let titleEl = await this.driver.findElement(By16.className("main-toolbar-form-title"));
1633
+ return titleEl.getText();
1634
+ };
1635
+ if (await this.isFullScreen()) {
1636
+ return getFullScreenTitle();
1637
+ }
1326
1638
  if (await this.isModal()) {
1327
- const titleEl2 = await this.driver.findElement(By15.css(`${this.popupContainerCssSelector} .popup-title`));
1639
+ const titleEl = await this.driver.findElement(By16.css(`${this.popupContainerCssSelector} .popup-title`));
1328
1640
  await waitElementIsVisible_default({
1329
- element: titleEl2,
1641
+ element: titleEl,
1330
1642
  driver: this.driver,
1331
1643
  errorMessage: `Form title element is not visible`
1332
1644
  });
1333
- return titleEl2.getText();
1645
+ return titleEl.getText();
1334
1646
  }
1335
- let titleEl = await this.driver.findElement(By15.className("main-toolbar-form-title"));
1336
- return titleEl.getText();
1647
+ return getFullScreenTitle();
1337
1648
  }
1338
1649
  setSubFormMode() {
1339
1650
  const testId = formTestId(this.formName);
@@ -1351,7 +1662,7 @@ var Form = class extends AbstractForm {
1351
1662
  async subForm(name, options = {}) {
1352
1663
  const { isDockPanel = false } = options;
1353
1664
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
1354
- const byCssSelector = By15.css(cssSelector);
1665
+ const byCssSelector = By16.css(cssSelector);
1355
1666
  const subFormEl = await this.driver.findElement(byCssSelector);
1356
1667
  await waitElementIsVisible_default({
1357
1668
  element: subFormEl,
@@ -1375,6 +1686,9 @@ var Form = class extends AbstractForm {
1375
1686
  };
1376
1687
 
1377
1688
  export {
1689
+ __require,
1690
+ __commonJS,
1691
+ __toESM,
1378
1692
  config,
1379
1693
  fixElementStaleError,
1380
1694
  staleElementAction,
@@ -1387,12 +1701,14 @@ export {
1387
1701
  byTestIdCssSelector,
1388
1702
  byTestId,
1389
1703
  readonlyLocator,
1704
+ disabledLocator,
1390
1705
  waitElementIsClickable_default,
1391
1706
  AbstractElementWithParent,
1392
1707
  TextEditor,
1393
1708
  NumberEditor,
1394
1709
  ControlClass,
1395
1710
  DX_CLEAR_BUTTON_AREA,
1711
+ withCustomTimeouts_default,
1396
1712
  editorFactory,
1397
1713
  createDocFilterTestId,
1398
1714
  createHeaderFilterTestId,