d5-testing-library 1.1.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,20 +31,25 @@ 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,
45
+ byTestIdCssSelector: () => byTestIdCssSelector,
42
46
  click: () => click,
43
47
  config: () => config,
44
48
  createDriver: () => createDriver,
45
49
  editorFactory: () => editorFactory,
46
50
  elementIsNotPresent: () => elementIsNotPresent,
47
51
  signIn: () => signIn,
52
+ wait: () => wait,
48
53
  waitElementIsVisible: () => waitElementIsVisible
49
54
  });
50
55
  module.exports = __toCommonJS(src_exports);
@@ -89,11 +94,58 @@ function config(cfg) {
89
94
  return configInstance.config(cfg);
90
95
  }
91
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
+
92
121
  // src/pageObjects/AbstractElement.ts
93
122
  var AbstractElement = class {
94
123
  driver;
95
- constructor(driver) {
124
+ elementCssSelector;
125
+ constructor(driver, elementCssSelector) {
96
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");
97
149
  }
98
150
  };
99
151
 
@@ -126,16 +178,62 @@ var AbstractPage = class extends AbstractElement {
126
178
  }
127
179
  };
128
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
+
129
188
  // src/utils/locators.ts
130
- var import_selenium_webdriver = require("selenium-webdriver");
189
+ var import_selenium_webdriver3 = require("selenium-webdriver");
190
+ var byTestIdCssSelector = (testId, element = "div") => {
191
+ return `${element}[data-testid="${testId}"]`;
192
+ };
131
193
  var byTestId = (testId, element = "div") => {
132
- return import_selenium_webdriver.By.css(`${element}[data-testid="${testId}"]`);
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
+ }
133
231
  };
134
232
 
135
233
  // src/utils/createDriver.ts
136
- var import_selenium_webdriver2 = require("selenium-webdriver");
234
+ var import_selenium_webdriver4 = require("selenium-webdriver");
137
235
  var createDriver = async (browser) => {
138
- 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();
139
237
  const manage = driver.manage();
140
238
  await manage.setTimeouts({ implicit: config().timeout });
141
239
  await manage.window().maximize();
@@ -143,86 +241,75 @@ var createDriver = async (browser) => {
143
241
  };
144
242
 
145
243
  // src/utils/elementIsNotPresent.ts
146
- var import_selenium_webdriver3 = require("selenium-webdriver");
244
+ var import_selenium_webdriver5 = require("selenium-webdriver");
147
245
  var elementIsNotPresent = function elementIsNotPresent2(locator) {
148
- 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) {
149
247
  const elements = await driver.findElements(locator);
150
248
  return elements.length == 0;
151
249
  });
152
250
  };
153
251
 
154
- // src/utils/waitElementIsVisible.ts
155
- var import_selenium_webdriver4 = require("selenium-webdriver");
156
- async function waitElementIsVisible({ element, timeout, errorMessage, driver }) {
157
- driver = driver ?? config().driver;
158
- const condition = import_selenium_webdriver4.until.elementIsVisible(element);
159
- await driver.wait(condition.fn, timeout ?? 1e4, errorMessage ?? condition.description());
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;
160
260
  }
161
261
 
162
262
  // src/pageObjects/AbstractElementWithParent.ts
