d5-testing-library 1.8.0-alpha.1 → 1.8.0-alpha.10

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-MZW4BBF3.mjs";
4
+ import "./chunk-NXQ4TYFN.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-PS3VVRTQ.mjs";
4
+ import "./chunk-NXQ4TYFN.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-6RIWBBNU.mjs";
4
+ import "./chunk-PS3VVRTQ.mjs";
5
+ import "./chunk-NXQ4TYFN.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -0,0 +1,21 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-PS3VVRTQ.mjs";
4
+
5
+ // src/pageObjects/elements/Forms/TreeView.ts
6
+ var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
7
+ var TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content:not(.dx-datagrid-content-fixed)";
8
+ var FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-treelist-content.dx-treelist-content-fixed";
9
+ var TreeView = class extends ListForm {
10
+ constructor(driver) {
11
+ super(driver);
12
+ this.popupContainerCssSelector = `.popup.wrapper-tree-view-${this.formName}`;
13
+ this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
14
+ this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
15
+ this.tableContentCssSelector = TREELIST_CONTENT_CSS_SELECTOR;
16
+ }
17
+ };
18
+
19
+ export {
20
+ TreeView
21
+ };
@@ -3,16 +3,22 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  wait
6
- } from "./chunk-JITTN2NY.mjs";
6
+ } from "./chunk-NXQ4TYFN.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
10
10
  var FormEdit = class extends Form {
11
- saveButtonBy = By.id("button-save");
12
- closeButtonBy = By.id("button-cancel");
11
+ saveButtonId = "#button-save";
12
+ closeButtonId = "#button-cancel";
13
13
  constructor(driver) {
14
14
  super(driver);
15
- this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
15
+ this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
16
+ }
17
+ async getButtonCssSelector(buttonId) {
18
+ if (await this.isModal()) {
19
+ return `${this.popupContainerCssSelector} ${buttonId}`;
20
+ }
21
+ return buttonId;
16
22
  }
17
23
  /**
18
24
  * Находит поле формы редактирования по имени
@@ -32,7 +38,8 @@ var FormEdit = class extends Form {
32
38
  * await formEdit.isSaveButtonDisabled();
33
39
  */
34
40
  async isSaveButtonDisabled() {
35
- const saveButton = await this.driver.findElement(this.saveButtonBy);
41
+ const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
42
+ const saveButton = await this.driver.findElement(By.css(saveButtonCssSelector));
36
43
  const result = await saveButton.getAttribute("aria-disabled");
37
44
  return result === "true";
38
45
  }
@@ -44,7 +51,8 @@ var FormEdit = class extends Form {
44
51
  * await formEdit.saveButtonClick();
45
52
  */
46
53
  async saveButtonClick() {
47
- const saveButton = await this.driver.findElement(this.saveButtonBy);
54
+ const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
55
+ const saveButton = await this.driver.findElement(By.css(saveButtonCssSelector));
48
56
  await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
49
57
  await click(saveButton, this.driver);
50
58
  }
@@ -56,7 +64,8 @@ var FormEdit = class extends Form {
56
64
  * await formEdit.closeButtonClick();
57
65
  */
58
66
  async closeButtonClick() {
59
- const closeButton = await this.driver.findElement(this.closeButtonBy);
67
+ const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
68
+ const closeButton = await this.driver.findElement(By.css(closeButtonCssSelector));
60
69
  await click(closeButton, this.driver);
61
70
  }
62
71
  };
@@ -262,6 +262,7 @@ var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
262
262
  ControlClass2["SingleDateRange"] = "single-date-range-control";
263
263
  ControlClass2["BooleanSelector"] = "buttons-group";
264
264
  ControlClass2["ButtonGroup"] = "button-group-field";
265
+ ControlClass2["HeaderFilterDictionary"] = "header-filter-dictionary";
265
266
  return ControlClass2;
266
267
  })(ControlClass || {});
267
268
 
@@ -679,6 +680,97 @@ var DateEditor = class extends AbstractDXEditorWithInput {
679
680
  }
680
681
  };
681
682
 
