d5-testing-library 1.3.1 → 1.4.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.
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  AbstractPage: () => AbstractPage,
34
+ ControlClass: () => ControlClass,
34
35
  Dialog: () => Dialog,
35
36
  FilterPanel: () => FilterPanel,
36
37
  FormEdit: () => FormEdit,
@@ -42,6 +43,7 @@ __export(src_exports, {
42
43
  PanelFilterField: () => PanelFilterField,
43
44
  SubsystemsPanel: () => SubsystemsPanel,
44
45
  TextEditor: () => TextEditor,
46
+ TreeView: () => TreeView,
45
47
  byTestId: () => byTestId,
46
48
  byTestIdCssSelector: () => byTestIdCssSelector,
47
49
  click: () => click,
@@ -186,6 +188,9 @@ var AbstractPage = class extends AbstractElement {
186
188
  // src/utils/actions.ts
187
189
  var click = async (webElement, driver) => {
188
190
  driver = driver ?? config().driver;
191
+ if (!await webElement.isDisplayed()) {
192
+ await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
193
+ }
189
194
  const actions = driver.actions({ async: true });
190
195
  await actions.move({ origin: webElement }).click().perform();
191
196
  };
@@ -311,7 +316,95 @@ var SubsystemsPanel = class extends AbstractElement {
311
316
  };
312
317
 
313
318
  // src/pageObjects/elements/Forms/AbstractForm.ts
319
+ var import_selenium_webdriver8 = require("selenium-webdriver");
320
+
321
+ // src/utils/createDataTestId.ts
322
+ function createDataTestId(formName, itemType, itemName) {
323
+ return `${formName}-${itemType}-${itemName}`;
324
+ }
325
+ function createFieldTestId(formName, itemName) {
326
+ return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
327
+ }
328
+ function createGroupTestId(formName, itemName) {
329
+ return createDataTestId(formName, "group" /* GROUP */, itemName);
330
+ }
331
+ function createFilterTestId(formName, itemName, layout) {
332
+ return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
333
+ }
334
+ function createDocFilterTestId(formName, itemName) {
335
+ return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
336
+ }
337
+ function createLayoutFilterTestId(formName, itemName) {
338
+ return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
339
+ }
340
+ function createTableId(formName) {
341
+ return `${"table" /* TABLE */}-${formName}`;
342
+ }
343
+ function createFormButtonTestId(formName, itemName) {
344
+ return createDataTestId(formName, "button" /* BUTTON */, itemName);
345
+ }
346
+
347
+ // src/utils/waitElementIsClickable.ts
348
+ async function waitElementIsClickable({
349
+ element,
350
+ timeout,
351
+ errorMessage,
352
+ driver
353
+ }) {
354
+ driver = driver ?? config().driver;
355
+ await wait(async () => {
356
+ const isDisabled = await element.getCssValue("pointer-events") === "none";
357
+ return await element.isDisplayed() && !isDisabled;
358
+ }, driver, errorMessage, timeout ?? config().timeout);
359
+ }
360
+
361
+ // src/pageObjects/elements/TableToolbar/AbstractButton.ts
362
+ var AbstractButton = class extends AbstractElementWithParent {
363
+ constructor(parentCssSelector, elementCssSelector, driver) {
364
+ super(parentCssSelector, elementCssSelector, driver);
365
+ }
366
+ async click() {
367
+ const button = await this.getElement();
368
+ await waitElementIsClickable({
369
+ element: button,
370
+ errorMessage: this.buttonNotDisplayedError(),
371
+ driver: this.driver
372
+ });
373
+ await click(button, this.driver);
374
+ }
375
+ async isDisabled() {
376
+ const button = await this.getElement();
377
+ return await button.getCssValue("pointer-events") === "none";
378
+ }
379
+ };
380
+
381
+ // src/pageObjects/elements/DXComponents/DXButton.ts
314
382
  var import_selenium_webdriver7 = require("selenium-webdriver");
383
+ var DXButton = class extends AbstractButton {
384
+ async getText() {
385
+ const classes = await this.getClasses();
386
+ if (!classes.includes("dx-button-has-text")) {
387
+ return null;
388
+ }
389
+ const el = await this.getElement();
390
+ const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
391
+ return await textEl.getText();
392
+ }
393
+ };
394
+
395
+ // src/pageObjects/elements/FormButton.ts
396
+ var FormButton = class extends DXButton {
397
+ name;
398
+ constructor(parentCssSelector, formName, name, driver) {
399
+ super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
400
+ this.name = name;
401
+ }
402
+ buttonNotDisplayedError() {
403
+ return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
404
+ }
405
+ };
406
+
407
+ // src/pageObjects/elements/Forms/AbstractForm.ts
315
408
  var AbstractForm = class extends AbstractPage {
316
409
  containerCssSelector = "";
317
410
  containerBy;
@@ -358,42 +451,22 @@ var AbstractForm = class extends AbstractPage {
358
451
  */
359
452
  async getTitleText() {
360
453
  if (await this.isModal()) {
361
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
454
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver8.By.css(`${this.popupContainerCssSelector} .popup-title`));
362
455
  return titleEl2.getText();
363
456
  }
364
- let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.className("main-toolbar-form-title"));
457
+ let titleEl = await this.driver.findElement(import_selenium_webdriver8.By.className("main-toolbar-form-title"));
365
458
  return titleEl.getText();
366
459
  }
460
+ button(name) {
461
+ return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
462
+ }
367
463
  };
368
464
 
369
465
  // src/pageObjects/elements/Forms/FormEdit.ts
370
- var import_selenium_webdriver14 = require("selenium-webdriver");
371
-
372
- // src/utils/createDataTestId.ts
373
- function createDataTestId(formName, itemType, itemName) {
374
- return `${formName}-${itemType}-${itemName}`;
375
- }
376
- function createFieldTestId(formName, itemName) {
377
- return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
378
- }
379
- function createGroupTestId(formName, itemName) {
380
- return createDataTestId(formName, "group" /* GROUP */, itemName);
381
- }
382
- function createFilterTestId(formName, itemName, layout) {
383
- return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
384
- }
385
- function createDocFilterTestId(formName, itemName) {
386
- return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
387
- }
388
- function createLayoutFilterTestId(formName, itemName) {
389
- return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
390
- }
391
- function createTableId(formName) {
392
- return `${"table" /* TABLE */}-${formName}`;
393
- }
466
+ var import_selenium_webdriver17 = require("selenium-webdriver");
394
467
 
395
468
  // src/pageObjects/elements/Editors/AbstractEditor.ts
396
- var import_selenium_webdriver8 = require("selenium-webdriver");
469
+ var import_selenium_webdriver9 = require("selenium-webdriver");
397
470
 
398
471
  // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
399
472
  var InputClearStrategy = class {
@@ -413,7 +486,7 @@ var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
413
486
  return `${this.getFullCssSelector()} .dx-texteditor-input`;
414
487
  }
415
488
  async getInputElement() {
416
- return this.driver.findElement(import_selenium_webdriver8.By.css(this.getInputCssSelector()));
489
+ return this.driver.findElement(import_selenium_webdriver9.By.css(this.getInputCssSelector()));
417
490
  }
418
491
  async getInputValue() {
419
492
  const inputEl = await this.getInputElement();
@@ -422,7 +495,7 @@ var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
422
495
  async setInputValue(value) {
423
496
  const inputEl = await this.getInputElement();
424
497
  await click(inputEl, this.driver);
425
- await inputEl.sendKeys(value, import_selenium_webdriver8.Key.ENTER);
498
+ await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
426
499
  }
427
500
  async clear() {
428
501
  await this.clearStrategy.clear(this);
@@ -458,6 +531,22 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
458
531
  }
459
532
  };
460
533
 
534
+ // src/pageObjects/elements/Editors/types.ts
535
+ var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
536
+ ControlClass2["Text"] = "text-control";
537
+ ControlClass2["TextArea"] = "text-area-control";
538
+ ControlClass2["Number"] = "number-control";
539
+ ControlClass2["CheckBox"] = "check-box";
540
+ ControlClass2["Multiselect"] = "multi-select-control";
541
+ ControlClass2["Select"] = "select-control";
542
+ ControlClass2["Switch"] = "switch-control";
543
+ ControlClass2["Date"] = "date-control";
544
+ ControlClass2["SingleDateRange"] = "single-date-range-control";
545
+ ControlClass2["BooleanSelector"] = "buttons-group";
546
+ ControlClass2["ButtonGroup"] = "button-group-field";
547
+ return ControlClass2;
548
+ })(ControlClass || {});
549
+
461
550
  // src/pageObjects/AbstractFormElement.ts