163
263
  var AbstractElementWithParent = class extends AbstractElement {
164
- getParentElement;
165
- elementBy;
166
- constructor(getParentElement, driver) {
167
- super(driver);
168
- this.getParentElement = getParentElement;
169
- }
170
- async getElement() {
171
- const parentEl = await this.getParentElement();
172
- await waitElementIsVisible({
173
- element: parentEl,
174
- driver: this.driver
175
- });
176
- const el = await parentEl.findElement(this.elementBy);
177
- await waitElementIsVisible({
178
- element: el,
179
- driver: this.driver
180
- });
181
- return el;
182
- }
183
- async getAttribute(attr) {
184
- const el = await this.getElement();
185
- return await el.getAttribute(attr);
186
- }
187
- async getClasses() {
188
- return await this.getAttribute("class");
264
+ parentCssSelector;
265
+ constructor(parentCssSelector, elementCssSelector, driver) {
266
+ super(driver, elementCssSelector);
267
+ this.parentCssSelector = parentCssSelector;
268
+ }
269
+ getFullCssSelector() {
270
+ if (!this.elementCssSelector) {
271
+ return this.parentCssSelector;
272
+ }
273
+ if (!this.parentCssSelector) {
274
+ return this.elementCssSelector;
275
+ }
276
+ return `${this.parentCssSelector} ${this.elementCssSelector}`;
189
277
  }
190
278
  };
191
279
 
192
280
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
281
+ var import_selenium_webdriver6 = require("selenium-webdriver");
193
282
  var SubsystemsPanelHeader = class extends AbstractElementWithParent {
194
- titleBy = byTestId("subsystems-panel-title", "span");
195
283
  async title() {
196
- const panel = await this.getParentElement();
197
- return panel.findElement(this.titleBy);
284
+ return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
198
285
  }
199
286
  };
200
287
 
201
288
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
202
- var import_selenium_webdriver5 = require("selenium-webdriver");
203
289
  var SubsystemsPanel = class extends AbstractElement {
204
- panelBy = import_selenium_webdriver5.By.id("aside");
205
290
  header;
206
291
  constructor(driver) {
207
292
  super(driver);
208
- this.header = new SubsystemsPanelHeader(this.panelElement, this.driver);
293
+ this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
209
294
  }
210
- panelElement = () => {
211
- return this.driver.findElement(this.panelBy);
212
- };
213
- headerTitle() {
214
- 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();
215
299
  }
216
300
  };
217
301
 
218
302
  // src/pageObjects/elements/Forms/AbstractForm.ts
219
- var import_selenium_webdriver6 = require("selenium-webdriver");
303
+ var import_selenium_webdriver7 = require("selenium-webdriver");
220
304
  var AbstractForm = class extends AbstractPage {
305
+ containerCssSelector = "";
221
306
  containerBy;
222
- popupContainerBy;
307
+ popupContainerCssSelector;
223
308
  constructor(driver) {
224
309
  super(driver);
225
- this.containerBy = byTestId(`form-content-wrapper-${this.formName}`);
310
+ const testId = `form-content-wrapper-${this.formName}`;
311
+ this.containerBy = byTestId(testId);
312
+ this.containerCssSelector = byTestIdCssSelector(testId);
226
313
  }
227
314
  async isModal() {
228
315
  const el = await this.getContainerElement();
@@ -245,10 +332,10 @@ var AbstractForm = class extends AbstractPage {
245
332
  */
246
333
  async exists() {
247
334
  try {
248
- await this.driver.wait(elementIsNotPresent(this.containerBy), 1e3);
335
+ let elements = await this.driver.findElements(this.containerBy);
336
+ return elements.length > 0;
337
+ } catch (error) {
249
338
  return false;
250
- } catch {
251
- return true;
252
339
  }
253
340
  }
254
341
  /**
@@ -260,29 +347,42 @@ var AbstractForm = class extends AbstractPage {
260
347
  */
261
348
  async getTitleText() {
262
349
  if (await this.isModal()) {
263
- const popupEl = await this.driver.findElement(this.popupContainerBy);
264
- const titleEl2 = await popupEl.findElement(import_selenium_webdriver6.By.className("popup-title"));
350
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
265
351
  return titleEl2.getText();
266
352
  }
267
- let container = await this.getContainerElement();
268
- let titleEl = await container.findElement(import_selenium_webdriver6.By.className("form-toolbar-name-container"));
353
+ let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.className("main-toolbar-form-title"));
269
354
  return titleEl.getText();
270
355
  }
271
356
  };
272
357
 
273
358
  // src/pageObjects/elements/Forms/FormEdit.ts
274
- var import_selenium_webdriver13 = require("selenium-webdriver");
359
+ var import_selenium_webdriver14 = require("selenium-webdriver");
275
360
 
276
- // src/pageObjects/elements/Editors/AbstractEditor.ts
277
- var import_selenium_webdriver7 = require("selenium-webdriver");
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
+ }
278
383
 
279
- // src/pageObjects/AbstractFormElement.ts
280
- var AbstractFormElement = class extends AbstractElementWithParent {
281
- constructor(getParentElement, elementBy, driver) {
282
- super(getParentElement, driver);
283
- this.elementBy = elementBy;
284
- }
285
- };
384
+ // src/pageObjects/elements/Editors/AbstractEditor.ts
385
+ var import_selenium_webdriver8 = require("selenium-webdriver");
286
386
 
287
387
  // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
288
388
  var InputClearStrategy = class {
@@ -293,14 +393,16 @@ var InputClearStrategy = class {
293
393
  };
294
394
 
295
395
  // src/pageObjects/elements/Editors/AbstractEditor.ts
296
- var AbstractDXEditorWithInput = class extends AbstractFormElement {
396
+ var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
297
397
  clearStrategy = new InputClearStrategy();
298
398
  setClearStrategy(strategy) {
299
399
  this.clearStrategy = strategy;
300
400
  }
401
+ getInputCssSelector() {
402
+ return `${this.getFullCssSelector()} .dx-texteditor-input`;
403
+ }
301
404
  async getInputElement() {
302
- const controlEl = await this.getElement();
303
- return controlEl.findElement(import_selenium_webdriver7.By.className("dx-texteditor-input"));
405
+ return this.driver.findElement(import_selenium_webdriver8.By.css(this.getInputCssSelector()));
304
406
  }
305
407
  async getInputValue() {
306
408
  const inputEl = await this.getInputElement();
@@ -309,7 +411,7 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
309
411
  async setInputValue(value) {
310
412
  const inputEl = await this.getInputElement();
311
413
  await click(inputEl, this.driver);
312
- await inputEl.sendKeys(value, import_selenium_webdriver7.Key.ENTER);
414
+ await inputEl.sendKeys(value, import_selenium_webdriver8.Key.ENTER);
313
415
  }
314
416
  async clear() {
315
417
  await this.clearStrategy.clear(this);
@@ -318,8 +420,8 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
318
420
 
319
421
  // src/pageObjects/elements/Editors/TextEditor.ts
320
422
  var TextEditor = class extends AbstractDXEditorWithInput {
321
- constructor(getParentElement, elementBy, driver) {
322
- super(getParentElement, elementBy, driver);
423
+ constructor(parentCssSelector, elementCssSelector, driver) {
424
+ super(parentCssSelector, elementCssSelector, driver);
323
425
  this.setClearStrategy(new InputClearStrategy());
324
426
  }
325
427
  getValue() {
@@ -332,8 +434,8 @@ var TextEditor = class extends AbstractDXEditorWithInput {
332
434
 
333
435
  // src/pageObjects/elements/Editors/NumberEditor.ts
334
436
  var NumberEditor = class extends AbstractDXEditorWithInput {
335
- constructor(getParentElement, elementBy, driver) {
336
- super(getParentElement, elementBy, driver);
437
+ constructor(parentCssSelector, elementCssSelector, driver) {
438
+ super(parentCssSelector, elementCssSelector, driver);
337
439
  this.setClearStrategy(new InputClearStrategy());
338
440
  }
339
441
  async getValue() {
@@ -345,11 +447,17 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
345
447
  }
346
448
  };
347
449
 
450
+ // src/pageObjects/AbstractFormElement.ts
451
+ var AbstractFormElement = class extends AbstractElementWithParent {
452
+ constructor(parentCssSelector, elementCssSelector, driver) {
453
+ super(parentCssSelector, elementCssSelector, driver);
454
+ }
455
+ };
456
+
348
457
  // src/pageObjects/elements/Editors/CheckBox.ts
349
- var CheckBox = class extends AbstractFormElement {
458
+ var CheckBox = class extends AbstractElementWithParent {
350
459
  async getValue() {
351
- const inputEl = await this.getElement();
352
- const result = await inputEl.getAttribute("aria-checked");
460
+ const result = await this.getAttribute("aria-checked");
353
461
  if (result === "true")
354
462
  return 1;
355
463
  if (result === "false")
@@ -366,7 +474,7 @@ var CheckBox = class extends AbstractFormElement {
366
474
  };
367
475
 
368
476
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
369
- var import_selenium_webdriver9 = require("selenium-webdriver");
477
+ var import_selenium_webdriver10 = require("selenium-webdriver");
370
478
 
371
479
  // src/utils/xpathHelper.ts
372
480
  var XPathHelper = class {
@@ -379,28 +487,28 @@ var XPathHelper = class {
379
487
  };
380
488
 
381
489
  // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
382
- var import_selenium_webdriver8 = require("selenium-webdriver");
490
+ var import_selenium_webdriver9 = require("selenium-webdriver");
383
491
  var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
384
492
  var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
385
493
  var ClearButtonStrategy = class {
386
494
  editorContainerClass;
387
- constructor(editorContainerClass) {
495
+ _driver;
496
+ constructor(editorContainerClass, driver) {
388
497
  this.editorContainerClass = editorContainerClass;
498
+ this._driver = driver;
389
499
  }
390
- async isEmptyEditorField(editor) {
391
- const parentEl = await editor.getParentElement();
392
- const editorContainer = await parentEl.findElement(import_selenium_webdriver8.By.className(this.editorContainerClass));
500
+ async isEmptyEditorField() {
501
+ const editorContainer = await this._driver.findElement(import_selenium_webdriver9.By.css(this.editorContainerClass));
393
502
  const classAttribute = await editorContainer.getAttribute("class");
394
503
  return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
395
504
  }
396
- async clear(editor) {
397
- if (await this.isEmptyEditorField(editor)) {
505
+ async clear() {
506
+ if (await this.isEmptyEditorField()) {
398
507
  throw new Error("This field is already empty");
399
508
  }
400
- const clearBtnSelector = `.${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
401
- const parentEl = await editor.getParentElement();
402
- const clearBtn = await parentEl.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
403
- await click(clearBtn, editor.driver);
509
+ const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
510
+ const clearBtn = await this._driver.findElement(import_selenium_webdriver9.By.css(clearBtnSelector));
511
+ await click(clearBtn, this._driver);
404
512
  }
405
513
  };
406
514
 
@@ -411,25 +519,17 @@ var combinedValueXpath = (value) => `${XPathHelper.getRoleXpath(SELECT_BOX_ELEME
411
519
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS,
412
520
  value
413
521
  )}`;
414
- var DX_SELECTBOX = "dx-selectbox";
415
522
  var SelectBoxEditor = class extends AbstractDXEditorWithInput {
416
- constructor(getParentElement, elementBy, driver) {
417
- super(getParentElement, elementBy, driver);
418
- this.setClearStrategy(new ClearButtonStrategy(DX_SELECTBOX));
523
+ constructor(parentCssSelector, elementCssSelector, driver) {
524
+ super(parentCssSelector, elementCssSelector, driver);
525
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
419
526
  }
420
527
  async setSelectInputValue(value) {
421
528
  const inputEl = await this.getInputElement();
422
529
  await click(inputEl, this.driver);
423
- await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
424
- await this.driver.wait(async () => {
425
- try {
426
- const optElement = await inputEl.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(value)));
427
- await click(optElement, this.driver);
428
- return true;
429
- } catch (e) {
430
- return false;
431
- }
432
- }, 2e3);
530
+ await inputEl.sendKeys(value, import_selenium_webdriver10.Key.ENTER);
531
+ const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
532
+ await click(optElement, this.driver);
433
533
  }
434
534
  async getValue() {
435
535
  const value = await super.getInputValue();
@@ -441,10 +541,9 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
441
541
  };
442
542
 
443
543
  // src/pageObjects/elements/Editors/SwitchEditor.ts
444
- var SwitchEditor = class extends AbstractFormElement {
544
+ var SwitchEditor = class extends AbstractElementWithParent {
445
545
  async getValue() {
446
- const inputEl = await this.getElement();
447
- const result = await inputEl.getAttribute("aria-label");
546
+ const result = await this.getAttribute("aria-label");
448
547
  if (result === "ON")
449
548
  return 1;
450
549
  if (result === "OFF")
@@ -457,27 +556,28 @@ var SwitchEditor = class extends AbstractFormElement {
457
556
  }
458
557
  const inputEl = await this.getElement();
459
558
  const currentValue = await this.getValue();
460
- if (currentValue !== value) {
461
- await click(inputEl, this.driver);
462
- await this.driver.wait(async () => {
463
- const updatedValue = await this.getValue();
464
- return updatedValue !== currentValue;
465
- });
559
+ if (currentValue === value) {
560
+ return;
466
561
  }
562
+ await click(inputEl, this.driver);
563
+ await wait(async () => {
564
+ const updatedValue = await this.getValue();
565
+ return updatedValue !== currentValue;
566
+ }, this.driver);
467
567
  }
468
568
  };
469
569
 
470
570
  // src/pageObjects/elements/Editors/TagBox.ts
471
- var import_selenium_webdriver10 = require("selenium-webdriver");
571
+ var import_selenium_webdriver11 = require("selenium-webdriver");
472
572
  var TAGS_SELECTOR = ".dx-tag .tag-text";
473
573
  var DX_TAG_CONTAINER = "dx-tag-container";
474
- var DX_TAGBOX = "dx-tagbox";
475
574
  var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
476
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"]';
477
577
  var TagBox = class extends AbstractDXEditorWithInput {
478
- constructor(getParentElement, elementBy, driver) {
479
- super(getParentElement, elementBy, driver);
480
- this.setClearStrategy(new ClearButtonStrategy(DX_TAGBOX));
578
+ constructor(parentCssSelector, elementCssSelector, driver) {
579
+ super(parentCssSelector, elementCssSelector, driver);
580
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
481
581
  }
482
582
  async setTagBoxInputValue(values) {
483
583
  const lastElement = values[values.length - 1];
@@ -488,37 +588,28 @@ var TagBox = class extends AbstractDXEditorWithInput {
488
588
  }
489
589
  await this.confirmSelection();
490
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
+ }
491
595
  async selectOption(inputEl, value, lastElement) {
492
596
  await inputEl.sendKeys(value);
493
- await this.driver.wait(async () => {
494
- try {
495
- const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
496
- await click(optElement, this.driver);
497
- return true;
498
- } catch (e) {
499
- return false;
500
- }
501
- });
597
+ const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
598
+ await click(optElement, this.driver);
599
+ await this.waitOptionSelection();
502
600
  if (value !== lastElement) {
503
601
  await inputEl.clear();
504
602
  }
505
603
  }
506
604
  async confirmSelection() {
507
- const inputEl = await this.getInputElement();
508
- const option = await inputEl.findElement(import_selenium_webdriver10.By.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
509
- const btnOk = await this.driver.findElement(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR));
510
- await this.driver.wait(async () => {
511
- return await option.getAttribute("aria-selected") === "true";
512
- });
605
+ const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
513
606
  await click(btnOk, this.driver);
514
607
  }
515
608
  async getTagBoxInputValue() {
516
609
  if (await this.isTagBoxEmpty()) {
517
610
  return [];
518
611
  }
519
- const parentEl = await this.getParentElement();
520
- const inputEl = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAG_CONTAINER));
521
- const tags = await inputEl.findElements(import_selenium_webdriver10.By.css(TAGS_SELECTOR));
612
+ const tags = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`));
522
613
  const values = [];
523
614
  for (const tag of tags) {
524
615
  const text = await tag.getText();
@@ -527,9 +618,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
527
618
  return values;
528
619
  }
529
620
  async isTagBoxEmpty() {
530
- const parentEl = await this.getParentElement();
531
- const tagboxContainer = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAGBOX));
532
- const classAttribute = await tagboxContainer.getAttribute("class");
621
+ const classAttribute = await this.getClasses();
533
622
  return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
534
623
  }
535
624
  async getValue() {
@@ -548,28 +637,25 @@ var TagBox = class extends AbstractDXEditorWithInput {
548
637
  if (!tagExists) {
549
638
  throw new Error(`The tag with the text: ${itemText} was not found`);
550
639
  }
551
- const parentEl = await this.getParentElement();
552
- const inputEl = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAG_CONTAINER));
553
- const clearBtnTestId = byTestId(`clear-button-${itemText}`);
554
- const clearBtn = await inputEl.findElement(clearBtnTestId);
640
+ const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
641
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`));
555
642
  await click(clearBtn, this.driver);
556
643
  }
557
644
  };
558
645
 
559
646
  // src/pageObjects/elements/Editors/ButtonGroup.ts
560
- var import_selenium_webdriver11 = require("selenium-webdriver");
647
+ var import_selenium_webdriver12 = require("selenium-webdriver");
561
648
  var ITEM_CLASS = "dx-buttongroup-item";
562
649
  var SELECTED_CLASS = "dx-state-selected";
563
- var ButtonGroup = class extends AbstractFormElement {
564
- async getItems() {
565
- return (await this.getElement()).findElements(import_selenium_webdriver11.By.className(ITEM_CLASS));
650
+ var ButtonGroup = class extends AbstractElementWithParent {
651
+ getItems() {
652
+ return this.driver.findElements(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
566
653
  }
567
654
  getDataValue(el) {
568
655
  return el.getAttribute("data-value");
569
656
  }
570
657
  async getValue() {
571
- const inputEl = await this.getElement();
572
- const selectedEl = await inputEl.findElement(import_selenium_webdriver11.By.className(`${ITEM_CLASS} ${SELECTED_CLASS}`));
658
+ const selectedEl = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
573
659
  return this.getDataValue(selectedEl);
574
660
  }
575
661
  async setValue(value) {
@@ -603,19 +689,14 @@ var BooleanSelector = class extends ButtonGroup {
603
689
  };
604
690
 
605
691
  // src/pageObjects/elements/Editors/DateEditor.ts
606
- var import_selenium_webdriver12 = require("selenium-webdriver");
692
+ var import_selenium_webdriver13 = require("selenium-webdriver");
607
693
  var DateEditor = class extends AbstractDXEditorWithInput {
608
- constructor(getParentElement, elementBy, driver) {
609
- super(getParentElement, elementBy, driver);
694
+ constructor(parentCssSelector, elementCssSelector, driver) {
695
+ super(parentCssSelector, elementCssSelector, driver);
610
696
  this.setClearStrategy(new InputClearStrategy());
611
697
  }
612
- async getControlElement() {
613
- const controlEl = await this.getElement();
614
- return controlEl.findElement(import_selenium_webdriver12.By.className("dx-dropdowneditor-input-wrapper"));
615
- }
616
698
  async getDateElement() {
617
- const controlEl = await this.getControlElement();
618
- return controlEl.findElement(import_selenium_webdriver12.By.css("input[type=hidden]"));
699
+ return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
619
700
  }
620
701
  async setDateValue(value) {
621
702
  const dateEl = await this.getInputElement();
@@ -625,8 +706,8 @@ var DateEditor = class extends AbstractDXEditorWithInput {
625
706
  const keys = day + month + year;
626
707
  await click(dateEl, this.driver);
627
708
  const actions = this.driver.actions({ async: true });
628
- await actions.move({ origin: dateEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
629
- await actions.move({ origin: dateEl }).sendKeys(keys, import_selenium_webdriver12.Key.ENTER).perform();
709
+ await actions.move({ origin: dateEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
710
+ await actions.move({ origin: dateEl }).sendKeys(keys, import_selenium_webdriver13.Key.ENTER).perform();
630
711
  }
631
712
  async getDateValue() {
632
713
  const inputEl = await this.getDateElement();
@@ -645,54 +726,39 @@ var DateEditor = class extends AbstractDXEditorWithInput {
645
726
  };
646
727
 
647
728
  // src/pageObjects/elements/Editors/editorFactory.ts
648
- var editorFactory = async (getParentElement, elementBy, driver) => {
649
- const elementInstance = new AbstractFormElement(getParentElement, elementBy, driver);
729
+ var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
730
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
650
731
  const classSting = await elementInstance.getClasses();
651
732
  if (classSting.includes("text-control"))
652
- return new TextEditor(getParentElement, elementBy, driver);
733
+ return new TextEditor(parentCssSelector, elementCssSelector, driver);
653
734
  if (classSting.includes("number-control"))
654
- return new NumberEditor(getParentElement, elementBy, driver);
735
+ return new NumberEditor(parentCssSelector, elementCssSelector, driver);
655
736
  if (classSting.includes("check-box"))
656
- return new CheckBox(getParentElement, elementBy, driver);
737
+ return new CheckBox(parentCssSelector, elementCssSelector, driver);
657
738
  if (classSting.includes("multi-select-control"))
658
- return new TagBox(getParentElement, elementBy, driver);
739
+ return new TagBox(parentCssSelector, elementCssSelector, driver);
659
740
  if (classSting.includes("select-control"))
660
- return new SelectBoxEditor(getParentElement, elementBy, driver);
741
+ return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
661
742
  if (classSting.includes("switch-control"))
662
- return new SwitchEditor(getParentElement, elementBy, driver);
743
+ return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
663
744
  if (classSting.includes("date-control"))
664
- return new DateEditor(getParentElement, elementBy, driver);
745
+ return new DateEditor(parentCssSelector, elementCssSelector, driver);
665
746
  if (classSting.includes("buttons-group"))
666
- return new BooleanSelector(getParentElement, elementBy, driver);
747
+ return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
667
748
  if (classSting.includes("button-group-field"))
668
- return new ButtonGroup(getParentElement, elementBy, driver);
749
+ return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
669
750
  throw new Error("Unknown type of editor. Please write ticket to the support");
670
751
  };
671
752
 
672
- // src/utils/createDataTestId.ts
673
- function createDataTestId(formName, itemType, itemName) {
674
- return `${formName}-${itemType}-${itemName}`;
675
- }
676
- function createFieldTestId(formName, itemName) {
677
- return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
678
- }
679
- function createGroupTestId(formName, itemName) {
680
- return createDataTestId(formName, "group" /* GROUP */, itemName);
681
- }
682
- function createTableId(formName) {
683
- return `${"table" /* TABLE */}-${formName}`;
684
- }
685
-
686
- // src/pageObjects/elements/FormField.ts
687
- var FormField = class extends AbstractElementWithParent {
753
+ // src/pageObjects/elements/AbstractEditor.ts
754
+ var AbstractEditor = class extends AbstractElementWithParent {
688
755
  editor;
689
- constructor(getParentElement, formName, name, driver) {
690
- super(getParentElement, driver);
691
- this.elementBy = byTestId(createFieldTestId(formName, name));
756
+ constructor(parentCssSelector, elementCssSelector, driver) {
757
+ super(parentCssSelector, elementCssSelector, driver);
692
758
  }
693
759
  async initEditor() {
694
760
  if (!this.editor) {
695
- this.editor = await editorFactory(this.getParentElement, this.elementBy, this.driver);
761
+ this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
696
762
  }
697
763
  }
698
764
  /**
@@ -741,37 +807,43 @@ var FormField = class extends AbstractElementWithParent {
741
807
  }
742
808
  };
743
809
 
744
- // src/pageObjects/elements/Groups/AbstractGroup.ts
745
- var AbstractDXGroup = class extends AbstractFormElement {
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
+ }
746
815
  };
747
816
 
748
- // src/pageObjects/elements/Groups/Panel.ts
749
- var Panel = class extends AbstractDXGroup {
817
+ // src/pageObjects/elements/Groups/AbstractGroup.ts
818
+ var AbstractGroup = class extends AbstractElementWithParent {
750
819
  async isDisplayed() {
751
820
  const groupElement = await this.getElement();
752
821
  return await groupElement.isDisplayed();
753
822
  }
754
823
  };
755
824
 
825
+ // src/pageObjects/elements/Groups/Panel.ts
826
+ var Panel = class extends AbstractGroup {
827
+ };
828
+
756
829
  // src/pageObjects/elements/Groups/groupFactory.ts
757
- var groupFactory = async (getParentElement, elementBy, driver) => {
758
- const elementInstance = new AbstractFormElement(getParentElement, elementBy, driver);
830
+ var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
831
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
759
832
  const classSting = await elementInstance.getClasses();
760
833
  if (classSting.includes("panel-group"))
761
- return new Panel(getParentElement, elementBy, driver);
834
+ return new Panel(parentCssSelector, elementCssSelector, driver);
762
835
  throw new Error("Unknown type of group. Please write ticket to the support");
763
836
  };
764
837
 
765
838
  // src/pageObjects/elements/FormGroup.ts
766
839
  var FormGroup = class extends AbstractElementWithParent {
767
840
  editor;
768
- constructor(getParentElement, formName, name, driver) {
769
- super(getParentElement, driver);
770
- this.elementBy = byTestId(createGroupTestId(formName, name));
841
+ constructor(parentCssSelector, formName, name, driver) {
842
+ super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
771
843
  }
772
844
  async initEditor() {
773
845
  if (!this.editor) {
774
- this.editor = await groupFactory(this.getParentElement, this.elementBy, this.driver);
846
+ this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
775
847
  }
776
848
  }
777
849
  /**
@@ -780,17 +852,21 @@ var FormGroup = class extends AbstractElementWithParent {
780
852
  * expect(await tableList.group('MainSuperPanel').isDisplayed();
781
853
  */
782
854
  async isDisplayed() {
783
- await this.initEditor();
784
- return this.editor.isDisplayed();
855
+ try {
856
+ await this.initEditor();
857
+ return this.editor.isDisplayed();
858
+ } catch {
859
+ return false;
860
+ }
785
861
  }
786
862
  };
787
863
 
788
864
  // src/pageObjects/elements/Forms/FormEdit.ts
789
865
  var FormEdit = class extends AbstractForm {
790
- saveButtonBy = import_selenium_webdriver13.By.id("button-save");
866
+ saveButtonBy = import_selenium_webdriver14.By.id("button-save");
791
867
  constructor(driver) {
792
868
  super(driver);
793
- this.popupContainerBy = import_selenium_webdriver13.By.className(`popup form-edit-${this.formName}`);
869
+ this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
794
870
  }
795
871
  /**
796
872
  * Находит поле формы редактирования по имени
@@ -800,7 +876,7 @@ var FormEdit = class extends AbstractForm {
800
876
  * expect(await formEdit.field('Name').getValue()).toBe('test value');
801
877
  */
802
878
  field(name) {
803
- return new FormField(this.getContainerElement, this.formName, name, this.driver);
879
+ return new FormField(this.containerCssSelector, this.formName, name, this.driver);
804
880
  }
805
881
  /**
806
882
  * Проверяет не отключена ли кнопка Сохранить
@@ -822,7 +898,7 @@ var FormEdit = class extends AbstractForm {
822
898
  * expect(await formEdit.group('Name');
823
899
  */
824
900
  group(name) {
825
- return new FormGroup(this.getContainerElement, this.formName, name, this.driver);
901
+ return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
826
902
  }
827
903
  /**
828
904
  * Нажатие на кнопку Сохранить
@@ -833,50 +909,67 @@ var FormEdit = class extends AbstractForm {
833
909
  */
834
910
  async saveButtonClick() {
835
911
  const saveButton = await this.driver.findElement(this.saveButtonBy);
836
- await this.driver.wait(async () => !await this.isSaveButtonDisabled(), void 0, "Button is disabled");
912
+ await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
837
913
  await click(saveButton, this.driver);
838
914
  }
839
915
  };
840
916
 
841
- // src/pageObjects/elements/Forms/ListForm.ts
917
+ // src/pageObjects/elements/Table/Table.ts
842
918
  var import_selenium_webdriver19 = require("selenium-webdriver");
843
919
 
844
- // src/pageObjects/elements/Table/Table.ts
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
845
924
  var import_selenium_webdriver16 = require("selenium-webdriver");
846
925
 
847
926
  // src/pageObjects/elements/Table/utils.ts
848
- var import_selenium_webdriver14 = require("selenium-webdriver");
849
- var getRowPathByIndex = (index) => {
850
- return import_selenium_webdriver14.By.css(`tr[aria-rowindex="${transformInputIndex(index)}"]`);
851
- };
927
+ var import_selenium_webdriver15 = require("selenium-webdriver");
928
+ function getCssRowByIndexSelector(index) {
929
+ return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
930
+ }
852
931
  var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
853
- var getColumnPathByIndex = (index) => {
854
- return import_selenium_webdriver14.By.css(getColumnByIndexCssSelector(index));
855
- };
856
932
  var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
857
- var getCellPathByIndex = (index) => {
858
- return import_selenium_webdriver14.By.css(`td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`);
859
- };
933
+ var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
934
+ function getCssCellByIndexSelector(index) {
935
+ return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
936
+ }
860
937
  var transformInputIndex = (index) => index + 1;
861
938
  var transformOutputIndex = (index) => +index - 1;
862
939
 
863
- // src/pageObjects/elements/Table/elements/Row.ts
864
- var import_selenium_webdriver15 = require("selenium-webdriver");
865
-
866
940
  // src/pageObjects/elements/Table/elements/Cell.ts
867
941
  var Cell = class extends AbstractElementWithParent {
868
- index;
869
- constructor(rowEl, index, driver) {
870
- super(() => Promise.resolve(rowEl), driver);
871
- this.index = index;
872
- this.elementBy = getCellPathByIndex(index);
942
+ _index;
943
+ getCellIndex;
944
+ constructor(parentCssSelector, getCellIndex, index, driver) {
945
+ super(parentCssSelector, getCssCellByIndexSelector(index), driver);
946
+ this.getCellIndex = getCellIndex;
947
+ this._index = index;
948
+ }
949
+ set index(index) {
950
+ this._index = index;
951
+ this.elementCssSelector = getCssCellByIndexSelector(index);
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
+ }
957
+ async getElement() {
958
+ if (this._index == null) {
959
+ this.index = await this.getCellIndex();
960
+ }
961
+ return super.getElement();
873
962
  }
874
963
  async getValue() {
875
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
+ }
876
969
  return cellEl.getText();
877
970
  }
878
971
  getIndex() {
879
- return this.index;
972
+ return this._index;
880
973
  }
881
974
  };
882
975
 
@@ -886,51 +979,46 @@ var DX_ROW_EDIT_CLASS = "dx-edit-row";
886
979
  var DX_DATA_ROW_CLASS = "dx-data-row";
887
980
  var Row = class extends AbstractElementWithParent {
888
981
  index;
889
- getColumnByCaption;
890
- constructor(getParentElement, index, driver, getColumnByCaption) {
891
- super(getParentElement, driver);
982
+ getColumnBy;
983
+ constructor(parentCssSelector, index, driver, getColumnBy) {
984
+ super(parentCssSelector, getCssRowByIndexSelector(index), driver);
892
985
  this.index = index;
893
- this.elementBy = getRowPathByIndex(index);
894
- this.getColumnByCaption = getColumnByCaption;
986
+ this.getColumnBy = getColumnBy;
895
987
  }
896
- async getCellByIndex(index) {
897
- const rowEl = await this.getElement();
898
- const cell = rowEl.findElement(getCellPathByIndex(index));
899
- if (cell) {
900
- return new Cell(rowEl, index, this.driver);
901
- }
902
- throw new Error(`Cannot find cell by index: ${index}`);
988
+ _getCell({ index, name, title }) {
989
+ return new Cell(this.getFullCssSelector(), () => {
990
+ return this.getColumnBy({ title, name }).getIndex();
991
+ }, index, this.driver);
903
992
  }
904
- async getCell(caption) {
905
- const column = await this.getColumnByCaption(caption);
906
- if (column) {
907
- const index = column.getIndex();
908
- return this.getCellByIndex(index);
909
- }
910
- throw new Error("Unknown caption of cell");
993
+ getCellByIndex(index) {
994
+ return this._getCell({ index });
995
+ }
996
+ getCell(name) {
997
+ return this._getCell({ name });
998
+ }
999
+ getCellByTitle(title) {
1000
+ return this._getCell({ title });
911
1001
  }
912
1002
  async select() {
913
1003
  const rowEl = await this.getElement();
914
1004
  await click(rowEl, this.driver);
915
- await this.driver.wait(async () => {
916
- const classes = await rowEl.getAttribute("class");
1005
+ await wait(async () => {
1006
+ const classes = await this.getClasses();
917
1007
  return classes.includes(DX_SELECTION_CLASS);
918
- }, 500, "Cannot select row");
1008
+ }, this.driver, "Cannot select row");
919
1009
  }
920
1010
  async isSelected() {
921
- const rowEl = await this.getElement();
922
- const result = await rowEl.getAttribute("aria-selected");
1011
+ const result = await this.getAttribute("aria-selected");
923
1012
  return result === "true";
924
1013
  }
925
1014
  getIndex() {
926
1015
  return this.index;
927
1016
  }
928
1017
  async getCells() {
929
- const rowEl = await this.getElement();
930
- const cells = await rowEl.findElements(import_selenium_webdriver15.By.css(`td[role="gridcell"]`));
1018
+ const cells = await this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
931
1019
  const result = [];
932
1020
  cells.forEach((_, index) => {
933
- const newCell = new Cell(rowEl, index, this.driver);
1021
+ const newCell = this.getCellByIndex(index);
934
1022
  result.push(newCell);
935
1023
  });
936
1024
  return result;
@@ -938,15 +1026,13 @@ var Row = class extends AbstractElementWithParent {
938
1026
  async clickInlineButton(buttonClass) {
939
1027
  const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
940
1028
  const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
941
- const button = (await this.getParentElement()).findElement(
942
- import_selenium_webdriver15.By.css(`${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
943
- );
1029
+ const button = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
944
1030
  return click(button, this.driver);
945
1031
  }
946
1032
  async checkEditingMode(isEditing, msg) {
947
- await this.driver.wait(async () => {
1033
+ await wait(async () => {
948
1034
  return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
949
- }, 2e3, msg);
1035
+ }, this.driver, msg);
950
1036
  }
951
1037
  async edit() {
952
1038
  await this.clickInlineButton("edit");
@@ -963,86 +1049,119 @@ var Row = class extends AbstractElementWithParent {
963
1049
  };
964
1050
 
965
1051
  // src/pageObjects/elements/Table/elements/Column.ts
1052
+ var import_selenium_webdriver18 = require("selenium-webdriver");
1053
+ var getHeaderCssSelector = () => {
1054
+ return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1055
+ };
966
1056
  var Column = class extends AbstractElementWithParent {
967
- index;
968
- constructor(getParentElement, index, driver) {
969
- super(getParentElement, driver);
1057
+ _index;
1058
+ _caption;
1059
+ _name;
1060
+ constructor({ parentCssSelector, name, caption, index, driver }) {
1061
+ super(parentCssSelector, "", driver);
1062
+ this._name = name;
970
1063
  this.index = index;
971
- this.elementBy = getColumnPathByIndex(index);
1064
+ this._caption = caption;
1065
+ }
1066
+ set index(index) {
1067
+ this._index = index;
1068
+ this.elementCssSelector = getColumnByIndexCssSelector(index);
1069
+ }
1070
+ get index() {
1071
+ return this._index;
1072
+ }
1073
+ async getElement() {
1074
+ await this.getIndex();
1075
+ return super.getElement();
1076
+ }
1077
+ async getColumnHeaderIndexBy(cssSelector) {
1078
+ const column = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${cssSelector}`));
1079
+ return transformOutputIndex(await column.getAttribute("aria-colindex"));
1080
+ }
1081
+ async getIndexByCaption() {
1082
+ return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
1083
+ }
1084
+ async getIndexByName() {
1085
+ return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
972
1086
  }
973
1087
  async caption() {
974
1088
  const el = await this.getElement();
975
1089
  return el.getText();
976
1090
  }
977
- getIndex() {
978
- return this.index;
1091
+ async getIndex() {
1092
+ if (this.index != null) {
1093
+ return this.index;
1094
+ }
1095
+ if (this._caption != null) {
1096
+ this.index = await this.getIndexByCaption();
1097
+ return this.index;
1098
+ }
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");
979
1104
  }
980
1105
  };
981
1106
 
982
1107
  // src/pageObjects/elements/Table/Table.ts
983
1108
  var Table = class extends AbstractElementWithParent {
984
1109
  formName;
985
- constructor(getParentElement, formName, driver) {
986
- super(getParentElement, driver);
987
- this.elementBy = import_selenium_webdriver16.By.id(createTableId(formName));
1110
+ constructor(parentCssSelector, formName, driver) {
1111
+ super(parentCssSelector, `#${createTableId(formName)}`, driver);
988
1112
  this.formName = formName;
989
1113
  }
990
- getHeaderCssSelector() {
991
- return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
992
- }
993
- async getDataGrid() {
994
- const parentEl = await this.getElement();
995
- return parentEl.findElement(import_selenium_webdriver16.By.css(`div[role="grid"]`));
996
- }
997
- getTableElement = () => {
998
- return this.getElement();
999
- };
1000
- async getRowByIndex(index) {
1001
- const gridContainer = await this.getDataGrid();
1002
- const row = await gridContainer.findElement(getRowPathByIndex(index));
1003
- if (row) {
1004
- return new Row(this.getTableElement, index, this.driver, this.getColumnByCaption.bind(this));
1005
- }
1006
- throw new Error(`Cannot find row by index: ${index}`);
1007
- }
1008
- async getColumnByIndex(index) {
1009
- const column = await (await this.getElement()).findElement(import_selenium_webdriver16.By.css(`${this.getHeaderCssSelector()} ${getColumnByIndexCssSelector(index)}`));
1010
- if (column) {
1011
- return new Column(this.getTableElement, index, this.driver);
1114
+ getColumnBy = (args) => {
1115
+ if (args.title) {
1116
+ return this.getColumnByTitle(args.title);
1012
1117
  }
1013
- throw new Error(`Cannot find column by index: ${index}`);
1118
+ return this.getColumnByName(args.name);
1119
+ };
1120
+ getRowByIndex(index) {
1121
+ return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1122
+ }
1123
+ getColumnByIndex(index) {
1124
+ return new Column({
1125
+ parentCssSelector: this.getFullCssSelector(),
1126
+ driver: this.driver,
1127
+ index
1128
+ });
1014
1129
  }
1015
- async getColumnByCaption(caption) {
1016
- const column = await (await this.getElement()).findElement(import_selenium_webdriver16.By.css(`${this.getHeaderCssSelector()} ${getColumnByCaptionCssSelector(caption)}`));
1017
- if (column) {
1018
- const index = await column.getAttribute("aria-colindex");
1019
- return new Column(this.getTableElement, transformOutputIndex(index), this.driver);
1020
- }
1021
- throw new Error(`Cannot find column by caption: ${caption}`);
1022
- }
1023
- async selectRowByIndex(index) {
1024
- const row = await this.getRowByIndex(index);
1025
- if (row) {
1026
- await row.select();
1027
- } else {
1028
- throw new Error(`Cannot find row by index: ${index}`);
1029
- }
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
+ });
1143
+ };
1144
+ selectRowByIndex(index) {
1145
+ return this.getRowByIndex(index).select();
1030
1146
  }
1031
1147
  async getRows() {
1032
- const gridContainer = await this.getDataGrid();
1033
- const rows = await gridContainer.findElements(import_selenium_webdriver16.By.className("dx-row dx-data-row"));
1148
+ const rows = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1034
1149
  const result = [];
1035
1150
  rows.forEach((_, index) => {
1036
- const newRow = new Row(this.getTableElement, index, this.driver, this.getColumnByCaption.bind(this));
1151
+ const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1037
1152
  result.push(newRow);
1038
1153
  });
1039
1154
  return result;
1040
1155
  }
1041
1156
  async getColumns() {
1042
- const columns = await (await this.getElement()).findElements(import_selenium_webdriver16.By.css(`${this.getHeaderCssSelector()} td[role="columnheader"]`));
1157
+ const columns = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
1043
1158
  const result = [];
1044
1159
  columns.forEach((_, index) => {
1045
- const newCol = new Column(this.getTableElement, index, this.driver);
1160
+ const newCol = new Column({
1161
+ parentCssSelector: this.getFullCssSelector(),
1162
+ index,
1163
+ driver: this.driver
1164
+ });
1046
1165
  result.push(newCol);
1047
1166
  });
1048
1167
  return result;
@@ -1058,54 +1177,229 @@ var Table = class extends AbstractElementWithParent {
1058
1177
  * expect(await form.field('Name').getValue()).toBe('test value');
1059
1178
  */
1060
1179
  field(name) {
1061
- return new FormField(this.getTableElement, this.formName, name, this.driver);
1180
+ return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
1062
1181
  }
1063
1182
  };
1064
1183
 
1065
- // src/pageObjects/elements/TableToolbar/TableToolbar.ts
1066
- var import_selenium_webdriver18 = require("selenium-webdriver");
1184
+ // src/pageObjects/elements/TableToolbar/AbstractButton.ts
1185
+ var AbstractButton = class extends AbstractElementWithParent {
1186
+ constructor(parentCssSelector, elementCssSelector, driver) {
1187
+ super(parentCssSelector, elementCssSelector, driver);
1188
+ }
1189
+ async click() {
1190
+ const button = await this.getElement();
1191
+ await wait(async () => {
1192
+ return await button.isDisplayed() && !await this.isDisabled();
1193
+ }, this.driver, this.buttonNotDisplayedError());
1194
+ await click(button, this.driver);
1195
+ }
1196
+ async isDisabled() {
1197
+ const button = await this.getElement();
1198
+ return await button.getCssValue("pointer-events") === "none";
1199
+ }
1200
+ };
1067
1201
 
1068
- // src/pageObjects/elements/TableToolbar/TableToolbarButton.ts
1069
- var import_selenium_webdriver17 = require("selenium-webdriver");
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
1070
1215
  var TOOLBAR_BUTTON_CLASS = "toolbar-button";
1071
- var TableToolbarButton = class extends AbstractElementWithParent {
1216
+ var ToolbarButton = class extends AbstractButton {
1072
1217
  name;
1073
- constructor(getParentElement, name, driver) {
1074
- super(getParentElement, driver);
1218
+ constructor(parentCssSelector, name, driver) {
1219
+ super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
1075
1220
  this.name = name;
1076
- this.elementBy = import_selenium_webdriver17.By.id(`${TOOLBAR_BUTTON_CLASS}-${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);
1077
1247
  }
1078
1248
  async click() {
1079
- const button = await this.getElement();
1080
- await this.driver.wait(async () => {
1081
- return await button.isDisplayed() && !await this.isDisabled();
1082
- }, 1e3, `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`);
1083
- return click(button, this.driver);
1249
+ await this.init();
1250
+ await this._button.click();
1084
1251
  }
1085
1252
  async isDisabled() {
1086
- const button = await this.getElement();
1087
- const result = await button.getAttribute("aria-disabled");
1088
- return result === "true";
1253
+ await this.init();
1254
+ return await this._button.isDisabled();
1089
1255
  }
1090
1256
  };
1091
1257
 
1092
- // src/pageObjects/elements/TableToolbar/TableToolbar.ts
1258
+ // src/pageObjects/elements/TableToolbar/FormToolbar.ts
1093
1259
  var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
1094
- var TableToolbar = class extends AbstractElementWithParent {
1095
- constructor(getParentElement, formName, driver) {
1096
- super(getParentElement, driver);
1097
- this.elementBy = import_selenium_webdriver18.By.id(`${TABLE_TOOLBAR_CLASS}-${formName}`);
1260
+ var FormToolbar = class extends AbstractElementWithParent {
1261
+ formName;
1262
+ constructor(parentCssSelector, formName, driver) {
1263
+ super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
1264
+ this.formName = formName;
1098
1265
  }
1099
- getTableToolbarElement = () => {
1100
- return this.driver.findElement(this.elementBy);
1101
- };
1102
- async button(name) {
1103
- const toolbar = await this.getTableToolbarElement();
1104
- const button = await toolbar.findElement(import_selenium_webdriver18.By.id(`${TOOLBAR_BUTTON_CLASS}-${name}`));
1105
- if (button) {
1106
- return new TableToolbarButton(this.getTableToolbarElement, name, this.driver);
1266
+ button(name) {
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
+ }
1107
1393
  }
1108
- throw new Error(`Cannot find button by name: ${name}`);
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);
1109
1403
  }
1110
1404
  };
1111
1405
 
@@ -1113,7 +1407,7 @@ var TableToolbar = class extends AbstractElementWithParent {
1113
1407
  var ListForm = class extends AbstractForm {
1114
1408
  constructor(driver) {
1115
1409
  super(driver);
1116
- this.popupContainerBy = import_selenium_webdriver19.By.className(`popup form-inline-${this.formName}`);
1410
+ this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
1117
1411
  }
1118
1412
  /**
1119
1413
  * Находит таблицу
@@ -1123,7 +1417,7 @@ var ListForm = class extends AbstractForm {
1123
1417
  * expect(listForm.table());
1124
1418
  */
1125
1419
  table() {
1126
- return new Table(this.getContainerElement, this.formName, this.driver);
1420
+ return new Table(this.containerCssSelector, this.formName, this.driver);
1127
1421
  }
1128
1422
  /**
1129
1423
  * Находит группу на лист форме по имени
@@ -1133,7 +1427,7 @@ var ListForm = class extends AbstractForm {
1133
1427
  * expect(await formEdit.group('Name');
1134
1428
  */
1135
1429
  group(name) {
1136
- return new FormGroup(this.getContainerElement, this.formName, name, this.driver);
1430
+ return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
1137
1431
  }
1138
1432
  /**
1139
1433
  * Находит таблицу
@@ -1143,79 +1437,52 @@ var ListForm = class extends AbstractForm {
1143
1437
  * expect(listForm.toolbarButton());
1144
1438
  */
1145
1439
  toolbarButton(name) {
1146
- const toolbar = new TableToolbar(this.getContainerElement, this.formName, this.driver);
1440
+ const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
1147
1441
  return toolbar.button(name);
1148
1442
  }
1149
- };
1150
-
1151
- // src/utils/signIn.ts
1152
- async function signIn(driver) {
1153
- const webDriver = driver ?? await createDriver();
1154
- config().driver = webDriver;
1155
- const loginPage = new LoginPage(webDriver);
1156
- await loginPage.locate();
1157
- await loginPage.authorize();
1158
- return webDriver;
1159
- }
1160
-
1161
- // src/utils/actions.ts
1162
- var click = async (webElement, driver) => {
1163
- driver = driver ?? config().driver;
1164
- const actions = driver.actions({ async: true });
1165
- await actions.move({ origin: webElement }).click().perform();
1166
- };
1167
-
1168
- // src/pageObjects/pages/LoginPage.ts
1169
- var LOGIN_PATH = "/login";
1170
- var LoginPage = class extends AbstractPage {
1171
- usernameField = byTestId("loginField", "input");
1172
- passwordField = byTestId("passwordField", "input");
1173
- loginButton = byTestId("loginButton");
1174
- async locate() {
1175
- await super.locate();
1176
- const login = await this.driver.findElement(this.usernameField);
1177
- await waitElementIsVisible({
1178
- element: login,
1179
- driver: this.driver
1180
- });
1181
- }
1182
- get path() {
1183
- return LOGIN_PATH;
1184
- }
1185
- async enterUsername(username) {
1186
- await this.driver.findElement(this.usernameField).sendKeys(username);
1187
- }
1188
- async enterPassword(password) {
1189
- await this.driver.findElement(this.passwordField).sendKeys(password);
1190
- }
1191
- async clickLoginButton() {
1192
- await click(await this.driver.findElement(this.loginButton), this.driver);
1193
- }
1194
- async loginWith(username, password) {
1195
- await this.enterUsername(username);
1196
- await this.enterPassword(password);
1197
- 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);
1198
1452
  }
1199
- async authorize() {
1200
- 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);
1201
1463
  }
1202
1464
  };
1203
1465
  // Annotate the CommonJS export names for ESM import in node:
1204
1466
  0 && (module.exports = {
1205
1467
  AbstractPage,
1468
+ FilterPanel,
1206
1469
  FormEdit,
1207
1470
  FormField,
1471
+ FormFilterField,
1208
1472
  ListForm,
1209
1473
  LoginPage,
1210
1474
  NumberEditor,
1475
+ PanelFilterField,
1211
1476
  SubsystemsPanel,
1212
1477
  TextEditor,
1213
1478
  byTestId,
1479
+ byTestIdCssSelector,
1214
1480
  click,
1215
1481
  config,
1216
1482
  createDriver,
1217
1483
  editorFactory,
1218
1484
  elementIsNotPresent,
1219
1485
  signIn,
1486
+ wait,
1220
1487
  waitElementIsVisible
1221
1488
  });