d5-testing-library 1.9.0-alpha.2 → 1.9.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -132,6 +132,9 @@ var init_AbstractElement = __esm({
132
132
  async getDataTestId() {
133
133
  return await this.getAttribute("data-testid");
134
134
  }
135
+ async getDataDateMode() {
136
+ return await this.getAttribute("data-datemode");
137
+ }
135
138
  };
136
139
  }
137
140
  });
@@ -512,6 +515,24 @@ var init_ClearButtonStrategy = __esm({
512
515
  }
513
516
  });
514
517
 
518
+ // src/utils/withCustomTimeouts.ts
519
+ async function withCustomTimeouts({ driver, timeout, callback }) {
520
+ const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
521
+ try {
522
+ await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
523
+ return await callback();
524
+ } finally {
525
+ await driver.manage().setTimeouts({ implicit: defaultTimeout });
526
+ }
527
+ }
528
+ var withCustomTimeouts_default;
529
+ var init_withCustomTimeouts = __esm({
530
+ "src/utils/withCustomTimeouts.ts"() {
531
+ "use strict";
532
+ withCustomTimeouts_default = withCustomTimeouts;
533
+ }
534
+ });
535
+
515
536
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
516
537
  var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
517
538
  var init_SelectBoxEditor = __esm({
@@ -522,21 +543,22 @@ var init_SelectBoxEditor = __esm({
522
543
  init_xpathHelper();
523
544
  init_actions();
524
545
  init_ClearButtonStrategy();
546
+ init_withCustomTimeouts();
525
547
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
526
548
  combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
527
549
  dropDownOptionClick = async (optionValue, driver, delay = true) => {
528
- const { implicit } = await driver.manage().getTimeouts();
529
- let optElement = null;
530
- const timeout = delay ? implicit : 200;
531
550
  let err = null;
532
551
  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);
552
+ await withCustomTimeouts_default({
553
+ driver,
554
+ timeout: delay ? void 0 : 200,
555
+ callback: async () => {
556
+ let optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
557
+ await click(optElement, driver);
558
+ }
559
+ });
536
560
  } catch (e) {
537
561
  err = new Error(`Item not found: "${optionValue}"`);
538
- } finally {
539
- await driver.manage().setTimeouts({ implicit });
540
562
  }
541
563
  if (err)
542
564
  throw err;
@@ -602,7 +624,7 @@ var init_SwitchEditor = __esm({
602
624
  });
603
625
 
604
626
  // src/pageObjects/elements/Editors/TagBox.ts
605
- var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
627
+ var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, getSelectedOptionXpath, TagBox;
606
628
  var init_TagBox = __esm({
607
629
  "src/pageObjects/elements/Editors/TagBox.ts"() {
608
630
  "use strict";
@@ -618,7 +640,7 @@ var init_TagBox = __esm({
618
640
  DX_TAG_CONTAINER = "dx-tag-container";
619
641
  DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
620
642
  BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
621
- TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
643
+ getSelectedOptionXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//div[contains(@class, 'dx-list-item') and @aria-selected="true"]//div[contains(., "${value}")]`;
622
644
  TagBox = class extends AbstractDXEditorWithInput {
623
645
  constructor(parentCssSelector, elementCssSelector, driver) {
624
646
  super(parentCssSelector, elementCssSelector, driver);
@@ -633,9 +655,15 @@ var init_TagBox = __esm({
633
655
  }
634
656
  await this.confirmSelection();
635
657
  }
636
- async waitOptionSelection() {
637
- const option = await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
638
- await safeWait(() => option.isDisplayed(), this.driver);
658
+ async waitOptionSelection(value) {
659
+ await safeWait(
660
+ async () => {
661
+ const elements = await this.driver.findElements(import_selenium_webdriver10.By.xpath(getSelectedOptionXpath(value)));
662
+ if (elements.length === 0) return false;
663
+ return await elements[0].isDisplayed();
664
+ },
665
+ this.driver
666
+ );
639
667
  }
640
668
  async selectOption(inputEl, value, lastElement) {
641
669
  try {
@@ -644,7 +672,7 @@ var init_TagBox = __esm({
644
672
  await inputEl.sendKeys(value);
645
673
  await dropDownOptionClick(value, this.driver);
646
674
  }
647
- await this.waitOptionSelection();
675
+ await this.waitOptionSelection(value);
648
676
  if (value !== lastElement) {
649
677
  await inputEl.clear();
650
678
  }
@@ -756,24 +784,57 @@ var init_BooleanSelector = __esm({
756
784
  });
757
785
 
758
786
  // src/pageObjects/elements/Editors/Date/utils.ts
759
- var formatDMYDate;
787
+ var formatDMYDate, formatToDateTime, getYearMonthDay;
760
788
  var init_utils = __esm({
761
789
  "src/pageObjects/elements/Editors/Date/utils.ts"() {
762
790
  "use strict";
763
- formatDMYDate = (date) => {
764
- const [year, month, day] = date.toJSON().split("T")[0].split("-");
765
- return `${day}${month}${year}`;
791
+ formatDMYDate = (date, isTimeAllowed = false) => {
792
+ const [year, month, day] = date.toISOString().split("T")[0].split("-");
793
+ if (!isTimeAllowed) {
794
+ return `${day}${month}${year}`;
795
+ }
796
+ const hours = String(date.getHours()).padStart(2, "0");
797
+ const minutes = String(date.getMinutes()).padStart(2, "0");
798
+ return `${day}${month}${year}${hours}${minutes}`;
799
+ };
800
+ formatToDateTime = (dateString) => {
801
+ const [datePart, timePart] = dateString.split("T");
802
+ const [year, month, day] = datePart.split("-").map(Number);
803
+ const [hours, minutes] = timePart.split(":").map(Number);
804
+ return new Date(year, month - 1, day, hours, minutes, 0, 0);
805
+ };
806
+ getYearMonthDay = (date) => {
807
+ const [year, month, day] = date.toISOString().split("T")[0].split("-");
808
+ return { year: +year, month: +month, day: +day };
766
809
  };
767
810
  }
768
811
  });
769
812
 
770
- // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
771
- var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
772
- var init_BaseDateEditor = __esm({
773
- "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
813
+ // src/pageObjects/elements/Editors/Date/DateSelectMode.ts
814
+ var DateSelectMode;
815
+ var init_DateSelectMode = __esm({
816
+ "src/pageObjects/elements/Editors/Date/DateSelectMode.ts"() {
774
817
  "use strict";
775
- init_AbstractEditor();
776
- init_InputClearStrategy();
818
+ DateSelectMode = class {
819
+ static isWeek(t) {
820
+ return t === "week" /* Week */;
821
+ }
822
+ static isMonth(t) {
823
+ return t === "month" /* Month */;
824
+ }
825
+ static isWeekOrMonth(t) {
826
+ return this.isWeek(t) || this.isMonth(t);
827
+ }
828
+ };
829
+ }
830
+ });
831
+
832
+ // src/pageObjects/elements/Editors/Date/Calendar.ts
833
+ var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, CALENDAR_CAPTION_SELECTOR, CALENDAR_CELL_SELECTOR, CALENDAR_PREVIOUS_SELECTOR, CALENDAR_NEXT_SELECTOR, TEXT_EDITOR_SELECTOR, movesToCalendarEndForWeek, movesToCalendarEndForMonth, Calendar;
834
+ var init_Calendar = __esm({
835
+ "src/pageObjects/elements/Editors/Date/Calendar.ts"() {
836
+ "use strict";
837
+ init_AbstractElementWithParent();
777
838
  import_selenium_webdriver12 = require("selenium-webdriver");
778
839
  init_locators();
779
840
  init_actions();
@@ -782,34 +843,244 @@ var init_BaseDateEditor = __esm({
782
843
  BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
783
844
  BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
784
845
  BTN_SAVE_SELECTOR = "DateRange__button-save";
846
+ CALENDAR_CAPTION_SELECTOR = "dx-calendar-caption-button";
847
+ CALENDAR_CELL_SELECTOR = "dx-calendar-cell";
848
+ CALENDAR_PREVIOUS_SELECTOR = "dx-calendar-navigator-previous-month";
849
+ CALENDAR_NEXT_SELECTOR = "dx-calendar-navigator-next-month";
850
+ TEXT_EDITOR_SELECTOR = "dx-texteditor-input";
851
+ movesToCalendarEndForWeek = 3;
852
+ movesToCalendarEndForMonth = 1;
853
+ Calendar = class extends AbstractElementWithParent {
854
+ _parentCssSelector;
855
+ constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
856
+ super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
857
+ this._parentCssSelector = parentCssSelector;
858
+ }
859
+ async init() {
860
+ const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(this._parentCssSelector));
861
+ const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
862
+ await click(button, this.driver);
863
+ }
864
+ /**
865
+ * Переходимо на найвищий рівень календаря
866
+ */
867
+ async moveToCalendarEnd(count) {
868
+ while (count >= 0) {
869
+ const calendarElement = await this.getElement();
870
+ const button = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_CAPTION_SELECTOR}`));
871
+ await click(button, this.driver);
872
+ count--;
873
+ }
874
+ }
875
+ /**
876
+ * Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
877
+ */
878
+ async choosePeriodForYear(targetYear) {
879
+ let found = false;
880
+ while (!found) {
881
+ const calendarElement = await this.getElement();
882
+ const periodCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
883
+ for (const cell of periodCells) {
884
+ const text = await cell.getText();
885
+ if (text) {
886
+ const [start, end] = text.split("-").map(Number);
887
+ if (targetYear >= start && targetYear <= end) {
888
+ await click(cell, this.driver);
889
+ found = true;
890
+ break;
891
+ }
892
+ }
893
+ }
894
+ if (!found) {
895
+ const firstPeriod = await periodCells[0].getText();
896
+ const [start] = firstPeriod.split("-").map(Number);
897
+ if (targetYear < start) {
898
+ const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
899
+ await click(prevBtn, this.driver);
900
+ } else {
901
+ const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
902
+ await click(nextBtn, this.driver);
903
+ }
904
+ }
905
+ }
906
+ }
907
+ /**
908
+ * Пошук та клік по конкретному року з навігацією
909
+ */
910
+ async chooseYear(targetYear) {
911
+ let found = false;
912
+ while (!found) {
913
+ const calendarElement = await this.getElement();
914
+ const yearCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
915
+ for (const cell of yearCells) {
916
+ const text = await cell.getText();
917
+ const cellYear = Number(text);
918
+ if (!isNaN(cellYear) && cellYear === targetYear) {
919
+ await click(cell, this.driver);
920
+ found = true;
921
+ break;
922
+ }
923
+ }
924
+ if (!found) {
925
+ const firstYearText = await yearCells[0].getText();
926
+ const lastYearText = await yearCells[yearCells.length - 1].getText();
927
+ const firstYear = Number(firstYearText);
928
+ const lastYear = Number(lastYearText);
929
+ if (targetYear < firstYear) {
930
+ const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
931
+ await click(prevBtn, this.driver);
932
+ } else if (targetYear > lastYear) {
933
+ const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
934
+ await click(nextBtn, this.driver);
935
+ } else {
936
+ throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
937
+ }
938
+ }
939
+ }
940
+ }
941
+ /**
942
+ * Пошук та клік по конкретному місяцю
943
+ */
944
+ async chooseMonth(year, month) {
945
+ const calendarElement = await this.getElement();
946
+ const monthCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
947
+ for (const cell of monthCells) {
948
+ const dataValue = await cell.getAttribute("data-value");
949
+ if (dataValue) {
950
+ const [cellYear, cellMonth] = dataValue.split("/").map(Number);
951
+ if (cellYear === year && cellMonth === month) {
952
+ await click(cell, this.driver);
953
+ return;
954
+ }
955
+ }
956
+ }
957
+ throw new Error(`Month ${month} for year ${year} not found`);
958
+ }
959
+ /**
960
+ * Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
961
+ */
962
+ async chooseDay(year, month, day) {
963
+ const calendarElement = await this.getElement();
964
+ const dayCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
965
+ for (const cell of dayCells) {
966
+ const dataValue = await cell.getAttribute("data-value");
967
+ if (dataValue) {
968
+ const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
969
+ if (cellYear === year && cellMonth === month && cellDay === day) {
970
+ await click(cell, this.driver);
971
+ return;
972
+ }
973
+ }
974
+ }
975
+ throw new Error(`Day ${day}.${month}.${year} not found`);
976
+ }
977
+ /**
978
+ * Встановлення дати для тижня
979
+ */
980
+ async setValueForWeek(date) {
981
+ const { year, month, day } = getYearMonthDay(date);
982
+ await this.moveToCalendarEnd(movesToCalendarEndForWeek);
983
+ await this.choosePeriodForYear(year);
984
+ await this.chooseYear(year);
985
+ await this.chooseMonth(year, month);
986
+ await this.chooseDay(year, month, day);
987
+ await this.save();
988
+ }
989
+ /**
990
+ * Встановлення дати для місяця
991
+ */
992
+ async setValueForMonth(date) {
993
+ const { year, month } = getYearMonthDay(date);
994
+ await this.moveToCalendarEnd(movesToCalendarEndForMonth);
995
+ await this.chooseYear(year);
996
+ await this.chooseMonth(year, month);
997
+ await this.save();
998
+ }
999
+ async getDateFromInput() {
1000
+ const calendarPopoverElement = await this.getElement();
1001
+ return calendarPopoverElement.findElement(
1002
+ import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
1003
+ );
1004
+ }
1005
+ async getDateToInput() {
1006
+ const calendarPopoverElement = await this.getElement();
1007
+ return calendarPopoverElement.findElement(
1008
+ import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
1009
+ );
1010
+ }
1011
+ async save() {
1012
+ const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
1013
+ await click(btnOk, this.driver);
1014
+ }
1015
+ };
1016
+ }
1017
+ });
1018
+
1019
+ // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
1020
+ var import_selenium_webdriver13, DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
1021
+ var init_BaseDateEditor = __esm({
1022
+ "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1023
+ "use strict";
1024
+ init_AbstractEditor();
1025
+ init_InputClearStrategy();
1026
+ import_selenium_webdriver13 = require("selenium-webdriver");
1027
+ init_actions();
1028
+ init_utils();
1029
+ init_DateSelectMode();
1030
+ init_Calendar();
1031
+ DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
785
1032
  BaseDateEditor = class extends AbstractDXEditorWithInput {
786
1033
  constructor(parentCssSelector, elementCssSelector, driver) {
787
1034
  super(parentCssSelector, elementCssSelector, driver);
788
1035
  this.setClearStrategy(new InputClearStrategy());
789
1036
  }
790
- async setArrayValue(value) {
791
- const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()}`));
1037
+ async getIsAllowedTime() {
1038
+ const dateField = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()}`));
1039
+ const classString = await dateField.getAttribute("class");
1040
+ return classString.includes(DATETIME_ALLOWED_SELECTOR);
1041
+ }
1042
+ async initCalendar() {
792
1043
  const dateFieldDataTestID = await this.getDataTestId();
793
- const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
794
- await click(button, this.driver);
795
- const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`)));
796
- const dateFromInput = await calendarPopoverElement.findElement(
797
- import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`)
798
- );
799
- const dateToInput = await calendarPopoverElement.findElement(
800
- import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`)
801
- );
1044
+ const calendar = new Calendar({
1045
+ parentCssSelector: this.getFullCssSelector(),
1046
+ dateFieldDataTestID,
1047
+ driver: this.driver
1048
+ });
1049
+ await calendar.init();
1050
+ return calendar;
1051
+ }
1052
+ async setValueForWeek(value) {
1053
+ const calendar = await this.initCalendar();
1054
+ await calendar.setValueForWeek(value);
1055
+ }
1056
+ async setValueForMonth(value) {
1057
+ const calendar = await this.initCalendar();
1058
+ await calendar.setValueForMonth(value);
1059
+ }
1060
+ async setArrayValue(value) {
1061
+ const calendar = await this.initCalendar();
1062
+ const dateFromInput = await calendar.getDateFromInput();
1063
+ const dateToInput = await calendar.getDateToInput();
802
1064
  await this.setSingleValue(value[0], dateFromInput);
803
1065
  await this.setSingleValue(value[1], dateToInput);
804
- const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
805
- await click(btnOk, this.driver);
1066
+ await calendar.save();
806
1067
  }
807
1068
  async setSingleValue(value, inputEl) {
1069
+ const dateMode = await this.getDataDateMode();
1070
+ if (DateSelectMode.isWeek(dateMode)) {
1071
+ await this.setValueForWeek(value);
1072
+ return;
1073
+ }
1074
+ if (DateSelectMode.isMonth(dateMode)) {
1075
+ await this.setValueForMonth(value);
1076
+ return;
1077
+ }
808
1078
  const actions = this.driver.actions({ async: true });
809
- const formattedDate = formatDMYDate(value);
1079
+ const isTimeAllowed = await this.getIsAllowedTime();
1080
+ const formattedDate = formatDMYDate(value, isTimeAllowed);
810
1081
  await click(inputEl, this.driver);
811
- await actions.move({ origin: inputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
812
- await actions.move({ origin: inputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
1082
+ await actions.move({ origin: inputEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
1083
+ await actions.move({ origin: inputEl }).sendKeys(formattedDate, import_selenium_webdriver13.Key.ENTER).perform();
813
1084
  }
814
1085
  async setDateValue(value) {
815
1086
  if (Array.isArray(value)) {
@@ -823,20 +1094,21 @@ var init_BaseDateEditor = __esm({
823
1094
  });
824
1095
 
825
1096
  // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
826
- var import_selenium_webdriver13, SingleDateEditor;
1097
+ var import_selenium_webdriver14, SingleDateEditor;
827
1098
  var init_SingleDateEditor = __esm({
828
1099
  "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
829
1100
  "use strict";
830
- import_selenium_webdriver13 = require("selenium-webdriver");
1101
+ import_selenium_webdriver14 = require("selenium-webdriver");
831
1102
  init_InputClearStrategy();
832
1103
  init_BaseDateEditor();
1104
+ init_utils();
833
1105
  SingleDateEditor = class extends BaseDateEditor {
834
1106
  constructor(parentCssSelector, elementCssSelector, driver) {
835
1107
  super(parentCssSelector, elementCssSelector, driver);
836
1108
  this.setClearStrategy(new InputClearStrategy());
837
1109
  }
838
1110
  async getDateElement() {
839
- return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1111
+ return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
840
1112
  }
841
1113
  async getDateValue() {
842
1114
  const inputEl = await this.getDateElement();
@@ -844,6 +1116,10 @@ var init_SingleDateEditor = __esm({
844
1116
  }
845
1117
  async getValue() {
846
1118
  const value = await this.getDateValue();
1119
+ const isTimeAllowed = await this.getIsAllowedTime();
1120
+ if (isTimeAllowed) {
1121
+ return value == "" ? null : formatToDateTime(value);
1122
+ }
847
1123
  return value == "" ? null : new Date(value);
848
1124
  }
849
1125
  setValue(value) {
@@ -857,11 +1133,11 @@ var init_SingleDateEditor = __esm({
857
1133
  });
858
1134
 
859
1135
  // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
860
- var import_selenium_webdriver14, DateRangeEditor;
1136
+ var import_selenium_webdriver15, DateRangeEditor;
861
1137
  var init_DateRangeEditor = __esm({
862
1138
  "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
863
1139
  "use strict";
864
- import_selenium_webdriver14 = require("selenium-webdriver");
1140
+ import_selenium_webdriver15 = require("selenium-webdriver");
865
1141
  init_InputClearStrategy();
866
1142
  init_BaseDateEditor();
867
1143
  DateRangeEditor = class extends BaseDateEditor {
@@ -870,7 +1146,7 @@ var init_DateRangeEditor = __esm({
870
1146
  this.setClearStrategy(new InputClearStrategy());
871
1147
  }
872
1148
  async getDateElement() {
873
- return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1149
+ return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
874
1150
  }
875
1151
  async getDateValue() {
876
1152
  const inputEl = await this.getDateElement();
@@ -941,39 +1217,40 @@ var init_DateEditor = __esm({
941
1217
  });
942
1218
 
943
1219
  // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
944
- var import_selenium_webdriver15, TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR2, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
1220
+ var import_selenium_webdriver16, TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
945
1221
  var init_HeaderFilterDictionary = __esm({
946
1222
  "src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
947
1223
  "use strict";
948
1224
  init_AbstractEditor();
949
- import_selenium_webdriver15 = require("selenium-webdriver");
1225
+ import_selenium_webdriver16 = require("selenium-webdriver");
950
1226
  init_actions();
951
1227
  init_locators();
952
1228
  init_ClearButtonStrategy();
953
1229
  init_fixElementStaleError();
1230
+ init_withCustomTimeouts();
954
1231
  TAGS_SELECTOR2 = ".dx-tag .tag-text";
955
1232
  DX_TAG_CONTAINER2 = "dx-tag-container";
956
1233
  DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
957
1234
  CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
958
1235
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
959
- TAG_BOX_LIST_ITEM_SELECTOR2 = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
1236
+ TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
960
1237
  combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
961
1238
  dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
962
- const { implicit } = await driver.manage().getTimeouts();
963
- let optElement = null;
964
- const timeout = delay ? implicit : 600;
965
1239
  let err = null;
966
1240
  try {
967
1241
  const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
968
- await driver.manage().setTimeouts({ implicit: timeout });
969
- const calendarPopoverElement = await driver.findElement(import_selenium_webdriver15.By.css(calendarPopoverSelector));
970
- const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver15.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
971
- optElement = await customOptionList.findElement(import_selenium_webdriver15.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
972
- await click(optElement, driver);
1242
+ await withCustomTimeouts_default({
1243
+ driver,
1244
+ timeout: delay ? void 0 : 600,
1245
+ callback: async () => {
1246
+ const calendarPopoverElement = await driver.findElement(import_selenium_webdriver16.By.css(calendarPopoverSelector));
1247
+ const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver16.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
1248
+ const optElement = await customOptionList.findElement(import_selenium_webdriver16.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
1249
+ await click(optElement, driver);
1250
+ }
1251
+ });
973
1252
  } catch (e) {
974
1253
  err = new Error(`Item not found: "${optionValue}"`);
975
- } finally {
976
- await driver.manage().setTimeouts({ implicit });
977
1254
  }
978
1255
  if (err)
979
1256
  throw err;
@@ -992,7 +1269,7 @@ var init_HeaderFilterDictionary = __esm({
992
1269
  }
993
1270
  }
994
1271
  async waitOptionSelection() {
995
- await fixElementStaleError(import_selenium_webdriver15.By.css(TAG_BOX_LIST_ITEM_SELECTOR2), this.driver);
1272
+ await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
996
1273
  }
997
1274
  async selectOption(inputEl, value, lastElement) {
998
1275
  try {
@@ -1001,7 +1278,7 @@ var init_HeaderFilterDictionary = __esm({
1001
1278
  await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
1002
1279
  const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
1003
1280
  for (let i = 0; i < textLength; i++) {
1004
- await inputEl.sendKeys(import_selenium_webdriver15.Key.BACK_SPACE);
1281
+ await inputEl.sendKeys(import_selenium_webdriver16.Key.BACK_SPACE);
1005
1282
  }
1006
1283
  } catch (error) {
1007
1284
  throw error;
@@ -1016,7 +1293,7 @@ var init_HeaderFilterDictionary = __esm({
1016
1293
  return [];
1017
1294
  }
1018
1295
  const tags = await this.driver.findElements(
1019
- import_selenium_webdriver15.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
1296
+ import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
1020
1297
  );
1021
1298
  const values = [];
1022
1299
  for (const tag of tags) {
@@ -1136,13 +1413,14 @@ var init_createDataTestId = __esm({
1136
1413
  });
1137
1414
 
1138
1415
  // src/pageObjects/elements/AbstractButton.ts
1139
- var AbstractButton;
1416
+ var D5_BUTTON_IS_PRESSED, AbstractButton;
1140
1417
  var init_AbstractButton = __esm({
1141
1418
  "src/pageObjects/elements/AbstractButton.ts"() {
1142
1419
  "use strict";
1143
1420
  init_AbstractElementWithParent();
1144
1421
  init_actions();
1145
1422
  init_waitElementIsClickable();
1423
+ D5_BUTTON_IS_PRESSED = "d5-is-pressed";
1146
1424
  AbstractButton = class extends AbstractElementWithParent {
1147
1425
  constructor(parentCssSelector, elementCssSelector, driver) {
1148
1426
  super(parentCssSelector, elementCssSelector, driver);
@@ -1168,17 +1446,26 @@ var init_AbstractButton = __esm({
1168
1446
  return false;
1169
1447
  }
1170
1448
  }
1449
+ async isPressed() {
1450
+ try {
1451
+ const button = await this.getElement();
1452
+ const classAttribute = await button.getAttribute("class");
1453
+ return classAttribute.includes(D5_BUTTON_IS_PRESSED);
1454
+ } catch {
1455
+ return false;
1456
+ }
1457
+ }
1171
1458
  };
1172
1459
  }
1173
1460
  });
1174
1461
 
1175
1462
  // src/pageObjects/elements/DXComponents/DXButton.ts
1176
- var import_selenium_webdriver17, DXButton;
1463
+ var import_selenium_webdriver18, DXButton;
1177
1464
  var init_DXButton = __esm({
1178
1465
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1179
1466
  "use strict";
1180
1467
  init_AbstractButton();
1181
- import_selenium_webdriver17 = require("selenium-webdriver");
1468
+ import_selenium_webdriver18 = require("selenium-webdriver");
1182
1469
  DXButton = class extends AbstractButton {
1183
1470
  async getText() {
1184
1471
  const classes = await this.getClasses();
@@ -1186,7 +1473,7 @@ var init_DXButton = __esm({
1186
1473
  return null;
1187
1474
  }
1188
1475
  const el = await this.getElement();
1189
- const textEl = el.findElement(import_selenium_webdriver17.By.className("dx-button-text"));
1476
+ const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
1190
1477
  return await textEl.getText();
1191
1478
  }
1192
1479
  };
@@ -1244,12 +1531,12 @@ var init_Panel = __esm({
1244
1531
  });
1245
1532
 
1246
1533
  // src/pageObjects/elements/Groups/TabPanel.ts
1247
- var import_selenium_webdriver18, TabPanelItem, TabPanel;
1534
+ var import_selenium_webdriver19, TabPanelItem, TabPanel;
1248
1535
  var init_TabPanel = __esm({
1249
1536
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1250
1537
  "use strict";
1251
1538
  init_AbstractGroup();
1252
- import_selenium_webdriver18 = require("selenium-webdriver");
1539
+ import_selenium_webdriver19 = require("selenium-webdriver");
1253
1540
  init_actions();
1254
1541
  TabPanelItem = class extends AbstractGroup {
1255
1542
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1260,7 +1547,7 @@ var init_TabPanel = __esm({
1260
1547
  }
1261
1548
  async isActive() {
1262
1549
  const tabPanelItemElement = await this.getElement();
1263
- const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver18.By.xpath('ancestor::div[@role="tab"][1]'));
1550
+ const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver19.By.xpath('ancestor::div[@role="tab"][1]'));
1264
1551
  return await grandparentTab.getAttribute("aria-selected") === "true";
1265
1552
  }
1266
1553
  async getTitle() {
@@ -1279,12 +1566,12 @@ var init_TabPanel = __esm({
1279
1566
  });
1280
1567
 
1281
1568
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1282
- var import_selenium_webdriver19, ACCORDION_TITLE_CONTAINER, AccordionItem;
1569
+ var import_selenium_webdriver20, ACCORDION_TITLE_CONTAINER, AccordionItem;
1283
1570
  var init_AccordionItem = __esm({
1284
1571
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1285
1572
  "use strict";
1286
1573
  init_AbstractGroup();
1287
- import_selenium_webdriver19 = require("selenium-webdriver");
1574
+ import_selenium_webdriver20 = require("selenium-webdriver");
1288
1575
  init_actions();
1289
1576
  ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1290
1577
  AccordionItem = class extends AbstractGroup {
@@ -1297,7 +1584,7 @@ var init_AccordionItem = __esm({
1297
1584
  }
1298
1585
  async clickAccordionItemTitle() {
1299
1586
  const accordionElement = await this.getElement();
1300
- const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver19.By.className(ACCORDION_TITLE_CONTAINER));
1587
+ const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver20.By.className(ACCORDION_TITLE_CONTAINER));
1301
1588
  await accordTitleElement.click();
1302
1589
  }
1303
1590
  async click() {
@@ -1467,6 +1754,7 @@ var init_AbstractForm = __esm({
1467
1754
  init_AbstractPage();
1468
1755
  init_FormButton();
1469
1756
  init_FormGroup();
1757
+ init_waitElementIsVisible();
1470
1758
  AbstractForm = class extends AbstractPage {
1471
1759
  containerCssSelector = "";
1472
1760
  _formName = "";
@@ -1491,7 +1779,15 @@ var init_AbstractForm = __esm({
1491
1779
  async exists() {
1492
1780
  try {
1493
1781
  let elements = await this.driver.findElements(this.containerBy);
1494
- return elements.length > 0;
1782
+ if (elements.length === 0) {
1783
+ return false;
1784
+ }
1785
+ await waitElementIsVisible_default({
1786
+ element: elements[0],
1787
+ errorMessage: "Element exists in DOM but is not visible",
1788
+ driver: this.driver
1789
+ });
1790
+ return true;
1495
1791
  } catch (error) {
1496
1792
  return false;
1497
1793
  }
@@ -1527,11 +1823,11 @@ function getCssRowByIndexSelector(index) {
1527
1823
  function getCssCellByIndexSelector(index) {
1528
1824
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1529
1825
  }
1530
- var import_selenium_webdriver20, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1826
+ var import_selenium_webdriver21, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1531
1827
  var init_utils2 = __esm({
1532
1828
  "src/pageObjects/elements/Table/utils.ts"() {
1533
1829
  "use strict";
1534
- import_selenium_webdriver20 = require("selenium-webdriver");
1830
+ import_selenium_webdriver21 = require("selenium-webdriver");
1535
1831
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1536
1832
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1537
1833
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1548,11 +1844,11 @@ var init_types3 = __esm({
1548
1844
  });
1549
1845
 
1550
1846
  // src/pageObjects/elements/Table/elements/Cell.ts
1551
- var import_selenium_webdriver21, Cell;
1847
+ var import_selenium_webdriver22, Cell;
1552
1848
  var init_Cell = __esm({
1553
1849
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1554
1850
  "use strict";
1555
- import_selenium_webdriver21 = require("selenium-webdriver");
1851
+ import_selenium_webdriver22 = require("selenium-webdriver");
1556
1852
  init_AbstractElementWithParent();
1557
1853
  init_utils2();
1558
1854
  init_types3();
@@ -1569,12 +1865,12 @@ var init_Cell = __esm({
1569
1865
  this.elementCssSelector = getCssCellByIndexSelector(index);
1570
1866
  }
1571
1867
  async getBooleanValue(cellEl) {
1572
- const booleanEl = await cellEl.findElement(import_selenium_webdriver21.By.className("boolean-widget"));
1868
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver22.By.className("boolean-widget"));
1573
1869
  return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1574
1870
  }
1575
1871
  async getTagsValue(cellEl) {
1576
1872
  const tagsCssSelector = ".multiselect-container .multiselect-cell";
1577
- const tags = await cellEl.findElements(import_selenium_webdriver21.By.css(tagsCssSelector));
1873
+ const tags = await cellEl.findElements(import_selenium_webdriver22.By.css(tagsCssSelector));
1578
1874
  const values = [];
1579
1875
  for (const tag of tags) {
1580
1876
  values.push(await tag.getAttribute("textContent"));
@@ -1594,7 +1890,7 @@ var init_Cell = __esm({
1594
1890
  const [datePart, timePart] = value.split(", ");
1595
1891
  const [day, month, year] = datePart.split(".").map(Number);
1596
1892
  const [hours, minutes] = timePart.split(":").map(Number);
1597
- return new Date(Date.UTC(year, month - 1, day, hours, minutes));
1893
+ return new Date(year, month - 1, day, hours, minutes, 0, 0);
1598
1894
  } else {
1599
1895
  const [day, month, year] = value.split(".").map(Number);
1600
1896
  return new Date(Date.UTC(year, month - 1, day));
@@ -1628,11 +1924,11 @@ var init_Cell = __esm({
1628
1924
  });
1629
1925
 
1630
1926
  // src/pageObjects/elements/Table/elements/Row.ts
1631
- var import_selenium_webdriver22, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1927
+ var import_selenium_webdriver23, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1632
1928
  var init_Row = __esm({
1633
1929
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1634
1930
  "use strict";
1635
- import_selenium_webdriver22 = require("selenium-webdriver");
1931
+ import_selenium_webdriver23 = require("selenium-webdriver");
1636
1932
  init_Cell();
1637
1933
  init_utils2();
1638
1934
  init_AbstractElementWithParent();
@@ -1678,9 +1974,18 @@ var init_Row = __esm({
1678
1974
  getCellByTitle(title) {
1679
1975
  return this._getCell({ title });
1680
1976
  }
1681
- async select() {
1977
+ async select(preserve = false) {
1682
1978
  await staleElementAction(async () => {
1683
1979
  const rowEl = await this.getElement();
1980
+ const isSelected = (await this.getClasses()).includes(DX_SELECTION_CLASS);
1981
+ if (isSelected && !preserve) {
1982
+ await this.driver.actions({ async: true }).keyUp(import_selenium_webdriver23.Key.CONTROL).perform();
1983
+ }
1984
+ if (preserve && !isSelected) {
1985
+ await this.driver.actions({ async: true }).keyDown(import_selenium_webdriver23.Key.CONTROL).perform();
1986
+ await click(rowEl, this.driver);
1987
+ return;
1988
+ }
1684
1989
  await click(rowEl, this.driver);
1685
1990
  });
1686
1991
  await safeWait(
@@ -1700,7 +2005,7 @@ var init_Row = __esm({
1700
2005
  return this.index;
1701
2006
  }
1702
2007
  async getCells() {
1703
- const cells = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
2008
+ const cells = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1704
2009
  const result = [];
1705
2010
  cells.forEach((_, index) => {
1706
2011
  const newCell = this.getCellByIndex(index);
@@ -1712,7 +2017,7 @@ var init_Row = __esm({
1712
2017
  const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1713
2018
  this.index
1714
2019
  )}"] .${buttonClass}`;
1715
- const by = import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
2020
+ const by = import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
1716
2021
  await staleElementAction(async () => {
1717
2022
  const button = await fixElementStaleError(by, this.driver);
1718
2023
  await click(button, this.driver);
@@ -1744,11 +2049,11 @@ var init_Row = __esm({
1744
2049
  });
1745
2050
 
1746
2051
  // src/pageObjects/elements/Table/elements/Column.ts
1747
- var import_selenium_webdriver23, Column;
2052
+ var import_selenium_webdriver24, Column;
1748
2053
  var init_Column = __esm({
1749
2054
  "src/pageObjects/elements/Table/elements/Column.ts"() {
1750
2055
  "use strict";
1751
- import_selenium_webdriver23 = require("selenium-webdriver");
2056
+ import_selenium_webdriver24 = require("selenium-webdriver");
1752
2057
  init_utils2();
1753
2058
  init_AbstractElementWithParent();
1754
2059
  init_fixElementStaleError();
@@ -1776,7 +2081,7 @@ var init_Column = __esm({
1776
2081
  return super.getElement();
1777
2082
  }
1778
2083
  async getColumnHeaderIndexBy(cssSelector) {
1779
- const column = await fixElementStaleError(import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
2084
+ const column = await fixElementStaleError(import_selenium_webdriver24.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1780
2085
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
1781
2086
  }
1782
2087
  async getIndexByCaption() {
@@ -2013,8 +2318,8 @@ var init_AbstractDropDownMenuList = __esm({
2013
2318
  const menuItemElement = await fixElementStaleError(by, this.driver);
2014
2319
  await click(menuItemElement, this.driver);
2015
2320
  }
2016
- async getElementByPath(path, getBy, returnLastElement = false) {
2017
- let pathList = isString(path) ? [path] : path;
2321
+ async getElementByPath(path2, getBy, returnLastElement = false) {
2322
+ let pathList = isString(path2) ? [path2] : path2;
2018
2323
  let result = null;
2019
2324
  let index = 1;
2020
2325
  for (let text of pathList) {
@@ -2059,12 +2364,12 @@ var init_cssToXPath = __esm({
2059
2364
  });
2060
2365
 
2061
2366
  // src/pageObjects/elements/DXContextMenuList.ts
2062
- var import_selenium_webdriver24, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2367
+ var import_selenium_webdriver25, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2063
2368
  var init_DXContextMenuList = __esm({
2064
2369
  "src/pageObjects/elements/DXContextMenuList.ts"() {
2065
2370
  "use strict";
2066
2371
  init_AbstractDropDownMenuList();
2067
- import_selenium_webdriver24 = require("selenium-webdriver");
2372
+ import_selenium_webdriver25 = require("selenium-webdriver");
2068
2373
  init_cssToXPath();
2069
2374
  init_waitElementIsVisible();
2070
2375
  CONTEXT_MENU_CLASS = "dx-context-menu";
@@ -2081,12 +2386,12 @@ var init_DXContextMenuList = __esm({
2081
2386
  getButtonTitleBy(title) {
2082
2387
  const buttonByTextXpath2 = (text) => `//span[contains(@class, "${CONTEXT_MENU_ITEM_TEXT_CLASS}") and contains(text(), "${text}")]`;
2083
2388
  const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
2084
- return import_selenium_webdriver24.By.xpath(xpath);
2389
+ return import_selenium_webdriver25.By.xpath(xpath);
2085
2390
  }
2086
2391
  async isVisible() {
2087
2392
  try {
2088
2393
  await waitElementIsVisible_default({
2089
- element: await this.driver.findElement(import_selenium_webdriver24.By.css(`.dx-overlay-wrapper .dx-contextmenu`)),
2394
+ element: await this.driver.findElement(import_selenium_webdriver25.By.css(`.dx-overlay-wrapper .dx-context-menu`)),
2090
2395
  driver: this.driver,
2091
2396
  errorMessage: "Cannot find dropdown element"
2092
2397
  });
@@ -2132,11 +2437,11 @@ var init_ContextMenu = __esm({
2132
2437
  });
2133
2438
 
2134
2439
  // src/pageObjects/elements/Table/Table.ts
2135
- var import_selenium_webdriver25, Table;
2440
+ var import_selenium_webdriver26, Table;
2136
2441
  var init_Table = __esm({
2137
2442
  "src/pageObjects/elements/Table/Table.ts"() {
2138
2443
  "use strict";
2139
- import_selenium_webdriver25 = require("selenium-webdriver");
2444
+ import_selenium_webdriver26 = require("selenium-webdriver");
2140
2445
  init_createDataTestId();
2141
2446
  init_AbstractElementWithParent();
2142
2447
  init_Row();
@@ -2144,6 +2449,8 @@ var init_Table = __esm({
2144
2449
  init_FormField();
2145
2450
  init_ContextMenu();
2146
2451
  init_actions();
2452
+ init_wait();
2453
+ init_withCustomTimeouts();
2147
2454
  Table = class extends AbstractElementWithParent {
2148
2455
  formName;
2149
2456
  headerCssSelector;
@@ -2209,13 +2516,32 @@ var init_Table = __esm({
2209
2516
  /**
2210
2517
  * Вибрати рядок по індексу.
2211
2518
  * @param index починається з 0
2519
+ * @param preserve boolean який изначає, чи повинні раніше вибрані рядки залишатися вибраними
2212
2520
  */
2213
- selectRowByIndex(index) {
2214
- return this.getRowByIndex(index).select();
2521
+ selectRowByIndex(index, preserve = false) {
2522
+ return this.getRowByIndex(index).select(preserve);
2215
2523
  }
2216
- async getRows() {
2524
+ /**
2525
+ * Вибрати масив рядків по індексу.
2526
+ * @param indexes починається з 0
2527
+ */
2528
+ async selectRowsByIndexes(indexes) {
2529
+ for (const index of indexes) {
2530
+ await this.selectRowByIndex(index, true);
2531
+ }
2532
+ }
2533
+ getRowElements(timeout) {
2217
2534
  const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
2218
- const rows = await this.driver.findElements(import_selenium_webdriver25.By.css(rowsFullCssSelector));
2535
+ return withCustomTimeouts_default({
2536
+ driver: this.driver,
2537
+ timeout,
2538
+ callback: () => {
2539
+ return this.driver.findElements(import_selenium_webdriver26.By.css(rowsFullCssSelector));
2540
+ }
2541
+ });
2542
+ }
2543
+ async getRows() {
2544
+ const rows = await this.getRowElements();
2219
2545
  const result = [];
2220
2546
  rows.forEach((_, index) => {
2221
2547
  const newRow = new Row(
@@ -2231,7 +2557,7 @@ var init_Table = __esm({
2231
2557
  }
2232
2558
  async getColumns() {
2233
2559
  const columns = await this.driver.findElements(
2234
- import_selenium_webdriver25.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`)
2560
+ import_selenium_webdriver26.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`)
2235
2561
  );
2236
2562
  const result = [];
2237
2563
  columns.forEach((_, index) => {
@@ -2301,16 +2627,82 @@ var init_Table = __esm({
2301
2627
  await contextMenu(cellElement, this.driver);
2302
2628
  });
2303
2629
  }
2630
+ /**
2631
+ * Отримує значення комірки таблиці за ім'ям комірки та індексом рядка.
2632
+ *
2633
+ * @param {string} cellName - Ім'я комірки (поля) в таблиці
2634
+ * @param {number} rowIndex - Індекс рядка (починається з 0)
2635
+ * @throws {Error} Викидає помилку, якщо rowIndex не вказано
2636
+ * @returns {Promise<string>} Повертає значення комірки
2637
+ *
2638
+ * @example
2639
+ * const table = new Table(driver);
2640
+ *
2641
+ * // Отримання значення комірки 'Name' в першому рядку (індекс 0)
2642
+ * const cellValue = await table.getCellValueByCellName('Name', 0);
2643
+ * expect(cellValue).toBe('Очікуване значення');
2644
+ */
2645
+ getCellValueByCellName(cellName, rowIndex) {
2646
+ if (rowIndex == null) {
2647
+ throw new Error("Error: getCellValue(): rowIndex is required");
2648
+ }
2649
+ const row = this.getRowByIndex(rowIndex);
2650
+ return row.getCell(cellName).getValue();
2651
+ }
2652
+ /**
2653
+ * Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
2654
+ *
2655
+ * @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
2656
+ *
2657
+ * @example
2658
+ * const table = new Table(driver);
2659
+ *
2660
+ * // Перевірка чи порожня таблиця
2661
+ * const empty = await table.isEmpty();
2662
+ * expect(empty).toBe(true);
2663
+ */
2664
+ async isEmpty() {
2665
+ try {
2666
+ await this.waitRowsCount(0);
2667
+ return true;
2668
+ } catch {
2669
+ return false;
2670
+ }
2671
+ }
2672
+ /**
2673
+ * Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
2674
+ * Використовується для синхронізації тестів з динамічним завантаженням даних.
2675
+ *
2676
+ * @param {number} count - Очікувана кількість рядків у таблиці
2677
+ * @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
2678
+ * @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
2679
+ *
2680
+ * @example
2681
+ * const table = new Table(driver);
2682
+ *
2683
+ * // Очікування, поки таблиця не стане порожньою
2684
+ * await table.waitRowsCount(0);
2685
+ *
2686
+ * // Очікування, поки в таблиці не з'явиться 5 рядків
2687
+ * await table.waitRowsCount(5);
2688
+ * console.log('Таблиця містить 5 рядків');
2689
+ */
2690
+ async waitRowsCount(count) {
2691
+ await safeWait(async () => {
2692
+ const rows = await this.getRowElements(1e3);
2693
+ return rows.length === count;
2694
+ }, this.driver, `Rows count not equal: ${count}`);
2695
+ }
2304
2696
  };
2305
2697
  }
2306
2698
  });
2307
2699
 
2308
2700
  // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
2309
- var import_selenium_webdriver26, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, ToolbarButton;
2701
+ var import_selenium_webdriver27, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, ToolbarButton;
2310
2702
  var init_ToolbarButton = __esm({
2311
2703
  "src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
2312
2704
  "use strict";
2313
- import_selenium_webdriver26 = require("selenium-webdriver");
2705
+ import_selenium_webdriver27 = require("selenium-webdriver");
2314
2706
  init_AbstractButton();
2315
2707
  TOOLBAR_BUTTON_CLASS = "toolbar-button";
2316
2708
  TOOLBAR_BUTTON_TEXT_CLASS = "dx-button-text";
@@ -2327,7 +2719,7 @@ var init_ToolbarButton = __esm({
2327
2719
  }
2328
2720
  async getTitle() {
2329
2721
  try {
2330
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver26.By.css(getToolbarButtonTextSelector(this.name)));
2722
+ const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
2331
2723
  return await buttonTextContainer.getText();
2332
2724
  } catch (_) {
2333
2725
  return null;
@@ -2338,12 +2730,12 @@ var init_ToolbarButton = __esm({
2338
2730
  });
2339
2731
 
2340
2732
  // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
2341
- var import_selenium_webdriver27, ToolbarGroupButton;
2733
+ var import_selenium_webdriver28, ToolbarGroupButton;
2342
2734
  var init_ToolbarGroupButton = __esm({
2343
2735
  "src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
2344
2736
  "use strict";
2345
2737
  init_AbstractButton();
2346
- import_selenium_webdriver27 = require("selenium-webdriver");
2738
+ import_selenium_webdriver28 = require("selenium-webdriver");
2347
2739
  init_ToolbarButton();
2348
2740
  ToolbarGroupButton = class extends AbstractButton {
2349
2741
  name;
@@ -2356,7 +2748,7 @@ var init_ToolbarGroupButton = __esm({
2356
2748
  }
2357
2749
  async getTitle() {
2358
2750
  try {
2359
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
2751
+ const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver28.By.css(getToolbarButtonTextSelector(this.name)));
2360
2752
  return await buttonTextContainer.getText();
2361
2753
  } catch (_) {
2362
2754
  return null;
@@ -2567,6 +2959,14 @@ var init_ToolbarItem = __esm({
2567
2959
  return false;
2568
2960
  }
2569
2961
  }
2962
+ async isPressed() {
2963
+ try {
2964
+ await this.init();
2965
+ return this._button.isPressed();
2966
+ } catch (error) {
2967
+ return false;
2968
+ }
2969
+ }
2570
2970
  async getTitle() {
2571
2971
  await this.init();
2572
2972
  return await this._button.getTitle();
@@ -2600,11 +3000,11 @@ var init_FormToolbar = __esm({
2600
3000
  });
2601
3001
 
2602
3002
  // src/pageObjects/elements/Filters/FilterOperation.ts
2603
- var import_selenium_webdriver28, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
3003
+ var import_selenium_webdriver29, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
2604
3004
  var init_FilterOperation = __esm({
2605
3005
  "src/pageObjects/elements/Filters/FilterOperation.ts"() {
2606
3006
  "use strict";
2607
- import_selenium_webdriver28 = require("selenium-webdriver");
3007
+ import_selenium_webdriver29 = require("selenium-webdriver");
2608
3008
  init_fixElementStaleError();
2609
3009
  init_AbstractElementWithParent();
2610
3010
  init_locators();
@@ -2644,10 +3044,10 @@ var init_FilterOperation = __esm({
2644
3044
  errorMessage: "Widget operation is not clickable",
2645
3045
  driver: this.driver
2646
3046
  });
2647
- const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver28.By.className("dx-icon"));
3047
+ const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver29.By.className("dx-icon"));
2648
3048
  await click(clickableElement, this.driver);
2649
3049
  try {
2650
- const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver28.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
3050
+ const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
2651
3051
  await waitElementIsVisible_default({
2652
3052
  element: widgetPopupEl,
2653
3053
  errorMessage: `Operation widget popup is not visible`,
@@ -2662,7 +3062,7 @@ var init_FilterOperation = __esm({
2662
3062
  throw new Error(`Operation with name "${operationName}" is not correct.`);
2663
3063
  }
2664
3064
  await this.initOperationWidget();
2665
- const operationEl = await fixElementStaleError(import_selenium_webdriver28.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
3065
+ const operationEl = await fixElementStaleError(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
2666
3066
  await click(operationEl, this.driver);
2667
3067
  await safeWait(
2668
3068
  async () => {
@@ -2918,11 +3318,11 @@ var init_PanelFilterField = __esm({
2918
3318
  });
2919
3319
 
2920
3320
  // src/pageObjects/elements/Filters/FilterPanel.ts
2921
- var import_selenium_webdriver29, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
3321
+ var import_selenium_webdriver30, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2922
3322
  var init_FilterPanel = __esm({
2923
3323
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2924
3324
  "use strict";
2925
- import_selenium_webdriver29 = require("selenium-webdriver");
3325
+ import_selenium_webdriver30 = require("selenium-webdriver");
2926
3326
  init_AbstractElement();
2927
3327
  init_PanelFilterField();
2928
3328
  init_actions();
@@ -2937,7 +3337,7 @@ var init_FilterPanel = __esm({
2937
3337
  async filterPanelButtons() {
2938
3338
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2939
3339
  const el = await this.getElement();
2940
- return el.findElements(import_selenium_webdriver29.By.css(selector));
3340
+ return el.findElements(import_selenium_webdriver30.By.css(selector));
2941
3341
  }
2942
3342
  constructor(formName, driver) {
2943
3343
  super(driver, drawerSelector(formName));
@@ -2970,7 +3370,7 @@ var init_FilterPanel = __esm({
2970
3370
  await this.driver.sleep(300);
2971
3371
  }
2972
3372
  async close() {
2973
- const btn = await this.driver.findElement(import_selenium_webdriver29.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
3373
+ const btn = await this.driver.findElement(import_selenium_webdriver30.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2974
3374
  await click(btn, this.driver);
2975
3375
  }
2976
3376
  };
@@ -3006,12 +3406,12 @@ var init_HeaderFilterField = __esm({
3006
3406
  });
3007
3407
 
3008
3408
  // src/pageObjects/elements/Filters/ColumnFilter.ts
3009
- var import_selenium_webdriver30, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
3409
+ var import_selenium_webdriver31, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
3010
3410
  var init_ColumnFilter = __esm({
3011
3411
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
3012
3412
  "use strict";
3013
3413
  init_actions();
3014
- import_selenium_webdriver30 = require("selenium-webdriver");
3414
+ import_selenium_webdriver31 = require("selenium-webdriver");
3015
3415
  init_HeaderFilterField();
3016
3416
  init_waitElementIsVisible();
3017
3417
  init_AbstractElement();
@@ -3020,7 +3420,7 @@ var init_ColumnFilter = __esm({
3020
3420
  init_wait();
3021
3421
  APPLY_SELECTOR = ".apply-button";
3022
3422
  CANCEL_SELECTOR = ".cancel-button";
3023
- HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
3423
+ HEADER_FILTER_ICON = ".indicators-container .filter-icon";
3024
3424
  HEADER_FILTER_CONTAINER = ".header-filter";
3025
3425
  HEADER_FILTER_BUTTONS = ".header-filter-buttons";
3026
3426
  ColumnFilter = class extends AbstractElement {
@@ -3036,11 +3436,11 @@ var init_ColumnFilter = __esm({
3036
3436
  }
3037
3437
  async getApplyButton() {
3038
3438
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
3039
- return this.driver.findElement(import_selenium_webdriver30.By.css(selector));
3439
+ return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
3040
3440
  }
3041
3441
  async getCancelButton() {
3042
3442
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
3043
- return this.driver.findElement(import_selenium_webdriver30.By.css(selector));
3443
+ return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
3044
3444
  }
3045
3445
  async apply() {
3046
3446
  const btn = await this.getApplyButton();
@@ -3054,24 +3454,15 @@ var init_ColumnFilter = __esm({
3054
3454
  const columnEl = await this._column.getElement();
3055
3455
  const actions = this.driver.actions({ async: true });
3056
3456
  await actions.move({ origin: columnEl }).perform();
3057
- const elements = await columnEl.findElements(import_selenium_webdriver30.By.css(HEADER_FILTER_ICON));
3058
- let headerFilterIcon = null;
3457
+ const headerFilterIconBy = import_selenium_webdriver31.By.css(HEADER_FILTER_ICON);
3458
+ let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
3059
3459
  await safeWait(
3060
- async () => {
3061
- let result = false;
3062
- for (let element of elements) {
3063
- if (await element.isDisplayed()) {
3064
- headerFilterIcon = element;
3065
- result = true;
3066
- break;
3067
- }
3068
- }
3069
- return result;
3460
+ () => {
3461
+ return headerFilterIcon.isDisplayed();
3070
3462
  },
3071
3463
  this.driver,
3072
3464
  `HeaderFilter "${this._name}" is not visible`
3073
3465
  );
3074
- if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
3075
3466
  await click(headerFilterIcon, this.driver);
3076
3467
  const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
3077
3468
  const filterEl = await filter.getElement();
@@ -3210,9 +3601,9 @@ var init_ListForm = __esm({
3210
3601
  init_FormFilterField();
3211
3602
  init_FilterPanel();
3212
3603
  init_ColumnFilter();
3213
- DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
3214
- DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content:not(.dx-datagrid-content-fixed)";
3215
- FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
3604
+ DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
3605
+ DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
3606
+ FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-sticky-columns .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
3216
3607
  CONTEXT_MENU_CSS_SELECTOR = ".dx-datagrid";
3217
3608
  ListForm = class extends Form {
3218
3609
  headerCssSelector;
@@ -3297,9 +3688,9 @@ var init_TreeView = __esm({
3297
3688
  "src/pageObjects/elements/Forms/TreeView.ts"() {
3298
3689
  "use strict";
3299
3690
  init_ListForm();
3300
- TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
3301
- TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content:not(.dx-datagrid-content-fixed)";
3302
- FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-treelist-content.dx-treelist-content-fixed";
3691
+ TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3692
+ TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3693
+ FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3303
3694
  TreeView = class extends ListForm {
3304
3695
  constructor(driver) {
3305
3696
  super(driver);
@@ -3352,12 +3743,12 @@ var init_createSubFormInstance = __esm({
3352
3743
  });
3353
3744
 
3354
3745
  // src/pageObjects/elements/Forms/Form.ts
3355
- var import_selenium_webdriver31, formTestId, Form;
3746
+ var import_selenium_webdriver32, formTestId, Form;
3356
3747
  var init_Form = __esm({
3357
3748
  "src/pageObjects/elements/Forms/Form.ts"() {
3358
3749
  "use strict";
3359
3750
  init_locators();
3360
- import_selenium_webdriver31 = require("selenium-webdriver");
3751
+ import_selenium_webdriver32 = require("selenium-webdriver");
3361
3752
  init_AbstractForm();
3362
3753
  init_waitElementIsVisible();
3363
3754
  init_createSubFormInstance();
@@ -3382,7 +3773,7 @@ var init_Form = __esm({
3382
3773
  */
3383
3774
  async getTitleText() {
3384
3775
  if (await this.isModal()) {
3385
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver31.By.css(`${this.popupContainerCssSelector} .popup-title`));
3776
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver32.By.css(`${this.popupContainerCssSelector} .popup-title`));
3386
3777
  await waitElementIsVisible_default({
3387
3778
  element: titleEl2,
3388
3779
  driver: this.driver,
@@ -3390,7 +3781,7 @@ var init_Form = __esm({
3390
3781
  });
3391
3782
  return titleEl2.getText();
3392
3783
  }
3393
- let titleEl = await this.driver.findElement(import_selenium_webdriver31.By.className("main-toolbar-form-title"));
3784
+ let titleEl = await this.driver.findElement(import_selenium_webdriver32.By.className("main-toolbar-form-title"));
3394
3785
  return titleEl.getText();
3395
3786
  }
3396
3787
  setSubFormMode() {
@@ -3409,7 +3800,7 @@ var init_Form = __esm({
3409
3800
  async subForm(name, options = {}) {
3410
3801
  const { isDockPanel = false } = options;
3411
3802
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
3412
- const byCssSelector = import_selenium_webdriver31.By.css(cssSelector);
3803
+ const byCssSelector = import_selenium_webdriver32.By.css(cssSelector);
3413
3804
  const subFormEl = await this.driver.findElement(byCssSelector);
3414
3805
  await waitElementIsVisible_default({
3415
3806
  element: subFormEl,
@@ -3439,12 +3830,12 @@ var FormEdit_exports = {};
3439
3830
  __export(FormEdit_exports, {
3440
3831
  default: () => FormEdit
3441
3832
  });
3442
- var import_selenium_webdriver32, FormEdit;
3833
+ var import_selenium_webdriver33, FormEdit;
3443
3834
  var init_FormEdit = __esm({
3444
3835
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
3445
3836
  "use strict";
3446
3837
  init_Form();
3447
- import_selenium_webdriver32 = require("selenium-webdriver");
3838
+ import_selenium_webdriver33 = require("selenium-webdriver");
3448
3839
  init_FormField();
3449
3840
  init_actions();
3450
3841
  init_wait();
@@ -3480,7 +3871,7 @@ var init_FormEdit = __esm({
3480
3871
  */
3481
3872
  async isSaveButtonDisabled() {
3482
3873
  const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3483
- const saveButton = await this.driver.findElement(import_selenium_webdriver32.By.css(saveButtonCssSelector));
3874
+ const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
3484
3875
  const result = await saveButton.getAttribute("aria-disabled");
3485
3876
  return result === "true";
3486
3877
  }
@@ -3493,7 +3884,7 @@ var init_FormEdit = __esm({
3493
3884
  */
3494
3885
  async saveButtonClick() {
3495
3886
  const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3496
- const saveButton = await this.driver.findElement(import_selenium_webdriver32.By.css(saveButtonCssSelector));
3887
+ const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
3497
3888
  await safeWait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
3498
3889
  await click(saveButton, this.driver);
3499
3890
  }
@@ -3506,7 +3897,7 @@ var init_FormEdit = __esm({
3506
3897
  */
3507
3898
  async closeButtonClick() {
3508
3899
  const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
3509
- const closeButton = await this.driver.findElement(import_selenium_webdriver32.By.css(closeButtonCssSelector));
3900
+ const closeButton = await this.driver.findElement(import_selenium_webdriver33.By.css(closeButtonCssSelector));
3510
3901
  await click(closeButton, this.driver);
3511
3902
  }
3512
3903
  };
@@ -3600,6 +3991,9 @@ init_locators();
3600
3991
 
3601
3992
  // src/utils/createDriver.ts
3602
3993
  var import_selenium_webdriver4 = require("selenium-webdriver");
3994
+ var import_node_path = __toESM(require("path"));
3995
+ var import_node_fs = __toESM(require("fs"));
3996
+ var import_node_os = __toESM(require("os"));
3603
3997
  init_config();
3604
3998
  var import_chrome = __toESM(require("selenium-webdriver/chrome"));
3605
3999
  var import_firefox = __toESM(require("selenium-webdriver/firefox"));
@@ -3607,7 +4001,15 @@ function chromeOptions(builder, options) {
3607
4001
  const ChromeOptions = new import_chrome.default.Options();
3608
4002
  if (options.headless) {
3609
4003
  ChromeOptions.addArguments(`--headless=new`);
4004
+ ChromeOptions.addArguments(`--disable-gpu`);
4005
+ ChromeOptions.addArguments(`--disable-dev-shm-usage`);
4006
+ ChromeOptions.addArguments(`--window-size=1920,1080`);
4007
+ }
4008
+ const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
4009
+ if (!import_node_fs.default.existsSync(userDataDir)) {
4010
+ import_node_fs.default.mkdirSync(userDataDir, { recursive: true });
3610
4011
  }
4012
+ ChromeOptions.addArguments(`--user-data-dir=${userDataDir}`);
3611
4013
  return builder.setChromeOptions(ChromeOptions);
3612
4014
  }
3613
4015
  function firefoxOptions(builder, options) {
@@ -3635,7 +4037,9 @@ var createDriver = async (browser) => {
3635
4037
  const driver = await builder.build();
3636
4038
  const manage = driver.manage();
3637
4039
  await manage.setTimeouts({ implicit: config().timeout });
3638
- await manage.window().maximize();
4040
+ if (!headless) {
4041
+ await manage.window().maximize();
4042
+ }
3639
4043
  return driver;
3640
4044
  };
3641
4045
 
@@ -3679,7 +4083,7 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
3679
4083
  };
3680
4084
 
3681
4085
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
3682
- var import_selenium_webdriver16 = require("selenium-webdriver");
4086
+ var import_selenium_webdriver17 = require("selenium-webdriver");
3683
4087
  init_wait();
3684
4088
  init_locators();
3685
4089
  init_Editors();
@@ -3777,7 +4181,7 @@ var SubsystemsPanel = class extends AbstractElement {
3777
4181
  */
3778
4182
  async searchClear() {
3779
4183
  const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
3780
- const clearBtn = await fixElementStaleError(import_selenium_webdriver16.By.css(clearBtnSelector), this.driver);
4184
+ const clearBtn = await fixElementStaleError(import_selenium_webdriver17.By.css(clearBtnSelector), this.driver);
3781
4185
  if (await clearBtn.isDisplayed()) {
3782
4186
  await click(clearBtn, this.driver);
3783
4187
  }
@@ -3791,7 +4195,7 @@ var SubsystemsPanel = class extends AbstractElement {
3791
4195
  */
3792
4196
  item(name) {
3793
4197
  const elementCSS = createSubSystemTestId(name);
3794
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
4198
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3795
4199
  }
3796
4200
  /**
3797
4201
  * Возвращает сабсистему по заголовку
@@ -3801,7 +4205,7 @@ var SubsystemsPanel = class extends AbstractElement {
3801
4205
  * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
3802
4206
  */
3803
4207
  itemByTitle(title) {
3804
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(byTitleCssSelector(title)) });
4208
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(byTitleCssSelector(title)) });
3805
4209
  }
3806
4210
  /**
3807
4211
  * Возвращается на уровень выше по сабсистемам
@@ -3811,7 +4215,7 @@ var SubsystemsPanel = class extends AbstractElement {
3811
4215
  * wait subsystemsPanel.back();
3812
4216
  */
3813
4217
  async back() {
3814
- const by = import_selenium_webdriver16.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
4218
+ const by = import_selenium_webdriver17.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
3815
4219
  await waitElementIsVisible_default(
3816
4220
  {
3817
4221
  by,
@@ -3856,7 +4260,7 @@ init_FilterPanel();
3856
4260
 
3857
4261
  // src/pageObjects/elements/Dialog.ts
3858
4262
  init_AbstractElement();
3859
- var import_selenium_webdriver33 = require("selenium-webdriver");
4263
+ var import_selenium_webdriver34 = require("selenium-webdriver");
3860
4264
  init_AbstractButton();
3861
4265
  var DIALOG_CLASS = ".d5-dialog";
3862
4266
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -3871,7 +4275,7 @@ var DialogButton = class extends AbstractButton {
3871
4275
  }
3872
4276
  async getElement() {
3873
4277
  const panel = await super.getElement();
3874
- return panel.findElement(import_selenium_webdriver33.By.xpath(buttonByTextXpath(this.text)));
4278
+ return panel.findElement(import_selenium_webdriver34.By.xpath(buttonByTextXpath(this.text)));
3875
4279
  }
3876
4280
  buttonNotDisplayedError() {
3877
4281
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -3894,11 +4298,11 @@ var Dialog = class extends AbstractElement {
3894
4298
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
3895
4299
  }
3896
4300
  async title() {
3897
- const el = await this.driver.findElement(import_selenium_webdriver33.By.css(this.titleSelector));
4301
+ const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.titleSelector));
3898
4302
  return await el.getText();
3899
4303
  }
3900
4304
  async text() {
3901
- const el = await this.driver.findElement(import_selenium_webdriver33.By.css(this.textSelector));
4305
+ const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.textSelector));
3902
4306
  return await el.getText();
3903
4307
  }
3904
4308
  button(text) {