462
551
  var AbstractFormElement = class extends AbstractElementWithParent {
463
552
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -485,20 +574,17 @@ var CheckBox = class extends AbstractElementWithParent {
485
574
  };
486
575
 
487
576
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
488
- var import_selenium_webdriver10 = require("selenium-webdriver");
577
+ var import_selenium_webdriver11 = require("selenium-webdriver");
489
578
 
490
579
  // src/utils/xpathHelper.ts
491
580
  var XPathHelper = class {
492
- static getRoleXpath(role) {
493
- return `//div[@role='${role}']`;
494
- }
495
581
  static getClassAndValueXpath(cssClass, value) {
496
- return `//div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
582
+ return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
497
583
  }
498
584
  };
499
585
 
500
586
  // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
501
- var import_selenium_webdriver9 = require("selenium-webdriver");
587
+ var import_selenium_webdriver10 = require("selenium-webdriver");
502
588
  var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
503
589
  var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
504
590
  var ClearButtonStrategy = class {
@@ -509,7 +595,7 @@ var ClearButtonStrategy = class {
509
595
  this._driver = driver;
510
596
  }
511
597
  async isEmptyEditorField() {
512
- const editorContainer = await this._driver.findElement(import_selenium_webdriver9.By.css(this.editorContainerClass));
598
+ const editorContainer = await this._driver.findElement(import_selenium_webdriver10.By.css(this.editorContainerClass));
513
599
  const classAttribute = await editorContainer.getAttribute("class");
514
600
  return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
515
601
  }
@@ -518,18 +604,31 @@ var ClearButtonStrategy = class {
518
604
  throw new Error("This field is already empty");
519
605
  }
520
606
  const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
521
- const clearBtn = await this._driver.findElement(import_selenium_webdriver9.By.css(clearBtnSelector));
607
+ const clearBtn = await this._driver.findElement(import_selenium_webdriver10.By.css(clearBtnSelector));
522
608
  await click(clearBtn, this._driver);
523
609
  }
524
610
  };
525
611
 
526
612
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
527
613
  var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
528
- var SELECT_BOX_ELEMENT_ROLE = "option";
529
- var combinedValueXpath = (value) => `${XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)}${XPathHelper.getClassAndValueXpath(
530
- SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS,
531
- value
532
- )}`;
614
+ var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
615
+ var dropDownOptionClick = async (optionValue, driver, delay = true) => {
616
+ const { implicit } = await driver.manage().getTimeouts();
617
+ let optElement = null;
618
+ const timeout = delay ? implicit : 200;
619
+ let err = null;
620
+ try {
621
+ await driver.manage().setTimeouts({ implicit: timeout });
622
+ optElement = await driver.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(optionValue)));
623
+ await click(optElement, driver);
624
+ } catch (e) {
625
+ err = new Error(`Item not found: "${optionValue}"`);
626
+ } finally {
627
+ await driver.manage().setTimeouts({ implicit });
628
+ }
629
+ if (err)
630
+ throw err;
631
+ };
533
632
  var SelectBoxEditor = class extends AbstractDXEditorWithInput {
534
633
  constructor(parentCssSelector, elementCssSelector, driver) {
535
634
  super(parentCssSelector, elementCssSelector, driver);
@@ -538,9 +637,12 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
538
637
  async setSelectInputValue(value) {
539
638
  const inputEl = await this.getInputElement();
540
639
  await click(inputEl, this.driver);
541
- await inputEl.sendKeys(value, import_selenium_webdriver10.Key.ENTER);
542
- const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
543
- await click(optElement, this.driver);
640
+ try {
641
+ await dropDownOptionClick(value, this.driver, false);
642
+ } catch {
643
+ await inputEl.sendKeys(value, import_selenium_webdriver11.Key.ENTER);
644
+ await dropDownOptionClick(value, this.driver);
645
+ }
544
646
  }
545
647
  async getValue() {
546
648
  const value = await super.getInputValue();
@@ -579,7 +681,7 @@ var SwitchEditor = class extends AbstractElementWithParent {
579
681
  };
580
682
 
581
683
  // src/pageObjects/elements/Editors/TagBox.ts
582
- var import_selenium_webdriver11 = require("selenium-webdriver");
684
+ var import_selenium_webdriver12 = require("selenium-webdriver");
583
685
  var TAGS_SELECTOR = ".dx-tag .tag-text";
584
686
  var DX_TAG_CONTAINER = "dx-tag-container";
585
687
  var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
@@ -600,27 +702,32 @@ var TagBox = class extends AbstractDXEditorWithInput {
600
702
  await this.confirmSelection();
601
703
  }
602
704
  async waitOptionSelection() {
603
- const option = await this.driver.findElement(import_selenium_webdriver11.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
705
+ const option = await this.driver.findElement(import_selenium_webdriver12.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
604
706
  await wait(() => option.isDisplayed(), this.driver);
605
707
  }
606
708
  async selectOption(inputEl, value, lastElement) {
607
- await inputEl.sendKeys(value);
608
- const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
609
- await click(optElement, this.driver);
709
+ try {
710
+ await dropDownOptionClick(value, this.driver, false);
711
+ } catch {
712
+ await inputEl.sendKeys(value);
713
+ await dropDownOptionClick(value, this.driver);
714
+ }
610
715
  await this.waitOptionSelection();
611
716
  if (value !== lastElement) {
612
717
  await inputEl.clear();
613
718
  }
614
719
  }
615
720
  async confirmSelection() {
616
- const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
721
+ const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(BTN_OK_SELECTOR));
617
722
  await click(btnOk, this.driver);
618
723
  }
619
724
  async getTagBoxInputValue() {
620
725
  if (await this.isTagBoxEmpty()) {
621
726
  return [];
622
727
  }
623
- const tags = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`));
728
+ const tags = await this.driver.findElements(
729
+ import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
730
+ );
624
731
  const values = [];
