d5-testing-library 1.5.0 → 1.7.0-alpha.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.
@@ -0,0 +1,7 @@
1
+ import {
2
+ FormEdit
3
+ } from "./chunk-H6LCUGIP.mjs";
4
+ import "./chunk-ISIVPVER.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-PVVYHCDQ.mjs";
4
+ import "./chunk-ISIVPVER.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-M7ZEJQ34.mjs";
4
+ import "./chunk-PVVYHCDQ.mjs";
5
+ import "./chunk-ISIVPVER.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -3,7 +3,7 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  wait
6
- } from "./chunk-VWNH6HVN.mjs";
6
+ } from "./chunk-ISIVPVER.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
@@ -420,8 +420,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
420
420
  await this.confirmSelection();
421
421
  }
422
422
  async waitOptionSelection() {
423
- const option = await this.driver.findElement(By6.css(TAG_BOX_LIST_ITEM_SELECTOR));
424
- await wait(() => option.isDisplayed(), this.driver);
423
+ await fixElementStaleError(By6.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
425
424
  }
426
425
  async selectOption(inputEl, value, lastElement) {
427
426
  try {
@@ -436,7 +435,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
436
435
  }
437
436
  }
438
437
  async confirmSelection() {
439
- const btnOk = await this.driver.findElement(By6.css(BTN_OK_SELECTOR));
438
+ const btnOk = await fixElementStaleError(By6.css(BTN_OK_SELECTOR), this.driver);
440
439
  await click(btnOk, this.driver);
441
440
  }
442
441
  async getTagBoxInputValue() {
@@ -722,6 +721,9 @@ function createFilterTestId(formName, itemName, layout) {
722
721
  function createDocFilterTestId(formName, itemName) {
723
722
  return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
724
723
  }
724
+ function createHeaderFilterTestId(formName, itemName) {
725
+ return createFilterTestId(formName, itemName, "header-filter" /* HEADER_FILTER */);
726
+ }
725
727
  function createLayoutFilterTestId(formName, itemName) {
726
728
  return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
727
729
  }
@@ -731,6 +733,9 @@ function createTableId(formName) {
731
733
  function createFormButtonTestId(formName, itemName) {
732
734
  return createDataTestId(formName, "button" /* BUTTON */, itemName);
733
735
  }
736
+ function createSubSystemTestId(itemName) {
737
+ return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
738
+ }
734
739
 
735
740
  // src/pageObjects/elements/AbstractEditor.ts
736
741
  var AbstractEditor = class extends AbstractElementWithParent {
@@ -807,7 +812,7 @@ var FormField = class extends AbstractEditor {
807
812
  };
808
813
 
809
814
  // src/pageObjects/elements/Forms/Form.ts
810
- import { By as By13 } from "selenium-webdriver";
815
+ import { By as By14 } from "selenium-webdriver";
811
816
 
812
817
  // src/utils/waitElementIsClickable.ts
813
818
  async function waitElementIsClickable({
@@ -881,19 +886,79 @@ var AbstractGroup = class extends AbstractElementWithParent {
881
886
  var Panel = class extends AbstractGroup {
882
887
  };
883
888
 
884
- // src/pageObjects/elements/Groups/TabPanel/TabPanel.ts
889
+ // src/pageObjects/elements/Groups/TabPanel.ts
885
890
  import { By as By12 } from "selenium-webdriver";
886
- var getTabTestIdByName = (name) => `tab-caption-${name}`;
891
+ var TabPanelItem = class extends AbstractGroup {
892
+ constructor(parentCssSelector, elementCssSelector, driver) {
893
+ super(parentCssSelector, elementCssSelector, driver);
894
+ }
895
+ async click() {
896
+ await click(await this.getElement(), this.driver);
897
+ }
898
+ async isActive() {
899
+ const tabPanelItemElement = await this.getElement();
900
+ const grandparentTab = await tabPanelItemElement.findElement(By12.xpath('ancestor::div[@role="tab"][1]'));
901
+ return await grandparentTab.getAttribute("aria-selected") === "true";
902
+ }
903
+ async getTitle() {
904
+ return "";
905
+ }
906
+ };
887
907
  var TabPanel = class extends AbstractGroup {
908
+ item(name) {
909
+ return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
910
+ }
911
+ async getTitle() {
912
+ return "";
913
+ }
914
+ };
915
+
916
+ // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
917
+ import { By as By13 } from "selenium-webdriver";
918
+ var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
919
+ var AccordionItem = class extends AbstractGroup {
888
920
  constructor(parentCssSelector, elementCssSelector, driver) {
889
921
  super(parentCssSelector, elementCssSelector, driver);
890
922
  }
891
- _getTab(name) {
892
- return this.driver.findElement(By12.css(`${this.getFullCssSelector()} ${byTestIdCssSelector(getTabTestIdByName(name))}`));
923
+ async getDataOpenedAccordItemAttr() {
924
+ const accordionElement = await this.getElement();
925
+ return await accordionElement.getAttribute("data-opened");
926
+ }
927
+ async clickAccordionItemTitle() {
928
+ const accordionElement = await this.getElement();
929
+ const accordTitleElement = await accordionElement.findElement(By13.className(ACCORDION_TITLE_CONTAINER));
930
+ await accordTitleElement.click();
931
+ }
932
+ async click() {
933
+ await click(await this.getElement(), this.driver);
934
+ }
935
+ async isExpanded() {
936
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
937
+ return dataOpened === "true";
938
+ }
939
+ async isCollapsed() {
940
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
941
+ return dataOpened === "false" || !dataOpened;
942
+ }
943
+ async expand() {
944
+ if (!await this.isExpanded()) {
945
+ await this.clickAccordionItemTitle();
946
+ }
893
947
  }
894
- async tabClick(name) {
895
- const tabEl = this._getTab(name);
896
- await tabEl.click();
948
+ async collapse() {
949
+ if (await this.isExpanded()) {
950
+ await this.clickAccordionItemTitle();
951
+ }
952
+ }
953
+ };
954
+
955
+ // src/pageObjects/elements/Groups/Accordion/Accordion.ts
956
+ var Accordion = class extends AbstractGroup {
957
+ constructor(parentCssSelector, elementCssSelector, driver) {
958
+ super(parentCssSelector, elementCssSelector, driver);
959
+ }
960
+ item(name) {
961
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
897
962
  }
898
963
  };
899
964
 
@@ -903,20 +968,26 @@ var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
903
968
  const classSting = await elementInstance.getClasses();
904
969
  if (classSting.includes("tab-panel-group"))
905
970
  return new TabPanel(parentCssSelector, elementCssSelector, driver);
971
+ if (classSting.includes("tab-panel-item"))
972
+ return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
906
973
  if (classSting.includes("panel-group"))
907
974
  return new Panel(parentCssSelector, elementCssSelector, driver);
975
+ if (classSting.includes("accordion-group"))
976
+ return new Accordion(parentCssSelector, elementCssSelector, driver);
977
+ if (classSting.includes("d5-accordion-item"))
978
+ return new AccordionItem(parentCssSelector, elementCssSelector, driver);
908
979
  throw new Error("Unknown type of group. Please write ticket to the support");
909
980
  };
910
981
 
911
982
  // src/pageObjects/elements/FormGroup.ts
912
983
  var FormGroup = class extends AbstractElementWithParent {
913
- editor;
984
+ groupInstance;
914
985
  constructor(parentCssSelector, formName, name, driver) {
915
986
  super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
916
987
  }
917
- async initEditor() {
918
- if (!this.editor) {
919
- this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
988
+ async initInstance() {
989
+ if (!this.groupInstance) {
990
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
920
991
  }
921
992
  }
922
993
  /**
@@ -926,20 +997,66 @@ var FormGroup = class extends AbstractElementWithParent {
926
997
  */
927
998
  async isDisplayed() {
928
999
  try {
929
- await this.initEditor();
930
- return this.editor.isDisplayed();
1000
+ await this.initInstance();
1001
+ return this.groupInstance.isDisplayed();
931
1002
  } catch {
932
1003
  return false;
933
1004
  }
934
1005
  }
935
1006
  /**
936
- * Происходит клик по табе
1007
+ * Клик по элементам группы.
1008
+ * Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
937
1009
  * @example
938
- * expect(await tableList.group('TabPanel').tabClick(tabName);
1010
+ * expect(await tableList.group('TabPanel').itemClick('Tab');
1011
+ * expect(await tableList.group('Accordion').itemClick('AccordionItem');
939
1012
  */
940
- async tabClick(name) {
941
- await this.initEditor();
942
- await this.editor.tabClick(name);
1013
+ async itemClick(name) {
1014
+ await this.initInstance();
1015
+ const item = this.groupInstance.item?.(name);
1016
+ await item?.click();
1017
+ }
1018
+ /**
1019
+ * Метод работает если группа - это элемент аккордеона или вкладка таб панели
1020
+ * @example
1021
+ * expect(await tableList.group('Tab').click();
1022
+ * expect(await tableList.group('AccordionItem').click();
1023
+ */
1024
+ async click() {
1025
+ await this.initInstance();
1026
+ await this.groupInstance.click?.();
1027
+ }
1028
+ async collapse() {
1029
+ await this.initInstance();
1030
+ if (this.groupInstance instanceof AccordionItem) {
1031
+ await this.groupInstance.collapse();
1032
+ }
1033
+ }
1034
+ async expand() {
1035
+ await this.initInstance();
1036
+ if (this.groupInstance instanceof AccordionItem) {
1037
+ await this.groupInstance.expand();
1038
+ }
1039
+ }
1040
+ async isExpanded() {
1041
+ await this.initInstance();
1042
+ if (this.groupInstance instanceof AccordionItem) {
1043
+ return await this.groupInstance.isExpanded();
1044
+ }
1045
+ return false;
1046
+ }
1047
+ async isCollapsed() {
1048
+ await this.initInstance();
1049
+ if (this.groupInstance instanceof AccordionItem) {
1050
+ return await this.groupInstance.isCollapsed();
1051
+ }
1052
+ return false;
1053
+ }
1054
+ async isActive() {
1055
+ await this.initInstance();
1056
+ if (this.groupInstance instanceof TabPanelItem) {
1057
+ return await this.groupInstance.isActive();
1058
+ }
1059
+ return false;
943
1060
  }
944
1061
  };
945
1062
 
@@ -997,15 +1114,15 @@ async function classDependencyInjector(formType) {
997
1114
  let SubFormFactoryClass;
998
1115
  switch (formType) {
999
1116
  case "1" /* LIST */:
1000
- SubFormFactoryClass = (await import("./ListForm-HDVXB6CG.mjs")).default;
1117
+ SubFormFactoryClass = (await import("./ListForm-NWULJ2P6.mjs")).default;
1001
1118
  break;
1002
1119
  case "3" /* TREE */:
1003
- SubFormFactoryClass = (await import("./TreeView-DE5RBMDD.mjs")).default;
1120
+ SubFormFactoryClass = (await import("./TreeView-USLYNLBL.mjs")).default;
1004
1121
  break;
1005
1122
  case "2" /* EDIT */:
1006
1123
  case "99" /* FREE_FORM */:
1007
1124
  case "4" /* REPORT */:
1008
- SubFormFactoryClass = (await import("./FormEdit-MZJH5R5H.mjs")).default;
1125
+ SubFormFactoryClass = (await import("./FormEdit-2OXEIJRD.mjs")).default;
1009
1126
  break;
1010
1127
  default:
1011
1128
  throw new Error(`Unsupported form type ${formType}`);
@@ -1035,10 +1152,10 @@ var Form = class extends AbstractForm {
1035
1152
  */
1036
1153
  async getTitleText() {
1037
1154
  if (await this.isModal()) {
1038
- const titleEl2 = await this.driver.findElement(By13.css(`${this.popupContainerCssSelector} .popup-title`));
1155
+ const titleEl2 = await this.driver.findElement(By14.css(`${this.popupContainerCssSelector} .popup-title`));
1039
1156
  return titleEl2.getText();
1040
1157
  }
1041
- let titleEl = await this.driver.findElement(By13.className("main-toolbar-form-title"));
1158
+ let titleEl = await this.driver.findElement(By14.className("main-toolbar-form-title"));
1042
1159
  return titleEl.getText();
1043
1160
  }
1044
1161
  setSubFormMode() {
@@ -1056,7 +1173,7 @@ var Form = class extends AbstractForm {
1056
1173
  */
1057
1174
  async subForm(name) {
1058
1175
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
1059
- const byCssSelector = By13.css(cssSelector);
1176
+ const byCssSelector = By14.css(cssSelector);
1060
1177
  const subFormEl = await this.driver.findElement(byCssSelector);
1061
1178
  await waitElementIsVisible({
1062
1179
  element: subFormEl,
@@ -1091,15 +1208,18 @@ export {
1091
1208
  byTestId,
1092
1209
  readonlyLocator,
1093
1210
  AbstractElementWithParent,
1211
+ TextEditor,
1212
+ NumberEditor,
1213
+ ControlClass,
1214
+ DX_CLEAR_BUTTON_AREA,
1215
+ editorFactory,
1094
1216
  createDocFilterTestId,
1217
+ createHeaderFilterTestId,
1095
1218
  createLayoutFilterTestId,
1096
1219
  createTableId,
1220
+ createSubSystemTestId,
1097
1221
  waitElementIsClickable,
1098
1222
  AbstractButton,
1099
- TextEditor,
1100
- NumberEditor,
1101
- ControlClass,
1102
- editorFactory,
1103
1223
  AbstractEditor,
1104
1224
  FormField,
1105
1225
  Form
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ListForm
3
- } from "./chunk-NWWYF43G.mjs";
3
+ } from "./chunk-PVVYHCDQ.mjs";
4
4
 
5
5
  // src/pageObjects/elements/Forms/TreeView.ts
6
6
  var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
@@ -9,12 +9,14 @@ import {
9
9
  byTestIdCssSelector,
10
10
  click,
11
11
  createDocFilterTestId,
12
+ createHeaderFilterTestId,
12
13
  createLayoutFilterTestId,
13
14
  createTableId,
14
15
  fixElementStaleError,
15
16
  wait,
16
- waitElementIsClickable
17
- } from "./chunk-VWNH6HVN.mjs";
17
+ waitElementIsClickable,
18
+ waitElementIsVisible
19
+ } from "./chunk-ISIVPVER.mjs";
18
20
 
19
21
  // src/pageObjects/elements/Table/Table.ts
20
22
  import { By as By5 } from "selenium-webdriver";
@@ -595,6 +597,122 @@ var FilterPanel = class extends AbstractElement {
595
597
  }
596
598
  };
597
599
 
600
+ // src/pageObjects/elements/Filters/ColumnFilter.ts
601
+ import { By as By8 } from "selenium-webdriver";
602
+
603
+ // src/pageObjects/elements/Filters/HeaderFilterField.ts
604
+ var HeaderFilterField = class extends AbstractEditor {
605
+ constructor(parentCssSelector, formName, name, driver) {
606
+ super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
607
+ }
608
+ async getValue() {
609
+ return super.getValue();
610
+ }
611
+ async setValue(value) {
612
+ return super.setValue(value);
613
+ }
614
+ async clear() {
615
+ return super.clear();
616
+ }
617
+ async remove(itemText) {
618
+ return super.remove(itemText);
619
+ }
620
+ };
621
+
622
+ // src/pageObjects/elements/Filters/ColumnFilter.ts
623
+ var APPLY_SELECTOR = ".apply-button";
624
+ var CANCEL_SELECTOR = ".cancel-button";
625
+ var HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
626
+ var HEADER_FILTER_CONTAINER = ".header-filter";
627
+ var HEADER_FILTER_BUTTONS = ".header-filter-buttons";
628
+ var ColumnFilter = class extends AbstractElement {
629
+ _formName;
630
+ _name;
631
+ _column;
632
+ constructor(formName, name, column, driver) {
633
+ super(driver, HEADER_FILTER_CONTAINER);
634
+ this._formName = formName;
635
+ this._name = name;
636
+ this._column = column;
637
+ this.driver = driver;
638
+ }
639
+ async getApplyButton() {
640
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
641
+ return this.driver.findElement(By8.css(selector));
642
+ }
643
+ async getCancelButton() {
644
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
645
+ return this.driver.findElement(By8.css(selector));
646
+ }
647
+ async apply() {
648
+ const btn = await this.getApplyButton();
649
+ await click(btn, this.driver);
650
+ }
651
+ async cancel() {
652
+ const btn = await this.getCancelButton();
653
+ await click(btn, this.driver);
654
+ }
655
+ async initFilter() {
656
+ const columnEl = await this._column.getElement();
657
+ const actions = this.driver.actions({ async: true });
658
+ await actions.move({ origin: columnEl }).perform();
659
+ const elements = await columnEl.findElements(By8.css(HEADER_FILTER_ICON));
660
+ const headerFilterIcon = elements[1];
661
+ await waitElementIsVisible({
662
+ element: headerFilterIcon,
663
+ driver: this.driver,
664
+ errorMessage: `HeaderFilter "${this._name}" is not visible`
665
+ });
666
+ if (!headerFilterIcon)
667
+ throw new Error(`HeaderFilter "${this._name}" is not visible`);
668
+ await headerFilterIcon.click();
669
+ return new HeaderFilterField("", this._formName, this._name, this.driver);
670
+ }
671
+ /**
672
+ * Возвращает значение в поле
673
+ * @example
674
+ * expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
675
+ * expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
676
+ */
677
+ async getValue() {
678
+ const filter = await this.initFilter();
679
+ const result = await filter.getValue();
680
+ await this.cancel();
681
+ return result;
682
+ }
683
+ /**
684
+ * Устанавливает значение в поле
685
+ * @example
686
+ * await form.columnFilter('NumberFld').setValue(123);
687
+ * await form.columnFilter('TextFld').setValue('TestValue');
688
+ */
689
+ async setValue(value) {
690
+ const filter = await this.initFilter();
691
+ await filter.setValue(value);
692
+ return this.apply();
693
+ }
694
+ /**
695
+ * Очищает значение в поле
696
+ * @example
697
+ * await form.columnFilter('NumberFld').clear();
698
+ */
699
+ async clear() {
700
+ const filter = await this.initFilter();
701
+ await filter.clear();
702
+ return this.apply();
703
+ }
704
+ /**
705
+ * Удаляет тег по переданному тексту
706
+ * @example
707
+ * await form.columnFilter('TagBox').remove('test');
708
+ */
709
+ async remove(itemText) {
710
+ const filter = await this.initFilter();
711
+ await filter.remove(itemText);
712
+ return this.apply();
713
+ }
714
+ };
715
+
598
716
  // src/pageObjects/elements/Forms/ListForm.ts
599
717
  var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
600
718
  var ListForm = class extends Form {
@@ -635,6 +753,10 @@ var ListForm = class extends Form {
635
753
  formFilter(name) {
636
754
  return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
637
755
  }
756
+ columnFilter(name) {
757
+ const column = this.table().getColumnByName(name);
758
+ return new ColumnFilter(this.formName, name, column, this.driver);
759
+ }
638
760
  /**
639
761
  * Модель панели фильтрации
640
762
  * @returns {FilterPanel}