683
+ // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
684
+ import { By as By11, Key as Key4 } from "selenium-webdriver";
685
+ var TAGS_SELECTOR2 = ".dx-tag .tag-text";
686
+ var DX_TAG_CONTAINER2 = "dx-tag-container";
687
+ var DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
688
+ var CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
689
+ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
690
+ var TAG_BOX_LIST_ITEM_SELECTOR2 = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
691
+ var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
692
+ var dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
693
+ const { implicit } = await driver.manage().getTimeouts();
694
+ let optElement = null;
695
+ const timeout = delay ? implicit : 600;
696
+ let err = null;
697
+ try {
698
+ const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
699
+ await driver.manage().setTimeouts({ implicit: timeout });
700
+ const calendarPopoverElement = await driver.findElement(By11.css(calendarPopoverSelector));
701
+ const customOptionList = calendarPopoverElement.findElement(By11.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
702
+ optElement = await customOptionList.findElement(By11.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
703
+ await click(optElement, driver);
704
+ } catch (e) {
705
+ err = new Error(`Item not found: "${optionValue}"`);
706
+ } finally {
707
+ await driver.manage().setTimeouts({ implicit });
708
+ }
709
+ if (err)
710
+ throw err;
711
+ };
712
+ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
713
+ constructor(parentCssSelector, elementCssSelector, driver) {
714
+ super(parentCssSelector, elementCssSelector, driver);
715
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
716
+ }
717
+ async setTagBoxInputValue(values) {
718
+ const lastElement = values[values.length - 1];
719
+ const inputEl = await this.getInputElement();
720
+ await inputEl.click();
721
+ for (const value of values) {
722
+ await this.selectOption(inputEl, value, lastElement);
723
+ }
724
+ }
725
+ async waitOptionSelection() {
726
+ await fixElementStaleError(By11.css(TAG_BOX_LIST_ITEM_SELECTOR2), this.driver);
727
+ }
728
+ async selectOption(inputEl, value, lastElement) {
729
+ try {
730
+ await inputEl.sendKeys(value);
731
+ const dataTEST = await this.getDataTestId();
732
+ await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
733
+ const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
734
+ for (let i = 0; i < textLength; i++) {
735
+ await inputEl.sendKeys(Key4.BACK_SPACE);
736
+ }
737
+ } catch (error) {
738
+ throw error;
739
+ }
740
+ await this.waitOptionSelection();
741
+ if (value !== lastElement) {
742
+ await inputEl.clear();
743
+ }
744
+ }
745
+ async getHeaderFilterDictionaryInputValue() {
746
+ if (await this.isHeaderFilterDictionaryEmpty()) {
747
+ return [];
748
+ }
749
+ const tags = await this.driver.findElements(
750
+ By11.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
751
+ );
752
+ const values = [];
753
+ for (const tag of tags) {
754
+ values.push(await tag.getAttribute("textContent"));
755
+ }
756
+ return values;
757
+ }
758
+ async isHeaderFilterDictionaryEmpty() {
759
+ const classAttribute = await this.getClasses();
760
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY3);
761
+ }
762
+ async getValue() {
763
+ const value = await this.getHeaderFilterDictionaryInputValue();
764
+ return value.length ? value : null;
765
+ }
766
+ async setValue(values) {
767
+ if (!Array.isArray(values)) {
768
+ values = [values];
769
+ }
770
+ await this.setTagBoxInputValue(values);
771
+ }
772
+ };
773
+
682
774
  // src/pageObjects/elements/Editors/editorFactory.ts
683
775
  var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
684
776
  const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
@@ -702,6 +794,8 @@ var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
702
794
  return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
703
795
  if (classSting.includes("button-group-field" /* ButtonGroup */))
704
796
  return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
797
+ if (classSting.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
798
+ return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, driver);
705
799
  throw new Error("Unknown type of editor. Please write ticket to the support");
706
800
  };
707
801
 