625
732
  for (const tag of tags) {
626
733
  values.push(await tag.getAttribute("textContent"));
@@ -648,24 +755,26 @@ var TagBox = class extends AbstractDXEditorWithInput {
648
755
  throw new Error(`The tag with the text: ${itemText} was not found`);
649
756
  }
650
757
  const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
651
- const clearBtn = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`));
758
+ const clearBtn = await this.driver.findElement(
759
+ import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
760
+ );
652
761
  await click(clearBtn, this.driver);
653
762
  }
654
763
  };
655
764
 
656
765
  // src/pageObjects/elements/Editors/ButtonGroup.ts
657
- var import_selenium_webdriver12 = require("selenium-webdriver");
766
+ var import_selenium_webdriver13 = require("selenium-webdriver");
658
767
  var ITEM_CLASS = "dx-buttongroup-item";
659
768
  var SELECTED_CLASS = "dx-state-selected";
660
769
  var ButtonGroup = class extends AbstractElementWithParent {
661
770
  getItems() {
662
- return this.driver.findElements(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
771
+ return this.driver.findElements(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
663
772
  }
664
773
  getDataValue(el) {
665
774
  return el.getAttribute("data-value");
666
775
  }
667
776
  async getValue() {
668
- const selectedEl = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
777
+ const selectedEl = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
669
778
  return this.getDataValue(selectedEl);
670
779
  }
671
780
  async setValue(value) {
@@ -698,26 +807,67 @@ var BooleanSelector = class extends ButtonGroup {
698
807
  }
699
808
  };
700
809
 
701
- // src/pageObjects/elements/Editors/DateEditor.ts
702
- var import_selenium_webdriver13 = require("selenium-webdriver");
703
- var DateEditor = class extends AbstractDXEditorWithInput {
810
+ // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
811
+ var import_selenium_webdriver15 = require("selenium-webdriver");
812
+
813
+ // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
814
+ var import_selenium_webdriver14 = require("selenium-webdriver");
815
+
816
+ // src/pageObjects/elements/Editors/Date/utils.ts
817
+ var formatDMYDate = (date) => {
818
+ const [year, month, day] = date.toJSON().split("T")[0].split("-");
819
+ return `${day}${month}${year}`;
820
+ };
821
+
822
+ // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
823
+ var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
824
+ var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
825
+ var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
826
+ var BTN_SAVE_SELECTOR = "DateRange__button-save";
827
+ var BaseDateEditor = class extends AbstractDXEditorWithInput {
704
828
  constructor(parentCssSelector, elementCssSelector, driver) {
705
829
  super(parentCssSelector, elementCssSelector, driver);
706
830
  this.setClearStrategy(new InputClearStrategy());
707
831
  }
708
- async getDateElement() {
709
- return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
710
- }
711
832
  async setDateValue(value) {
712
- const dateEl = await this.getInputElement();
713
- const stringDate = value.toJSON().split("T")[0];
714
- const dateArr = stringDate.split("-");
715
- const [year, month, day] = dateArr;
716
- const keys = day + month + year;
717
- await click(dateEl, this.driver);
718
833
  const actions = this.driver.actions({ async: true });
719
- await actions.move({ origin: dateEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
720
- await actions.move({ origin: dateEl }).sendKeys(keys, import_selenium_webdriver13.Key.ENTER).perform();
834
+ const dateField = await this.driver.findElement(import_selenium_webdriver14.By.css(`${this.getFullCssSelector()}`));
835
+ const dateFieldDataTestID = await this.getDataTestId();
836
+ const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
837
+ const dateInputEl = await this.getInputElement();
838
+ await dateInputEl.clear();
839
+ if (Array.isArray(value)) {
840
+ const formattedDates = value.map(formatDMYDate);
841
+ const button = await dateField.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
842
+ await button.click();
843
+ const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver14.By.css(calendarPopoverSelector));
844
+ const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
845
+ const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
846
+ await dateFromInput.click();
847
+ await dateFromInput.sendKeys(formattedDates[0]);
848
+ await dateToInput.click();
849
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
850
+ await dateToInput.sendKeys(formattedDates[1]);
851
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.ENTER).perform();
852
+ const btnOk = await this.driver.findElement(import_selenium_webdriver14.By.css(`.${BTN_SAVE_SELECTOR}`));
853
+ await btnOk.click();
854
+ } else {
855
+ const formattedDate = formatDMYDate(value);
856
+ await click(dateInputEl, this.driver);
857
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
858
+ await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver14.Key.ENTER).perform();
859
+ }
860
+ }
861
+ };
862
+
863
+ // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
864
+ var SingleDateEditor = class extends BaseDateEditor {
865
+ constructor(parentCssSelector, elementCssSelector, driver) {
866
+ super(parentCssSelector, elementCssSelector, driver);
867
+ this.setClearStrategy(new InputClearStrategy());
868
+ }
869
+ async getDateElement() {
870
+ return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
721
871
  }
722
872
  async getDateValue() {
723
873
  const inputEl = await this.getDateElement();
@@ -735,27 +885,105 @@ var DateEditor = class extends AbstractDXEditorWithInput {
735
885
  }
736
886
  };
737
887
 
888
+ // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
889
+ var import_selenium_webdriver16 = require("selenium-webdriver");
890
+ var DateRangeEditor = class extends BaseDateEditor {
891
+ constructor(parentCssSelector, elementCssSelector, driver) {
892
+ super(parentCssSelector, elementCssSelector, driver);
893
+ this.setClearStrategy(new InputClearStrategy());
894
+ }
895
+ async getDateElement() {
896
+ return this.driver.findElement(import_selenium_webdriver16.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
897
+ }
898
+ async getDateValue() {
899
+ const inputEl = await this.getDateElement();
900
+ const dateFromStr = await inputEl.getAttribute("datefrom");
901
+ const dateToStr = await inputEl.getAttribute("dateto");
902
+ const dateFrom = new Date(dateFromStr);
903
+ const dateTo = new Date(dateToStr);
904
+ return [dateFrom, dateTo];
905
+ }
906
+ async getValue() {
907
+ const values = await this.getDateValue();
908
+ return !values.length ? null : values;
909
+ }
910
+ setValue(value) {
911
+ if (typeof value === "object") {
912
+ return this.setDateValue(value);
913
+ }
914
+ throw new Error(`Value is incorrect. It should be Object`);
915
+ }
916
+ };
917
+
918
+ // src/pageObjects/elements/Editors/Date/DateEditor.ts
919
+ var DateEditor = class extends AbstractDXEditorWithInput {
920
+ editorInstance = null;
921
+ initPromise;
922
+ constructor(parentCssSelector, elementCssSelector, driver) {
923
+ super(parentCssSelector, elementCssSelector, driver);
924
+ this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
925
+ }
926
+ async init(parentCssSelector, elementCssSelector, driver) {
927
+ await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
928
+ }
929
+ async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
930
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
931
+ const classString = await elementInstance.getClasses();
932
+ switch (true) {
933
+ case classString.includes("date-control" /* Date */):
934
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
935
+ break;
936
+ case classString.includes("single-date-range-control" /* SingleDateRange */):
937
+ this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
938
+ break;
939
+ default:
940
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
941
+ }
942
+ }
943
+ async ensureInitialized() {
944
+ if (!this.editorInstance) {
945
+ await this.initPromise;
946
+ }
947
+ }
948
+ async setValue(value) {
949
+ await this.ensureInitialized();
950
+ if (this.editorInstance) {
951
+ await this.editorInstance.setValue(value);
952
+ return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
953
+ }
954
+ throw new Error("Editor instance is not initialized.");
955
+ }
956
+ async getValue() {
957
+ await this.ensureInitialized();
958
+ if (this.editorInstance) {
959
+ return this.editorInstance.getValue();
960
+ }
961
+ throw new Error("Editor instance is not initialized.");
962
+ }
963
+ };
964
+
738
965
  // src/pageObjects/elements/Editors/editorFactory.ts
739
966
  var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
740
967
  const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
741
968
  const classSting = await elementInstance.getClasses();
742
- if (classSting.includes("text-control"))
969
+ if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
743
970
  return new TextEditor(parentCssSelector, elementCssSelector, driver);
744
- if (classSting.includes("number-control"))
971
+ if (classSting.includes("number-control" /* Number */))
745
972
  return new NumberEditor(parentCssSelector, elementCssSelector, driver);
746
- if (classSting.includes("check-box"))
973
+ if (classSting.includes("check-box" /* CheckBox */))
747
974
  return new CheckBox(parentCssSelector, elementCssSelector, driver);
748
- if (classSting.includes("multi-select-control"))
975
+ if (classSting.includes("multi-select-control" /* Multiselect */))
749
976
  return new TagBox(parentCssSelector, elementCssSelector, driver);
750
- if (classSting.includes("select-control"))
977
+ if (classSting.includes("select-control" /* Select */))
751
978
  return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
752
- if (classSting.includes("switch-control"))
979
+ if (classSting.includes("switch-control" /* Switch */))
753
980
  return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
754
- if (classSting.includes("date-control"))
981
+ if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
755
982
  return new DateEditor(parentCssSelector, elementCssSelector, driver);
756
- if (classSting.includes("buttons-group"))
983
+ }
984
+ if (classSting.includes("buttons-group" /* BooleanSelector */))
757
985
  return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
758
- if (classSting.includes("button-group-field"))
986
+ if (classSting.includes("button-group-field" /* ButtonGroup */))
759
987
  return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
760
988
  throw new Error("Unknown type of editor. Please write ticket to the support");
761
989
  };
@@ -883,8 +1111,8 @@ var FormGroup = class extends AbstractElementWithParent {
883
1111
 
884
1112
  // src/pageObjects/elements/Forms/FormEdit.ts
885
1113
  var FormEdit = class extends AbstractForm {
886
- saveButtonBy = import_selenium_webdriver14.By.id("button-save");
887
- closeButtonBy = import_selenium_webdriver14.By.id("button-cancel");
1114
+ saveButtonBy = import_selenium_webdriver17.By.id("button-save");
1115
+ closeButtonBy = import_selenium_webdriver17.By.id("button-cancel");
888
1116
  constructor(driver) {
889
1117
  super(driver);
890
1118
  this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
@@ -947,16 +1175,16 @@ var FormEdit = class extends AbstractForm {
947
1175
  };
948
1176
 
949
1177
  // src/pageObjects/elements/Table/Table.ts
950
- var import_selenium_webdriver19 = require("selenium-webdriver");
1178
+ var import_selenium_webdriver22 = require("selenium-webdriver");
951
1179
 
952
1180
  // src/pageObjects/elements/Table/elements/Row.ts
953
- var import_selenium_webdriver17 = require("selenium-webdriver");
1181
+ var import_selenium_webdriver20 = require("selenium-webdriver");
954
1182
 
955
1183
  // src/pageObjects/elements/Table/elements/Cell.ts
956
- var import_selenium_webdriver16 = require("selenium-webdriver");
1184
+ var import_selenium_webdriver19 = require("selenium-webdriver");
957
1185
 
958
1186
  // src/pageObjects/elements/Table/utils.ts
959
- var import_selenium_webdriver15 = require("selenium-webdriver");
1187
+ var import_selenium_webdriver18 = require("selenium-webdriver");
960
1188
  function getCssRowByIndexSelector(index) {
961
1189
  return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
962
1190
  }
@@ -983,9 +1211,18 @@ var Cell = class extends AbstractElementWithParent {
983
1211
  this.elementCssSelector = getCssCellByIndexSelector(index);
984
1212
  }
985
1213
  async getBooleanValue(cellEl) {
986
- const booleanEl = await cellEl.findElement(import_selenium_webdriver16.By.className("boolean-widget"));
1214
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver19.By.className("boolean-widget"));
987
1215
  return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
988
1216
  }
1217
+ async getTagsValue(cellEl) {
1218
+ const tagsCssSelector = ".multiselect-container .multiselect-cell";
1219
+ const tags = await cellEl.findElements(import_selenium_webdriver19.By.css(tagsCssSelector));
1220
+ const values = [];
1221
+ for (const tag of tags) {
1222
+ values.push(await tag.getAttribute("textContent"));
1223
+ }
1224
+ return values;
1225
+ }
989
1226
  async getElement() {
990
1227
  if (this._index == null) {
991
1228
  this.index = await this.getCellIndex();
@@ -995,9 +1232,10 @@ var Cell = class extends AbstractElementWithParent {
995
1232
  async getValue() {
996
1233
  const cellEl = await this.getElement();
997
1234
  const cellElClass = await cellEl.getAttribute("class");
998
- if (cellElClass.includes("boolean-column")) {
1235
+ if (cellElClass.includes("boolean-column" /* Boolean */))
999
1236
  return this.getBooleanValue(cellEl);
1000
- }
1237
+ if (cellElClass.includes("tags-column" /* Tags */))
1238
+ return this.getTagsValue(cellEl);
1001
1239
  return cellEl.getText();
1002
1240
  }
1003
1241
  getIndex() {
@@ -1018,9 +1256,14 @@ var Row = class extends AbstractElementWithParent {
1018
1256
  this.getColumnBy = getColumnBy;
1019
1257
  }
1020
1258
  _getCell({ index, name, title }) {
1021
- return new Cell(this.getFullCssSelector(), () => {
1022
- return this.getColumnBy({ title, name }).getIndex();
1023
- }, index, this.driver);
1259
+ return new Cell(
1260
+ this.getFullCssSelector(),
1261
+ () => {
1262
+ return this.getColumnBy({ title, name }).getIndex();
1263
+ },
1264
+ index,
1265
+ this.driver
1266
+ );
1024
1267
  }
1025
1268
  getCellByIndex(index) {
1026
1269
  return this._getCell({ index });
@@ -1034,10 +1277,14 @@ var Row = class extends AbstractElementWithParent {
1034
1277
  async select() {
1035
1278
  const rowEl = await this.getElement();
1036
1279
  await click(rowEl, this.driver);
1037
- await wait(async () => {
1038
- const classes = await this.getClasses();
1039
- return classes.includes(DX_SELECTION_CLASS);
1040
- }, this.driver, "Cannot select row");
1280
+ await wait(
1281
+ async () => {
1282
+ const classes = await this.getClasses();
1283
+ return classes.includes(DX_SELECTION_CLASS);
1284
+ },
1285
+ this.driver,
1286
+ "Cannot select row"
1287
+ );
1041
1288
  }
1042
1289
  async isSelected() {
1043
1290
  const result = await this.getAttribute("aria-selected");
@@ -1047,7 +1294,7 @@ var Row = class extends AbstractElementWithParent {
1047
1294
  return this.index;
1048
1295
  }
1049
1296
  async getCells() {
1050
- const cells = await this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1297
+ const cells = await this.driver.findElements(import_selenium_webdriver20.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1051
1298
  const result = [];
1052
1299
  cells.forEach((_, index) => {
1053
1300
  const newCell = this.getCellByIndex(index);
@@ -1057,14 +1304,22 @@ var Row = class extends AbstractElementWithParent {
1057
1304
  }
1058
1305
  async clickInlineButton(buttonClass) {
1059
1306
  const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1060
- const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
1061
- const button = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
1307
+ const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1308
+ this.index
1309
+ )}"] .${buttonClass}`;
1310
+ const button = await this.driver.findElement(
1311
+ import_selenium_webdriver20.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
1312
+ );
1062
1313
  return click(button, this.driver);
1063
1314
  }
