d5-testing-library 1.2.0 → 1.3.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,11 +31,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  AbstractPage: () => AbstractPage,
34
+ FilterPanel: () => FilterPanel,
34
35
  FormEdit: () => FormEdit,
35
36
  FormField: () => FormField,
37
+ FormFilterField: () => FormFilterField,
36
38
  ListForm: () => ListForm,
37
39
  LoginPage: () => LoginPage,
38
40
  NumberEditor: () => NumberEditor,
41
+ PanelFilterField: () => PanelFilterField,
39
42
  SubsystemsPanel: () => SubsystemsPanel,
40
43
  TextEditor: () => TextEditor,
41
44
  byTestId: () => byTestId,
@@ -91,11 +94,58 @@ function config(cfg) {
91
94
  return configInstance.config(cfg);
92
95
  }
93
96
 
97
+ // src/pageObjects/AbstractElement.ts
98
+ var import_selenium_webdriver2 = require("selenium-webdriver");
99
+
100
+ // src/utils/waitElementIsVisible.ts
101
+ var import_selenium_webdriver = require("selenium-webdriver");
102
+
103
+ // src/utils/wait.ts
104
+ async function wait(condition, driver, errorMessage, timeout) {
105
+ driver = driver ?? config().driver;
106
+ await driver.wait(condition, timeout ?? config().timeout, errorMessage);
107
+ }
108
+
109
+ // src/utils/waitElementIsVisible.ts
110
+ async function waitElementIsVisible({
111
+ element,
112
+ timeout,
113
+ errorMessage,
114
+ driver
115
+ }) {
116
+ driver = driver ?? config().driver;
117
+ const condition = import_selenium_webdriver.until.elementIsVisible(element);
118
+ await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
119
+ }
120
+
94
121
  // src/pageObjects/AbstractElement.ts
95
122
  var AbstractElement = class {
96
123
  driver;
97
- constructor(driver) {
124
+ elementCssSelector;
125
+ constructor(driver, elementCssSelector) {
98
126
  this.driver = driver || config().driver;
127
+ this.elementCssSelector = elementCssSelector;
128
+ }
129
+ getFullCssSelector() {
130
+ return this.elementCssSelector;
131
+ }
132
+ async getElement() {
133
+ return this.driver.findElement(import_selenium_webdriver2.By.css(this.getFullCssSelector()));
134
+ }
135
+ async getAttribute(attr) {
136
+ const element = await this.getElement();
137
+ await waitElementIsVisible({
138
+ element,
139
+ driver: this.driver,
140
+ errorMessage: `Element not found: ${this.getFullCssSelector()}`
141
+ });
142
+ return await element.getAttribute(attr);
143
+ }
144
+ async getClasses() {
145
+ return await this.getAttribute("class");
146
+ }
147
+ async getDataTestId() {
148
+ return await this.getAttribute("data-testid");
99
149
  }
100
150
  };
101
151
 
@@ -128,19 +178,62 @@ var AbstractPage = class extends AbstractElement {
128
178
  }
129
179
  };
130
180
 
181
+ // src/utils/actions.ts
182
+ var click = async (webElement, driver) => {
183
+ driver = driver ?? config().driver;
184
+ const actions = driver.actions({ async: true });
185
+ await actions.move({ origin: webElement }).click().perform();
186
+ };
187
+
131
188
  // src/utils/locators.ts
132
- var import_selenium_webdriver = require("selenium-webdriver");
189
+ var import_selenium_webdriver3 = require("selenium-webdriver");
133
190
  var byTestIdCssSelector = (testId, element = "div") => {
134
191
  return `${element}[data-testid="${testId}"]`;
135
192
  };
136
193
  var byTestId = (testId, element = "div") => {
137
- return import_selenium_webdriver.By.css(byTestIdCssSelector(testId, element));
194
+ return import_selenium_webdriver3.By.css(byTestIdCssSelector(testId, element));
195
+ };
196
+
197
+ // src/pageObjects/pages/LoginPage.ts
198
+ var LOGIN_PATH = "/login";
199
+ var LoginPage = class extends AbstractPage {
200
+ usernameField = byTestId("loginField", "input");
201
+ passwordField = byTestId("passwordField", "input");
202
+ loginButton = byTestId("loginButton");
203
+ async locate() {
204
+ await super.locate();
205
+ const login = await this.driver.findElement(this.usernameField);
206
+ await waitElementIsVisible({
207
+ element: login,
208
+ driver: this.driver
209
+ });
210
+ }
211
+ get path() {
212
+ return LOGIN_PATH;
213
+ }
214
+ async enterUsername(username) {
215
+ await this.driver.findElement(this.usernameField).sendKeys(username);
216
+ }
217
+ async enterPassword(password) {
218
+ await this.driver.findElement(this.passwordField).sendKeys(password);
219
+ }
220
+ async clickLoginButton() {
221
+ await click(await this.driver.findElement(this.loginButton), this.driver);
222
+ }
223
+ async loginWith(username, password) {
224
+ await this.enterUsername(username);
225
+ await this.enterPassword(password);
226
+ await this.clickLoginButton();
227
+ }
228
+ async authorize() {
229
+ await this.loginWith(config().auth.login, config().auth.password);
230
+ }
138
231
  };