@@ -736,6 +830,52 @@ function createFormButtonTestId(formName, itemName) {
736
830
  function createSubSystemTestId(itemName) {
737
831
  return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
738
832
  }
833
+ function createEditorButtonTestId(itemName) {
834
+ return `${"editor-button" /* EDITOR_BUTTON */}-${itemName}`;
835
+ }
836
+
837
+ // src/utils/waitElementIsClickable.ts
838
+ async function waitElementIsClickable({
839
+ element,
840
+ timeout,
841
+ errorMessage,
842
+ driver
843
+ }) {
844
+ driver = driver ?? config().driver;
845
+ await wait(async () => {
846
+ const isDisabled = await element.getCssValue("pointer-events") === "none";
847
+ return await element.isDisplayed() && !isDisabled;
848
+ }, driver, errorMessage, timeout ?? config().timeout);
849
+ }
850
+
851
+ // src/pageObjects/elements/EditorButton.ts
852
+ var EditorButton = class extends AbstractElementWithParent {
853
+ name;
854
+ constructor(parentCssSelector, name, driver) {
855
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
856
+ this.name = name;
857
+ }
858
+ buttonNotDisplayedError() {
859
+ return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
860
+ }
861
+ async click() {
862
+ const button = await this.getElement();
863
+ await waitElementIsClickable({
864
+ element: button,
865
+ errorMessage: this.buttonNotDisplayedError(),
866
+ driver: this.driver
867
+ });
868
+ await click(button, this.driver);
869
+ }
870
+ async isDisplayed() {
871
+ try {
872
+ const button = await this.getElement();
873
+ return await button.isDisplayed();
874
+ } catch (error) {
875
+ return false;
876
+ }
877
+ }
878
+ };
739
879
 
740
880
  // src/pageObjects/elements/AbstractEditor.ts
741
881
  var AbstractEditor = class extends AbstractElementWithParent {
@@ -802,6 +942,16 @@ var AbstractEditor = class extends AbstractElementWithParent {
802
942
  await this.initEditor();
803
943
  return this.editor.isReadonly();
804
944
  }
945
+ /**
946
+ * Находит кнопку на поле по имени
947
+ * @example
948
+ * const form= new MyForm();
949
+ * //...
950
+ * await form.field('Name').button('editorButton).click()
951
+ */
952
+ button(name) {
953
+ return new EditorButton(this.getFullCssSelector(), name, this.driver);
954
+ }
805
955
  };
806
956
 
807
957
  // src/pageObjects/elements/FormField.ts
@@ -812,21 +962,7 @@ var FormField = class extends AbstractEditor {
812
962
  };
813
963
 
814
964
  // src/pageObjects/elements/Forms/Form.ts
815
- import { By as By14 } from "selenium-webdriver";
816
-
817
- // src/utils/waitElementIsClickable.ts
818
- async function waitElementIsClickable({
819
- element,
820
- timeout,
821
- errorMessage,
822
- driver
823
- }) {
824
- driver = driver ?? config().driver;
825
- await wait(async () => {
826
- const isDisabled = await element.getCssValue("pointer-events") === "none";
827
- return await element.isDisplayed() && !isDisabled;
828
- }, driver, errorMessage, timeout ?? config().timeout);
829
- }
965
+ import { By as By15 } from "selenium-webdriver";
830
966
 
831
967
  // src/pageObjects/elements/TableToolbar/AbstractButton.ts
832
968
  var AbstractButton = class extends AbstractElementWithParent {
@@ -846,10 +982,14 @@ var AbstractButton = class extends AbstractElementWithParent {
846
982
  const button = await this.getElement();
847
983
  return await button.getCssValue("pointer-events") === "none";
848
984
  }
985
+ async isDisplayed() {
986
+ const button = await this.getElement();
987
+ return await button.isDisplayed();
988
+ }
849
989
  };
850
990
 
851
991
  // src/pageObjects/elements/DXComponents/DXButton.ts
852
- import { By as By11 } from "selenium-webdriver";
992
+ import { By as By12 } from "selenium-webdriver";
853
993
  var DXButton = class extends AbstractButton {
854
994
  async getText() {
855
995
  const classes = await this.getClasses();
@@ -857,7 +997,7 @@ var DXButton = class extends AbstractButton {
857
997
  return null;
858
998
  }
859
999
  const el = await this.getElement();
860
- const textEl = el.findElement(By11.className("dx-button-text"));
1000
+ const textEl = el.findElement(By12.className("dx-button-text"));
861
1001
  return await textEl.getText();
862
1002
  }
863
1003
  };
@@ -887,7 +1027,7 @@ var Panel = class extends AbstractGroup {
887
1027
  };
888
1028
 
889
1029
  // src/pageObjects/elements/Groups/TabPanel.ts
890
- import { By as By12 } from "selenium-webdriver";
1030
+ import { By as By13 } from "selenium-webdriver";
891
1031
  var TabPanelItem = class extends AbstractGroup {
892
1032
  constructor(parentCssSelector, elementCssSelector, driver) {
893
1033
  super(parentCssSelector, elementCssSelector, driver);
@@ -897,7 +1037,7 @@ var TabPanelItem = class extends AbstractGroup {
897
1037
  }
898
1038
  async isActive() {
899
1039
  const tabPanelItemElement = await this.getElement();
900
- const grandparentTab = await tabPanelItemElement.findElement(By12.xpath('ancestor::div[@role="tab"][1]'));
1040
+ const grandparentTab = await tabPanelItemElement.findElement(By13.xpath('ancestor::div[@role="tab"][1]'));
901
1041
  return await grandparentTab.getAttribute("aria-selected") === "true";
902
1042
  }
903
1043
  async getTitle() {
@@ -914,7 +1054,7 @@ var TabPanel = class extends AbstractGroup {
914
1054
  };
915
1055
 
916
1056
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
917
- import { By as By13 } from "selenium-webdriver";
1057
+ import { By as By14 } from "selenium-webdriver";
918
1058
  var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
919
1059
  var AccordionItem = class extends AbstractGroup {
920
1060
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -926,7 +1066,7 @@ var AccordionItem = class extends AbstractGroup {
926
1066
  }
927
1067
  async clickAccordionItemTitle() {
928
1068
  const accordionElement = await this.getElement();
929
- const accordTitleElement = await accordionElement.findElement(By13.className(ACCORDION_TITLE_CONTAINER));
1069
+ const accordTitleElement = await accordionElement.findElement(By14.className(ACCORDION_TITLE_CONTAINER));
930
1070
  await accordTitleElement.click();
931
1071
  }
932
1072
  async click() {
@@ -1114,15 +1254,15 @@ async function classDependencyInjector(formType) {
1114
1254
  let SubFormFactoryClass;
1115
1255
  switch (formType) {
1116
1256
  case "1" /* LIST */:
1117
- SubFormFactoryClass = (await import("./ListForm-R7WQIGBI.mjs")).default;
1257
+ SubFormFactoryClass = (await import("./ListForm-FXCLXRJW.mjs")).default;
1118
1258
  break;
1119
1259
  case "3" /* TREE */:
1120
- SubFormFactoryClass = (await import("./TreeView-STUAAR65.mjs")).default;
1260
+ SubFormFactoryClass = (await import("./TreeView-DE2BPJG2.mjs")).default;
1121
1261
  break;
1122
1262
  case "2" /* EDIT */:
1123
1263
  case "99" /* FREE_FORM */:
1124
1264
  case "4" /* REPORT */:
1125
- SubFormFactoryClass = (await import("./FormEdit-XOCYARDX.mjs")).default;
1265
+ SubFormFactoryClass = (await import("./FormEdit-ZFZMJYWV.mjs")).default;
1126
1266
  break;
1127
1267
  default:
1128
1268
  throw new Error(`Unsupported form type ${formType}`);
@@ -1152,10 +1292,10 @@ var Form = class extends AbstractForm {
1152
1292
  */
1153
1293
  async getTitleText() {
1154
1294
  if (await this.isModal()) {
1155
- const titleEl2 = await this.driver.findElement(By14.css(`${this.popupContainerCssSelector} .popup-title`));
1295
+ const titleEl2 = await this.driver.findElement(By15.css(`${this.popupContainerCssSelector} .popup-title`));
1156
1296
  return titleEl2.getText();
1157
1297
  }
1158
- let titleEl = await this.driver.findElement(By14.className("main-toolbar-form-title"));
1298
+ let titleEl = await this.driver.findElement(By15.className("main-toolbar-form-title"));
1159
1299
  return titleEl.getText();
1160
1300
  }
1161
1301
  setSubFormMode() {
@@ -1173,7 +1313,7 @@ var Form = class extends AbstractForm {
1173
1313
  */
1174
1314
  async subForm(name) {
1175
1315
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
1176
- const byCssSelector = By14.css(cssSelector);
1316
+ const byCssSelector = By15.css(cssSelector);
1177
1317
  const subFormEl = await this.driver.findElement(byCssSelector);
1178
1318
  await waitElementIsVisible({
1179
1319
  element: subFormEl,