1064
1315
  async checkEditingMode(isEditing, msg) {
1065
- await wait(async () => {
1066
- return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
1067
- }, this.driver, msg);
1316
+ await wait(
1317
+ async () => {
1318
+ return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
1319
+ },
1320
+ this.driver,
1321
+ msg
1322
+ );
1068
1323
  }
1069
1324
  async edit() {
1070
1325
  await this.clickInlineButton("edit");
@@ -1081,19 +1336,18 @@ var Row = class extends AbstractElementWithParent {
1081
1336
  };
1082
1337
 
1083
1338
  // src/pageObjects/elements/Table/elements/Column.ts
1084
- var import_selenium_webdriver18 = require("selenium-webdriver");
1085
- var getHeaderCssSelector = () => {
1086
- return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1087
- };
1339
+ var import_selenium_webdriver21 = require("selenium-webdriver");
1088
1340
  var Column = class extends AbstractElementWithParent {
1089
1341
  _index;
1090
1342
  _caption;
1091
1343
  _name;
1092
- constructor({ parentCssSelector, name, caption, index, driver }) {
1344
+ headerCssSelector;
1345
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
1093
1346
  super(parentCssSelector, "", driver);
1094
1347
  this._name = name;
1095
1348
  this.index = index;
1096
1349
  this._caption = caption;
1350
+ this.headerCssSelector = headerCssSelector;
1097
1351
  }
1098
1352
  set index(index) {
1099
1353
  this._index = index;
@@ -1107,7 +1361,9 @@ var Column = class extends AbstractElementWithParent {
1107
1361
  return super.getElement();
1108
1362
  }
1109
1363
  async getColumnHeaderIndexBy(cssSelector) {
1110
- const column = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${cssSelector}`));
1364
+ const column = await this.driver.findElement(
1365
+ import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`)
1366
+ );
1111
1367
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
1112
1368
  }
1113
1369
  async getIndexByCaption() {
@@ -1139,9 +1395,11 @@ var Column = class extends AbstractElementWithParent {
1139
1395
  // src/pageObjects/elements/Table/Table.ts
1140
1396
  var Table = class extends AbstractElementWithParent {
1141
1397
  formName;
1142
- constructor(parentCssSelector, formName, driver) {
1398
+ headerCssSelector;
1399
+ constructor(parentCssSelector, headerCssSelector, formName, driver) {
1143
1400
  super(parentCssSelector, `#${createTableId(formName)}`, driver);
1144
1401
  this.formName = formName;
1402
+ this.headerCssSelector = headerCssSelector;
1145
1403
  }
1146
1404
  getColumnBy = (args) => {
1147
1405
  if (args.title) {
@@ -1162,6 +1420,7 @@ var Table = class extends AbstractElementWithParent {
1162
1420
  getColumnByTitle = (title) => {
1163
1421
  return new Column({
1164
1422
  parentCssSelector: this.getFullCssSelector(),
1423
+ headerCssSelector: this.headerCssSelector,
1165
1424
  caption: title,
1166
1425
  driver: this.driver
1167
1426
  });
@@ -1169,6 +1428,7 @@ var Table = class extends AbstractElementWithParent {
1169
1428
  getColumnByName = (name) => {
1170
1429
  return new Column({
1171
1430
  parentCssSelector: this.getFullCssSelector(),
1431
+ headerCssSelector: this.headerCssSelector,
1172
1432
  name,
1173
1433
  driver: this.driver
1174
1434
  });
@@ -1177,7 +1437,7 @@ var Table = class extends AbstractElementWithParent {
1177
1437
  return this.getRowByIndex(index).select();
1178
1438
  }
1179
1439
  async getRows() {
1180
- const rows = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1440
+ const rows = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1181
1441
  const result = [];
1182
1442
  rows.forEach((_, index) => {
1183
1443
  const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
@@ -1186,7 +1446,9 @@ var Table = class extends AbstractElementWithParent {
1186
1446
  return result;
1187
1447
  }
1188
1448
  async getColumns() {
1189
- const columns = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
1449
+ const columns = await this.driver.findElements(
1450
+ import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1451
+ );
1190
1452
  const result = [];
1191
1453
  columns.forEach((_, index) => {
1192
1454
  const newCol = new Column({
@@ -1213,24 +1475,6 @@ var Table = class extends AbstractElementWithParent {
1213
1475
  }
1214
1476
  };
1215
1477
 
1216
- // src/pageObjects/elements/TableToolbar/AbstractButton.ts
1217
- var AbstractButton = class extends AbstractElementWithParent {
1218
- constructor(parentCssSelector, elementCssSelector, driver) {
1219
- super(parentCssSelector, elementCssSelector, driver);
1220
- }
1221
- async click() {
1222
- const button = await this.getElement();
1223
- await wait(async () => {
1224
- return await button.isDisplayed() && !await this.isDisabled();
1225
- }, this.driver, this.buttonNotDisplayedError());
1226
- await click(button, this.driver);
1227
- }
1228
- async isDisabled() {
1229
- const button = await this.getElement();
1230
- return await button.getCssValue("pointer-events") === "none";
1231
- }
1232
- };
1233
-
1234
1478
  // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
1235
1479
  var ToolbarGroupButton = class extends AbstractButton {
1236
1480
  name;
@@ -1257,7 +1501,7 @@ var ToolbarButton = class extends AbstractButton {
1257
1501
  };
1258
1502
 
1259
1503
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1260
- var import_selenium_webdriver20 = require("selenium-webdriver");
1504
+ var import_selenium_webdriver23 = require("selenium-webdriver");
1261
1505
 
1262
1506
  // src/utils/typesUtil.ts
1263
1507
  var types = {
@@ -1291,7 +1535,7 @@ var ToolbarMenu = class extends AbstractElementWithParent {
1291
1535
  }
1292
1536
  async toggle() {
1293
1537
  const dropdown = await this.getElement();
1294
- await dropdown.click();
1538
+ await click(dropdown, this.driver);
1295
1539
  }
1296
1540
  getCssSelectorToButton(name) {
1297
1541
  return byTestId(`ftb-${this._formName}-${name}`);
@@ -1301,9 +1545,11 @@ var ToolbarMenu = class extends AbstractElementWithParent {
1301
1545
  }
1302
1546
  async goToButton(name, selector) {
1303
1547
  const toolbarMenuItem = this.driver.findElement(selector);
1304
- await wait(async () => {
1305
- return await toolbarMenuItem.isDisplayed();
1306
- }, this.driver, this.buttonNotDisplayedError(name));
1548
+ await waitElementIsClickable({
1549
+ element: toolbarMenuItem,
1550
+ errorMessage: this.buttonNotDisplayedError(name),
1551
+ driver: this.driver
1552
+ });
1307
1553
  await click(toolbarMenuItem, this.driver);
1308
1554
  }
1309
1555
  async clickButton(name) {
@@ -1322,12 +1568,12 @@ var ToolbarMenu = class extends AbstractElementWithParent {
1322
1568
  async clickButtonByTitle(title) {
1323
1569
  await this.toggle();
1324
1570
  if (isString(title)) {
1325
- const selector = import_selenium_webdriver20.By.xpath(buttonByTextXpath(title));
1571
+ const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(title));
1326
1572
  await this.goToButton(title, selector);
1327
1573
  }
1328
1574
  if (isArray(title)) {
1329
1575
  for (let t of title) {
1330
- const selector = import_selenium_webdriver20.By.xpath(buttonByTextXpath(t));
1576
+ const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(t));
1331
1577
  await this.goToButton(t, selector);
1332
1578
  }
1333
1579
  }
@@ -1424,7 +1670,7 @@ var FormFilterField = class extends AbstractEditor {
1424
1670
  };
1425
1671
 
1426
1672
  // src/pageObjects/elements/Filters/FilterPanel.ts
1427
- var import_selenium_webdriver21 = require("selenium-webdriver");
1673
+ var import_selenium_webdriver24 = require("selenium-webdriver");
1428
1674
 
1429
1675
  // src/pageObjects/elements/Filters/PanelFilterField.ts
1430
1676
  var PanelFilterField = class extends AbstractEditor {
@@ -1479,7 +1725,7 @@ var FilterPanel = class extends AbstractElement {
1479
1725
  async filterPanelButtons() {
1480
1726
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
1481
1727
  const el = await this.getElement();
1482
- return el.findElements(import_selenium_webdriver21.By.css(selector));
1728
+ return el.findElements(import_selenium_webdriver24.By.css(selector));
1483
1729
  }
1484
1730
  constructor(formName, driver) {
1485
1731
  super(driver, drawerSelector(formName));
@@ -1512,16 +1758,19 @@ var FilterPanel = class extends AbstractElement {
1512
1758
  await this.driver.sleep(300);
1513
1759
  }
1514
1760
  async close() {
1515
- const btn = await this.driver.findElement(import_selenium_webdriver21.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
1761
+ const btn = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
1516
1762
  await click(btn, this.driver);
1517
1763
  }
1518
1764
  };
1519
1765
 
1520
1766
  // src/pageObjects/elements/Forms/ListForm.ts
1767
+ var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1521
1768
  var ListForm = class extends AbstractForm {
1769
+ headerCssSelector;
1522
1770
  constructor(driver) {
1523
1771
  super(driver);
1524
1772
  this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
1773
+ this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
1525
1774
  }
1526
1775
  /**
1527
1776
  * Находит таблицу
@@ -1531,7 +1780,7 @@ var ListForm = class extends AbstractForm {
1531
1780
  * expect(listForm.table());
1532
1781
  */
1533
1782
  table() {
1534
- return new Table(this.containerCssSelector, this.formName, this.driver);
1783
+ return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
1535
1784
  }
1536
1785
  /**
1537
1786
  * Находит группу на лист форме по имени
@@ -1577,8 +1826,18 @@ var ListForm = class extends AbstractForm {
1577
1826
  }
1578
1827
  };
1579
1828
 
1829
+ // src/pageObjects/elements/Forms/TreeView.ts
1830
+ var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
1831
+ var TreeView = class extends ListForm {
1832
+ constructor(driver) {
1833
+ super(driver);
1834
+ this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
1835
+ this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
1836
+ }
1837
+ };
1838
+
1580
1839
  // src/pageObjects/elements/Dialog.ts
1581
- var import_selenium_webdriver22 = require("selenium-webdriver");
1840
+ var import_selenium_webdriver25 = require("selenium-webdriver");
1582
1841
  var DIALOG_CLASS = ".d5-dialog";
1583
1842
  var DIALOG_TITLE_CLASS = ".dialog__title";
1584
1843
  var DIALOG_TEXT_CLASS = ".dialog__text";
@@ -1592,7 +1851,7 @@ var DialogButton = class extends AbstractButton {
1592
1851
  }
1593
1852
  async getElement() {
1594
1853
  const panel = await super.getElement();
1595
- return panel.findElement(import_selenium_webdriver22.By.xpath(buttonByTextXpath2(this.text)));
1854
+ return panel.findElement(import_selenium_webdriver25.By.xpath(buttonByTextXpath2(this.text)));
1596
1855
  }
1597
1856
  buttonNotDisplayedError() {
1598
1857
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -1612,11 +1871,11 @@ var Dialog = class extends AbstractElement {
1612
1871
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
1613
1872
  }
1614
1873
  async title() {
1615
- const el = await this.driver.findElement(import_selenium_webdriver22.By.css(this.titleSelector));
1874
+ const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.titleSelector));
1616
1875
  return await el.getText();
1617
1876
  }
1618
1877
  async text() {
1619
- const el = await this.driver.findElement(import_selenium_webdriver22.By.css(this.textSelector));
1878
+ const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.textSelector));
1620
1879
  return await el.getText();
1621
1880
  }
1622
1881
  button(text) {
@@ -1626,6 +1885,7 @@ var Dialog = class extends AbstractElement {
1626
1885
  // Annotate the CommonJS export names for ESM import in node:
1627
1886
  0 && (module.exports = {
1628
1887
  AbstractPage,
1888
+ ControlClass,
1629
1889
  Dialog,
1630
1890
  FilterPanel,
1631
1891
  FormEdit,
@@ -1637,6 +1897,7 @@ var Dialog = class extends AbstractElement {
1637
1897
  PanelFilterField,
1638
1898
  SubsystemsPanel,
1639
1899
  TextEditor,
1900
+ TreeView,
1640
1901
  byTestId,
1641
1902
  byTestIdCssSelector,
1642
1903
  click,