139
232
 
140
233
  // src/utils/createDriver.ts
141
- var import_selenium_webdriver2 = require("selenium-webdriver");
234
+ var import_selenium_webdriver4 = require("selenium-webdriver");
142
235
  var createDriver = async (browser) => {
143
- const driver = await new import_selenium_webdriver2.Builder().forBrowser(browser ?? config().browser).build();
236
+ const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
144
237
  const manage = driver.manage();
145
238
  await manage.setTimeouts({ implicit: config().timeout });
146
239
  await manage.window().maximize();
@@ -148,44 +241,30 @@ var createDriver = async (browser) => {
148
241
  };
149
242
 
150
243
  // src/utils/elementIsNotPresent.ts
151
- var import_selenium_webdriver3 = require("selenium-webdriver");
244
+ var import_selenium_webdriver5 = require("selenium-webdriver");
152
245
  var elementIsNotPresent = function elementIsNotPresent2(locator) {
153
- return new import_selenium_webdriver3.Condition("for no element to be located " + locator, async function(driver) {
246
+ return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
154
247
  const elements = await driver.findElements(locator);
155
248
  return elements.length == 0;
156
249
  });
157
250
  };
158
251
 
159
- // src/utils/waitElementIsVisible.ts
160
- var import_selenium_webdriver4 = require("selenium-webdriver");
161
-
162
- // src/utils/wait.ts
163
- async function wait(condition, driver, errorMessage, timeout) {
164
- driver = driver ?? config().driver;
165
- await driver.wait(condition, timeout ?? config().timeout, errorMessage);
166
- }
167
-
168
- // src/utils/waitElementIsVisible.ts
169
- async function waitElementIsVisible({
170
- element,
171
- timeout,
172
- errorMessage,
173
- driver
174
- }) {
175
- driver = driver ?? config().driver;
176
- const condition = import_selenium_webdriver4.until.elementIsVisible(element);
177
- await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
252
+ // src/utils/signIn.ts
253
+ async function signIn(driver) {
254
+ const webDriver = driver ?? await createDriver();
255
+ config().driver = webDriver;
256
+ const loginPage = new LoginPage(webDriver);
257
+ await loginPage.locate();
258
+ await loginPage.authorize();
259
+ return webDriver;
178
260
  }
179
261
 
180
262
  // src/pageObjects/AbstractElementWithParent.ts
181
- var import_selenium_webdriver5 = require("selenium-webdriver");
182
263
  var AbstractElementWithParent = class extends AbstractElement {
183
- elementCssSelector;
184
264
  parentCssSelector;
185
265
  constructor(parentCssSelector, elementCssSelector, driver) {
186
- super(driver);
266
+ super(driver, elementCssSelector);
187
267
  this.parentCssSelector = parentCssSelector;
188
- this.elementCssSelector = elementCssSelector;
189
268
  }
190
269
  getFullCssSelector() {
191
270
  if (!this.elementCssSelector) {
@@ -196,21 +275,6 @@ var AbstractElementWithParent = class extends AbstractElement {
196
275
  }
197
276
  return `${this.parentCssSelector} ${this.elementCssSelector}`;
198
277
  }
199
- async getElement() {
200
- return this.driver.findElement(import_selenium_webdriver5.By.css(this.getFullCssSelector()));
201
- }
202
- async getAttribute(attr) {
203
- const element = await this.getElement();
204
- await waitElementIsVisible({
205
- element,
206
- driver: this.driver,
207
- errorMessage: `Element not found: ${this.getFullCssSelector()}`
208
- });
209
- return await element.getAttribute(attr);
210
- }
211
- async getClasses() {
212
- return await this.getAttribute("class");
213
- }
214
278
  };
215
279
 
216
280
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
@@ -228,8 +292,10 @@ var SubsystemsPanel = class extends AbstractElement {
228
292
  super(driver);
229
293
  this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
230
294
  }
231
- headerTitle() {
232
- return this.header.title().then((el) => el.getText());
295
+ async headerTitle() {
296
+ const title = await this.header.title();
297
+ await wait(async () => await title.getText() != "", this.driver);
298
+ return title.getText();
233
299
  }
234
300
  };
235
301
 
@@ -266,10 +332,10 @@ var AbstractForm = class extends AbstractPage {
266
332
  */
267
333
  async exists() {
268
334
  try {
269
- await wait(elementIsNotPresent(this.containerBy), this.driver);
335
+ let elements = await this.driver.findElements(this.containerBy);
336
+ return elements.length > 0;
337
+ } catch (error) {
270
338
  return false;
271
- } catch {
272
- return true;
273
339
  }
274
340
  }
275
341
  /**
@@ -284,7 +350,7 @@ var AbstractForm = class extends AbstractPage {
284
350
  const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
285
351
  return titleEl2.getText();
286
352
  }
287
- let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.containerCssSelector} .form-toolbar-name-container`));
353
+ let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.className("main-toolbar-form-title"));
288
354
  return titleEl.getText();
289
355
  }
290
356
  };
@@ -292,6 +358,29 @@ var AbstractForm = class extends AbstractPage {
292
358
  // src/pageObjects/elements/Forms/FormEdit.ts
293
359
  var import_selenium_webdriver14 = require("selenium-webdriver");
294
360
 
361
+ // src/utils/createDataTestId.ts
362
+ function createDataTestId(formName, itemType, itemName) {
363
+ return `${formName}-${itemType}-${itemName}`;
364
+ }
365
+ function createFieldTestId(formName, itemName) {
366
+ return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
367
+ }
368
+ function createGroupTestId(formName, itemName) {
369
+ return createDataTestId(formName, "group" /* GROUP */, itemName);
370
+ }
371
+ function createFilterTestId(formName, itemName, layout) {
372
+ return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
373
+ }
374
+ function createDocFilterTestId(formName, itemName) {
375
+ return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
376
+ }
377
+ function createLayoutFilterTestId(formName, itemName) {
378
+ return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
379
+ }
380
+ function createTableId(formName) {
381
+ return `${"table" /* TABLE */}-${formName}`;
382
+ }
383
+
295
384
  // src/pageObjects/elements/Editors/AbstractEditor.ts
296
385
  var import_selenium_webdriver8 = require("selenium-webdriver");
297
386
 
@@ -484,6 +573,7 @@ var TAGS_SELECTOR = ".dx-tag .tag-text";
484
573
  var DX_TAG_CONTAINER = "dx-tag-container";
485
574
  var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
486
575
  var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
576
+ var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
487
577
  var TagBox = class extends AbstractDXEditorWithInput {
488
578
  constructor(parentCssSelector, elementCssSelector, driver) {
489
579
  super(parentCssSelector, elementCssSelector, driver);
@@ -498,21 +588,21 @@ var TagBox = class extends AbstractDXEditorWithInput {
498
588
  }
499
589
  await this.confirmSelection();
500
590
  }
591
+ async waitOptionSelection() {
592
+ const option = await this.driver.findElement(import_selenium_webdriver11.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
593
+ await wait(() => option.isDisplayed(), this.driver);
594
+ }
501
595
  async selectOption(inputEl, value, lastElement) {
502
596
  await inputEl.sendKeys(value);
503
597
  const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
504
598
  await click(optElement, this.driver);
599
+ await this.waitOptionSelection();
505
600
  if (value !== lastElement) {
506
601
  await inputEl.clear();
507
602
  }
508
603
  }
509
604
  async confirmSelection() {
510
- const inputEl = await this.getInputElement();
511
- const option = await inputEl.findElement(import_selenium_webdriver11.By.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
512
605
  const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
513
- await wait(async () => {
514
- return await option.getAttribute("aria-selected") === "true";
515
- }, this.driver);
516
606
  await click(btnOk, this.driver);
517
607
  }
518
608
  async getTagBoxInputValue() {
@@ -660,25 +750,11 @@ var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
660
750
  throw new Error("Unknown type of editor. Please write ticket to the support");
661
751
  };
662
752
 
663
- // src/utils/createDataTestId.ts
664
- function createDataTestId(formName, itemType, itemName) {
665
- return `${formName}-${itemType}-${itemName}`;
666
- }
667
- function createFieldTestId(formName, itemName) {
668
- return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
669
- }
670
- function createGroupTestId(formName, itemName) {
671
- return createDataTestId(formName, "group" /* GROUP */, itemName);
672
- }
673
- function createTableId(formName) {
674
- return `${"table" /* TABLE */}-${formName}`;
675
- }
676
-
677
- // src/pageObjects/elements/FormField.ts
678
- var FormField = class extends AbstractElementWithParent {
753
+ // src/pageObjects/elements/AbstractEditor.ts
754
+ var AbstractEditor = class extends AbstractElementWithParent {
679
755
  editor;
680
- constructor(parentCssSelector, formName, name, driver) {
681
- super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
756
+ constructor(parentCssSelector, elementCssSelector, driver) {
757
+ super(parentCssSelector, elementCssSelector, driver);
682
758
  }
683
759
  async initEditor() {
684
760
  if (!this.editor) {
@@ -731,6 +807,13 @@ var FormField = class extends AbstractElementWithParent {
731
807
  }
732
808
  };
733
809
 
810
+ // src/pageObjects/elements/FormField.ts
811
+ var FormField = class extends AbstractEditor {
812
+ constructor(parentCssSelector, formName, name, driver) {
813
+ super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
814
+ }
815
+ };
816
+
734
817
  // src/pageObjects/elements/Groups/AbstractGroup.ts
735
818
  var AbstractGroup = class extends AbstractElementWithParent {
736
819
  async isDisplayed() {
@@ -832,9 +915,12 @@ var FormEdit = class extends AbstractForm {
832
915
  };
833
916
 
834
917
  // src/pageObjects/elements/Table/Table.ts
835
- var import_selenium_webdriver18 = require("selenium-webdriver");
918
+ var import_selenium_webdriver19 = require("selenium-webdriver");
836
919
 
837
920
  // src/pageObjects/elements/Table/elements/Row.ts
921
+ var import_selenium_webdriver17 = require("selenium-webdriver");
922
+
923
+ // src/pageObjects/elements/Table/elements/Cell.ts
838
924
  var import_selenium_webdriver16 = require("selenium-webdriver");
839
925
 
840
926
  // src/pageObjects/elements/Table/utils.ts
@@ -844,6 +930,7 @@ function getCssRowByIndexSelector(index) {
844
930
  }
845
931
  var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
846
932
  var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
933
+ var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
847
934
  function getCssCellByIndexSelector(index) {
848
935
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
849
936
  }
@@ -863,6 +950,10 @@ var Cell = class extends AbstractElementWithParent {
863
950
  this._index = index;
864
951
  this.elementCssSelector = getCssCellByIndexSelector(index);
865
952
  }
953
+ async getBooleanValue(cellEl) {
954
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver16.By.className("boolean-widget"));
955
+ return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
956
+ }
866
957
  async getElement() {
867
958
  if (this._index == null) {
868
959
  this.index = await this.getCellIndex();
@@ -871,6 +962,10 @@ var Cell = class extends AbstractElementWithParent {
871
962
  }
872
963
  async getValue() {
873
964
  const cellEl = await this.getElement();
965
+ const cellElClass = await cellEl.getAttribute("class");
966
+ if (cellElClass.includes("boolean-column")) {
967
+ return this.getBooleanValue(cellEl);
968
+ }
874
969
  return cellEl.getText();
875
970
  }
876
971
  getIndex() {
@@ -884,22 +979,25 @@ var DX_ROW_EDIT_CLASS = "dx-edit-row";
884
979
  var DX_DATA_ROW_CLASS = "dx-data-row";
885
980
  var Row = class extends AbstractElementWithParent {
886
981
  index;
887
- getColumnByCaption;
888
- constructor(parentCssSelector, index, driver, getColumnByCaption) {
982
+ getColumnBy;
983
+ constructor(parentCssSelector, index, driver, getColumnBy) {
889
984
  super(parentCssSelector, getCssRowByIndexSelector(index), driver);
890
985
  this.index = index;
891
- this.getColumnByCaption = getColumnByCaption;
986
+ this.getColumnBy = getColumnBy;
892
987
  }
893
- _getCell(index, caption) {
988
+ _getCell({ index, name, title }) {
894
989
  return new Cell(this.getFullCssSelector(), () => {
895
- return this.getColumnByCaption(caption).getIndex();
990
+ return this.getColumnBy({ title, name }).getIndex();
896
991
  }, index, this.driver);
897
992
  }
898
993
  getCellByIndex(index) {
899
- return this._getCell(index);
994
+ return this._getCell({ index });
995
+ }
996
+ getCell(name) {
997
+ return this._getCell({ name });
900
998
  }
901
- getCell(caption) {
902
- return this._getCell(void 0, caption);
999
+ getCellByTitle(title) {
1000
+ return this._getCell({ title });
903
1001
  }
904
1002
  async select() {
905
1003
  const rowEl = await this.getElement();
@@ -917,7 +1015,7 @@ var Row = class extends AbstractElementWithParent {
917
1015
  return this.index;
918
1016
  }
919
1017
  async getCells() {
920
- const cells = await this.driver.findElements(import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1018
+ const cells = await this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
921
1019
  const result = [];
922
1020
  cells.forEach((_, index) => {
923
1021
  const newCell = this.getCellByIndex(index);
@@ -928,7 +1026,7 @@ var Row = class extends AbstractElementWithParent {
928
1026
  async clickInlineButton(buttonClass) {
929
1027
  const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
930
1028
  const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
931
- const button = await this.driver.findElement(import_selenium_webdriver16.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
1029
+ const button = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
932
1030
  return click(button, this.driver);
933
1031
  }
934
1032
  async checkEditingMode(isEditing, msg) {
@@ -951,15 +1049,17 @@ var Row = class extends AbstractElementWithParent {
951
1049
  };
952
1050
 
953
1051
  // src/pageObjects/elements/Table/elements/Column.ts
954
- var import_selenium_webdriver17 = require("selenium-webdriver");
1052
+ var import_selenium_webdriver18 = require("selenium-webdriver");
955
1053
  var getHeaderCssSelector = () => {
956
1054
  return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
957
1055
  };
958
1056
  var Column = class extends AbstractElementWithParent {
959
1057
  _index;
960
1058
  _caption;
961
- constructor(parentCssSelector, caption, index, driver) {
1059
+ _name;
1060
+ constructor({ parentCssSelector, name, caption, index, driver }) {
962
1061
  super(parentCssSelector, "", driver);
1062
+ this._name = name;
963
1063
  this.index = index;
964
1064
  this._caption = caption;
965
1065
  }
@@ -974,19 +1074,33 @@ var Column = class extends AbstractElementWithParent {
974
1074
  await this.getIndex();
975
1075
  return super.getElement();
976
1076
  }
977
- async getIndexByCaption() {
978
- const column = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${getColumnByCaptionCssSelector(this._caption)}`));
1077
+ async getColumnHeaderIndexBy(cssSelector) {
1078
+ const column = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${cssSelector}`));
979
1079
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
980
1080
  }
1081
+ async getIndexByCaption() {
1082
+ return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
1083
+ }
1084
+ async getIndexByName() {
1085
+ return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
1086
+ }
981
1087
  async caption() {
982
1088
  const el = await this.getElement();
983
1089
  return el.getText();
984
1090
  }
985
1091
  async getIndex() {
986
- if (this.index == null) {
1092
+ if (this.index != null) {
1093
+ return this.index;
1094
+ }
1095
+ if (this._caption != null) {
987
1096
  this.index = await this.getIndexByCaption();
1097
+ return this.index;
988
1098
  }
989
- return this.index;
1099
+ if (this._name != null) {
1100
+ this.index = await this.getIndexByName();
1101
+ return this.index;
1102
+ }
1103
+ throw new Error("Cant get the index in the column");
990
1104
  }
991
1105
  };
992
1106
 
@@ -997,32 +1111,57 @@ var Table = class extends AbstractElementWithParent {
997
1111
  super(parentCssSelector, `#${createTableId(formName)}`, driver);
998
1112
  this.formName = formName;
999
1113
  }
1114
+ getColumnBy = (args) => {
1115
+ if (args.title) {
1116
+ return this.getColumnByTitle(args.title);
1117
+ }
1118
+ return this.getColumnByName(args.name);
1119
+ };
1000
1120
  getRowByIndex(index) {
1001
- return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption.bind(this));
1121
+ return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1002
1122
  }
1003
1123
  getColumnByIndex(index) {
1004
- return new Column(this.getFullCssSelector(), void 0, index, this.driver);
1124
+ return new Column({
1125
+ parentCssSelector: this.getFullCssSelector(),
1126
+ driver: this.driver,
1127
+ index
1128
+ });
1005
1129
  }
1006
- getColumnByCaption = (caption) => {
1007
- return new Column(this.getFullCssSelector(), caption, void 0, this.driver);
1130
+ getColumnByTitle = (title) => {
1131
+ return new Column({
1132
+ parentCssSelector: this.getFullCssSelector(),
1133
+ caption: title,
1134
+ driver: this.driver
1135
+ });
1136
+ };
1137
+ getColumnByName = (name) => {
1138
+ return new Column({
1139
+ parentCssSelector: this.getFullCssSelector(),
1140
+ name,
1141
+ driver: this.driver
1142
+ });
1008
1143
  };
1009
1144
  selectRowByIndex(index) {
1010
1145
  return this.getRowByIndex(index).select();
1011
1146
  }
1012
1147
  async getRows() {
1013
- const rows = await this.driver.findElements(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1148
+ const rows = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1014
1149
  const result = [];
1015
1150
  rows.forEach((_, index) => {
1016
- const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption);
1151
+ const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1017
1152
  result.push(newRow);
1018
1153
  });
1019
1154
  return result;
1020
1155
  }
1021
1156
  async getColumns() {
1022
- const columns = await this.driver.findElements(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
1157
+ const columns = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
1023
1158
  const result = [];
1024
1159
  columns.forEach((_, index) => {
1025
- const newCol = new Column(this.getFullCssSelector(), void 0, index, this.driver);
1160
+ const newCol = new Column({
1161
+ parentCssSelector: this.getFullCssSelector(),
1162
+ index,
1163
+ driver: this.driver
1164
+ });
1026
1165
  result.push(newCol);
1027
1166
  });
1028
1167
  return result;
@@ -1042,19 +1181,16 @@ var Table = class extends AbstractElementWithParent {
1042
1181
  }
1043
1182
  };
1044
1183
 
1045
- // src/pageObjects/elements/TableToolbar/TableToolbarButton.ts
1046
- var TOOLBAR_BUTTON_CLASS = "toolbar-button";
1047
- var TableToolbarButton = class extends AbstractElementWithParent {
1048
- name;
1049
- constructor(parentCssSelector, name, driver) {
1050
- super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
1051
- this.name = name;
1184
+ // src/pageObjects/elements/TableToolbar/AbstractButton.ts
1185
+ var AbstractButton = class extends AbstractElementWithParent {
1186
+ constructor(parentCssSelector, elementCssSelector, driver) {
1187
+ super(parentCssSelector, elementCssSelector, driver);
1052
1188
  }
1053
1189
  async click() {
1054
1190
  const button = await this.getElement();
1055
1191
  await wait(async () => {
1056
1192
  return await button.isDisplayed() && !await this.isDisabled();
1057
- }, this.driver, `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`);
1193
+ }, this.driver, this.buttonNotDisplayedError());
1058
1194
  await click(button, this.driver);
1059
1195
  }
1060
1196
  async isDisabled() {
@@ -1063,14 +1199,207 @@ var TableToolbarButton = class extends AbstractElementWithParent {
1063
1199
  }
1064
1200
  };
1065
1201
 
1066
- // src/pageObjects/elements/TableToolbar/TableToolbar.ts
1202
+ // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
1203
+ var ToolbarGroupButton = class extends AbstractButton {
1204
+ name;
1205
+ constructor(parentCssSelector, name, driver) {
1206
+ super(parentCssSelector, ``, driver);
1207
+ this.name = name;
1208
+ }
1209
+ buttonNotDisplayedError() {
1210
+ return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1211
+ }
1212
+ };
1213
+
1214
+ // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
1215
+ var TOOLBAR_BUTTON_CLASS = "toolbar-button";
1216
+ var ToolbarButton = class extends AbstractButton {
1217
+ name;
1218
+ constructor(parentCssSelector, name, driver) {
1219
+ super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
1220
+ this.name = name;
1221
+ }
1222
+ buttonNotDisplayedError() {
1223
+ return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1224
+ }
1225
+ };
1226
+
1227
+ // src/pageObjects/elements/TableToolbar/ToolbarItem.ts
1228
+ var GROUP_BUTTON_CLASS = "toolbar-group-button";
1229
+ var toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
1230
+ var ToolbarItem = class extends AbstractElementWithParent {
1231
+ _button;
1232
+ // private _formName: string;
1233
+ _itemName;
1234
+ constructor(parentCssSelector, formName, itemName, driver) {
1235
+ super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
1236
+ this._itemName = itemName;
1237
+ }
1238
+ async init() {
1239
+ if (this._button)
1240
+ return this._button;
1241
+ const classNames = await this.getClasses();
1242
+ if (classNames.includes(GROUP_BUTTON_CLASS)) {
1243
+ this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
1244
+ return;
1245
+ }
1246
+ this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
1247
+ }
1248
+ async click() {
1249
+ await this.init();
1250
+ await this._button.click();
1251
+ }
1252
+ async isDisabled() {
1253
+ await this.init();
1254
+ return await this._button.isDisabled();
1255
+ }
1256
+ };
1257
+
1258
+ // src/pageObjects/elements/TableToolbar/FormToolbar.ts
1067
1259
  var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
1068
- var TableToolbar = class extends AbstractElementWithParent {
1260
+ var FormToolbar = class extends AbstractElementWithParent {
1261
+ formName;
1069
1262
  constructor(parentCssSelector, formName, driver) {
1070
1263
  super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
1264
+ this.formName = formName;
1071
1265
  }
1072
1266
  button(name) {
1073
- return new TableToolbarButton(this.getFullCssSelector(), name, this.driver);
1267
+ return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
1268
+ }
1269
+ };
1270
+
1271
+ // src/pageObjects/elements/Filters/FormFilterField.ts
1272
+ var FormFilterField = class extends AbstractEditor {
1273
+ constructor(parentCssSelector, formName, name, driver) {
1274
+ super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
1275
+ }
1276
+ /**
1277
+ * Возвращает значение в поле
1278
+ * @example
1279
+ * expect(await form.formFilter('NumberFld').getValue()).toBe(10);
1280
+ * expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
1281
+ */
1282
+ async getValue() {
1283
+ return super.getValue();
1284
+ }
1285
+ /**
1286
+ * Устанавливает значение в поле
1287
+ * @example
1288
+ * await form.formFilter('NumberFld').setValue(123);
1289
+ * await form.formFilter('TextFld').setValue('TestValue');
1290
+ */
1291
+ async setValue(value) {
1292
+ return super.setValue(value);
1293
+ }
1294
+ /**
1295
+ * Очищает значение в поле
1296
+ * @example
1297
+ * await form.formFilter('NumberFld').clear();
1298
+ */
1299
+ async clear() {
1300
+ return super.clear();
1301
+ }
1302
+ /**
1303
+ * Удаляет тег по переданному тексту
1304
+ * @example
1305
+ * await form.formFilter('TagBox').remove('test');
1306
+ */
1307
+ async remove(itemText) {
1308
+ return super.remove(itemText);
1309
+ }
1310
+ };
1311
+
1312
+ // src/pageObjects/elements/Filters/FilterPanel.ts
1313
+ var import_selenium_webdriver20 = require("selenium-webdriver");
1314
+
1315
+ // src/pageObjects/elements/Filters/PanelFilterField.ts
1316
+ var PanelFilterField = class extends AbstractEditor {
1317
+ constructor(parentCssSelector, formName, name, driver) {
1318
+ super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
1319
+ }
1320
+ /**
1321
+ * Возвращает значение в поле
1322
+ * @example
1323
+ * expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
1324
+ * expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
1325
+ */
1326
+ async getValue() {
1327
+ return super.getValue();
1328
+ }
1329
+ /**
1330
+ * Устанавливает значение в поле
1331
+ * @example
1332
+ * await form.filterPanel.filterField('NumberFld').setValue(123);
1333
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue');
1334
+ */
1335
+ async setValue(value) {
1336
+ return super.setValue(value);
1337
+ }
1338
+ /**
1339
+ * Очищает значение в поле
1340
+ * @example
1341
+ * await form.filterPanel.filterField('NumberFld').clear();
1342
+ */
1343
+ async clear() {
1344
+ return super.clear();
1345
+ }
1346
+ /**
1347
+ * Удаляет тег по переданному тексту
1348
+ * @example
1349
+ * await form.filterPanel.filterField('TagBox').remove('test');
1350
+ */
1351
+ async remove(itemText) {
1352
+ return super.remove(itemText);
1353
+ }
1354
+ };
1355
+
1356
+ // src/pageObjects/elements/Filters/FilterPanel.ts
1357
+ var drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
1358
+ var FILTER_PANEL_SELECTOR = ".filter-panel";
1359
+ var CLOSE_SELECTOR = ".button-close";
1360
+ var FilterPanel = class extends AbstractElement {
1361
+ _formName;
1362
+ get filterPanelSelector() {
1363
+ return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
1364
+ }
1365
+ async filterPanelButtons() {
1366
+ const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
1367
+ const el = await this.getElement();
1368
+ return el.findElements(import_selenium_webdriver20.By.css(selector));
1369
+ }
1370
+ constructor(formName, driver) {
1371
+ super(driver, drawerSelector(formName));
1372
+ this._formName = formName;
1373
+ }
1374
+ /**
1375
+ * Возвращает фильтр на панели фильтрации
1376
+ * @returns {PanelFilterField}
1377
+ * @example
1378
+ * await form.filterPanel.filterField('NumberFld');
1379
+ */
1380
+ filterField(name) {
1381
+ return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
1382
+ }
1383
+ async apply() {
1384
+ const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
1385
+ await click(btn, this.driver);
1386
+ }
1387
+ async findButtonByTitle(title) {
1388
+ const buttons = await this.filterPanelButtons();
1389
+ for (const btn of buttons) {
1390
+ if (await btn.getText() === title) {
1391
+ return btn;
1392
+ }
1393
+ }
1394
+ }
1395
+ async clearAll() {
1396
+ const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
1397
+ await click(btn, this.driver);
1398
+ await this.driver.sleep(300);
1399
+ }
1400
+ async close() {
1401
+ const btn = await this.driver.findElement(import_selenium_webdriver20.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
1402
+ await click(btn, this.driver);
1074
1403
  }
1075
1404
  };
1076
1405
 
@@ -1108,71 +1437,42 @@ var ListForm = class extends AbstractForm {
1108
1437
  * expect(listForm.toolbarButton());
1109
1438
  */
1110
1439
  toolbarButton(name) {
1111
- const toolbar = new TableToolbar(this.containerCssSelector, this.formName, this.driver);
1440
+ const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
1112
1441
  return toolbar.button(name);
1113
1442
  }
1114
- };
1115
-
1116
- // src/utils/signIn.ts
1117
- async function signIn(driver) {
1118
- const webDriver = driver ?? await createDriver();
1119
- config().driver = webDriver;
1120
- const loginPage = new LoginPage(webDriver);
1121
- await loginPage.locate();
1122
- await loginPage.authorize();
1123
- return webDriver;
1124
- }
1125
-
1126
- // src/utils/actions.ts
1127
- var click = async (webElement, driver) => {
1128
- driver = driver ?? config().driver;
1129
- const actions = driver.actions({ async: true });
1130
- await actions.move({ origin: webElement }).click().perform();
1131
- };
1132
-
1133
- // src/pageObjects/pages/LoginPage.ts
1134
- var LOGIN_PATH = "/login";
1135
- var LoginPage = class extends AbstractPage {
1136
- usernameField = byTestId("loginField", "input");
1137
- passwordField = byTestId("passwordField", "input");
1138
- loginButton = byTestId("loginButton");
1139
- async locate() {
1140
- await super.locate();
1141
- const login = await this.driver.findElement(this.usernameField);
1142
- await waitElementIsVisible({
1143
- element: login,
1144
- driver: this.driver
1145
- });
1146
- }
1147
- get path() {
1148
- return LOGIN_PATH;
1149
- }
1150
- async enterUsername(username) {
1151
- await this.driver.findElement(this.usernameField).sendKeys(username);
1152
- }
1153
- async enterPassword(password) {
1154
- await this.driver.findElement(this.passwordField).sendKeys(password);
1155
- }
1156
- async clickLoginButton() {
1157
- await click(await this.driver.findElement(this.loginButton), this.driver);
1158
- }
1159
- async loginWith(username, password) {
1160
- await this.enterUsername(username);
1161
- await this.enterPassword(password);
1162
- await this.clickLoginButton();
1443
+ /**
1444
+ * Фильтр который расположен на форме
1445
+ * @example
1446
+ * const listForm = new MyForm();
1447
+ * //...
1448
+ * expect(listForm.formFilter());
1449
+ */
1450
+ formFilter(name) {
1451
+ return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
1163
1452
  }
1164
- async authorize() {
1165
- await this.loginWith(config().auth.login, config().auth.password);
1453
+ /**
1454
+ * Модель панели фильтрации
1455
+ * @returns {FilterPanel}
1456
+ * @example
1457
+ * const listForm = new MyForm();
1458
+ * //...
1459
+ * expect(listForm.filterPanel());
1460
+ */
1461
+ get filterPanel() {
1462
+ return new FilterPanel(this.formName, this.driver);
1166
1463
  }
1167
1464
  };
1168
1465
  // Annotate the CommonJS export names for ESM import in node:
1169
1466
  0 && (module.exports = {
1170
1467
  AbstractPage,
1468
+ FilterPanel,
1171
1469
  FormEdit,
1172
1470
  FormField,
1471
+ FormFilterField,
1173
1472
  ListForm,
1174
1473
  LoginPage,
1175
1474
  NumberEditor,
1475
+ PanelFilterField,
1176
1476
  SubsystemsPanel,
1177
1477
  TextEditor,
1178
1478
  byTestId,