d5-testing-library 2.0.0-alpha.0 → 2.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -59,84 +59,44 @@ var init_config = __esm({
59
59
  }
60
60
  });
61
61
 
62
- // src/utils/fixElementStaleError.ts
63
- function fixElementStaleError(by, driver) {
64
- const maxCount = 3;
65
- let err;
66
- const call = async (times) => {
67
- if (times > maxCount) throw err;
68
- try {
69
- let el = await driver.findElement(by);
70
- await el.getAttribute("class");
71
- return el;
72
- } catch (e) {
73
- err = e;
74
- if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
75
- return call(times + 1);
76
- }
77
- }
78
- if (err) throw err;
79
- };
80
- return call(0);
81
- }
82
- async function staleElementAction(action) {
83
- const maxCount = 3;
84
- let err;
85
- const call = async (times) => {
86
- if (times > maxCount) throw err;
87
- try {
88
- await action();
89
- } catch (e) {
90
- err = e;
91
- if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
92
- await call(times + 1);
93
- }
94
- }
95
- if (err) throw err;
96
- };
97
- await call(0);
98
- }
99
- var init_fixElementStaleError = __esm({
100
- "src/utils/fixElementStaleError.ts"() {
101
- "use strict";
102
- }
103
- });
104
-
105
62
  // src/pageObjects/AbstractElement.ts
106
- var import_selenium_webdriver, AbstractElement;
63
+ var AbstractElement;
107
64
  var init_AbstractElement = __esm({
108
65
  "src/pageObjects/AbstractElement.ts"() {
109
66
  "use strict";
110
- import_selenium_webdriver = require("selenium-webdriver");
111
- init_fixElementStaleError();
112
67
  AbstractElement = class {
113
- driver;
114
- elementCssSelector;
115
- constructor(driver, elementCssSelector) {
116
- this.driver = driver;
68
+ constructor(page, elementCssSelector) {
69
+ this.page = page;
117
70
  this.elementCssSelector = elementCssSelector;
118
71
  }
72
+ elementCssSelector;
119
73
  getFullCssSelector() {
120
74
  return this.elementCssSelector;
121
75
  }
122
76
  joinRelativeCssSelectors(selectors) {
123
77
  return selectors.join(" ");
124
78
  }
125
- getElement() {
126
- return fixElementStaleError(import_selenium_webdriver.By.css(this.getFullCssSelector()), this.driver);
79
+ syncLocator() {
80
+ return this.page.locator(`css=${this.getFullCssSelector()}`);
81
+ }
82
+ getLocator() {
83
+ return this.syncLocator();
127
84
  }
128
85
  async getAttribute(attr) {
129
- const element = await this.getElement();
130
- return await element.getAttribute(attr);
86
+ const locator = this.syncLocator();
87
+ if (await locator.isVisible()) {
88
+ return locator.getAttribute(attr);
89
+ }
90
+ return "";
131
91
  }
132
- async getClasses() {
133
- return await this.getAttribute("class");
92
+ getClasses() {
93
+ return this.getAttribute("class");
134
94
  }
135
- async getDataTestId() {
136
- return await this.getAttribute("data-testid");
95
+ getDataTestId() {
96
+ return this.getAttribute("data-testid");
137
97
  }
138
- async getDataDateMode() {
139
- return await this.getAttribute("data-datemode");
98
+ getDataDateMode() {
99
+ return this.getAttribute("data-datemode");
140
100
  }
141
101
  };
142
102
  }
@@ -147,15 +107,12 @@ var AbstractPage;
147
107
  var init_AbstractPage = __esm({
148
108
  "src/pageObjects/pages/AbstractPage.ts"() {
149
109
  "use strict";
150
- init_config();
151
110
  init_AbstractElement();
152
111
  AbstractPage = class extends AbstractElement {
153
112
  url;
154
- host;
155
- constructor(driver) {
156
- super(driver);
157
- this.host = config().auth.host;
158
- this.url = this.host + this.prependHash(this.path);
113
+ constructor(page) {
114
+ super(page);
115
+ this.url = this.prependHash(this.path);
159
116
  }
160
117
  prependHash(urlPath) {
161
118
  if (!urlPath.startsWith("/#")) {
@@ -164,7 +121,7 @@ var init_AbstractPage = __esm({
164
121
  return urlPath;
165
122
  }
166
123
  async goToUrl(url) {
167
- await this.driver.get(url);
124
+ await this.page.goto(url);
168
125
  }
169
126
  get path() {
170
127
  return "/#";
@@ -173,115 +130,99 @@ var init_AbstractPage = __esm({
173
130
  await this.goToUrl(this.url);
174
131
  }
175
132
  async reloadPage() {
176
- await this.driver.navigate().refresh();
133
+ await this.page.reload();
177
134
  }
178
135
  };
179
136
  }
180
137
  });
181
138
 
182
- // src/utils/wait.ts
183
- async function wait(condition, driver, errorMessage, timeout) {
184
- await driver.wait(condition, timeout ?? config().timeout, errorMessage);
185
- }
186
- function safeWait(condition, driver, errorMessage, timeout) {
187
- return wait(async () => {
188
- try {
189
- return await condition(driver);
190
- } catch {
191
- return false;
192
- }
193
- }, driver, errorMessage, timeout);
194
- }
195
- var init_wait = __esm({
196
- "src/utils/wait.ts"() {
197
- "use strict";
198
- init_config();
199
- }
200
- });
201
-
202
- // src/utils/waitElementIsVisible.ts
203
- async function waitElementIsVisible({
204
- timeout,
205
- errorMessage,
206
- driver,
207
- ...rest
208
- }) {
209
- await safeWait(async () => {
210
- const searchedElement = "by" in rest ? await fixElementStaleError(rest.by, driver) : rest.element;
211
- return await searchedElement.isDisplayed();
212
- }, driver, errorMessage ?? "Element is not visible", timeout ?? config().timeout);
213
- }
214
- var waitElementIsVisible_default;
215
- var init_waitElementIsVisible = __esm({
216
- "src/utils/waitElementIsVisible.ts"() {
217
- "use strict";
218
- init_config();
219
- init_wait();
220
- init_fixElementStaleError();
221
- waitElementIsVisible_default = waitElementIsVisible;
222
- }
223
- });
224
-
225
- // src/utils/actions.ts
226
- var click, contextMenu;
227
- var init_actions = __esm({
228
- "src/utils/actions.ts"() {
139
+ // src/pageObjects/pages/LoginPage.ts
140
+ var LOGIN_PATH, LoginPage;
141
+ var init_LoginPage = __esm({
142
+ "src/pageObjects/pages/LoginPage.ts"() {
229
143
  "use strict";
230
- click = async (webElement, driver) => {
231
- if (!await webElement.isDisplayed()) {
232
- await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
144
+ init_AbstractPage();
145
+ LOGIN_PATH = "/login";
146
+ LoginPage = class extends AbstractPage {
147
+ async locate() {
148
+ await super.locate();
149
+ await this.page.getByTestId("loginField").waitFor({ state: "visible" });
233
150
  }
234
- const actions = driver.actions({ async: true });
235
- await actions.move({ origin: webElement }).click().perform();
236
- };
237
- contextMenu = async (webElement, driver) => {
238
- if (!await webElement.isDisplayed()) {
239
- await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
151
+ get path() {
152
+ return LOGIN_PATH;
153
+ }
154
+ enterUsername(username) {
155
+ return this.page.getByTestId("loginField").fill(username);
156
+ }
157
+ enterPassword(password) {
158
+ return this.page.getByTestId("passwordField").fill(password);
159
+ }
160
+ async clickLoginButton() {
161
+ await this.page.getByTestId("loginButton").click();
162
+ }
163
+ async loginWith(username, password) {
164
+ await this.enterUsername(username);
165
+ await this.enterPassword(password);
166
+ await this.clickLoginButton();
240
167
  }
241
- const actions = driver.actions({ async: true });
242
- await actions.move({ origin: webElement }).contextClick().perform();
243
168
  };
244
169
  }
245
170
  });
246
171
 
247
172
  // src/utils/locators.ts
248
- var import_selenium_webdriver2, byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
173
+ var byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
249
174
  var init_locators = __esm({
250
175
  "src/utils/locators.ts"() {
251
176
  "use strict";
252
- import_selenium_webdriver2 = require("selenium-webdriver");
253
177
  byTestIdCssSelector = (testId, element = "div") => {
254
178
  return `${element}[data-testid="${testId}"]`;
255
179
  };
256
180
  byTestId = (testId, element = "div") => {
257
- return import_selenium_webdriver2.By.css(byTestIdCssSelector(testId, element));
181
+ return byTestIdCssSelector(testId, element);
258
182
  };
259
183
  readonlyLocator = "readonly";
260
184
  disabledLocator = "disabled";
261
185
  }
262
186
  });
263
187
 
264
- // src/utils/waitElementIsClickable.ts
265
- async function waitElementIsClickable({
188
+ // src/utils/waitElementIsVisible.ts
189
+ async function waitElementIsVisible({
266
190
  timeout,
267
- errorMessage,
268
- driver,
269
- ...rest
191
+ locator
270
192
  }) {
271
- await safeWait(async () => {
272
- const searchedElement = "by" in rest ? await fixElementStaleError(rest.by, driver) : rest.element;
273
- const isDisabled = await searchedElement.getCssValue("pointer-events") === "none";
274
- return await searchedElement.isDisplayed() && !isDisabled;
275
- }, driver, errorMessage, timeout ?? config().timeout);
193
+ try {
194
+ await locator.waitFor({ state: "visible", timeout });
195
+ } catch {
196
+ throw new Error("Element is not visible");
197
+ }
276
198
  }
277
- var waitElementIsClickable_default;
278
- var init_waitElementIsClickable = __esm({
279
- "src/utils/waitElementIsClickable.ts"() {
199
+ var waitElementIsVisible_default;
200
+ var init_waitElementIsVisible = __esm({
201
+ "src/utils/waitElementIsVisible.ts"() {
202
+ "use strict";
203
+ waitElementIsVisible_default = waitElementIsVisible;
204
+ }
205
+ });
206
+
207
+ // src/utils/wait.ts
208
+ async function wait(condition, page, errorMessage, timeout = 3e4) {
209
+ const start = Date.now();
210
+ while (true) {
211
+ try {
212
+ const result = await condition();
213
+ if (result) return;
214
+ } catch {
215
+ }
216
+ if (Date.now() - start > timeout) {
217
+ const msg = errorMessage || `Timeout waiting for condition after ${timeout}ms`;
218
+ throw new Error(msg);
219
+ }
220
+ await page.waitForTimeout(100);
221
+ }
222
+ }
223
+ var init_wait = __esm({
224
+ "src/utils/wait.ts"() {
280
225
  "use strict";
281
- init_config();
282
- init_wait();
283
- init_fixElementStaleError();
284
- waitElementIsClickable_default = waitElementIsClickable;
285
226
  }
286
227
  });
287
228
 
@@ -293,9 +234,8 @@ var init_AbstractElementWithParent = __esm({
293
234
  init_AbstractElement();
294
235
  init_locators();
295
236
  AbstractElementWithParent = class extends AbstractElement {
296
- parentCssSelector;
297
- constructor(parentCssSelector, elementCssSelector, driver) {
298
- super(driver, elementCssSelector);
237
+ constructor(parentCssSelector, elementCssSelector, page) {
238
+ super(page, elementCssSelector);
299
239
  this.parentCssSelector = parentCssSelector;
300
240
  }
301
241
  getFullCssSelector() {
@@ -308,59 +248,92 @@ var init_AbstractElementWithParent = __esm({
308
248
  return `${this.parentCssSelector} ${this.elementCssSelector}`;
309
249
  }
310
250
  async isReadonly() {
311
- const classSting = await this.getClasses();
312
- return classSting.includes(readonlyLocator);
251
+ const classString = await this.getClasses();
252
+ return classString.includes(readonlyLocator);
313
253
  }
314
254
  async isDisabled() {
315
- const classSting = await this.getClasses();
316
- return classSting.includes(disabledLocator);
255
+ const classString = await this.getClasses();
256
+ return classString.includes(disabledLocator);
317
257
  }
318
258
  };
319
259
  }
320
260
  });
321
261
 
322
- // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
323
- var InputClearStrategy;
324
- var init_InputClearStrategy = __esm({
325
- "src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
262
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
263
+ var SubsystemsPanelHeader;
264
+ var init_SubsystemsPanelHeader = __esm({
265
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts"() {
326
266
  "use strict";
327
- InputClearStrategy = class {
328
- async clear(editor) {
329
- const inputEl = await editor.getInputElement();
330
- await inputEl.clear();
267
+ init_AbstractElementWithParent();
268
+ SubsystemsPanelHeader = class extends AbstractElementWithParent {
269
+ async title() {
270
+ return this.page.locator(this.getFullCssSelector());
271
+ }
272
+ };
273
+ }
274
+ });
275
+
276
+ // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
277
+ var DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
278
+ var init_ClearButtonStrategy = __esm({
279
+ "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
280
+ "use strict";
281
+ DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
282
+ DX_CLEAR_BUTTON_AREA = ".dx-clear-button-area .dx-icon-clear";
283
+ ClearButtonStrategy = class {
284
+ editorContainerSelector;
285
+ page;
286
+ constructor(editorContainerSelector, page) {
287
+ this.editorContainerSelector = editorContainerSelector;
288
+ this.page = page;
289
+ }
290
+ get editorContainer() {
291
+ return this.page.locator(this.editorContainerSelector);
292
+ }
293
+ async isEmptyEditorField() {
294
+ const classAttribute = await this.editorContainer.getAttribute("class");
295
+ return Boolean(classAttribute?.includes(DX_TEXTEDITOR_EMPTY));
296
+ }
297
+ async clear() {
298
+ if (await this.isEmptyEditorField()) {
299
+ return;
300
+ }
301
+ const clearButton = this.editorContainer.locator(`${DX_CLEAR_BUTTON_AREA}`);
302
+ if (await clearButton.isHidden()) {
303
+ return;
304
+ }
305
+ await clearButton.click();
331
306
  }
332
307
  };
333
308
  }
334
309
  });
335
310
 
336
311
  // src/pageObjects/elements/Editors/AbstractEditor.ts
337
- var import_selenium_webdriver7, AbstractDXEditorWithInput;
312
+ var AbstractDXEditorWithInput;
338
313
  var init_AbstractEditor = __esm({
339
314
  "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
340
315
  "use strict";
341
- import_selenium_webdriver7 = require("selenium-webdriver");
342
- init_actions();
343
- init_InputClearStrategy();
344
316
  init_AbstractElementWithParent();
317
+ init_ClearButtonStrategy();
345
318
  AbstractDXEditorWithInput = class extends AbstractElementWithParent {
346
- clearStrategy = new InputClearStrategy();
319
+ clearStrategy = new ClearButtonStrategy(this.getFullCssSelector(), this.page);
347
320
  setClearStrategy(strategy) {
348
321
  this.clearStrategy = strategy;
349
322
  }
350
323
  getInputCssSelector() {
351
324
  return `${this.getFullCssSelector()} .dx-texteditor-input`;
352
325
  }
353
- async getInputElement() {
354
- return this.driver.findElement(import_selenium_webdriver7.By.css(this.getInputCssSelector()));
326
+ getInputLocator() {
327
+ return this.page.locator(this.getInputCssSelector());
355
328
  }
356
- async getInputValue() {
357
- const inputEl = await this.getInputElement();
358
- return inputEl.getAttribute("value");
329
+ getInputValue() {
330
+ return this.getInputLocator().inputValue();
359
331
  }
360
332
  async setInputValue(value) {
361
- const inputEl = await this.getInputElement();
362
- await click(inputEl, this.driver);
363
- await inputEl.sendKeys(value, import_selenium_webdriver7.Key.ENTER);
333
+ const input = this.getInputLocator();
334
+ await input.click();
335
+ await input.pressSequentially(value + "");
336
+ await input.press("Enter");
364
337
  }
365
338
  async clear() {
366
339
  await this.clearStrategy.clear(this);
@@ -375,11 +348,11 @@ var init_TextEditor = __esm({
375
348
  "src/pageObjects/elements/Editors/TextEditor.ts"() {
376
349
  "use strict";
377
350
  init_AbstractEditor();
378
- init_InputClearStrategy();
351
+ init_ClearButtonStrategy();
379
352
  TextEditor = class extends AbstractDXEditorWithInput {
380
- constructor(parentCssSelector, elementCssSelector, driver) {
381
- super(parentCssSelector, elementCssSelector, driver);
382
- this.setClearStrategy(new InputClearStrategy());
353
+ constructor(parentCssSelector, elementCssSelector, page) {
354
+ super(parentCssSelector, elementCssSelector, page);
355
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
383
356
  }
384
357
  async getValue() {
385
358
  const value = await super.getInputValue();
@@ -398,11 +371,11 @@ var init_NumberEditor = __esm({
398
371
  "src/pageObjects/elements/Editors/NumberEditor.ts"() {
399
372
  "use strict";
400
373
  init_AbstractEditor();
401
- init_InputClearStrategy();
374
+ init_ClearButtonStrategy();
402
375
  NumberEditor = class extends AbstractDXEditorWithInput {
403
- constructor(parentCssSelector, elementCssSelector, driver) {
404
- super(parentCssSelector, elementCssSelector, driver);
405
- this.setClearStrategy(new InputClearStrategy());
376
+ constructor(parentCssSelector, elementCssSelector, page) {
377
+ super(parentCssSelector, elementCssSelector, page);
378
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
406
379
  }
407
380
  async getValue() {
408
381
  const value = await super.getInputValue();
@@ -433,6 +406,7 @@ var init_types = __esm({
433
406
  ControlClass2["BooleanSelector"] = "buttons-group";
434
407
  ControlClass2["ButtonGroup"] = "button-group-field";
435
408
  ControlClass2["HeaderFilterDictionary"] = "header-filter-dictionary";
409
+ ControlClass2["FileUploader"] = "file-uploader";
436
410
  return ControlClass2;
437
411
  })(ControlClass || {});
438
412
  }
@@ -445,8 +419,8 @@ var init_AbstractFormElement = __esm({
445
419
  "use strict";
446
420
  init_AbstractElementWithParent();
447
421
  AbstractFormElement = class extends AbstractElementWithParent {
448
- constructor(parentCssSelector, elementCssSelector, driver) {
449
- super(parentCssSelector, elementCssSelector, driver);
422
+ constructor(parentCssSelector, elementCssSelector, page) {
423
+ super(parentCssSelector, elementCssSelector, page);
450
424
  }
451
425
  };
452
426
  }
@@ -457,7 +431,6 @@ var CheckBox;
457
431
  var init_CheckBox = __esm({
458
432
  "src/pageObjects/elements/Editors/CheckBox.ts"() {
459
433
  "use strict";
460
- init_actions();
461
434
  init_AbstractElementWithParent();
462
435
  CheckBox = class extends AbstractElementWithParent {
463
436
  async getValue() {
@@ -467,10 +440,10 @@ var init_CheckBox = __esm({
467
440
  return null;
468
441
  }
469
442
  async setValue(value) {
470
- const inputEl = await this.getElement();
443
+ const inputEl = this.getLocator();
471
444
  const currentValue = await this.getValue();
472
445
  if (currentValue !== value) {
473
- await click(inputEl, this.driver);
446
+ await inputEl.click();
474
447
  }
475
448
  }
476
449
  };
@@ -484,111 +457,128 @@ var init_xpathHelper = __esm({
484
457
  "use strict";
485
458
  XPathHelper = class {
486
459
  static getClassAndValueXpath(cssClass, value) {
487
- return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
460
+ return `div[contains(@class, '${cssClass}') and .='${value}']`;
488
461
  }
489
462
  };
490
463
  }
491
464
  });
492
465
 
493
- // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
494
- var import_selenium_webdriver8, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
495
- var init_ClearButtonStrategy = __esm({
496
- "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
497
- "use strict";
498
- import_selenium_webdriver8 = require("selenium-webdriver");
499
- init_actions();
500
- DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
501
- DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
502
- ClearButtonStrategy = class {
503
- editorContainerClass;
504
- _driver;
505
- constructor(editorContainerClass, driver) {
506
- this.editorContainerClass = editorContainerClass;
507
- this._driver = driver;
508
- }
509
- async isEmptyEditorField() {
510
- const editorContainer = await this._driver.findElement(import_selenium_webdriver8.By.css(this.editorContainerClass));
511
- const classAttribute = await editorContainer.getAttribute("class");
512
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
513
- }
514
- async clear() {
515
- if (await this.isEmptyEditorField()) {
516
- throw new Error("This field is already empty");
517
- }
518
- const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
519
- const clearBtn = await this._driver.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
520
- await click(clearBtn, this._driver);
521
- }
522
- };
523
- }
524
- });
525
-
526
- // src/utils/withCustomTimeouts.ts
527
- async function withCustomTimeouts({ driver, timeout, callback }) {
528
- const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
529
- try {
530
- await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
531
- return await callback();
532
- } finally {
533
- await driver.manage().setTimeouts({ implicit: defaultTimeout });
466
+ // src/utils/typesUtil.ts
467
+ function isEmptyValue(value) {
468
+ switch (true) {
469
+ case !isDefined(value):
470
+ case value === "":
471
+ case (isArray(value) && !value.length):
472
+ case (isObject(value) && isEmptyObject(value)):
473
+ return true;
534
474
  }
475
+ return false;
535
476
  }
536
- var withCustomTimeouts_default;
537
- var init_withCustomTimeouts = __esm({
538
- "src/utils/withCustomTimeouts.ts"() {
477
+ var types, isObject, isEmptyObject, type, isNull, isArray, isDefined, isString, isDate, isArrayOfDates, isUndefined;
478
+ var init_typesUtil = __esm({
479
+ "src/utils/typesUtil.ts"() {
539
480
  "use strict";
540
- withCustomTimeouts_default = withCustomTimeouts;
481
+ types = {
482
+ "[object Array]": "array",
483
+ "[object Date]": "date",
484
+ "[object Object]": "object",
485
+ "[object String]": "string",
486
+ "[object Null]": "null"
487
+ };
488
+ isObject = function(value) {
489
+ return type(value) === "object" && !isNull(value) && !isArray(value) && !isDate(value);
490
+ };
491
+ isEmptyObject = function(object) {
492
+ return !Object.keys(object).length;
493
+ };
494
+ type = function(object) {
495
+ const typeOfObject = Object.prototype.toString.call(object);
496
+ return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
497
+ };
498
+ isNull = function(value) {
499
+ return type(value) === "null";
500
+ };
501
+ isArray = function(value) {
502
+ return type(value) === "array";
503
+ };
504
+ isDefined = function(value) {
505
+ return value !== null && !isUndefined(value);
506
+ };
507
+ isString = function(object) {
508
+ return typeof object === "string";
509
+ };
510
+ isDate = function(object) {
511
+ return type(object) === "date";
512
+ };
513
+ isArrayOfDates = function(array) {
514
+ return isArray(array) && array.every(isDate);
515
+ };
516
+ isUndefined = (val) => val === void 0;
541
517
  }
542
518
  });
543
519
 
544
520
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
545
- var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
521
+ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
546
522
  var init_SelectBoxEditor = __esm({
547
523
  "src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
548
524
  "use strict";
549
525
  init_AbstractEditor();
550
- import_selenium_webdriver9 = require("selenium-webdriver");
551
- init_xpathHelper();
552
- init_actions();
553
526
  init_ClearButtonStrategy();
554
- init_withCustomTimeouts();
527
+ init_xpathHelper();
528
+ init_src();
529
+ init_typesUtil();
555
530
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
556
531
  combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
557
- dropDownOptionClick = async (optionValue, driver, delay = true) => {
558
- let err = null;
559
- try {
560
- await withCustomTimeouts_default({
561
- driver,
562
- timeout: delay ? void 0 : 200,
563
- callback: async () => {
564
- let optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
565
- await click(optElement, driver);
566
- }
567
- });
568
- } catch (e) {
569
- err = new Error(`Item not found: "${optionValue}"`);
532
+ dropDownOptionClick = async (optionValue, page, delay = true) => {
533
+ const locator = page.locator(`xpath=${combinedValueXpath(optionValue)}`);
534
+ if (delay) {
535
+ try {
536
+ await locator.waitFor({ state: "visible", timeout: 5e3 });
537
+ } catch {
538
+ throw new Error(`Item not found: "${optionValue}"`);
539
+ }
540
+ } else {
541
+ if (await locator.count() === 0) {
542
+ throw new Error(`Item not found: "${optionValue}"`);
543
+ }
570
544
  }
571
- if (err)
572
- throw err;
545
+ await locator.click();
573
546
  };
574
547
  SelectBoxEditor = class extends AbstractDXEditorWithInput {
575
- constructor(parentCssSelector, elementCssSelector, driver) {
576
- super(parentCssSelector, elementCssSelector, driver);
577
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
548
+ constructor(parentCssSelector, elementCssSelector, page) {
549
+ super(parentCssSelector, elementCssSelector, page);
550
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
551
+ }
552
+ getInputLocator() {
553
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
578
554
  }
579
555
  async setSelectInputValue(value) {
580
- const inputEl = await this.getInputElement();
581
- await click(inputEl, this.driver);
556
+ const inputEl = this.getInputLocator();
557
+ await inputEl.click();
582
558
  try {
583
- await dropDownOptionClick(value, this.driver, false);
559
+ await inputEl.pressSequentially(value + "");
560
+ await inputEl.press("Enter");
561
+ await dropDownOptionClick(value, this.page, false);
584
562
  } catch {
585
- await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
586
- await dropDownOptionClick(value, this.driver);
563
+ await dropDownOptionClick(value, this.page);
587
564
  }
588
565
  }
566
+ getHiddenInputValue() {
567
+ const hiddenInput = this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
568
+ return hiddenInput.getAttribute("value");
569
+ }
589
570
  async getValue() {
590
- const value = await super.getInputValue();
591
- return value == "" ? null : value;
571
+ let result = null;
572
+ await wait(async () => {
573
+ const hiddenValue = await this.getHiddenInputValue();
574
+ if (!isEmptyValue(hiddenValue)) {
575
+ const value = await super.getInputValue();
576
+ result = value;
577
+ return !isEmptyValue(value);
578
+ }
579
+ return true;
580
+ }, this.page);
581
+ return result === "" ? null : result;
592
582
  }
593
583
  setValue(value) {
594
584
  return this.setSelectInputValue(value);
@@ -602,7 +592,6 @@ var SwitchEditor;
602
592
  var init_SwitchEditor = __esm({
603
593
  "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
604
594
  "use strict";
605
- init_actions();
606
595
  init_AbstractElementWithParent();
607
596
  init_wait();
608
597
  SwitchEditor = class extends AbstractElementWithParent {
@@ -616,141 +605,139 @@ var init_SwitchEditor = __esm({
616
605
  if (value !== 0 && value !== 1) {
617
606
  value = value ? 1 : 0;
618
607
  }
619
- const inputEl = await this.getElement();
608
+ const inputEl = this.getLocator();
620
609
  const currentValue = await this.getValue();
621
610
  if (currentValue === value) {
622
611
  return;
623
612
  }
624
- await click(inputEl, this.driver);
625
- await safeWait(async () => {
613
+ await inputEl.click();
614
+ await wait(async () => {
626
615
  const updatedValue = await this.getValue();
627
616
  return updatedValue !== currentValue;
628
- }, this.driver);
617
+ }, this.page);
629
618
  }
630
619
  };
631
620
  }
632
621
  });
633
622
 
634
623
  // src/pageObjects/elements/Editors/TagBox.ts
635
- var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, getSelectedOptionXpath, TagBox;
624
+ var TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TagBox;
636
625
  var init_TagBox = __esm({
637
626
  "src/pageObjects/elements/Editors/TagBox.ts"() {
638
627
  "use strict";
639
628
  init_AbstractEditor();
640
- import_selenium_webdriver10 = require("selenium-webdriver");
641
- init_actions();
629
+ init_ClearButtonStrategy();
642
630
  init_locators();
643
631
  init_SelectBoxEditor();
644
- init_ClearButtonStrategy();
645
- init_fixElementStaleError();
646
632
  init_wait();
647
633
  TAGS_SELECTOR = ".dx-tag .tag-text";
648
634
  DX_TAG_CONTAINER = "dx-tag-container";
649
635
  DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
650
636
  BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
651
- getSelectedOptionXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//div[contains(@class, 'dx-list-item') and @aria-selected="true"]//div[contains(., "${value}")]`;
652
637
  TagBox = class extends AbstractDXEditorWithInput {
653
- constructor(parentCssSelector, elementCssSelector, driver) {
654
- super(parentCssSelector, elementCssSelector, driver);
655
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
638
+ constructor(parentCssSelector, elementCssSelector, page) {
639
+ super(parentCssSelector, elementCssSelector, page);
640
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
641
+ }
642
+ getInputLocator() {
643
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
656
644
  }
657
645
  async setTagBoxInputValue(values) {
658
646
  const lastElement = values[values.length - 1];
659
- const inputEl = await this.getInputElement();
660
- await inputEl.click();
647
+ const input = this.getInputLocator();
648
+ await input.click();
661
649
  for (const value of values) {
662
- await this.selectOption(inputEl, value, lastElement);
650
+ await this.selectOption(input, value, lastElement);
663
651
  }
664
652
  await this.confirmSelection();
665
653
  }
666
654
  async waitOptionSelection(value) {
667
- await safeWait(
668
- async () => {
669
- const elements = await this.driver.findElements(import_selenium_webdriver10.By.xpath(getSelectedOptionXpath(value)));
670
- if (elements.length === 0) return false;
671
- return await elements[0].isDisplayed();
672
- },
673
- this.driver
674
- );
655
+ const option = this.page.locator(`.dx-overlay-wrapper .dx-list-item[aria-selected="true"] >> text=${value}`);
656
+ await option.waitFor({ state: "visible", timeout: 5e3 });
675
657
  }
676
- async selectOption(inputEl, value, lastElement) {
658
+ async selectOption(input, value, lastElement) {
677
659
  try {
678
- await dropDownOptionClick(value, this.driver, false);
660
+ await dropDownOptionClick(value, this.page, false);
679
661
  } catch {
680
- await inputEl.sendKeys(value);
681
- await dropDownOptionClick(value, this.driver);
662
+ await input.pressSequentially(value + "");
663
+ await dropDownOptionClick(value, this.page, true);
682
664
  }
683
665
  await this.waitOptionSelection(value);
684
666
  if (value !== lastElement) {
685
- await inputEl.clear();
667
+ await input.pressSequentially("");
686
668
  }
687
669
  }
688
670
  async confirmSelection() {
689
- const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
690
- await click(btnOk, this.driver);
671
+ const btnOk = this.page.locator(BTN_OK_SELECTOR);
672
+ await btnOk.click();
691
673
  }
692
674
  async getTagBoxInputValue() {
693
- if (await this.isTagBoxEmpty()) {
694
- return [];
695
- }
696
- const tags = await this.driver.findElements(
697
- import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
675
+ if (await this.isTagBoxEmpty()) return [];
676
+ let count = 0;
677
+ let tags = null;
678
+ await wait(
679
+ async () => {
680
+ tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`);
681
+ count = await tags.count();
682
+ return count > 0;
683
+ },
684
+ this.page
698
685
  );
699
686
  const values = [];
700
- for (const tag of tags) {
701
- values.push(await tag.getAttribute("textContent"));
687
+ if (tags) {
688
+ for (let i = 0; i < count; i++) {
689
+ const tag = tags.nth(i);
690
+ const text = await tag.innerText();
691
+ if (text) values.push(text.trim());
692
+ }
702
693
  }
703
694
  return values;
704
695
  }
705
696
  async isTagBoxEmpty() {
706
- const classAttribute = await this.getClasses();
707
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
697
+ const classAttr = await this.getClasses();
698
+ return classAttr.includes(DX_TEXTEDITOR_EMPTY2);
708
699
  }
709
700
  async getValue() {
710
701
  const value = await this.getTagBoxInputValue();
711
702
  return value.length ? value : null;
712
703
  }
713
704
  async setValue(values) {
714
- if (!Array.isArray(values)) {
715
- throw new Error("The provided value is not an array");
716
- }
705
+ if (!Array.isArray(values)) throw new Error("The provided value is not an array");
717
706
  await this.setTagBoxInputValue(values);
718
707
  }
719
708
  async remove(itemText) {
720
709
  const tagValues = await this.getValue();
721
- const tagExists = tagValues.includes(itemText);
722
- if (!tagExists) {
710
+ if (!tagValues.includes(itemText)) {
723
711
  throw new Error(`The tag with the text: ${itemText} was not found`);
724
712
  }
725
713
  const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
726
- const clearBtn = await this.driver.findElement(
727
- import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
728
- );
729
- await click(clearBtn, this.driver);
714
+ const clearBtn = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`);
715
+ await clearBtn.click();
730
716
  }
731
717
  };
732
718
  }
733
719
  });
734
720
 
735
721
  // src/pageObjects/elements/Editors/ButtonGroup.ts
736
- var import_selenium_webdriver11, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
722
+ var ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
737
723
  var init_ButtonGroup = __esm({
738
724
  "src/pageObjects/elements/Editors/ButtonGroup.ts"() {
739
725
  "use strict";
740
- init_actions();
741
- import_selenium_webdriver11 = require("selenium-webdriver");
742
726
  init_AbstractElementWithParent();
743
727
  ITEM_CLASS = "dx-buttongroup-item";
744
728
  SELECTED_CLASS = "dx-state-selected";
745
729
  ButtonGroup = class extends AbstractElementWithParent {
730
+ constructor(parentCssSelector, elementCssSelector, page) {
731
+ super(parentCssSelector, elementCssSelector, page);
732
+ }
746
733
  getItems() {
747
- return this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
734
+ return this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}`).all();
748
735
  }
749
- getDataValue(el) {
750
- return el.getAttribute("data-value");
736
+ async getDataValue(el) {
737
+ return await el.getAttribute("data-value");
751
738
  }
752
739
  async getValue() {
753
- const selectedEl = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
740
+ const selectedEl = this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`);
754
741
  return this.getDataValue(selectedEl);
755
742
  }
756
743
  async setValue(value) {
@@ -764,7 +751,7 @@ var init_ButtonGroup = __esm({
764
751
  }
765
752
  }
766
753
  if (!buttonEl) throw new Error(`Cannot find item in button group with text: ${value}`);
767
- await click(buttonEl, this.driver);
754
+ await buttonEl.click();
768
755
  }
769
756
  };
770
757
  }
@@ -838,14 +825,12 @@ var init_DateSelectMode = __esm({
838
825
  });
839
826
 
840
827
  // src/pageObjects/elements/Editors/Date/Calendar.ts
841
- var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, CALENDAR_CAPTION_SELECTOR, CALENDAR_CELL_SELECTOR, CALENDAR_PREVIOUS_SELECTOR, CALENDAR_NEXT_SELECTOR, TEXT_EDITOR_SELECTOR, movesToCalendarEndForWeek, movesToCalendarEndForMonth, Calendar;
828
+ var BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, CALENDAR_CAPTION_SELECTOR, CALENDAR_CELL_SELECTOR, CALENDAR_PREVIOUS_SELECTOR, CALENDAR_NEXT_SELECTOR, TEXT_EDITOR_SELECTOR, movesToCalendarEndForWeek, movesToCalendarEndForMonth, Calendar;
842
829
  var init_Calendar = __esm({
843
830
  "src/pageObjects/elements/Editors/Date/Calendar.ts"() {
844
831
  "use strict";
845
832
  init_AbstractElementWithParent();
846
- import_selenium_webdriver12 = require("selenium-webdriver");
847
833
  init_locators();
848
- init_actions();
849
834
  init_utils();
850
835
  BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
851
836
  BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
@@ -860,131 +845,110 @@ var init_Calendar = __esm({
860
845
  movesToCalendarEndForMonth = 1;
861
846
  Calendar = class extends AbstractElementWithParent {
862
847
  _parentCssSelector;
863
- constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
864
- super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
848
+ constructor({ parentCssSelector, dateFieldDataTestID, page }) {
849
+ super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), page);
865
850
  this._parentCssSelector = parentCssSelector;
866
851
  }
852
+ get root() {
853
+ return this.getLocator();
854
+ }
867
855
  async init() {
868
- const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(this._parentCssSelector));
869
- const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
870
- await click(button, this.driver);
856
+ const dateField = this.page.locator(this._parentCssSelector);
857
+ await dateField.locator(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`).click();
871
858
  }
872
- /**
873
- * Переходимо на найвищий рівень календаря
874
- */
875
859
  async moveToCalendarEnd(count) {
876
860
  while (count >= 0) {
877
- const calendarElement = await this.getElement();
878
- const button = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_CAPTION_SELECTOR}`));
879
- await click(button, this.driver);
861
+ await this.root.locator(`.${CALENDAR_CAPTION_SELECTOR}`).click();
880
862
  count--;
881
863
  }
882
864
  }
883
- /**
884
- * Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
885
- */
886
865
  async choosePeriodForYear(targetYear) {
887
866
  let found = false;
888
867
  while (!found) {
889
- const calendarElement = await this.getElement();
890
- const periodCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
891
- for (const cell of periodCells) {
892
- const text = await cell.getText();
868
+ const periodCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
869
+ const count = await periodCells.count();
870
+ for (let i = 0; i < count; i++) {
871
+ const cell = periodCells.nth(i);
872
+ const text = await cell.innerText();
893
873
  if (text) {
894
874
  const [start, end] = text.split("-").map(Number);
895
875
  if (targetYear >= start && targetYear <= end) {
896
- await click(cell, this.driver);
876
+ await cell.click();
897
877
  found = true;
898
878
  break;
899
879
  }
900
880
  }
901
881
  }
902
882
  if (!found) {
903
- const firstPeriod = await periodCells[0].getText();
904
- const [start] = firstPeriod.split("-").map(Number);
883
+ const firstText = await periodCells.first().innerText();
884
+ const [start] = firstText.split("-").map(Number);
905
885
  if (targetYear < start) {
906
- const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
907
- await click(prevBtn, this.driver);
886
+ await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
908
887
  } else {
909
- const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
910
- await click(nextBtn, this.driver);
888
+ await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
911
889
  }
912
890
  }
913
891
  }
914
892
  }
915
- /**
916
- * Пошук та клік по конкретному року з навігацією
917
- */
918
893
  async chooseYear(targetYear) {
919
894
  let found = false;
920
895
  while (!found) {
921
- const calendarElement = await this.getElement();
922
- const yearCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
923
- for (const cell of yearCells) {
924
- const text = await cell.getText();
925
- const cellYear = Number(text);
926
- if (!isNaN(cellYear) && cellYear === targetYear) {
927
- await click(cell, this.driver);
896
+ const yearCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
897
+ const count = await yearCells.count();
898
+ for (let i = 0; i < count; i++) {
899
+ const cell = yearCells.nth(i);
900
+ const year = Number(await cell.innerText());
901
+ if (!isNaN(year) && year === targetYear) {
902
+ await cell.click();
928
903
  found = true;
929
904
  break;
930
905
  }
931
906
  }
932
907
  if (!found) {
933
- const firstYearText = await yearCells[0].getText();
934
- const lastYearText = await yearCells[yearCells.length - 1].getText();
935
- const firstYear = Number(firstYearText);
936
- const lastYear = Number(lastYearText);
908
+ const firstYear = Number(await yearCells.first().innerText());
909
+ const lastYear = Number(await yearCells.nth(count - 1).innerText());
937
910
  if (targetYear < firstYear) {
938
- const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
939
- await click(prevBtn, this.driver);
911
+ await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
940
912
  } else if (targetYear > lastYear) {
941
- const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
942
- await click(nextBtn, this.driver);
913
+ await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
943
914
  } else {
944
915
  throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
945
916
  }
946
917
  }
947
918
  }
948
919
  }
949
- /**
950
- * Пошук та клік по конкретному місяцю
951
- */
952
920
  async chooseMonth(year, month) {
953
- const calendarElement = await this.getElement();
954
- const monthCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
955
- for (const cell of monthCells) {
921
+ const monthCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
922
+ const count = await monthCells.count();
923
+ for (let i = 0; i < count; i++) {
924
+ const cell = monthCells.nth(i);
956
925
  const dataValue = await cell.getAttribute("data-value");
957
926
  if (dataValue) {
958
927
  const [cellYear, cellMonth] = dataValue.split("/").map(Number);
959
928
  if (cellYear === year && cellMonth === month) {
960
- await click(cell, this.driver);
929
+ await cell.click();
961
930
  return;
962
931
  }
963
932
  }
964
933
  }
965
934
  throw new Error(`Month ${month} for year ${year} not found`);
966
935
  }
967
- /**
968
- * Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
969
- */
970
936
  async chooseDay(year, month, day) {
971
- const calendarElement = await this.getElement();
972
- const dayCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
973
- for (const cell of dayCells) {
937
+ const dayCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
938
+ const count = await dayCells.count();
939
+ for (let i = 0; i < count; i++) {
940
+ const cell = dayCells.nth(i);
974
941
  const dataValue = await cell.getAttribute("data-value");
975
942
  if (dataValue) {
976
943
  const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
977
944
  if (cellYear === year && cellMonth === month && cellDay === day) {
978
- await click(cell, this.driver);
945
+ await cell.click();
979
946
  return;
980
947
  }
981
948
  }
982
949
  }
983
950
  throw new Error(`Day ${day}.${month}.${year} not found`);
984
951
  }
985
- /**
986
- * Встановлення дати для тижня
987
- */
988
952
  async setValueForWeek(date) {
989
953
  const { year, month, day } = getYearMonthDay(date);
990
954
  await this.moveToCalendarEnd(movesToCalendarEndForWeek);
@@ -994,9 +958,6 @@ var init_Calendar = __esm({
994
958
  await this.chooseDay(year, month, day);
995
959
  await this.save();
996
960
  }
997
- /**
998
- * Встановлення дати для місяця
999
- */
1000
961
  async setValueForMonth(date) {
1001
962
  const { year, month } = getYearMonthDay(date);
1002
963
  await this.moveToCalendarEnd(movesToCalendarEndForMonth);
@@ -1004,46 +965,37 @@ var init_Calendar = __esm({
1004
965
  await this.chooseMonth(year, month);
1005
966
  await this.save();
1006
967
  }
1007
- async getDateFromInput() {
1008
- const calendarPopoverElement = await this.getElement();
1009
- return calendarPopoverElement.findElement(
1010
- import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
1011
- );
968
+ getDateFromInputLocator() {
969
+ return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
1012
970
  }
1013
- async getDateToInput() {
1014
- const calendarPopoverElement = await this.getElement();
1015
- return calendarPopoverElement.findElement(
1016
- import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
1017
- );
971
+ getDateToInputLocator() {
972
+ return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
1018
973
  }
1019
974
  async save() {
1020
- const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
1021
- await click(btnOk, this.driver);
975
+ await this.root.locator(`.${BTN_SAVE_SELECTOR}`).click();
1022
976
  }
1023
977
  };
1024
978
  }
1025
979
  });
1026
980
 
1027
981
  // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
1028
- var import_selenium_webdriver13, DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
982
+ var DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
1029
983
  var init_BaseDateEditor = __esm({
1030
984
  "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1031
985
  "use strict";
1032
986
  init_AbstractEditor();
1033
- init_InputClearStrategy();
1034
- import_selenium_webdriver13 = require("selenium-webdriver");
1035
- init_actions();
1036
987
  init_utils();
1037
988
  init_DateSelectMode();
1038
989
  init_Calendar();
990
+ init_ClearButtonStrategy();
1039
991
  DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
1040
992
  BaseDateEditor = class extends AbstractDXEditorWithInput {
1041
- constructor(parentCssSelector, elementCssSelector, driver) {
1042
- super(parentCssSelector, elementCssSelector, driver);
1043
- this.setClearStrategy(new InputClearStrategy());
993
+ constructor(parentCssSelector, elementCssSelector, page) {
994
+ super(parentCssSelector, elementCssSelector, page);
995
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1044
996
  }
1045
997
  async getIsAllowedTime() {
1046
- const dateField = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()}`));
998
+ const dateField = this.page.locator(`${this.getFullCssSelector()}`);
1047
999
  const classString = await dateField.getAttribute("class");
1048
1000
  return classString.includes(DATETIME_ALLOWED_SELECTOR);
1049
1001
  }
@@ -1052,7 +1004,7 @@ var init_BaseDateEditor = __esm({
1052
1004
  const calendar = new Calendar({
1053
1005
  parentCssSelector: this.getFullCssSelector(),
1054
1006
  dateFieldDataTestID,
1055
- driver: this.driver
1007
+ page: this.page
1056
1008
  });
1057
1009
  await calendar.init();
1058
1010
  return calendar;
@@ -1067,13 +1019,13 @@ var init_BaseDateEditor = __esm({
1067
1019
  }
1068
1020
  async setArrayValue(value) {
1069
1021
  const calendar = await this.initCalendar();
1070
- const dateFromInput = await calendar.getDateFromInput();
1071
- const dateToInput = await calendar.getDateToInput();
1022
+ const dateFromInput = calendar.getDateFromInputLocator();
1023
+ const dateToInput = calendar.getDateToInputLocator();
1072
1024
  await this.setSingleValue(value[0], dateFromInput);
1073
1025
  await this.setSingleValue(value[1], dateToInput);
1074
1026
  await calendar.save();
1075
1027
  }
1076
- async setSingleValue(value, inputEl) {
1028
+ async setSingleValue(value, input) {
1077
1029
  const dateMode = await this.getDataDateMode();
1078
1030
  if (DateSelectMode.isWeek(dateMode)) {
1079
1031
  await this.setValueForWeek(value);
@@ -1083,18 +1035,18 @@ var init_BaseDateEditor = __esm({
1083
1035
  await this.setValueForMonth(value);
1084
1036
  return;
1085
1037
  }
1086
- const actions = this.driver.actions({ async: true });
1087
1038
  const isTimeAllowed = await this.getIsAllowedTime();
1088
1039
  const formattedDate = formatDMYDate(value, isTimeAllowed);
1089
- await click(inputEl, this.driver);
1090
- await actions.move({ origin: inputEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
1091
- await actions.move({ origin: inputEl }).sendKeys(formattedDate, import_selenium_webdriver13.Key.ENTER).perform();
1040
+ await input.click();
1041
+ await input.press("Home");
1042
+ await input.pressSequentially(formattedDate);
1043
+ await input.press("Enter");
1092
1044
  }
1093
1045
  async setDateValue(value) {
1094
1046
  if (Array.isArray(value)) {
1095
1047
  await this.setArrayValue(value);
1096
1048
  } else {
1097
- await this.setSingleValue(value, await this.getInputElement());
1049
+ await this.setSingleValue(value, this.getInputLocator());
1098
1050
  }
1099
1051
  }
1100
1052
  };
@@ -1102,77 +1054,79 @@ var init_BaseDateEditor = __esm({
1102
1054
  });
1103
1055
 
1104
1056
  // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
1105
- var import_selenium_webdriver14, SingleDateEditor;
1057
+ var SingleDateEditor;
1106
1058
  var init_SingleDateEditor = __esm({
1107
1059
  "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
1108
1060
  "use strict";
1109
- import_selenium_webdriver14 = require("selenium-webdriver");
1110
- init_InputClearStrategy();
1111
1061
  init_BaseDateEditor();
1112
1062
  init_utils();
1063
+ init_ClearButtonStrategy();
1113
1064
  SingleDateEditor = class extends BaseDateEditor {
1114
- constructor(parentCssSelector, elementCssSelector, driver) {
1115
- super(parentCssSelector, elementCssSelector, driver);
1116
- this.setClearStrategy(new InputClearStrategy());
1065
+ constructor(parentCssSelector, elementCssSelector, page) {
1066
+ super(parentCssSelector, elementCssSelector, page);
1067
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1117
1068
  }
1118
- async getDateElement() {
1119
- return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1069
+ getDateLocator() {
1070
+ return this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
1120
1071
  }
1121
1072
  async getDateValue() {
1122
- const inputEl = await this.getDateElement();
1123
- return inputEl.getAttribute("value");
1073
+ const input = this.getDateLocator();
1074
+ return input.getAttribute("value");
1124
1075
  }
1125
1076
  async getValue() {
1126
1077
  const value = await this.getDateValue();
1127
1078
  const isTimeAllowed = await this.getIsAllowedTime();
1128
1079
  if (isTimeAllowed) {
1129
- return value == "" ? null : formatToDateTime(value);
1080
+ return value === "" ? null : formatToDateTime(value);
1130
1081
  }
1131
- return value == "" ? null : new Date(value);
1082
+ return value === "" ? null : new Date(value);
1132
1083
  }
1133
- setValue(value) {
1134
- if (typeof value === "object") {
1135
- return this.setDateValue(value);
1084
+ async setValue(value) {
1085
+ if (value instanceof Date) {
1086
+ await this.setDateValue(value);
1087
+ } else {
1088
+ throw new Error(`Value is incorrect. It should be a Date object`);
1136
1089
  }
1137
- throw new Error(`Value is incorrect. It should be Object`);
1138
1090
  }
1139
1091
  };
1140
1092
  }
1141
1093
  });
1142
1094
 
1143
1095
  // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
1144
- var import_selenium_webdriver15, DateRangeEditor;
1096
+ var DateRangeEditor;
1145
1097
  var init_DateRangeEditor = __esm({
1146
1098
  "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
1147
1099
  "use strict";
1148
- import_selenium_webdriver15 = require("selenium-webdriver");
1149
- init_InputClearStrategy();
1150
1100
  init_BaseDateEditor();
1101
+ init_typesUtil();
1102
+ init_ClearButtonStrategy();
1151
1103
  DateRangeEditor = class extends BaseDateEditor {
1152
- constructor(parentCssSelector, elementCssSelector, driver) {
1153
- super(parentCssSelector, elementCssSelector, driver);
1154
- this.setClearStrategy(new InputClearStrategy());
1104
+ constructor(parentCssSelector, elementCssSelector, page) {
1105
+ super(parentCssSelector, elementCssSelector, page);
1106
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1155
1107
  }
1156
- async getDateElement() {
1157
- return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1108
+ getDateLocator() {
1109
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
1158
1110
  }
1159
1111
  async getDateValue() {
1160
- const inputEl = await this.getDateElement();
1161
- const dateFromStr = await inputEl.getAttribute("datefrom");
1162
- const dateToStr = await inputEl.getAttribute("dateto");
1163
- const dateFrom = new Date(dateFromStr);
1164
- const dateTo = new Date(dateToStr);
1165
- return [dateFrom, dateTo];
1112
+ const input = this.getDateLocator();
1113
+ const dateFromStr = await input.getAttribute("datefrom");
1114
+ const dateToStr = await input.getAttribute("dateto");
1115
+ const dateFrom = dateFromStr ? new Date(dateFromStr) : null;
1116
+ const dateTo = dateToStr ? new Date(dateToStr) : null;
1117
+ return dateFrom && dateTo ? [dateFrom, dateTo] : null;
1166
1118
  }
1167
1119
  async getValue() {
1168
1120
  const values = await this.getDateValue();
1169
- return !values.length ? null : values;
1121
+ return values?.length ? values : null;
1170
1122
  }
1171
- setValue(value) {
1172
- if (typeof value === "object") {
1173
- return this.setDateValue(value);
1123
+ async setValue(value) {
1124
+ if (isDate(value) || isArrayOfDates(value)) {
1125
+ const inputValue = Array.isArray(value) ? value : [value, value];
1126
+ await this.setDateValue(inputValue);
1127
+ return;
1174
1128
  }
1175
- throw new Error(`Value is incorrect. It should be Object`);
1129
+ throw new Error(`Value is incorrect. It should be a Date object or Date array`);
1176
1130
  }
1177
1131
  };
1178
1132
  }
@@ -1197,18 +1151,18 @@ var init_DateEditor = __esm({
1197
1151
  await this.setEditorInstance();
1198
1152
  }
1199
1153
  async setEditorInstance() {
1200
- const { parentCssSelector, elementCssSelector, driver } = this;
1201
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1154
+ const { parentCssSelector, elementCssSelector, page } = this;
1155
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1202
1156
  const classString = await elementInstance.getClasses();
1203
1157
  switch (true) {
1204
1158
  case classString.includes("date-control" /* Date */):
1205
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1159
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
1206
1160
  break;
1207
1161
  case classString.includes("single-date-range-control" /* SingleDateRange */):
1208
- this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
1162
+ this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, page);
1209
1163
  break;
1210
1164
  default:
1211
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1165
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
1212
1166
  }
1213
1167
  }
1214
1168
  async setValue(value) {
@@ -1225,87 +1179,73 @@ var init_DateEditor = __esm({
1225
1179
  });
1226
1180
 
1227
1181
  // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
1228
- var import_selenium_webdriver16, TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
1182
+ var TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
1229
1183
  var init_HeaderFilterDictionary = __esm({
1230
1184
  "src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
1231
1185
  "use strict";
1232
1186
  init_AbstractEditor();
1233
- import_selenium_webdriver16 = require("selenium-webdriver");
1234
- init_actions();
1235
- init_locators();
1236
1187
  init_ClearButtonStrategy();
1237
- init_fixElementStaleError();
1238
- init_withCustomTimeouts();
1188
+ init_locators();
1239
1189
  TAGS_SELECTOR2 = ".dx-tag .tag-text";
1240
1190
  DX_TAG_CONTAINER2 = "dx-tag-container";
1241
1191
  DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
1242
1192
  CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
1243
1193
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
1244
1194
  TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
1245
- combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
1246
- dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
1247
- let err = null;
1195
+ dropDownHeaderFilterDictionaryOptionClick = async (optionValue, page, dataTEST = "", delay = true) => {
1196
+ const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
1197
+ const calendarPopover = page.locator(calendarPopoverSelector);
1198
+ const customOptionList = calendarPopover.locator(`.${CUSTOM_OPTION_LIST_SELECTOR}`);
1199
+ const optElement = customOptionList.locator(`.${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}`, { hasText: optionValue });
1248
1200
  try {
1249
- const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
1250
- await withCustomTimeouts_default({
1251
- driver,
1252
- timeout: delay ? void 0 : 600,
1253
- callback: async () => {
1254
- const calendarPopoverElement = await driver.findElement(import_selenium_webdriver16.By.css(calendarPopoverSelector));
1255
- const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver16.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
1256
- const optElement = await customOptionList.findElement(import_selenium_webdriver16.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
1257
- await click(optElement, driver);
1258
- }
1259
- });
1260
- } catch (e) {
1261
- err = new Error(`Item not found: "${optionValue}"`);
1201
+ await optElement.waitFor({ state: "visible", timeout: delay ? void 0 : 600 });
1202
+ await optElement.click();
1203
+ } catch {
1204
+ throw new Error(`Item not found: "${optionValue}"`);
1262
1205
  }
1263
- if (err)
1264
- throw err;
1265
1206
  };
1266
1207
  HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
1267
- constructor(parentCssSelector, elementCssSelector, driver) {
1268
- super(parentCssSelector, elementCssSelector, driver);
1269
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1208
+ constructor(parentCssSelector, elementCssSelector, page) {
1209
+ super(parentCssSelector, elementCssSelector, page);
1210
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1211
+ }
1212
+ getInputLocator() {
1213
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
1270
1214
  }
1271
1215
  async setTagBoxInputValue(values) {
1272
1216
  const lastElement = values[values.length - 1];
1273
- const inputEl = await this.getInputElement();
1217
+ const inputEl = this.getInputLocator();
1274
1218
  await inputEl.click();
1275
1219
  for (const value of values) {
1276
1220
  await this.selectOption(inputEl, value, lastElement);
1277
1221
  }
1278
1222
  }
1279
- async waitOptionSelection() {
1280
- await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
1223
+ async waitOptionSelection(value) {
1224
+ await this.page.locator(`${TAG_BOX_LIST_ITEM_SELECTOR}`).filter({ hasText: value }).first().waitFor({ state: "visible" });
1281
1225
  }
1282
1226
  async selectOption(inputEl, value, lastElement) {
1283
1227
  try {
1284
- await inputEl.sendKeys(value);
1228
+ await inputEl.pressSequentially(value + "");
1285
1229
  const dataTEST = await this.getDataTestId();
1286
- await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
1287
- const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
1288
- for (let i = 0; i < textLength; i++) {
1289
- await inputEl.sendKeys(import_selenium_webdriver16.Key.BACK_SPACE);
1230
+ await dropDownHeaderFilterDictionaryOptionClick(value, this.page, dataTEST);
1231
+ if (value !== lastElement) {
1232
+ await inputEl.pressSequentially("");
1290
1233
  }
1291
1234
  } catch (error) {
1292
1235
  throw error;
1293
1236
  }
1294
- await this.waitOptionSelection();
1295
- if (value !== lastElement) {
1296
- await inputEl.clear();
1297
- }
1237
+ await this.waitOptionSelection(value);
1298
1238
  }
1299
1239
  async getHeaderFilterDictionaryInputValue() {
1300
1240
  if (await this.isHeaderFilterDictionaryEmpty()) {
1301
1241
  return [];
1302
1242
  }
1303
- const tags = await this.driver.findElements(
1304
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
1305
- );
1243
+ const tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`);
1244
+ await tags.first().waitFor({ state: "visible" });
1245
+ const count = await tags.count();
1306
1246
  const values = [];
1307
- for (const tag of tags) {
1308
- values.push(await tag.getAttribute("textContent"));
1247
+ for (let i = 0; i < count; i++) {
1248
+ values.push(await tags.nth(i).innerText() ?? "");
1309
1249
  }
1310
1250
  return values;
1311
1251
  }
@@ -1327,6 +1267,125 @@ var init_HeaderFilterDictionary = __esm({
1327
1267
  }
1328
1268
  });
1329
1269
 
1270
+ // src/pageObjects/elements/Editors/FileUploader.ts
1271
+ var FILE_NAME_SELECTOR, FILE_SIZE_ATTRIBUTE, FILE_DATE_ATTRIBUTE, FILE_TYPE_ATTRIBUTE, SELECT_FILE_BUTTON_SELECTOR, DOWNLOAD_FILE_BUTTON_SELECTOR, METADATA_SELECTOR, CLEAR_BUTTON_SELECTOR, FileUploader;
1272
+ var init_FileUploader = __esm({
1273
+ "src/pageObjects/elements/Editors/FileUploader.ts"() {
1274
+ "use strict";
1275
+ init_AbstractElementWithParent();
1276
+ FILE_NAME_SELECTOR = ".file-text";
1277
+ FILE_SIZE_ATTRIBUTE = "data-filesize";
1278
+ FILE_DATE_ATTRIBUTE = "data-moddate";
1279
+ FILE_TYPE_ATTRIBUTE = "data-filetype";
1280
+ SELECT_FILE_BUTTON_SELECTOR = ".select-file-button";
1281
+ DOWNLOAD_FILE_BUTTON_SELECTOR = ".download-file-button";
1282
+ METADATA_SELECTOR = ".file-text-file-info-wrapper";
1283
+ CLEAR_BUTTON_SELECTOR = ".clear-button";
1284
+ FileUploader = class extends AbstractElementWithParent {
1285
+ constructor(parentCssSelector, elementCssSelector, page) {
1286
+ super(parentCssSelector, elementCssSelector, page);
1287
+ }
1288
+ /**
1289
+ * Returns the metadata container element for the uploaded file.
1290
+ * Returns null when metadata is not rendered or not visible.
1291
+ */
1292
+ async getMedataElement() {
1293
+ const root = this.getFullCssSelector();
1294
+ const locator = this.page.locator(`${root} ${METADATA_SELECTOR}`);
1295
+ if (!await locator.isVisible()) return null;
1296
+ return locator;
1297
+ }
1298
+ /**
1299
+ * Returns the name of the uploaded file, or null if not present.
1300
+ */
1301
+ async getFileName() {
1302
+ const root = this.getFullCssSelector();
1303
+ const locator = this.page.locator(`${root} ${FILE_NAME_SELECTOR}`);
1304
+ if (!await locator.isVisible()) return null;
1305
+ const text = await locator.innerText();
1306
+ return text?.trim() || null;
1307
+ }
1308
+ /**
1309
+ * Returns the size of the uploaded file, or null if not present.
1310
+ */
1311
+ async getFileSize() {
1312
+ const element = await this.getMedataElement();
1313
+ if (!element) return null;
1314
+ const result = (await element.getAttribute(FILE_SIZE_ATTRIBUTE))?.trim();
1315
+ return isNaN(+result) ? null : +result;
1316
+ }
1317
+ /**
1318
+ * Returns the upload/modification date of the file, or null if not present.
1319
+ */
1320
+ async getFileDate() {
1321
+ const element = await this.getMedataElement();
1322
+ if (!element) return null;
1323
+ const fileModDate = (await element.getAttribute(FILE_DATE_ATTRIBUTE))?.trim();
1324
+ return fileModDate ? new Date(fileModDate) : null;
1325
+ }
1326
+ /**
1327
+ * Returns the MIME/content type of the uploaded file from metadata.
1328
+ * Returns null when the type attribute is absent or empty.
1329
+ */
1330
+ async getFileType() {
1331
+ const element = await this.getMedataElement();
1332
+ if (!element) return null;
1333
+ const fileType = (await element.getAttribute(FILE_TYPE_ATTRIBUTE))?.trim();
1334
+ return fileType || null;
1335
+ }
1336
+ /**
1337
+ * Returns current file information: name, size and upload/modification date.
1338
+ * Returns null if no file is uploaded.
1339
+ */
1340
+ async getValue() {
1341
+ const name = await this.getFileName();
1342
+ const size = await this.getFileSize();
1343
+ const date = await this.getFileDate();
1344
+ const type2 = await this.getFileType();
1345
+ if (!name && !size && !date && !type2) return null;
1346
+ return { FileName: name, FileSize: size, FileType: type2, ModDate: date };
1347
+ }
1348
+ /**
1349
+ * Uploads a file by clicking the select-file-button and providing the file path.
1350
+ * @param filePath - Absolute or relative path to the file on disk.
1351
+ */
1352
+ async setValue(filePath) {
1353
+ const root = this.getFullCssSelector();
1354
+ const fileChooserPromise = this.page.waitForEvent("filechooser");
1355
+ await this.page.locator(`${root} ${SELECT_FILE_BUTTON_SELECTOR}`).click();
1356
+ const fileChooser = await fileChooserPromise;
1357
+ await fileChooser.setFiles(filePath);
1358
+ }
1359
+ /**
1360
+ * Downloads the currently uploaded file by clicking the download-file-button.
1361
+ * Returns the suggested file name of the downloaded file.
1362
+ */
1363
+ async download() {
1364
+ const root = this.getFullCssSelector();
1365
+ const buttonLocator = this.page.locator(
1366
+ `${root} ${DOWNLOAD_FILE_BUTTON_SELECTOR}`
1367
+ );
1368
+ if (await buttonLocator.isHidden()) return "";
1369
+ const downloadPromise = this.page.waitForEvent("download");
1370
+ await buttonLocator.click();
1371
+ const download = await downloadPromise;
1372
+ return download.suggestedFilename();
1373
+ }
1374
+ /**
1375
+ * Removes the currently uploaded file by clicking the delete-file-button.
1376
+ * Does nothing if no file is uploaded.
1377
+ */
1378
+ async clear() {
1379
+ if (await this.getValue() === null) return;
1380
+ const root = this.getFullCssSelector();
1381
+ const deleteButton = this.page.locator(`${root} ${CLEAR_BUTTON_SELECTOR}`);
1382
+ if (await deleteButton.isHidden()) return;
1383
+ await deleteButton.click();
1384
+ }
1385
+ };
1386
+ }
1387
+ });
1388
+
1330
1389
  // src/pageObjects/elements/Editors/editorFactory.ts
1331
1390
  var editorFactory;
1332
1391
  var init_editorFactory = __esm({
@@ -1344,26 +1403,29 @@ var init_editorFactory = __esm({
1344
1403
  init_ButtonGroup();
1345
1404
  init_DateEditor();
1346
1405
  init_HeaderFilterDictionary();
1347
- editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
1348
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1349
- const classSting = await elementInstance.getClasses();
1350
- if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
1351
- return new TextEditor(parentCssSelector, elementCssSelector, driver);
1352
- if (classSting.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, driver);
1353
- if (classSting.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, driver);
1354
- if (classSting.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, driver);
1355
- if (classSting.includes("select-control" /* Select */))
1356
- return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
1357
- if (classSting.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
1358
- if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
1359
- return new DateEditor(parentCssSelector, elementCssSelector, driver);
1360
- }
1361
- if (classSting.includes("buttons-group" /* BooleanSelector */))
1362
- return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
1363
- if (classSting.includes("button-group-field" /* ButtonGroup */))
1364
- return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
1365
- if (classSting.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
1366
- return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, driver);
1406
+ init_FileUploader();
1407
+ editorFactory = async (parentCssSelector, elementCssSelector, page) => {
1408
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1409
+ const classString = await elementInstance.getClasses();
1410
+ if ((classString.includes("text-control" /* Text */) || classString.includes("text-area-control" /* TextArea */)) && !classString.includes("single-date-range-control" /* SingleDateRange */))
1411
+ return new TextEditor(parentCssSelector, elementCssSelector, page);
1412
+ if (classString.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, page);
1413
+ if (classString.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, page);
1414
+ if (classString.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, page);
1415
+ if (classString.includes("select-control" /* Select */))
1416
+ return new SelectBoxEditor(parentCssSelector, elementCssSelector, page);
1417
+ if (classString.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, page);
1418
+ if (classString.includes("date-control" /* Date */) || classString.includes("single-date-range-control" /* SingleDateRange */)) {
1419
+ return new DateEditor(parentCssSelector, elementCssSelector, page);
1420
+ }
1421
+ if (classString.includes("buttons-group" /* BooleanSelector */))
1422
+ return new BooleanSelector(parentCssSelector, elementCssSelector, page);
1423
+ if (classString.includes("button-group-field" /* ButtonGroup */))
1424
+ return new ButtonGroup(parentCssSelector, elementCssSelector, page);
1425
+ if (classString.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
1426
+ return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, page);
1427
+ if (classString.includes("file-uploader" /* FileUploader */))
1428
+ return new FileUploader(parentCssSelector, elementCssSelector, page);
1367
1429
  throw new Error("Unknown type of editor. Please write ticket to the support");
1368
1430
  };
1369
1431
  }
@@ -1380,6 +1442,35 @@ var init_Editors = __esm({
1380
1442
  }
1381
1443
  });
1382
1444
 
1445
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
1446
+ var SubsystemItem;
1447
+ var init_SubsystemItem = __esm({
1448
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts"() {
1449
+ "use strict";
1450
+ init_waitElementIsVisible();
1451
+ SubsystemItem = class {
1452
+ bySelector;
1453
+ page;
1454
+ constructor({ page, bySelector }) {
1455
+ this.bySelector = bySelector;
1456
+ this.page = page;
1457
+ }
1458
+ getElement() {
1459
+ return this.page.locator(this.bySelector);
1460
+ }
1461
+ async getTitle() {
1462
+ await waitElementIsVisible_default({ locator: this.getElement() });
1463
+ const el = this.getElement();
1464
+ return await el.getAttribute("data-title");
1465
+ }
1466
+ async click() {
1467
+ const el = this.getElement();
1468
+ await el.click();
1469
+ }
1470
+ };
1471
+ }
1472
+ });
1473
+
1383
1474
  // src/utils/createDataTestId.ts
1384
1475
  function createDataTestId(formName, itemType, itemName) {
1385
1476
  return `${formName}-${itemType}-${itemName}`;
@@ -1414,51 +1505,160 @@ function createSubSystemTestId(itemName) {
1414
1505
  function createEditorButtonTestId(itemName) {
1415
1506
  return `${"editor-button" /* EDITOR_BUTTON */}-${itemName}`;
1416
1507
  }
1508
+ function createLabelFieldTestId(formName, itemName) {
1509
+ return `${"label" /* LABEL */}-${createFieldTestId(formName, itemName)}`;
1510
+ }
1511
+ function createLabelDocFilterTestId(formName, itemName) {
1512
+ return `${"label" /* LABEL */}-${createDocFilterTestId(formName, itemName)}`;
1513
+ }
1514
+ function createLabelLayoutFilterTestId(formName, itemName) {
1515
+ return `${"label" /* LABEL */}-${createLayoutFilterTestId(formName, itemName)}`;
1516
+ }
1417
1517
  var init_createDataTestId = __esm({
1418
1518
  "src/utils/createDataTestId.ts"() {
1419
1519
  "use strict";
1420
1520
  }
1421
1521
  });
1422
1522
 
1523
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
1524
+ var SEARCH_ITEM_SELECTOR, BACK_BUTTON_SELECTOR, SEARCH_INPUT_SELECTOR, byTitleCssSelector, SubsystemsPanel;
1525
+ var init_SubsystemsPanel = __esm({
1526
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts"() {
1527
+ "use strict";
1528
+ init_AbstractElement();
1529
+ init_SubsystemsPanelHeader();
1530
+ init_wait();
1531
+ init_locators();
1532
+ init_Editors();
1533
+ init_SubsystemItem();
1534
+ init_createDataTestId();
1535
+ init_ClearButtonStrategy();
1536
+ init_waitElementIsVisible();
1537
+ SEARCH_ITEM_SELECTOR = "search-item";
1538
+ BACK_BUTTON_SELECTOR = "subsystem-back-item";
1539
+ SEARCH_INPUT_SELECTOR = "search-subsystem-input";
1540
+ byTitleCssSelector = (title) => {
1541
+ return `span[data-title="${title}"]`;
1542
+ };
1543
+ SubsystemsPanel = class extends AbstractElement {
1544
+ header;
1545
+ constructor(page) {
1546
+ super(page);
1547
+ this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.page);
1548
+ }
1549
+ async headerTitle() {
1550
+ const title = await this.header.title();
1551
+ await wait(async () => await title.innerText() != "", this.page);
1552
+ return title.innerText();
1553
+ }
1554
+ getSearchComponent() {
1555
+ return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.page);
1556
+ }
1557
+ /**
1558
+ * Находит сабсистему по заголовку
1559
+ * @example
1560
+ * const subsystemsPanel= new SubsystemsPanel();
1561
+ * //...
1562
+ * await subsystemsPanel.search('SubSystemTitle');
1563
+ */
1564
+ async search(title) {
1565
+ const searchComponent = this.getSearchComponent();
1566
+ await this.searchClear();
1567
+ await searchComponent.setValue(title);
1568
+ await wait(
1569
+ async () => {
1570
+ const findElement = this.itemByTitle(title).getElement();
1571
+ const classes = await findElement.getAttribute("class");
1572
+ return classes.includes(SEARCH_ITEM_SELECTOR);
1573
+ },
1574
+ this.page,
1575
+ `Cannot find element: ${title}`
1576
+ );
1577
+ }
1578
+ /**
1579
+ * Очищает поиск сабсистем
1580
+ * @example
1581
+ * const subsystemsPanel= new SubsystemsPanel();
1582
+ * //...
1583
+ * await subsystemsPanel.searchClear();
1584
+ */
1585
+ async searchClear() {
1586
+ const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} ${DX_CLEAR_BUTTON_AREA}`;
1587
+ const clearBtn = this.page.locator(clearBtnSelector);
1588
+ if (await clearBtn.isVisible()) {
1589
+ await clearBtn.click();
1590
+ }
1591
+ }
1592
+ /**
1593
+ * Возвращает сабсистему по имени
1594
+ * @example
1595
+ * const subsystemsPanel= new SubsystemsPanel();
1596
+ * //...
1597
+ * const subsystem = subsystemsPanel.item('SubSystemName');
1598
+ */
1599
+ item(name) {
1600
+ const elementCSS = createSubSystemTestId(name);
1601
+ return new SubsystemItem({ page: this.page, bySelector: `${byTestIdCssSelector(elementCSS, "span")}` });
1602
+ }
1603
+ /**
1604
+ * Возвращает сабсистему по заголовку
1605
+ * @example
1606
+ * const subsystemsPanel= new SubsystemsPanel();
1607
+ * //...
1608
+ * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
1609
+ */
1610
+ itemByTitle(title) {
1611
+ return new SubsystemItem({ page: this.page, bySelector: byTitleCssSelector(title) });
1612
+ }
1613
+ /**
1614
+ * Возвращается на уровень выше по сабсистемам
1615
+ * @example
1616
+ * const subsystemsPanel= new SubsystemsPanel();
1617
+ * //...
1618
+ * wait subsystemsPanel.back();
1619
+ */
1620
+ async back() {
1621
+ const locator = this.page.locator(`#aside .${BACK_BUTTON_SELECTOR}`);
1622
+ await waitElementIsVisible_default({ locator });
1623
+ await locator.click();
1624
+ }
1625
+ };
1626
+ }
1627
+ });
1628
+
1423
1629
  // src/pageObjects/elements/AbstractButton.ts
1424
1630
  var D5_BUTTON_IS_PRESSED, AbstractButton;
1425
1631
  var init_AbstractButton = __esm({
1426
1632
  "src/pageObjects/elements/AbstractButton.ts"() {
1427
1633
  "use strict";
1428
1634
  init_AbstractElementWithParent();
1429
- init_actions();
1430
- init_waitElementIsClickable();
1431
1635
  D5_BUTTON_IS_PRESSED = "d5-is-pressed";
1432
1636
  AbstractButton = class extends AbstractElementWithParent {
1433
- constructor(parentCssSelector, elementCssSelector, driver) {
1434
- super(parentCssSelector, elementCssSelector, driver);
1637
+ constructor(parentCssSelector, elementCssSelector, page) {
1638
+ super(parentCssSelector, elementCssSelector, page);
1639
+ }
1640
+ get button() {
1641
+ return this.getLocator();
1642
+ }
1643
+ getLocator() {
1644
+ return super.getLocator();
1435
1645
  }
1436
1646
  async click() {
1437
- const button = await this.getElement();
1438
- await waitElementIsClickable_default({
1439
- element: button,
1440
- errorMessage: this.buttonNotDisplayedError(),
1441
- driver: this.driver
1442
- });
1443
- await click(button, this.driver);
1647
+ await this.button.click();
1444
1648
  }
1445
1649
  async isDisabled() {
1446
- const button = await this.getElement();
1447
- return await button.getCssValue("pointer-events") === "none";
1650
+ return await this.button.isDisabled();
1448
1651
  }
1449
- async isDisplayed() {
1450
- try {
1451
- const button = await this.getElement();
1452
- return await button.isDisplayed();
1453
- } catch {
1454
- return false;
1455
- }
1652
+ async isVisible() {
1653
+ return await this.button.isVisible();
1456
1654
  }
1457
1655
  async isPressed() {
1458
1656
  try {
1459
- const button = await this.getElement();
1460
- const classAttribute = await button.getAttribute("class");
1461
- return classAttribute.includes(D5_BUTTON_IS_PRESSED);
1657
+ if (await this.button.isVisible()) {
1658
+ const classAttribute = await this.button.getAttribute("class");
1659
+ return classAttribute.includes(D5_BUTTON_IS_PRESSED);
1660
+ }
1661
+ return false;
1462
1662
  } catch {
1463
1663
  return false;
1464
1664
  }
@@ -1468,21 +1668,22 @@ var init_AbstractButton = __esm({
1468
1668
  });
1469
1669
 
1470
1670
  // src/pageObjects/elements/DXComponents/DXButton.ts
1471
- var import_selenium_webdriver18, DXButton;
1671
+ var DXButton;
1472
1672
  var init_DXButton = __esm({
1473
1673
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1474
1674
  "use strict";
1475
1675
  init_AbstractButton();
1476
- import_selenium_webdriver18 = require("selenium-webdriver");
1477
1676
  DXButton = class extends AbstractButton {
1478
1677
  async getText() {
1479
1678
  const classes = await this.getClasses();
1480
- if (!classes.includes("dx-button-has-text")) {
1679
+ if (!classes?.includes("dx-button-has-text")) {
1680
+ return null;
1681
+ }
1682
+ const textEl = this.getLocator().locator(".dx-button-text");
1683
+ if (!await textEl.count()) {
1481
1684
  return null;
1482
1685
  }
1483
- const el = await this.getElement();
1484
- const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
1485
- return await textEl.getText();
1686
+ return await textEl.innerText();
1486
1687
  }
1487
1688
  };
1488
1689
  }
@@ -1498,8 +1699,8 @@ var init_FormButton = __esm({
1498
1699
  init_DXButton();
1499
1700
  FormButton = class extends DXButton {
1500
1701
  name;
1501
- constructor(parentCssSelector, formName, name, driver) {
1502
- super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
1702
+ constructor(parentCssSelector, formName, name, page) {
1703
+ super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), page);
1503
1704
  this.name = name;
1504
1705
  }
1505
1706
  buttonNotDisplayedError() {
@@ -1519,9 +1720,9 @@ var init_AbstractGroup = __esm({
1519
1720
  "use strict";
1520
1721
  init_AbstractElementWithParent();
1521
1722
  AbstractGroup = class extends AbstractElementWithParent {
1522
- async isDisplayed() {
1523
- const groupElement = await this.getElement();
1524
- return await groupElement.isDisplayed();
1723
+ async isVisible() {
1724
+ const groupElement = this.getLocator();
1725
+ return await groupElement.isVisible();
1525
1726
  }
1526
1727
  };
1527
1728
  }
@@ -1539,24 +1740,24 @@ var init_Panel = __esm({
1539
1740
  });
1540
1741
 
1541
1742
  // src/pageObjects/elements/Groups/TabPanel.ts
1542
- var import_selenium_webdriver19, TabPanelItem, TabPanel;
1743
+ var TabPanelItem, TabPanel;
1543
1744
  var init_TabPanel = __esm({
1544
1745
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1545
1746
  "use strict";
1546
1747
  init_AbstractGroup();
1547
- import_selenium_webdriver19 = require("selenium-webdriver");
1548
- init_actions();
1549
1748
  TabPanelItem = class extends AbstractGroup {
1550
- constructor(parentCssSelector, elementCssSelector, driver) {
1551
- super(parentCssSelector, elementCssSelector, driver);
1749
+ constructor(parentCssSelector, elementCssSelector, page) {
1750
+ super(parentCssSelector, elementCssSelector, page);
1751
+ }
1752
+ get itemElement() {
1753
+ return this.getLocator();
1552
1754
  }
1553
1755
  async click() {
1554
- await click(await this.getElement(), this.driver);
1756
+ await this.itemElement.click();
1555
1757
  }
1556
1758
  async isActive() {
1557
- const tabPanelItemElement = await this.getElement();
1558
- const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver19.By.xpath('ancestor::div[@role="tab"][1]'));
1559
- return await grandparentTab.getAttribute("aria-selected") === "true";
1759
+ const tab = this.itemElement.locator('xpath=ancestor::div[@role="tab"][1]');
1760
+ return await tab.getAttribute("aria-selected") === "true";
1560
1761
  }
1561
1762
  async getTitle() {
1562
1763
  return "";
@@ -1564,7 +1765,11 @@ var init_TabPanel = __esm({
1564
1765
  };
1565
1766
  TabPanel = class extends AbstractGroup {
1566
1767
  item(name) {
1567
- return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
1768
+ return new TabPanelItem(
1769
+ this.getFullCssSelector(),
1770
+ `.tab-panel-item[data-groupname="${name}"]`,
1771
+ this.page
1772
+ );
1568
1773
  }
1569
1774
  async getTitle() {
1570
1775
  return "";
@@ -1574,37 +1779,35 @@ var init_TabPanel = __esm({
1574
1779
  });
1575
1780
 
1576
1781
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1577
- var import_selenium_webdriver20, ACCORDION_TITLE_CONTAINER, AccordionItem;
1782
+ var ACCORDION_TITLE_CONTAINER, AccordionItem;
1578
1783
  var init_AccordionItem = __esm({
1579
1784
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1580
1785
  "use strict";
1581
1786
  init_AbstractGroup();
1582
- import_selenium_webdriver20 = require("selenium-webdriver");
1583
- init_actions();
1584
- ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1787
+ ACCORDION_TITLE_CONTAINER = ".accordion-title-container";
1585
1788
  AccordionItem = class extends AbstractGroup {
1586
- constructor(parentCssSelector, elementCssSelector, driver) {
1587
- super(parentCssSelector, elementCssSelector, driver);
1789
+ constructor(parentCssSelector, elementCssSelector, page) {
1790
+ super(parentCssSelector, elementCssSelector, page);
1588
1791
  }
1589
1792
  async getDataOpenedAccordItemAttr() {
1590
- const accordionElement = await this.getElement();
1591
- return await accordionElement.getAttribute("data-opened");
1793
+ const locator = this.getLocator();
1794
+ if (await locator.isVisible()) {
1795
+ return locator.getAttribute("data-opened");
1796
+ }
1797
+ return "";
1592
1798
  }
1593
1799
  async clickAccordionItemTitle() {
1594
- const accordionElement = await this.getElement();
1595
- const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver20.By.className(ACCORDION_TITLE_CONTAINER));
1596
- await accordTitleElement.click();
1800
+ await this.getLocator().locator(ACCORDION_TITLE_CONTAINER).click();
1597
1801
  }
1598
1802
  async click() {
1599
- await click(await this.getElement(), this.driver);
1803
+ await this.getLocator().click();
1600
1804
  }
1601
1805
  async isExpanded() {
1602
- const dataOpened = await this.getDataOpenedAccordItemAttr();
1603
- return dataOpened === "true";
1806
+ return await this.getDataOpenedAccordItemAttr() === "true";
1604
1807
  }
1605
1808
  async isCollapsed() {
1606
- const dataOpened = await this.getDataOpenedAccordItemAttr();
1607
- return dataOpened === "false" || !dataOpened;
1809
+ const opened = await this.getDataOpenedAccordItemAttr();
1810
+ return opened === "false" || opened === null;
1608
1811
  }
1609
1812
  async expand() {
1610
1813
  if (!await this.isExpanded()) {
@@ -1628,11 +1831,11 @@ var init_Accordion = __esm({
1628
1831
  init_AbstractGroup();
1629
1832
  init_AccordionItem();
1630
1833
  Accordion = class extends AbstractGroup {
1631
- constructor(parentCssSelector, elementCssSelector, driver) {
1632
- super(parentCssSelector, elementCssSelector, driver);
1834
+ constructor(parentCssSelector, elementCssSelector, page) {
1835
+ super(parentCssSelector, elementCssSelector, page);
1633
1836
  }
1634
1837
  item(name) {
1635
- return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
1838
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.page);
1636
1839
  }
1637
1840
  };
1638
1841
  }
@@ -1648,14 +1851,14 @@ var init_groupFactory = __esm({
1648
1851
  init_TabPanel();
1649
1852
  init_Accordion();
1650
1853
  init_AccordionItem();
1651
- groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
1652
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1854
+ groupFactory = async (parentCssSelector, elementCssSelector, page) => {
1855
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1653
1856
  const classSting = await elementInstance.getClasses();
1654
- if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, driver);
1655
- if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
1656
- if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, driver);
1657
- if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, driver);
1658
- if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, driver);
1857
+ if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, page);
1858
+ if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, page);
1859
+ if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, page);
1860
+ if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, page);
1861
+ if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, page);
1659
1862
  throw new Error("Unknown type of group. Please write ticket to the support");
1660
1863
  };
1661
1864
  }
@@ -1674,23 +1877,23 @@ var init_FormGroup = __esm({
1674
1877
  init_TabPanel();
1675
1878
  FormGroup = class extends AbstractElementWithParent {
1676
1879
  groupInstance;
1677
- constructor(parentCssSelector, formName, name, driver) {
1678
- super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
1880
+ constructor(parentCssSelector, formName, name, page) {
1881
+ super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), page);
1679
1882
  }
1680
1883
  async initInstance() {
1681
1884
  if (!this.groupInstance) {
1682
- this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1885
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.page);
1683
1886
  }
1684
1887
  }
1685
1888
  /**
1686
1889
  * Возвращает булевое значение доступна ли группа
1687
1890
  * @example
1688
- * expect(await tableList.group('MainSuperPanel').isDisplayed();
1891
+ * expect(await tableList.group('MainSuperPanel').isVisible();
1689
1892
  */
1690
- async isDisplayed() {
1893
+ async isVisible() {
1691
1894
  try {
1692
1895
  await this.initInstance();
1693
- return this.groupInstance.isDisplayed();
1896
+ return this.groupInstance.isVisible();
1694
1897
  } catch {
1695
1898
  return false;
1696
1899
  }
@@ -1766,10 +1969,12 @@ var init_AbstractForm = __esm({
1766
1969
  AbstractForm = class extends AbstractPage {
1767
1970
  containerCssSelector = "";
1768
1971
  _formName = "";
1769
- containerBy;
1770
- getContainerElement = () => {
1771
- return this.driver.findElement(this.containerBy);
1772
- };
1972
+ get container() {
1973
+ return this.page.locator(this.containerCssSelector);
1974
+ }
1975
+ constructor(page) {
1976
+ super(page);
1977
+ }
1773
1978
  set formName(name) {
1774
1979
  this._formName = name;
1775
1980
  }
@@ -1786,22 +1991,20 @@ var init_AbstractForm = __esm({
1786
1991
  */
1787
1992
  async exists() {
1788
1993
  try {
1789
- let elements = await this.driver.findElements(this.containerBy);
1790
- if (elements.length === 0) {
1791
- return false;
1792
- }
1793
- await waitElementIsVisible_default({
1794
- element: elements[0],
1795
- errorMessage: "Element exists in DOM but is not visible",
1796
- driver: this.driver
1797
- });
1994
+ const container = this.page.locator(this.containerCssSelector);
1995
+ await waitElementIsVisible_default({ locator: container, timeout: 3e3 });
1798
1996
  return true;
1799
1997
  } catch (error) {
1800
1998
  return false;
1801
1999
  }
1802
2000
  }
1803
2001
  button(name) {
1804
- return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
2002
+ return new FormButton(
2003
+ this.containerCssSelector,
2004
+ this.formName,
2005
+ name,
2006
+ this.page
2007
+ );
1805
2008
  }
1806
2009
  /**
1807
2010
  * Находит группу на форме по имени
@@ -1811,7 +2014,12 @@ var init_AbstractForm = __esm({
1811
2014
  * expect(await formEdit.group('Name');
1812
2015
  */
1813
2016
  group(name) {
1814
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
2017
+ return new FormGroup(
2018
+ this.containerCssSelector,
2019
+ this.formName,
2020
+ name,
2021
+ this.page
2022
+ );
1815
2023
  }
1816
2024
  };
1817
2025
  }
@@ -1831,11 +2039,10 @@ function getCssRowByIndexSelector(index) {
1831
2039
  function getCssCellByIndexSelector(index) {
1832
2040
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1833
2041
  }
1834
- var import_selenium_webdriver21, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
2042
+ var getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1835
2043
  var init_utils2 = __esm({
1836
2044
  "src/pageObjects/elements/Table/utils.ts"() {
1837
2045
  "use strict";
1838
- import_selenium_webdriver21 = require("selenium-webdriver");
1839
2046
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1840
2047
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1841
2048
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1852,19 +2059,18 @@ var init_types3 = __esm({
1852
2059
  });
1853
2060
 
1854
2061
  // src/pageObjects/elements/Table/elements/Cell.ts
1855
- var import_selenium_webdriver22, Cell;
2062
+ var Cell;
1856
2063
  var init_Cell = __esm({
1857
2064
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1858
2065
  "use strict";
1859
- import_selenium_webdriver22 = require("selenium-webdriver");
1860
2066
  init_AbstractElementWithParent();
1861
2067
  init_utils2();
1862
2068
  init_types3();
1863
2069
  Cell = class extends AbstractElementWithParent {
1864
2070
  _index;
1865
2071
  getCellIndex;
1866
- constructor(parentCssSelector, getCellIndex, driver, index) {
1867
- super(parentCssSelector, getCssCellByIndexSelector(index), driver);
2072
+ constructor(parentCssSelector, getCellIndex, page, index) {
2073
+ super(parentCssSelector, getCssCellByIndexSelector(index), page);
1868
2074
  this.getCellIndex = getCellIndex;
1869
2075
  this._index = index;
1870
2076
  }
@@ -1873,25 +2079,27 @@ var init_Cell = __esm({
1873
2079
  this.elementCssSelector = getCssCellByIndexSelector(index);
1874
2080
  }
1875
2081
  async getBooleanValue(cellEl) {
1876
- const booleanEl = await cellEl.findElement(import_selenium_webdriver22.By.className("boolean-widget"));
1877
- return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
2082
+ const booleanEl = cellEl.locator(".boolean-widget");
2083
+ const checked = await booleanEl.getAttribute("aria-checked");
2084
+ return checked === "true" ? 1 : 0;
1878
2085
  }
1879
2086
  async getTagsValue(cellEl) {
1880
- const tagsCssSelector = ".multiselect-container .multiselect-cell";
1881
- const tags = await cellEl.findElements(import_selenium_webdriver22.By.css(tagsCssSelector));
2087
+ const tags = cellEl.locator(".multiselect-container .multiselect-cell");
2088
+ const count = await tags.count();
1882
2089
  const values = [];
1883
- for (const tag of tags) {
1884
- values.push(await tag.getAttribute("textContent"));
2090
+ for (let i = 0; i < count; i++) {
2091
+ const text = await tags.nth(i).innerText();
2092
+ if (text) values.push(text.trim());
1885
2093
  }
1886
2094
  return values.length ? values : null;
1887
2095
  }
1888
2096
  async getNumberValue(cellEl) {
1889
- const value = (await cellEl.getText()).trim();
1890
- return value == "" ? null : Number.parseFloat(value);
2097
+ const text = (await cellEl.innerText())?.trim() ?? "";
2098
+ return text === "" ? null : Number.parseFloat(text);
1891
2099
  }
1892
2100
  async getDateValue(cellEl, cellElClass) {
1893
- const value = (await cellEl.getText()).trim();
1894
- if (value === "") return null;
2101
+ const value = (await cellEl.innerText())?.trim() ?? "";
2102
+ if (!value) return null;
1895
2103
  const getDate = (stringDate) => {
1896
2104
  const isWithTime = cellElClass.includes("with-time");
1897
2105
  try {
@@ -1917,21 +2125,21 @@ var init_Cell = __esm({
1917
2125
  }
1918
2126
  return getDate(value);
1919
2127
  }
1920
- async getElement() {
2128
+ async getLocator() {
1921
2129
  if (this._index == null) {
1922
2130
  this.index = await this.getCellIndex();
1923
2131
  }
1924
- return super.getElement();
2132
+ return this.syncLocator();
1925
2133
  }
1926
2134
  async getValue() {
1927
- const cellEl = await this.getElement();
1928
- const cellElClass = await cellEl.getAttribute("class");
2135
+ const cellEl = await this.getLocator();
2136
+ const cellElClass = await cellEl.getAttribute("class") ?? "";
1929
2137
  if (cellElClass.includes("boolean-column" /* Boolean */)) return this.getBooleanValue(cellEl);
1930
2138
  if (cellElClass.includes("tags-column" /* Tags */)) return this.getTagsValue(cellEl);
1931
2139
  if (cellElClass.includes("number-column" /* Number */)) return this.getNumberValue(cellEl);
1932
2140
  if (cellElClass.includes("date-column" /* Date */)) return this.getDateValue(cellEl, cellElClass);
1933
- const cellText = await cellEl.getText();
1934
- return cellText == "" ? null : cellText;
2141
+ const cellText = (await cellEl.innerText())?.trim() ?? "";
2142
+ return cellText === "" ? null : cellText;
1935
2143
  }
1936
2144
  getIndex() {
1937
2145
  return this._index;
@@ -1941,17 +2149,14 @@ var init_Cell = __esm({
1941
2149
  });
1942
2150
 
1943
2151
  // src/pageObjects/elements/Table/elements/Row.ts
1944
- var import_selenium_webdriver23, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, FIRST_CLICKED_CELL_SELECTOR, Row;
2152
+ var DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, FIRST_CLICKED_CELL_SELECTOR, Row;
1945
2153
  var init_Row = __esm({
1946
2154
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1947
2155
  "use strict";
1948
- import_selenium_webdriver23 = require("selenium-webdriver");
1949
2156
  init_Cell();
1950
2157
  init_utils2();
1951
2158
  init_AbstractElementWithParent();
1952
- init_actions();
1953
2159
  init_wait();
1954
- init_fixElementStaleError();
1955
2160
  DX_SELECTION_CLASS = "dx-selection";
1956
2161
  DX_ROW_EDIT_CLASS = "dx-edit-row";
1957
2162
  DX_DATA_ROW_CLASS = "dx-data-row";
@@ -1964,11 +2169,11 @@ var init_Row = __esm({
1964
2169
  * @param parentCssSelector
1965
2170
  * @param fixedTableContentCssSelector
1966
2171
  * @param index починається з 0 (в getCssRowByIndexSelector додається +1)
1967
- * @param driver
2172
+ * @param page
1968
2173
  * @param getColumnBy
1969
2174
  */
1970
- constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
1971
- super(parentCssSelector, getCssRowByIndexSelector(index), driver);
2175
+ constructor(parentCssSelector, fixedTableContentCssSelector, index, page, getColumnBy) {
2176
+ super(parentCssSelector, getCssRowByIndexSelector(index), page);
1972
2177
  this.index = index;
1973
2178
  this.getColumnBy = getColumnBy;
1974
2179
  this.fixedTableContentCssSelector = fixedTableContentCssSelector;
@@ -1976,10 +2181,8 @@ var init_Row = __esm({
1976
2181
  _getCell({ index, name, title }) {
1977
2182
  return new Cell(
1978
2183
  this.getFullCssSelector(),
1979
- () => {
1980
- return this.getColumnBy({ title, name }).getIndex();
1981
- },
1982
- this.driver,
2184
+ () => this.getColumnBy({ title, name }).getIndex(),
2185
+ this.page,
1983
2186
  index
1984
2187
  );
1985
2188
  }
@@ -1993,61 +2196,56 @@ var init_Row = __esm({
1993
2196
  return this._getCell({ title });
1994
2197
  }
1995
2198
  async select(preserve = false) {
1996
- await staleElementAction(async () => {
1997
- const rowEl = await this.getElement();
1998
- const isSelected = (await this.getClasses()).includes(DX_SELECTION_CLASS);
1999
- const clickedElement = await rowEl.findElement(import_selenium_webdriver23.By.css(FIRST_CLICKED_CELL_SELECTOR));
2000
- if (isSelected && !preserve) {
2001
- await this.driver.actions({ async: true }).keyUp(import_selenium_webdriver23.Key.CONTROL).perform();
2002
- }
2003
- if (preserve && !isSelected) {
2004
- await this.driver.actions({ async: true }).keyDown(import_selenium_webdriver23.Key.CONTROL).perform();
2005
- await click(clickedElement, this.driver);
2006
- return;
2007
- }
2008
- await click(clickedElement, this.driver);
2009
- });
2010
- await safeWait(
2199
+ const rowEl = this.getLocator();
2200
+ const classes = await this.getClasses();
2201
+ const isSelected = classes.includes(DX_SELECTION_CLASS);
2202
+ const clickedElement = rowEl.locator(FIRST_CLICKED_CELL_SELECTOR);
2203
+ if (isSelected && !preserve) {
2204
+ await this.page.keyboard.up("Control");
2205
+ }
2206
+ if (preserve && !isSelected) {
2207
+ await this.page.keyboard.down("Control");
2208
+ await clickedElement.click();
2209
+ return;
2210
+ }
2211
+ await clickedElement.click();
2212
+ await wait(
2011
2213
  async () => {
2012
- const classes = await this.getClasses();
2013
- return classes.includes(DX_SELECTION_CLASS);
2214
+ const classes2 = await this.getClasses();
2215
+ return classes2.includes(DX_SELECTION_CLASS);
2014
2216
  },
2015
- this.driver,
2217
+ this.page,
2016
2218
  "Cannot select row"
2017
2219
  );
2018
2220
  }
2019
2221
  async isSelected() {
2020
- const result = await this.getAttribute("aria-selected");
2021
- return result === "true";
2222
+ const rowEl = this.getLocator();
2223
+ const ariaSelected = await rowEl.getAttribute("aria-selected");
2224
+ return ariaSelected === "true";
2022
2225
  }
2023
2226
  getIndex() {
2024
2227
  return this.index;
2025
2228
  }
2026
2229
  async getCells() {
2027
- const cells = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
2230
+ const rowEl = this.getLocator();
2231
+ const cellsCount = await rowEl.locator('td[role="gridcell"]').count();
2028
2232
  const result = [];
2029
- cells.forEach((_, index) => {
2030
- const newCell = this.getCellByIndex(index);
2031
- result.push(newCell);
2032
- });
2233
+ for (let i = 0; i < cellsCount; i++) {
2234
+ result.push(this.getCellByIndex(i));
2235
+ }
2033
2236
  return result;
2034
2237
  }
2035
2238
  async clickInlineButton(buttonClass) {
2036
- const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
2037
- this.index
2038
- )}"] .${buttonClass}`;
2039
- const by = import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
2040
- await staleElementAction(async () => {
2041
- const button = await fixElementStaleError(by, this.driver);
2042
- await click(button, this.driver);
2043
- });
2239
+ const buttonSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
2240
+ const button = this.page.locator(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonSelector}`);
2241
+ await button.click();
2044
2242
  }
2045
2243
  async checkEditingMode(isEditing, msg) {
2046
- await safeWait(
2244
+ await wait(
2047
2245
  async () => {
2048
2246
  return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
2049
2247
  },
2050
- this.driver,
2248
+ this.page,
2051
2249
  msg
2052
2250
  );
2053
2251
  }
@@ -2068,39 +2266,37 @@ var init_Row = __esm({
2068
2266
  });
2069
2267
 
2070
2268
  // src/pageObjects/elements/Table/elements/Column.ts
2071
- var import_selenium_webdriver24, Column;
2269
+ var Column;
2072
2270
  var init_Column = __esm({
2073
2271
  "src/pageObjects/elements/Table/elements/Column.ts"() {
2074
2272
  "use strict";
2075
- import_selenium_webdriver24 = require("selenium-webdriver");
2076
2273
  init_utils2();
2077
2274
  init_AbstractElementWithParent();
2078
- init_fixElementStaleError();
2079
2275
  Column = class extends AbstractElementWithParent {
2080
2276
  _index;
2081
2277
  _caption;
2082
2278
  _name;
2083
2279
  headerCssSelector;
2084
- constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
2085
- super(parentCssSelector, "", driver);
2280
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, page }) {
2281
+ super(parentCssSelector, "", page);
2086
2282
  this._name = name;
2283
+ this.headerCssSelector = headerCssSelector;
2087
2284
  this.index = index;
2088
2285
  this._caption = caption;
2089
- this.headerCssSelector = headerCssSelector;
2090
2286
  }
2091
2287
  set index(index) {
2092
2288
  this._index = index;
2093
- this.elementCssSelector = getColumnByIndexCssSelector(index);
2289
+ this.elementCssSelector = `${this.headerCssSelector} ${getColumnByIndexCssSelector(index)}`;
2094
2290
  }
2095
2291
  get index() {
2096
2292
  return this._index;
2097
2293
  }
2098
- async getElement() {
2294
+ async getLocator() {
2099
2295
  await this.getIndex();
2100
- return super.getElement();
2296
+ return this.syncLocator();
2101
2297
  }
2102
2298
  async getColumnHeaderIndexBy(cssSelector) {
2103
- const column = await fixElementStaleError(import_selenium_webdriver24.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
2299
+ const column = this.page.locator(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`);
2104
2300
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
2105
2301
  }
2106
2302
  async getIndexByCaption() {
@@ -2110,13 +2306,12 @@ var init_Column = __esm({
2110
2306
  return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
2111
2307
  }
2112
2308
  async caption() {
2113
- const el = await this.getElement();
2114
- return el.getText();
2309
+ const el = await this.getLocator();
2310
+ const text = await el.innerText();
2311
+ return text?.trim() ?? null;
2115
2312
  }
2116
2313
  async getIndex() {
2117
- if (this.index != null) {
2118
- return this.index;
2119
- }
2314
+ if (this.index != null) return this.index;
2120
2315
  if (this._caption != null) {
2121
2316
  this.index = await this.getIndexByCaption();
2122
2317
  return this.index;
@@ -2125,7 +2320,7 @@ var init_Column = __esm({
2125
2320
  this.index = await this.getIndexByName();
2126
2321
  return this.index;
2127
2322
  }
2128
- throw new Error("Cant get the index in the column");
2323
+ throw new Error("Cannot get the index in the column");
2129
2324
  }
2130
2325
  };
2131
2326
  }
@@ -2139,31 +2334,24 @@ var init_EditorButton = __esm({
2139
2334
  init_locators();
2140
2335
  init_createDataTestId();
2141
2336
  init_AbstractElementWithParent();
2142
- init_waitElementIsClickable();
2143
- init_actions();
2144
2337
  EditorButton = class extends AbstractElementWithParent {
2145
2338
  name;
2146
- constructor(parentCssSelector, name, driver) {
2147
- super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
2339
+ constructor(parentCssSelector, name, page) {
2340
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), page);
2148
2341
  this.name = name;
2149
2342
  }
2150
2343
  buttonNotDisplayedError() {
2151
2344
  return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
2152
2345
  }
2153
2346
  async click() {
2154
- const button = await this.getElement();
2155
- await waitElementIsClickable_default({
2156
- element: button,
2157
- errorMessage: this.buttonNotDisplayedError(),
2158
- driver: this.driver
2159
- });
2160
- await click(button, this.driver);
2347
+ const button = this.getLocator();
2348
+ await button.click();
2161
2349
  }
2162
- async isDisplayed() {
2350
+ async isVisible() {
2163
2351
  try {
2164
- const button = await this.getElement();
2165
- return await button.isDisplayed();
2166
- } catch (error) {
2352
+ const button = this.getLocator();
2353
+ return await button.isVisible();
2354
+ } catch {
2167
2355
  return false;
2168
2356
  }
2169
2357
  }
@@ -2171,6 +2359,25 @@ var init_EditorButton = __esm({
2171
2359
  }
2172
2360
  });
2173
2361
 
2362
+ // src/pageObjects/elements/EditorTitle.ts
2363
+ var CAPTION_TEXT_CLASS, EditorTitle;
2364
+ var init_EditorTitle = __esm({
2365
+ "src/pageObjects/elements/EditorTitle.ts"() {
2366
+ "use strict";
2367
+ init_AbstractElementWithParent();
2368
+ CAPTION_TEXT_CLASS = " .caption-text";
2369
+ EditorTitle = class extends AbstractElementWithParent {
2370
+ constructor({ parentCssSelector, elementCssSelector, page }) {
2371
+ super(parentCssSelector, elementCssSelector, page);
2372
+ }
2373
+ async getTitle() {
2374
+ const captionElement = this.getLocator().locator(CAPTION_TEXT_CLASS);
2375
+ return captionElement.innerText();
2376
+ }
2377
+ };
2378
+ }
2379
+ });
2380
+
2174
2381
  // src/pageObjects/elements/AbstractEditor.ts
2175
2382
  var AbstractEditor;
2176
2383
  var init_AbstractEditor2 = __esm({
@@ -2179,14 +2386,17 @@ var init_AbstractEditor2 = __esm({
2179
2386
  init_AbstractElementWithParent();
2180
2387
  init_Editors();
2181
2388
  init_EditorButton();
2389
+ init_EditorTitle();
2182
2390
  AbstractEditor = class extends AbstractElementWithParent {
2183
2391
  editor;
2184
- constructor(parentCssSelector, elementCssSelector, driver) {
2185
- super(parentCssSelector, elementCssSelector, driver);
2392
+ _titleCssSelector;
2393
+ constructor({ parentCssSelector, elementCssSelector, titleCssSelector, page }) {
2394
+ super(parentCssSelector, elementCssSelector, page);
2395
+ this._titleCssSelector = titleCssSelector;
2186
2396
  }
2187
2397
  async initEditor() {
2188
2398
  if (!this.editor) {
2189
- this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
2399
+ this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.page);
2190
2400
  }
2191
2401
  }
2192
2402
  /**
@@ -2254,16 +2464,16 @@ var init_AbstractEditor2 = __esm({
2254
2464
  return this.editor.isDisabled();
2255
2465
  }
2256
2466
  /**
2257
- * Возвращает значение true|false в зависимости isDisplayed поле или нет
2467
+ * Возвращает значение true|false в зависимости isVisible поле или нет
2258
2468
  * @example
2259
- * expect(await formEdit.field('NumberFld').isDisplayed()).toBe(true);
2260
- * expect(await formEdit.field('TextFld').isDisplayed()).toBe(false);
2469
+ * expect(await formEdit.field('NumberFld').isVisible()).toBe(true);
2470
+ * expect(await formEdit.field('TextFld').isVisible()).toBe(false);
2261
2471
  */
2262
- async isDisplayed() {
2472
+ async isVisible() {
2263
2473
  try {
2264
2474
  await this.initEditor();
2265
- const element = await this.getElement();
2266
- return await element.isDisplayed();
2475
+ const element = this.getLocator();
2476
+ return await element.isVisible();
2267
2477
  } catch {
2268
2478
  return false;
2269
2479
  }
@@ -2276,7 +2486,33 @@ var init_AbstractEditor2 = __esm({
2276
2486
  * await form.field('Name').button('editorButton).click()
2277
2487
  */
2278
2488
  button(name) {
2279
- return new EditorButton(this.getFullCssSelector(), name, this.driver);
2489
+ return new EditorButton(this.getFullCssSelector(), name, this.page);
2490
+ }
2491
+ /**
2492
+ * Повертає загловок едітора
2493
+ * @example
2494
+ * expect(await formEdit.field('NumberFld').title()).toBe('Title1');
2495
+ * expect(await formEdit.field('TextFld').title()).toBe('Title2`);
2496
+ */
2497
+ async title() {
2498
+ return new EditorTitle({
2499
+ elementCssSelector: this._titleCssSelector,
2500
+ parentCssSelector: this.parentCssSelector,
2501
+ page: this.page
2502
+ }).getTitle();
2503
+ }
2504
+ /**
2505
+ * Вивантажує файл і повертає назву файла. Доступний тільки для поля FileUploader.
2506
+ * @example
2507
+ * const fileName = await formEdit.field('FileField').downloadFile();
2508
+ * expect(filename()).toBe('file.pdf');
2509
+ */
2510
+ async download() {
2511
+ await this.initEditor();
2512
+ if (!this.editor.download) {
2513
+ throw new Error("download is only available for the FileUploader field type.");
2514
+ }
2515
+ return this.editor.download();
2280
2516
  }
2281
2517
  };
2282
2518
  }
@@ -2287,39 +2523,18 @@ var FormField;
2287
2523
  var init_FormField = __esm({
2288
2524
  "src/pageObjects/elements/FormField.ts"() {
2289
2525
  "use strict";
2290
- init_locators();
2291
- init_createDataTestId();
2292
- init_AbstractEditor2();
2293
- FormField = class extends AbstractEditor {
2294
- constructor(parentCssSelector, formName, name, driver) {
2295
- super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
2296
- }
2297
- };
2298
- }
2299
- });
2300
-
2301
- // src/utils/typesUtil.ts
2302
- var import_util, types, type, isArray, isString;
2303
- var init_typesUtil = __esm({
2304
- "src/utils/typesUtil.ts"() {
2305
- "use strict";
2306
- import_util = require("selenium-webdriver/lib/util");
2307
- types = {
2308
- "[object Array]": "array",
2309
- "[object Date]": "date",
2310
- "[object Object]": "object",
2311
- "[object String]": "string",
2312
- "[object Null]": "null"
2313
- };
2314
- type = function(object) {
2315
- const typeOfObject = Object.prototype.toString.call(object);
2316
- return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
2317
- };
2318
- isArray = function(value) {
2319
- return type(value) === "array";
2320
- };
2321
- isString = function(object) {
2322
- return typeof object === "string";
2526
+ init_locators();
2527
+ init_createDataTestId();
2528
+ init_AbstractEditor2();
2529
+ FormField = class extends AbstractEditor {
2530
+ constructor(parentCssSelector, formName, name, page) {
2531
+ super({
2532
+ parentCssSelector,
2533
+ elementCssSelector: byTestIdCssSelector(createFieldTestId(formName, name)),
2534
+ titleCssSelector: byTestIdCssSelector(createLabelFieldTestId(formName, name)),
2535
+ page
2536
+ });
2537
+ }
2323
2538
  };
2324
2539
  }
2325
2540
  });
@@ -2330,32 +2545,21 @@ var init_AbstractDropDownMenuList = __esm({
2330
2545
  "src/pageObjects/elements/AbstractDropDownMenuList.ts"() {
2331
2546
  "use strict";
2332
2547
  init_AbstractElementWithParent();
2333
- init_actions();
2334
- init_waitElementIsClickable();
2335
- init_fixElementStaleError();
2336
2548
  init_typesUtil();
2337
2549
  AbstractDropDownMenuList = class extends AbstractElementWithParent {
2338
- buttonNotDisplayedError(name) {
2339
- return `Menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
2340
- }
2341
- async clickItemBy(errorMessage, by) {
2342
- await waitElementIsClickable_default({
2343
- errorMessage,
2344
- driver: this.driver,
2345
- by
2346
- });
2347
- const menuItemElement = await fixElementStaleError(by, this.driver);
2348
- await click(menuItemElement, this.driver);
2550
+ async clickItemBy(locator) {
2551
+ const menuItemElement = this.page.locator(locator);
2552
+ await menuItemElement.click();
2349
2553
  }
2350
- async getElementByPath(path2, getBy, returnLastElement = false) {
2351
- let pathList = isString(path2) ? [path2] : path2;
2554
+ async getElementByPath(path, getBy, returnLastElement = false) {
2555
+ let pathList = isString(path) ? [path] : path;
2352
2556
  let result = null;
2353
2557
  let index = 1;
2354
2558
  for (let text of pathList) {
2355
2559
  if (!returnLastElement || index < pathList.length) {
2356
- await this.clickItemBy(this.buttonNotDisplayedError(text), getBy(text));
2560
+ await this.clickItemBy(getBy(text));
2357
2561
  } else {
2358
- result = await fixElementStaleError(getBy(text), this.driver);
2562
+ result = this.page.locator(getBy(text));
2359
2563
  }
2360
2564
  index++;
2361
2565
  }
@@ -2380,26 +2584,12 @@ var init_AbstractDropDownMenuList = __esm({
2380
2584
  }
2381
2585
  });
2382
2586
 
2383
- // src/utils/cssToXPath.ts
2384
- function cssClassesToXPath(classNames) {
2385
- const classNamesList = classNames.split(".").filter((className) => !!className);
2386
- const chained = classNamesList.map((className) => `contains(@class, "${className}")`).join(" and ");
2387
- return `[${chained}]`;
2388
- }
2389
- var init_cssToXPath = __esm({
2390
- "src/utils/cssToXPath.ts"() {
2391
- "use strict";
2392
- }
2393
- });
2394
-
2395
2587
  // src/pageObjects/elements/DXContextMenuList.ts
2396
- var import_selenium_webdriver25, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2588
+ var CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2397
2589
  var init_DXContextMenuList = __esm({
2398
2590
  "src/pageObjects/elements/DXContextMenuList.ts"() {
2399
2591
  "use strict";
2400
2592
  init_AbstractDropDownMenuList();
2401
- import_selenium_webdriver25 = require("selenium-webdriver");
2402
- init_cssToXPath();
2403
2593
  init_waitElementIsVisible();
2404
2594
  CONTEXT_MENU_CLASS = "dx-context-menu";
2405
2595
  CONTEXT_MENU_ITEM_TEXT_CLASS = "dx-menu-item-text";
@@ -2407,23 +2597,21 @@ var init_DXContextMenuList = __esm({
2407
2597
  /**
2408
2598
  * @param parentCssSelector
2409
2599
  * @param classNames - Список класів. Починається з крапки
2410
- * @param driver
2600
+ * @param page
2411
2601
  */
2412
- constructor(parentCssSelector, classNames, driver) {
2413
- super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, driver);
2602
+ constructor(parentCssSelector, classNames, page) {
2603
+ super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, page);
2414
2604
  }
2415
2605
  getButtonTitleBy(title) {
2416
- const buttonByTextXpath2 = (text) => `//span[contains(@class, "${CONTEXT_MENU_ITEM_TEXT_CLASS}") and contains(text(), "${text}")]`;
2417
- const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
2418
- return import_selenium_webdriver25.By.xpath(xpath);
2606
+ return `${this.elementCssSelector} span.${CONTEXT_MENU_ITEM_TEXT_CLASS}:has-text("${title}")`;
2419
2607
  }
2420
2608
  async isVisible() {
2421
2609
  try {
2610
+ const el = this.page.locator(`.dx-overlay-wrapper .${CONTEXT_MENU_CLASS}`);
2422
2611
  await waitElementIsVisible_default({
2423
- element: await this.driver.findElement(import_selenium_webdriver25.By.css(`.dx-overlay-wrapper .dx-context-menu`)),
2424
- driver: this.driver,
2425
- errorMessage: "Cannot find dropdown element"
2612
+ locator: el
2426
2613
  });
2614
+ return true;
2427
2615
  } catch {
2428
2616
  return false;
2429
2617
  }
@@ -2442,8 +2630,8 @@ var init_ContextMenu = __esm({
2442
2630
  ContextMenu = class extends DXContextMenuList {
2443
2631
  _formName;
2444
2632
  _initFn;
2445
- constructor(cssClass, formName, driver) {
2446
- super("", cssClass, driver);
2633
+ constructor(cssClass, formName, page) {
2634
+ super("", cssClass, page);
2447
2635
  this._formName = formName;
2448
2636
  }
2449
2637
  setInit(cb) {
@@ -2451,7 +2639,7 @@ var init_ContextMenu = __esm({
2451
2639
  return this;
2452
2640
  }
2453
2641
  getButtonNameBy(name) {
2454
- return byTestId(`cm-${this._formName}-${name}`);
2642
+ return byTestIdCssSelector(`cm-${this._formName}-${name}`);
2455
2643
  }
2456
2644
  async clickButtonByTitle(title) {
2457
2645
  await this._initFn?.();
@@ -2466,20 +2654,17 @@ var init_ContextMenu = __esm({
2466
2654
  });
2467
2655
 
2468
2656
  // src/pageObjects/elements/Table/Table.ts
2469
- var import_selenium_webdriver26, Table;
2657
+ var Table;
2470
2658
  var init_Table = __esm({
2471
2659
  "src/pageObjects/elements/Table/Table.ts"() {
2472
2660
  "use strict";
2473
- import_selenium_webdriver26 = require("selenium-webdriver");
2474
2661
  init_createDataTestId();
2475
2662
  init_AbstractElementWithParent();
2476
2663
  init_Row();
2477
2664
  init_Column();
2478
2665
  init_FormField();
2479
2666
  init_ContextMenu();
2480
- init_actions();
2481
2667
  init_wait();
2482
- init_withCustomTimeouts();
2483
2668
  Table = class extends AbstractElementWithParent {
2484
2669
  formName;
2485
2670
  headerCssSelector;
@@ -2493,9 +2678,9 @@ var init_Table = __esm({
2493
2678
  headerCssSelector,
2494
2679
  fixedTableContentCssSelector,
2495
2680
  formName,
2496
- driver
2681
+ page
2497
2682
  }) {
2498
- super(parentCssSelector, `#${createTableId(formName)}`, driver);
2683
+ super(parentCssSelector, `#${createTableId(formName)}`, page);
2499
2684
  this.formName = formName;
2500
2685
  this.headerCssSelector = headerCssSelector;
2501
2686
  this.contextMenuCssSelector = contextMenuCssSelector;
@@ -2513,7 +2698,7 @@ var init_Table = __esm({
2513
2698
  * @param index починається з 0
2514
2699
  */
2515
2700
  getRowByIndex(index) {
2516
- return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
2701
+ return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.page, this.getColumnBy);
2517
2702
  }
2518
2703
  /**
2519
2704
  * @param index починається з 0
@@ -2522,26 +2707,27 @@ var init_Table = __esm({
2522
2707
  this.getRowByIndex(index);
2523
2708
  return new Column({
2524
2709
  parentCssSelector: this.getFullCssSelector(),
2525
- driver: this.driver,
2710
+ headerCssSelector: this.headerCssSelector,
2711
+ page: this.page,
2526
2712
  index
2527
2713
  });
2528
2714
  }
2529
- getColumnByTitle = (title) => {
2715
+ getColumnByTitle(title) {
2530
2716
  return new Column({
2531
2717
  parentCssSelector: this.getFullCssSelector(),
2532
2718
  headerCssSelector: this.headerCssSelector,
2533
2719
  caption: title,
2534
- driver: this.driver
2720
+ page: this.page
2535
2721
  });
2536
- };
2537
- getColumnByName = (name) => {
2722
+ }
2723
+ getColumnByName(name) {
2538
2724
  return new Column({
2539
2725
  parentCssSelector: this.getFullCssSelector(),
2540
2726
  headerCssSelector: this.headerCssSelector,
2541
2727
  name,
2542
- driver: this.driver
2728
+ page: this.page
2543
2729
  });
2544
- };
2730
+ }
2545
2731
  /**
2546
2732
  * Вибрати рядок по індексу.
2547
2733
  * @param index починається з 0
@@ -2559,48 +2745,31 @@ var init_Table = __esm({
2559
2745
  await this.selectRowByIndex(index, true);
2560
2746
  }
2561
2747
  }
2562
- getRowElements(timeout) {
2563
- const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
2564
- return withCustomTimeouts_default({
2565
- driver: this.driver,
2566
- timeout,
2567
- callback: () => {
2568
- return this.driver.findElements(import_selenium_webdriver26.By.css(rowsFullCssSelector));
2569
- }
2570
- });
2748
+ getRowElements() {
2749
+ const rowsSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
2750
+ return this.page.locator(rowsSelector);
2571
2751
  }
2572
2752
  async getRows() {
2573
- const rows = await this.getRowElements();
2753
+ const rowCount = await this.getRowElements().count();
2574
2754
  const result = [];
2575
- rows.forEach((_, index) => {
2576
- const newRow = new Row(
2577
- this.getFullCssSelector(),
2578
- this.fixedTableContentCssSelector,
2579
- index,
2580
- this.driver,
2581
- this.getColumnBy
2582
- );
2583
- result.push(newRow);
2584
- });
2755
+ for (let i = 0; i < rowCount; i++) {
2756
+ result.push(this.getRowByIndex(i));
2757
+ }
2585
2758
  return result;
2586
2759
  }
2587
2760
  async getColumns() {
2588
- const columns = await this.driver.findElements(
2589
- import_selenium_webdriver26.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`)
2761
+ const columnsLocator = this.page.locator(
2762
+ `${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`
2590
2763
  );
2764
+ const count = await columnsLocator.count();
2591
2765
  const result = [];
2592
- columns.forEach((_, index) => {
2593
- const newCol = new Column({
2594
- parentCssSelector: this.getFullCssSelector(),
2595
- index,
2596
- driver: this.driver
2597
- });
2598
- result.push(newCol);
2599
- });
2766
+ for (let i = 0; i < count; i++) {
2767
+ result.push(new Column({ parentCssSelector: this.getFullCssSelector(), page: this.page, index: i }));
2768
+ }
2600
2769
  return result;
2601
2770
  }
2602
2771
  element() {
2603
- return this.getElement();
2772
+ return this.getLocator();
2604
2773
  }
2605
2774
  /**
2606
2775
  * Находит поле когда форма находится в состоянии редактирования
@@ -2610,7 +2779,7 @@ var init_Table = __esm({
2610
2779
  * expect(await form.field('Name').getValue()).toBe('test value');
2611
2780
  */
2612
2781
  field(name) {
2613
- return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
2782
+ return new FormField(this.getFullCssSelector(), this.formName, name, this.page);
2614
2783
  }
2615
2784
  /**
2616
2785
  * Возвращает список строк которые выделены
@@ -2622,11 +2791,11 @@ var init_Table = __esm({
2622
2791
  */
2623
2792
  async getSelectedRows() {
2624
2793
  const rows = await this.getRows();
2625
- let result = [];
2794
+ const result = [];
2626
2795
  for (const row of rows) {
2627
2796
  if (await row.isSelected()) {
2797
+ result.push(row);
2628
2798
  }
2629
- result.push(row);
2630
2799
  }
2631
2800
  return result;
2632
2801
  }
@@ -2643,17 +2812,16 @@ var init_Table = __esm({
2643
2812
  * await form.contextMenu('FieldName', 3).clickButton(['Group', 'ButtonInGroup']);
2644
2813
  */
2645
2814
  contextMenu(fieldName, rowIndex) {
2646
- return new ContextMenu(this.contextMenuCssSelector, this.formName, this.driver).setInit(async () => {
2815
+ return new ContextMenu(this.contextMenuCssSelector, this.formName, this.page).setInit(async () => {
2647
2816
  let row;
2648
2817
  if (rowIndex != null) {
2649
2818
  row = this.getRowByIndex(rowIndex);
2650
2819
  } else {
2651
2820
  [row] = await this.getSelectedRows();
2652
2821
  }
2653
- if (!row)
2654
- throw new Error("No row available row for context menu");
2655
- const cellElement = await row.getCell(fieldName).getElement();
2656
- await contextMenu(cellElement, this.driver);
2822
+ if (!row) throw new Error("No row available row for context menu");
2823
+ const cellElement = await row.getCell(fieldName).getLocator();
2824
+ await cellElement.click({ button: "right" });
2657
2825
  });
2658
2826
  }
2659
2827
  /**
@@ -2665,16 +2833,14 @@ var init_Table = __esm({
2665
2833
  * @returns {Promise<string>} Повертає значення комірки
2666
2834
  *
2667
2835
  * @example
2668
- * const table = new Table(driver);
2836
+ * const table = new Table(page);
2669
2837
  *
2670
2838
  * // Отримання значення комірки 'Name' в першому рядку (індекс 0)
2671
2839
  * const cellValue = await table.getCellValueByCellName('Name', 0);
2672
2840
  * expect(cellValue).toBe('Очікуване значення');
2673
2841
  */
2674
2842
  getCellValueByCellName(cellName, rowIndex) {
2675
- if (rowIndex == null) {
2676
- throw new Error("Error: getCellValue(): rowIndex is required");
2677
- }
2843
+ if (rowIndex == null) throw new Error("Error: getCellValue(): rowIndex is required");
2678
2844
  const row = this.getRowByIndex(rowIndex);
2679
2845
  return row.getCell(cellName).getValue();
2680
2846
  }
@@ -2684,19 +2850,15 @@ var init_Table = __esm({
2684
2850
  * @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
2685
2851
  *
2686
2852
  * @example
2687
- * const table = new Table(driver);
2853
+ * const table = new Table(page);
2688
2854
  *
2689
2855
  * // Перевірка чи порожня таблиця
2690
2856
  * const empty = await table.isEmpty();
2691
2857
  * expect(empty).toBe(true);
2692
2858
  */
2693
2859
  async isEmpty() {
2694
- try {
2695
- await this.waitRowsCount(0);
2696
- return true;
2697
- } catch {
2698
- return false;
2699
- }
2860
+ const rowCount = await this.getRowElements().count();
2861
+ return rowCount === 0;
2700
2862
  }
2701
2863
  /**
2702
2864
  * Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
@@ -2707,7 +2869,7 @@ var init_Table = __esm({
2707
2869
  * @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
2708
2870
  *
2709
2871
  * @example
2710
- * const table = new Table(driver);
2872
+ * const table = new Table(page);
2711
2873
  *
2712
2874
  * // Очікування, поки таблиця не стане порожньою
2713
2875
  * await table.waitRowsCount(0);
@@ -2717,21 +2879,24 @@ var init_Table = __esm({
2717
2879
  * console.log('Таблиця містить 5 рядків');
2718
2880
  */
2719
2881
  async waitRowsCount(count) {
2720
- await safeWait(async () => {
2721
- const rows = await this.getRowElements(1e3);
2722
- return rows.length === count;
2723
- }, this.driver, `Rows count not equal: ${count}`);
2882
+ await wait(
2883
+ async () => {
2884
+ const rowsCount = await this.getRowElements().count();
2885
+ return rowsCount === count;
2886
+ },
2887
+ this.page,
2888
+ `Rows count not equal: ${count}`
2889
+ );
2724
2890
  }
2725
2891
  };
2726
2892
  }
2727
2893
  });
2728
2894
 
2729
2895
  // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
2730
- var import_selenium_webdriver27, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
2896
+ var TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
2731
2897
  var init_ToolbarButton = __esm({
2732
2898
  "src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
2733
2899
  "use strict";
2734
- import_selenium_webdriver27 = require("selenium-webdriver");
2735
2900
  init_AbstractButton();
2736
2901
  init_locators();
2737
2902
  TOOLBAR_BUTTON_CLASS = "toolbar-button";
@@ -2741,8 +2906,8 @@ var init_ToolbarButton = __esm({
2741
2906
  getToolbarButtonTextByTestIdSelector = (testId) => `${byTestIdCssSelector(testId)} .${TOOLBAR_BUTTON_TEXT_CLASS}`;
2742
2907
  ToolbarButton = class extends AbstractButton {
2743
2908
  name;
2744
- constructor(parentCssSelector, name, driver) {
2745
- super(parentCssSelector, getToolbarButtonSelector(name), driver);
2909
+ constructor(parentCssSelector, name, page) {
2910
+ super(parentCssSelector, getToolbarButtonSelector(name), page);
2746
2911
  this.name = name;
2747
2912
  }
2748
2913
  buttonNotDisplayedError() {
@@ -2750,8 +2915,8 @@ var init_ToolbarButton = __esm({
2750
2915
  }
2751
2916
  async getTitle() {
2752
2917
  try {
2753
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
2754
- return await buttonTextContainer.getText();
2918
+ const buttonTextContainer = this.page.locator(getToolbarButtonTextSelector(this.name));
2919
+ return await buttonTextContainer.innerText();
2755
2920
  } catch (_) {
2756
2921
  return null;
2757
2922
  }
@@ -2761,17 +2926,16 @@ var init_ToolbarButton = __esm({
2761
2926
  });
2762
2927
 
2763
2928
  // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
2764
- var import_selenium_webdriver28, ToolbarGroupButton;
2929
+ var ToolbarGroupButton;
2765
2930
  var init_ToolbarGroupButton = __esm({
2766
2931
  "src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
2767
2932
  "use strict";
2768
2933
  init_AbstractButton();
2769
- import_selenium_webdriver28 = require("selenium-webdriver");
2770
2934
  init_ToolbarButton();
2771
2935
  ToolbarGroupButton = class extends AbstractButton {
2772
2936
  name;
2773
- constructor(parentCssSelector, name, driver) {
2774
- super(parentCssSelector, ``, driver);
2937
+ constructor(parentCssSelector, name, page) {
2938
+ super(parentCssSelector, ``, page);
2775
2939
  this.name = name;
2776
2940
  }
2777
2941
  buttonNotDisplayedError() {
@@ -2780,8 +2944,8 @@ var init_ToolbarGroupButton = __esm({
2780
2944
  async getTitle() {
2781
2945
  try {
2782
2946
  const buttonTestId = await this.getDataTestId();
2783
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver28.By.css(getToolbarButtonTextByTestIdSelector(buttonTestId)));
2784
- return await buttonTextContainer.getText();
2947
+ const buttonTextContainer = this.page.locator(getToolbarButtonTextByTestIdSelector(buttonTestId));
2948
+ return await buttonTextContainer.innerText();
2785
2949
  } catch (_) {
2786
2950
  return null;
2787
2951
  }
@@ -2796,16 +2960,15 @@ var init_AbstractDropDownMenuButton = __esm({
2796
2960
  "src/pageObjects/elements/AbstractDropDownMenuButton.ts"() {
2797
2961
  "use strict";
2798
2962
  init_AbstractElementWithParent();
2799
- init_actions();
2800
2963
  AbstractDropDownMenuButton = class extends AbstractElementWithParent {
2801
2964
  _list;
2802
- constructor(parentCssSelector, elementCssSelector, list, driver) {
2803
- super(parentCssSelector, elementCssSelector, driver);
2965
+ constructor(parentCssSelector, elementCssSelector, list, page) {
2966
+ super(parentCssSelector, elementCssSelector, page);
2804
2967
  this._list = list;
2805
2968
  }
2806
2969
  async openDropdownMenu() {
2807
- const dropdown = await this.getElement();
2808
- await click(dropdown, this.driver);
2970
+ const dropdown = this.getLocator();
2971
+ await dropdown.click();
2809
2972
  await this._list.isVisible();
2810
2973
  }
2811
2974
  async clickButton(name) {
@@ -2833,6 +2996,7 @@ var ToolbarMenuItem;
2833
2996
  var init_ToolbarMenuItem = __esm({
2834
2997
  "src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts"() {
2835
2998
  "use strict";
2999
+ init_waitElementIsVisible();
2836
3000
  ToolbarMenuItem = class {
2837
3001
  getMenuItem;
2838
3002
  name;
@@ -2840,26 +3004,44 @@ var init_ToolbarMenuItem = __esm({
2840
3004
  this.getMenuItem = getMenuItem;
2841
3005
  this.name = name;
2842
3006
  }
3007
+ isPressed() {
3008
+ throw new Error("Method not implemented.");
3009
+ }
3010
+ getLocator() {
3011
+ throw new Error("Method not implemented.");
3012
+ }
2843
3013
  async click() {
2844
- const menuItemElement = await this.getMenuItem(this.name);
2845
- await menuItemElement.click();
3014
+ try {
3015
+ const menuItemElement = await this.getMenuItem(this.name);
3016
+ await waitElementIsVisible_default({ locator: menuItemElement });
3017
+ await menuItemElement.click();
3018
+ } catch (error) {
3019
+ throw new Error(`Cannot click on toolbar menu item: ${this.name}`);
3020
+ }
2846
3021
  }
2847
3022
  async getTitle() {
2848
3023
  try {
2849
3024
  const menuItemElement = await this.getMenuItem(this.name);
2850
- return await menuItemElement.getText();
3025
+ await waitElementIsVisible_default({ locator: menuItemElement });
3026
+ return await menuItemElement.innerText();
2851
3027
  } catch (_) {
2852
3028
  return null;
2853
3029
  }
2854
3030
  }
2855
3031
  async isDisabled() {
2856
- const menuItemElement = await this.getMenuItem(this.name);
2857
- return await menuItemElement.getCssValue("pointer-events") === "none";
3032
+ try {
3033
+ const menuItemElement = await this.getMenuItem(this.name);
3034
+ await waitElementIsVisible_default({ locator: menuItemElement });
3035
+ return await menuItemElement.isDisabled();
3036
+ } catch (_) {
3037
+ return false;
3038
+ }
2858
3039
  }
2859
- async isDisplayed() {
3040
+ async isVisible() {
2860
3041
  try {
2861
3042
  const menuItemElement = await this.getMenuItem(this.name);
2862
- return await menuItemElement.isDisplayed();
3043
+ await waitElementIsVisible_default({ locator: menuItemElement });
3044
+ return await menuItemElement.isVisible();
2863
3045
  } catch (_) {
2864
3046
  return false;
2865
3047
  }
@@ -2883,8 +3065,8 @@ var init_ToolbarMenu = __esm({
2883
3065
  getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
2884
3066
  ToolbarMenuList = class extends DXContextMenuList {
2885
3067
  _formName;
2886
- constructor(parentCssSelector, elementCssSelector, formName, driver) {
2887
- super(parentCssSelector, elementCssSelector, driver);
3068
+ constructor(parentCssSelector, elementCssSelector, formName, page) {
3069
+ super(parentCssSelector, elementCssSelector, page);
2888
3070
  this._formName = formName;
2889
3071
  }
2890
3072
  getButtonNameBy(name) {
@@ -2892,10 +3074,10 @@ var init_ToolbarMenu = __esm({
2892
3074
  }
2893
3075
  };
2894
3076
  ToolbarMenu = class extends AbstractDropDownMenuButton {
2895
- constructor(parentCssSelector, formName, name, driver) {
3077
+ constructor(parentCssSelector, formName, name, page) {
2896
3078
  const fullSelector = getFullCssSelector(formName, name);
2897
- const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, driver);
2898
- super(parentCssSelector, fullSelector, list, driver);
3079
+ const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, page);
3080
+ super(parentCssSelector, fullSelector, list, page);
2899
3081
  }
2900
3082
  checkNameValue(name) {
2901
3083
  if (!isString(name) && !isArray(name))
@@ -2913,13 +3095,13 @@ var init_ToolbarMenu = __esm({
2913
3095
  this.checkTitleValue(title);
2914
3096
  return new ToolbarMenuItem(this.getMenuItemElementByTitle.bind(this), title);
2915
3097
  }
2916
- async buttonIsDisplayed(name) {
3098
+ async buttonIsVisible(name) {
2917
3099
  const button = this.buttonByName(name);
2918
- return await button.isDisplayed();
3100
+ return await button.isVisible();
2919
3101
  }
2920
- async buttonByTitleIsDisplayed(title) {
3102
+ async buttonByTitleIsVisible(title) {
2921
3103
  const button = this.buttonByTitle(title);
2922
- return await button.isDisplayed();
3104
+ return await button.isVisible();
2923
3105
  }
2924
3106
  async buttonTitle(name) {
2925
3107
  const button = this.buttonByName(name);
@@ -2955,14 +3137,16 @@ var init_ToolbarItem = __esm({
2955
3137
  init_ToolbarButton();
2956
3138
  init_locators();
2957
3139
  init_ToolbarMenu();
3140
+ init_waitElementIsVisible();
3141
+ init_wait();
2958
3142
  GROUP_BUTTON_CLASS = "toolbar-group-button";
2959
3143
  toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
2960
3144
  ToolbarItem = class extends AbstractElementWithParent {
2961
3145
  _button;
2962
3146
  _formName;
2963
3147
  _itemName;
2964
- constructor(parentCssSelector, formName, itemName, driver) {
2965
- super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
3148
+ constructor(parentCssSelector, formName, itemName, page) {
3149
+ super(parentCssSelector, toolbarItemSelector(formName, itemName), page);
2966
3150
  this._itemName = itemName;
2967
3151
  this._formName = formName;
2968
3152
  }
@@ -2970,23 +3154,36 @@ var init_ToolbarItem = __esm({
2970
3154
  if (this._button) return this._button;
2971
3155
  const classNames = await this.getClasses();
2972
3156
  if (classNames.includes(GROUP_BUTTON_CLASS)) {
2973
- this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
3157
+ this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.page);
2974
3158
  return;
2975
3159
  }
2976
- this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
3160
+ this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.page);
2977
3161
  }
2978
3162
  async click() {
2979
- await this.init();
2980
- await this._button.click();
3163
+ try {
3164
+ await this.init();
3165
+ await wait(async () => {
3166
+ const element = this._button.getLocator();
3167
+ return await element.isEnabled() && await element.isVisible();
3168
+ }, this.page);
3169
+ await this._button.click();
3170
+ } catch (error) {
3171
+ throw new Error(`Cannot click on toolbar item: ${this._itemName}`);
3172
+ }
2981
3173
  }
2982
3174
  async isDisabled() {
2983
- await this.init();
2984
- return await this._button.isDisabled();
3175
+ try {
3176
+ await this.init();
3177
+ await waitElementIsVisible_default({ locator: this._button.getLocator() });
3178
+ return await this._button.isDisabled();
3179
+ } catch (error) {
3180
+ return false;
3181
+ }
2985
3182
  }
2986
- async isDisplayed() {
3183
+ async isVisible() {
2987
3184
  try {
2988
3185
  await this.init();
2989
- return this._button.isDisplayed();
3186
+ return this._button.isVisible();
2990
3187
  } catch (error) {
2991
3188
  return false;
2992
3189
  }
@@ -3000,11 +3197,15 @@ var init_ToolbarItem = __esm({
3000
3197
  }
3001
3198
  }
3002
3199
  async getTitle() {
3003
- await this.init();
3004
- return await this._button.getTitle();
3200
+ try {
3201
+ await this.init();
3202
+ return await this._button.getTitle();
3203
+ } catch (error) {
3204
+ return "";
3205
+ }
3005
3206
  }
3006
3207
  get menu() {
3007
- return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
3208
+ return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.page);
3008
3209
  }
3009
3210
  };
3010
3211
  }
@@ -3020,30 +3221,25 @@ var init_FormToolbar = __esm({
3020
3221
  TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
3021
3222
  FormToolbar = class extends AbstractElementWithParent {
3022
3223
  formName;
3023
- constructor(parentCssSelector, formName, driver) {
3024
- super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
3224
+ constructor(parentCssSelector, formName, page) {
3225
+ super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, page);
3025
3226
  this.formName = formName;
3026
3227
  }
3027
3228
  button(name) {
3028
- return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
3229
+ return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.page);
3029
3230
  }
3030
3231
  };
3031
3232
  }
3032
3233
  });
3033
3234
 
3034
3235
  // src/pageObjects/elements/Filters/FilterOperation.ts
3035
- var import_selenium_webdriver29, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
3236
+ var FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
3036
3237
  var init_FilterOperation = __esm({
3037
3238
  "src/pageObjects/elements/Filters/FilterOperation.ts"() {
3038
3239
  "use strict";
3039
- import_selenium_webdriver29 = require("selenium-webdriver");
3040
- init_fixElementStaleError();
3041
3240
  init_AbstractElementWithParent();
3042
3241
  init_locators();
3043
- init_actions();
3044
3242
  init_wait();
3045
- init_waitElementIsClickable();
3046
- init_waitElementIsVisible();
3047
3243
  FILTER_OPERATIONS = [
3048
3244
  "=",
3049
3245
  "<>",
@@ -3065,44 +3261,42 @@ var init_FilterOperation = __esm({
3065
3261
  getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
3066
3262
  FilterOperation = class extends AbstractElementWithParent {
3067
3263
  _testId;
3068
- constructor({ parentCssSelector, filterTestID, driver }) {
3069
- super(parentCssSelector, `${byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`)}`, driver);
3264
+ constructor({ parentCssSelector, filterTestID, page }) {
3265
+ super(
3266
+ parentCssSelector,
3267
+ byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`),
3268
+ page
3269
+ );
3070
3270
  this._testId = filterTestID;
3071
3271
  }
3272
+ popup() {
3273
+ return this.page.locator(
3274
+ byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)
3275
+ );
3276
+ }
3072
3277
  async initOperationWidget() {
3073
- const widgetButtonEl = await this.getElement();
3074
- await waitElementIsClickable_default({
3075
- element: widgetButtonEl,
3076
- errorMessage: "Widget operation is not clickable",
3077
- driver: this.driver
3078
- });
3079
- const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver29.By.className("dx-icon"));
3080
- await click(clickableElement, this.driver);
3081
- try {
3082
- const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
3083
- await waitElementIsVisible_default({
3084
- element: widgetPopupEl,
3085
- errorMessage: `Operation widget popup is not visible`,
3086
- driver: this.driver
3087
- });
3088
- } catch (_) {
3089
- throw `Operation widget popup is not visible`;
3090
- }
3278
+ const widgetButton = this.getLocator();
3279
+ const icon = widgetButton.locator(".dx-icon");
3280
+ await icon.first().click();
3281
+ const popup = this.popup();
3282
+ await popup.waitFor({ state: "visible" });
3091
3283
  }
3092
3284
  async setOperation(operationName) {
3093
3285
  if (!FILTER_OPERATIONS.includes(operationName)) {
3094
3286
  throw new Error(`Operation with name "${operationName}" is not correct.`);
3095
3287
  }
3096
3288
  await this.initOperationWidget();
3097
- const operationEl = await fixElementStaleError(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
3098
- await click(operationEl, this.driver);
3099
- await safeWait(
3289
+ const operationItem = this.popup().locator(
3290
+ getWidgetInPopupSelector(operationName)
3291
+ );
3292
+ await operationItem.click();
3293
+ await wait(
3100
3294
  async () => {
3101
3295
  const currOperationName = await this.getAttribute("data-operation");
3102
3296
  if (operationName === "isblank") return true;
3103
3297
  return currOperationName === operationName;
3104
3298
  },
3105
- this.driver,
3299
+ this.page,
3106
3300
  "Operation is not changed"
3107
3301
  );
3108
3302
  }
@@ -3115,12 +3309,12 @@ var init_FilterOperation = __esm({
3115
3309
  const currValue = await this.getIsBlank();
3116
3310
  if (currValue !== value) {
3117
3311
  await this.setOperation("isblank");
3118
- await safeWait(
3312
+ await wait(
3119
3313
  async () => {
3120
3314
  const currIsBlank = await this.getIsBlank();
3121
3315
  return currIsBlank === value;
3122
3316
  },
3123
- this.driver,
3317
+ this.page,
3124
3318
  "Operation is not changed"
3125
3319
  );
3126
3320
  }
@@ -3145,8 +3339,13 @@ var init_FormFilterField = __esm({
3145
3339
  FormFilterField = class extends AbstractEditor {
3146
3340
  formName;
3147
3341
  name;
3148
- constructor(parentCssSelector, formName, name, driver) {
3149
- super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
3342
+ constructor(parentCssSelector, formName, name, page) {
3343
+ super({
3344
+ parentCssSelector,
3345
+ elementCssSelector: byTestIdCssSelector(createLayoutFilterTestId(formName, name)),
3346
+ titleCssSelector: byTestIdCssSelector(createLabelLayoutFilterTestId(formName, name)),
3347
+ page
3348
+ });
3150
3349
  this.formName = formName;
3151
3350
  this.name = name;
3152
3351
  }
@@ -3198,7 +3397,7 @@ var init_FormFilterField = __esm({
3198
3397
  return new FilterOperation({
3199
3398
  parentCssSelector: this.parentCssSelector,
3200
3399
  filterTestID: createLayoutFilterTestId(this.formName, this.name),
3201
- driver: this.driver
3400
+ page: this.page
3202
3401
  });
3203
3402
  }
3204
3403
  /**
@@ -3259,8 +3458,13 @@ var init_PanelFilterField = __esm({
3259
3458
  PanelFilterField = class extends AbstractEditor {
3260
3459
  formName;
3261
3460
  name;
3262
- constructor(parentCssSelector, formName, name, driver) {
3263
- super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
3461
+ constructor(parentCssSelector, formName, name, page) {
3462
+ super({
3463
+ parentCssSelector,
3464
+ elementCssSelector: byTestIdCssSelector(createDocFilterTestId(formName, name)),
3465
+ titleCssSelector: byTestIdCssSelector(createLabelDocFilterTestId(formName, name)),
3466
+ page
3467
+ });
3264
3468
  this.formName = formName;
3265
3469
  this.name = name;
3266
3470
  }
@@ -3312,7 +3516,7 @@ var init_PanelFilterField = __esm({
3312
3516
  return new FilterOperation({
3313
3517
  parentCssSelector: this.parentCssSelector,
3314
3518
  filterTestID: createDocFilterTestId(this.formName, this.name),
3315
- driver: this.driver
3519
+ page: this.page
3316
3520
  });
3317
3521
  }
3318
3522
  /**
@@ -3362,14 +3566,12 @@ var init_PanelFilterField = __esm({
3362
3566
  });
3363
3567
 
3364
3568
  // src/pageObjects/elements/Filters/FilterPanel.ts
3365
- var import_selenium_webdriver30, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
3569
+ var drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
3366
3570
  var init_FilterPanel = __esm({
3367
3571
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
3368
3572
  "use strict";
3369
- import_selenium_webdriver30 = require("selenium-webdriver");
3370
3573
  init_AbstractElement();
3371
3574
  init_PanelFilterField();
3372
- init_actions();
3373
3575
  drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
3374
3576
  FILTER_PANEL_SELECTOR = ".filter-panel";
3375
3577
  CLOSE_SELECTOR = ".button-close";
@@ -3380,11 +3582,10 @@ var init_FilterPanel = __esm({
3380
3582
  }
3381
3583
  async filterPanelButtons() {
3382
3584
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
3383
- const el = await this.getElement();
3384
- return el.findElements(import_selenium_webdriver30.By.css(selector));
3585
+ return this.page.locator(selector).all();
3385
3586
  }
3386
- constructor(formName, driver) {
3387
- super(driver, drawerSelector(formName));
3587
+ constructor(formName, page) {
3588
+ super(page, drawerSelector(formName));
3388
3589
  this._formName = formName;
3389
3590
  }
3390
3591
  /**
@@ -3394,28 +3595,28 @@ var init_FilterPanel = __esm({
3394
3595
  * await form.filterPanel.filterField('NumberFld');
3395
3596
  */
3396
3597
  filterField(name) {
3397
- return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
3598
+ return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.page);
3398
3599
  }
3399
3600
  async apply() {
3400
3601
  const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
3401
- await click(btn, this.driver);
3602
+ await btn.click();
3402
3603
  }
3403
3604
  async findButtonByTitle(title) {
3404
3605
  const buttons = await this.filterPanelButtons();
3405
3606
  for (const btn of buttons) {
3406
- if (await btn.getText() === title) {
3607
+ if (await btn.innerText() === title) {
3407
3608
  return btn;
3408
3609
  }
3409
3610
  }
3410
3611
  }
3411
3612
  async clearAll() {
3412
3613
  const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
3413
- await click(btn, this.driver);
3414
- await this.driver.sleep(300);
3614
+ await btn.click();
3615
+ await this.page.waitForTimeout(300);
3415
3616
  }
3416
3617
  async close() {
3417
- const btn = await this.driver.findElement(import_selenium_webdriver30.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
3418
- await click(btn, this.driver);
3618
+ const btn = this.page.locator(`${this.elementCssSelector} ${CLOSE_SELECTOR}`);
3619
+ await btn.click();
3419
3620
  }
3420
3621
  };
3421
3622
  }
@@ -3430,8 +3631,13 @@ var init_HeaderFilterField = __esm({
3430
3631
  init_createDataTestId();
3431
3632
  init_AbstractEditor2();
3432
3633
  HeaderFilterField = class extends AbstractEditor {
3433
- constructor(parentCssSelector, formName, name, driver) {
3434
- super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
3634
+ constructor(parentCssSelector, formName, name, page) {
3635
+ super({
3636
+ parentCssSelector,
3637
+ elementCssSelector: byTestIdCssSelector(createHeaderFilterTestId(formName, name)),
3638
+ titleCssSelector: "",
3639
+ page
3640
+ });
3435
3641
  }
3436
3642
  async getValue() {
3437
3643
  return super.getValue();
@@ -3456,71 +3662,51 @@ var init_HeaderFilterField = __esm({
3456
3662
  });
3457
3663
 
3458
3664
  // src/pageObjects/elements/Filters/ColumnFilter.ts
3459
- var import_selenium_webdriver31, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
3665
+ var APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
3460
3666
  var init_ColumnFilter = __esm({
3461
3667
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
3462
3668
  "use strict";
3463
- init_actions();
3464
- import_selenium_webdriver31 = require("selenium-webdriver");
3465
3669
  init_HeaderFilterField();
3466
- init_waitElementIsVisible();
3467
- init_AbstractElement();
3468
3670
  init_FilterOperation();
3469
3671
  init_createDataTestId();
3470
- init_wait();
3672
+ init_waitElementIsVisible();
3471
3673
  APPLY_SELECTOR = ".apply-button";
3472
3674
  CANCEL_SELECTOR = ".cancel-button";
3473
3675
  HEADER_FILTER_ICON = ".indicators-container .filter-icon";
3474
3676
  HEADER_FILTER_CONTAINER = ".header-filter";
3475
3677
  HEADER_FILTER_BUTTONS = ".header-filter-buttons";
3476
- ColumnFilter = class extends AbstractElement {
3678
+ ColumnFilter = class {
3477
3679
  _formName;
3478
3680
  _name;
3479
3681
  _column;
3480
- constructor(formName, name, column, driver) {
3481
- super(driver, HEADER_FILTER_CONTAINER);
3682
+ page;
3683
+ constructor(formName, name, column, page) {
3482
3684
  this._formName = formName;
3483
3685
  this._name = name;
3484
3686
  this._column = column;
3485
- this.driver = driver;
3687
+ this.page = page;
3486
3688
  }
3487
- async getApplyButton() {
3488
- const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
3489
- return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
3689
+ getApplyButton() {
3690
+ return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`);
3490
3691
  }
3491
- async getCancelButton() {
3492
- const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
3493
- return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
3692
+ getCancelButton() {
3693
+ return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`);
3494
3694
  }
3495
3695
  async apply() {
3496
- const btn = await this.getApplyButton();
3497
- await click(btn, this.driver);
3696
+ await this.getApplyButton().click();
3498
3697
  }
3499
3698
  async cancel() {
3500
- const btn = await this.getCancelButton();
3501
- await click(btn, this.driver);
3699
+ await this.getCancelButton().click();
3502
3700
  }
3503
3701
  async initFilter() {
3504
- const columnEl = await this._column.getElement();
3505
- const actions = this.driver.actions({ async: true });
3506
- await actions.move({ origin: columnEl }).perform();
3507
- const headerFilterIconBy = import_selenium_webdriver31.By.css(HEADER_FILTER_ICON);
3508
- let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
3509
- await safeWait(
3510
- () => {
3511
- return headerFilterIcon.isDisplayed();
3512
- },
3513
- this.driver,
3514
- `HeaderFilter "${this._name}" is not visible`
3515
- );
3516
- await click(headerFilterIcon, this.driver);
3517
- const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
3518
- const filterEl = await filter.getElement();
3519
- await waitElementIsVisible_default({
3520
- element: filterEl,
3521
- driver: this.driver,
3522
- errorMessage: `Header filter is not visible`
3523
- });
3702
+ const columnEl = await this._column.getLocator();
3703
+ await columnEl.hover();
3704
+ const headerFilterIcon = columnEl.locator(HEADER_FILTER_ICON);
3705
+ await headerFilterIcon.waitFor({ state: "visible" });
3706
+ await headerFilterIcon.click();
3707
+ const filter = new HeaderFilterField("", this._formName, this._name, this.page);
3708
+ const filterEl = filter.getLocator();
3709
+ await waitElementIsVisible_default({ locator: filterEl });
3524
3710
  return filter;
3525
3711
  }
3526
3712
  /**
@@ -3547,9 +3733,9 @@ var init_ColumnFilter = __esm({
3547
3733
  const filterOperation = new FilterOperation({
3548
3734
  parentCssSelector: HEADER_FILTER_CONTAINER,
3549
3735
  filterTestID: createHeaderFilterTestId(this._formName, this._name),
3550
- driver: this.driver
3736
+ page: this.page
3551
3737
  });
3552
- const inputEl = await filter.getElement();
3738
+ const inputEl = filter.getLocator();
3553
3739
  if (typeof operation === "string") {
3554
3740
  await inputEl.click();
3555
3741
  await filterOperation.setOperation(operation);
@@ -3559,7 +3745,7 @@ var init_ColumnFilter = __esm({
3559
3745
  await filterOperation.setIsBlank(isBlank);
3560
3746
  }
3561
3747
  await filter.setValue(value);
3562
- return this.apply();
3748
+ await this.apply();
3563
3749
  }
3564
3750
  /**
3565
3751
  * Очищает значение в поле
@@ -3586,12 +3772,12 @@ var init_ColumnFilter = __esm({
3586
3772
  */
3587
3773
  async initOperation() {
3588
3774
  const filter = await this.initFilter();
3589
- const inputEl = await filter.getElement();
3775
+ const inputEl = filter.getLocator();
3590
3776
  await inputEl.click();
3591
3777
  return new FilterOperation({
3592
3778
  parentCssSelector: HEADER_FILTER_CONTAINER,
3593
3779
  filterTestID: createHeaderFilterTestId(this._formName, this._name),
3594
- driver: this.driver
3780
+ page: this.page
3595
3781
  });
3596
3782
  }
3597
3783
  /**
@@ -3611,7 +3797,7 @@ var init_ColumnFilter = __esm({
3611
3797
  */
3612
3798
  async getOperation() {
3613
3799
  const filterOperation = await this.initOperation();
3614
- return await filterOperation.getOperation();
3800
+ return filterOperation.getOperation();
3615
3801
  }
3616
3802
  /**
3617
3803
  * Устанавливает операцию 'isblank' для фильтра
@@ -3630,7 +3816,7 @@ var init_ColumnFilter = __esm({
3630
3816
  */
3631
3817
  async getIsBlank() {
3632
3818
  const filterOperation = await this.initOperation();
3633
- return await filterOperation.getIsBlank();
3819
+ return filterOperation.getIsBlank();
3634
3820
  }
3635
3821
  async isReadonly() {
3636
3822
  const filter = await this.initFilter();
@@ -3672,8 +3858,8 @@ var init_ListForm = __esm({
3672
3858
  fixedTableContentCssSelector;
3673
3859
  tableContentCssSelector;
3674
3860
  contextMenuCssSelector;
3675
- constructor(driver) {
3676
- super(driver);
3861
+ constructor(page) {
3862
+ super(page);
3677
3863
  this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
3678
3864
  this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
3679
3865
  this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
@@ -3688,17 +3874,15 @@ var init_ListForm = __esm({
3688
3874
  * expect(listForm.table());
3689
3875
  */
3690
3876
  table() {
3691
- return new Table(
3692
- {
3693
- parentCssSelector: this.containerCssSelector,
3694
- headerCssSelector: this.headerCssSelector,
3695
- fixedTableContentCssSelector: this.fixedTableContentCssSelector,
3696
- formName: this.formName,
3697
- driver: this.driver,
3698
- contextMenuCssSelector: this.contextMenuCssSelector,
3699
- tableContentCssSelector: this.tableContentCssSelector
3700
- }
3701
- );
3877
+ return new Table({
3878
+ parentCssSelector: this.containerCssSelector,
3879
+ headerCssSelector: this.headerCssSelector,
3880
+ fixedTableContentCssSelector: this.fixedTableContentCssSelector,
3881
+ formName: this.formName,
3882
+ page: this.page,
3883
+ contextMenuCssSelector: this.contextMenuCssSelector,
3884
+ tableContentCssSelector: this.tableContentCssSelector
3885
+ });
3702
3886
  }
3703
3887
  /**
3704
3888
  * Находит таблицу
@@ -3708,7 +3892,7 @@ var init_ListForm = __esm({
3708
3892
  * expect(listForm.toolbarButton());
3709
3893
  */
3710
3894
  toolbarButton(name) {
3711
- const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
3895
+ const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.page);
3712
3896
  return toolbar.button(name);
3713
3897
  }
3714
3898
  /**
@@ -3719,11 +3903,11 @@ var init_ListForm = __esm({
3719
3903
  * expect(listForm.formFilter());
3720
3904
  */
3721
3905
  formFilter(name) {
3722
- return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
3906
+ return new FormFilterField(this.containerCssSelector, this.formName, name, this.page);
3723
3907
  }
3724
3908
  columnFilter(name) {
3725
3909
  const column = this.table().getColumnByName(name);
3726
- return new ColumnFilter(this.formName, name, column, this.driver);
3910
+ return new ColumnFilter(this.formName, name, column, this.page);
3727
3911
  }
3728
3912
  /**
3729
3913
  * Модель панели фильтрации
@@ -3734,7 +3918,7 @@ var init_ListForm = __esm({
3734
3918
  * expect(listForm.filterPanel());
3735
3919
  */
3736
3920
  get filterPanel() {
3737
- return new FilterPanel(this.formName, this.driver);
3921
+ return new FilterPanel(this.formName, this.page);
3738
3922
  }
3739
3923
  };
3740
3924
  }
@@ -3754,8 +3938,8 @@ var init_TreeView = __esm({
3754
3938
  TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3755
3939
  FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3756
3940
  TreeView = class extends ListForm {
3757
- constructor(driver) {
3758
- super(driver);
3941
+ constructor(page) {
3942
+ super(page);
3759
3943
  this.popupContainerCssSelector = `.popup.tree-view-${this.formName}`;
3760
3944
  this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
3761
3945
  this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
@@ -3805,29 +3989,28 @@ var init_createSubFormInstance = __esm({
3805
3989
  });
3806
3990
 
3807
3991
  // src/pageObjects/elements/Forms/Form.ts
3808
- var import_selenium_webdriver32, formTestId, Form;
3992
+ var formTestId, Form;
3809
3993
  var init_Form = __esm({
3810
3994
  "src/pageObjects/elements/Forms/Form.ts"() {
3811
3995
  "use strict";
3812
3996
  init_locators();
3813
- import_selenium_webdriver32 = require("selenium-webdriver");
3814
3997
  init_AbstractForm();
3815
- init_waitElementIsVisible();
3816
3998
  init_createSubFormInstance();
3999
+ init_waitElementIsVisible();
3817
4000
  formTestId = (formName) => `form-content-wrapper-${formName}`;
3818
4001
  Form = class extends AbstractForm {
3819
4002
  popupContainerCssSelector;
3820
- constructor(driver) {
3821
- super(driver);
4003
+ constructor(page) {
4004
+ super(page);
3822
4005
  this.setSubFormMode();
3823
4006
  }
3824
4007
  async isModal() {
3825
- const el = await this.getContainerElement();
4008
+ const el = this.getContainerElement();
3826
4009
  const value = await el.getAttribute("data-ismodal");
3827
4010
  return value === "true";
3828
4011
  }
3829
4012
  async isFullScreen() {
3830
- const el = await this.getContainerElement();
4013
+ const el = this.getContainerElement();
3831
4014
  const value = await el.getAttribute("data-isfullscreen");
3832
4015
  return value === "true";
3833
4016
  }
@@ -3837,29 +4020,27 @@ var init_Form = __esm({
3837
4020
  * const listForm = new MyForm();
3838
4021
  * //...
3839
4022
  * expect(await listForm.getTitleText()).toBe('MyFormTitle');
4023
+ * Получение заголовка на форме
3840
4024
  */
3841
4025
  async getTitleText() {
3842
4026
  const getFullScreenTitle = async () => {
3843
- let titleEl = await this.driver.findElement(import_selenium_webdriver32.By.className("main-toolbar-form-title"));
3844
- return titleEl.getText();
4027
+ const titleEl = this.page.locator(".main-toolbar-form-title");
4028
+ return titleEl.innerText();
3845
4029
  };
3846
4030
  if (await this.isFullScreen()) {
3847
4031
  return getFullScreenTitle();
3848
4032
  }
3849
4033
  if (await this.isModal()) {
3850
- const titleEl = await this.driver.findElement(import_selenium_webdriver32.By.css(`${this.popupContainerCssSelector} .popup-title`));
4034
+ const titleEl = this.page.locator(`${this.popupContainerCssSelector} .popup-title`);
3851
4035
  await waitElementIsVisible_default({
3852
- element: titleEl,
3853
- driver: this.driver,
3854
- errorMessage: `Form title element is not visible`
4036
+ locator: titleEl
3855
4037
  });
3856
- return titleEl.getText();
4038
+ return titleEl.innerText();
3857
4039
  }
3858
4040
  return getFullScreenTitle();
3859
4041
  }
3860
4042
  setSubFormMode() {
3861
4043
  const testId = formTestId(this.formName);
3862
- this.containerBy = byTestId(testId);
3863
4044
  this.containerCssSelector = byTestIdCssSelector(testId);
3864
4045
  }
3865
4046
  /**
@@ -3873,26 +4054,26 @@ var init_Form = __esm({
3873
4054
  async subForm(name, options = {}) {
3874
4055
  const { isDockPanel = false } = options;
3875
4056
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
3876
- const byCssSelector = import_selenium_webdriver32.By.css(cssSelector);
3877
- const subFormEl = await this.driver.findElement(byCssSelector);
4057
+ const subFormEl = this.page.locator(cssSelector);
3878
4058
  await waitElementIsVisible_default({
3879
- element: subFormEl,
3880
- driver: this.driver,
3881
- errorMessage: `Subform "${name}" is not visible`
4059
+ locator: subFormEl
3882
4060
  });
3883
4061
  const formType = await subFormEl.getAttribute("data-formtype");
3884
- const formName = await subFormEl.getAttribute("data-formname");
3885
- let SubFormFactoryClass = await classDependencyInjector(formType);
4062
+ const formName = await subFormEl.getAttribute("data-formname") ?? "";
4063
+ const SubFormFactoryClass = await classDependencyInjector(formType);
3886
4064
  const SubForm = class extends SubFormFactoryClass {
3887
4065
  setSubFormMode() {
3888
4066
  this.containerCssSelector = cssSelector;
3889
- this.containerBy = byCssSelector;
4067
+ this.containerBy = cssSelector;
3890
4068
  }
3891
4069
  get formName() {
3892
4070
  return formName;
3893
4071
  }
3894
4072
  };
3895
- return new SubForm(this.driver);
4073
+ return new SubForm(this.page);
4074
+ }
4075
+ getContainerElement() {
4076
+ return this.page.locator(this.containerCssSelector);
3896
4077
  }
3897
4078
  };
3898
4079
  }
@@ -3903,20 +4084,18 @@ var FormEdit_exports = {};
3903
4084
  __export(FormEdit_exports, {
3904
4085
  default: () => FormEdit
3905
4086
  });
3906
- var import_selenium_webdriver33, FormEdit;
4087
+ var FormEdit;
3907
4088
  var init_FormEdit = __esm({
3908
4089
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
3909
4090
  "use strict";
3910
4091
  init_Form();
3911
- import_selenium_webdriver33 = require("selenium-webdriver");
3912
4092
  init_FormField();
3913
- init_actions();
3914
4093
  init_wait();
3915
4094
  FormEdit = class extends Form {
3916
4095
  saveButtonId = "#button-save";
3917
4096
  closeButtonId = "#button-cancel";
3918
- constructor(driver) {
3919
- super(driver);
4097
+ constructor(page) {
4098
+ super(page);
3920
4099
  this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
3921
4100
  }
3922
4101
  async getButtonCssSelector(buttonId) {
@@ -3933,7 +4112,7 @@ var init_FormEdit = __esm({
3933
4112
  * expect(await formEdit.field('Name').getValue()).toBe('test value');
3934
4113
  */
3935
4114
  field(name) {
3936
- return new FormField(this.containerCssSelector, this.formName, name, this.driver);
4115
+ return new FormField(this.containerCssSelector, this.formName, name, this.page);
3937
4116
  }
3938
4117
  /**
3939
4118
  * Проверяет не отключена ли кнопка Сохранить
@@ -3944,7 +4123,7 @@ var init_FormEdit = __esm({
3944
4123
  */
3945
4124
  async isSaveButtonDisabled() {
3946
4125
  const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3947
- const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
4126
+ const saveButton = this.page.locator(saveButtonCssSelector);
3948
4127
  const result = await saveButton.getAttribute("aria-disabled");
3949
4128
  return result === "true";
3950
4129
  }
@@ -3957,9 +4136,9 @@ var init_FormEdit = __esm({
3957
4136
  */
3958
4137
  async saveButtonClick() {
3959
4138
  const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3960
- const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
3961
- await safeWait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
3962
- await click(saveButton, this.driver);
4139
+ const saveButton = this.page.locator(saveButtonCssSelector);
4140
+ await wait(async () => !await this.isSaveButtonDisabled(), this.page, "Button is disabled");
4141
+ await saveButton.click();
3963
4142
  }
3964
4143
  /**
3965
4144
  * Нажатие на кнопку Закрить
@@ -3970,8 +4149,91 @@ var init_FormEdit = __esm({
3970
4149
  */
3971
4150
  async closeButtonClick() {
3972
4151
  const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
3973
- const closeButton = await this.driver.findElement(import_selenium_webdriver33.By.css(closeButtonCssSelector));
3974
- await click(closeButton, this.driver);
4152
+ const closeButton = this.page.locator(closeButtonCssSelector);
4153
+ await closeButton.click();
4154
+ }
4155
+ };
4156
+ }
4157
+ });
4158
+
4159
+ // src/pageObjects/elements/Forms/ReportForm.ts
4160
+ var ReportForm;
4161
+ var init_ReportForm = __esm({
4162
+ "src/pageObjects/elements/Forms/ReportForm.ts"() {
4163
+ "use strict";
4164
+ init_FormEdit();
4165
+ ReportForm = class extends FormEdit {
4166
+ constructor(page) {
4167
+ super(page);
4168
+ this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
4169
+ this.saveButtonId = "#button-apply";
4170
+ }
4171
+ /**
4172
+ * Знаходить поле/фільтр у формі репорту за ім'ям
4173
+ * @example
4174
+ * const formReport = new MyForm();
4175
+ * //...
4176
+ * expect(await formReport.filterField('Name').getValue()).toBe('test value');
4177
+ */
4178
+ filterField(name) {
4179
+ return super.field(name);
4180
+ }
4181
+ };
4182
+ }
4183
+ });
4184
+
4185
+ // src/pageObjects/elements/Dialog.ts
4186
+ var DIALOG_CLASS, DIALOG_TITLE_CLASS, DIALOG_TEXT_CLASS, DIALOG_BUTTONS_PANEL_CLASS, buttonByTextXpath, DialogButton, Dialog;
4187
+ var init_Dialog = __esm({
4188
+ "src/pageObjects/elements/Dialog.ts"() {
4189
+ "use strict";
4190
+ init_AbstractElement();
4191
+ init_AbstractButton();
4192
+ DIALOG_CLASS = ".d5-dialog";
4193
+ DIALOG_TITLE_CLASS = ".dialog__title";
4194
+ DIALOG_TEXT_CLASS = ".dialog__text";
4195
+ DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
4196
+ buttonByTextXpath = (text) => `xpath=.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
4197
+ DialogButton = class extends AbstractButton {
4198
+ text;
4199
+ constructor(parentCssSelector, text, page) {
4200
+ super(parentCssSelector, "", page);
4201
+ this.text = text;
4202
+ }
4203
+ getLocator() {
4204
+ const panel = super.getLocator();
4205
+ return panel.locator(buttonByTextXpath(this.text));
4206
+ }
4207
+ buttonNotDisplayedError() {
4208
+ return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
4209
+ }
4210
+ getTitle() {
4211
+ throw new Error(`Method "getTitle()" is not working.`);
4212
+ }
4213
+ };
4214
+ Dialog = class extends AbstractElement {
4215
+ constructor(page) {
4216
+ super(page, DIALOG_CLASS);
4217
+ }
4218
+ get titleSelector() {
4219
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
4220
+ }
4221
+ get textSelector() {
4222
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
4223
+ }
4224
+ get buttonsSelector() {
4225
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
4226
+ }
4227
+ async title() {
4228
+ const el = this.page.locator(this.titleSelector);
4229
+ return await el.innerText();
4230
+ }
4231
+ async text() {
4232
+ const el = this.page.locator(this.textSelector);
4233
+ return await el.innerText();
4234
+ }
4235
+ button(text) {
4236
+ return new DialogButton(this.buttonsSelector, text, this.page);
3975
4237
  }
3976
4238
  };
3977
4239
  }
@@ -6783,6 +7045,25 @@ var require_d5lib = __commonJS({
6783
7045
  }
6784
7046
  });
6785
7047
 
7048
+ // src/api/ApiRequest.ts
7049
+ function ApiRequest(objectName, operation) {
7050
+ const { auth } = config();
7051
+ (0, import_d5lib.config)(auth);
7052
+ const postInstance = (0, import_d5lib.post)(objectName, operation);
7053
+ const invoke = async () => {
7054
+ return postInstance.send(true);
7055
+ };
7056
+ return Object.assign(postInstance, { invoke });
7057
+ }
7058
+ var import_d5lib;
7059
+ var init_ApiRequest = __esm({
7060
+ "src/api/ApiRequest.ts"() {
7061
+ "use strict";
7062
+ init_config();
7063
+ import_d5lib = __toESM(require_d5lib());
7064
+ }
7065
+ });
7066
+
6786
7067
  // src/index.ts
6787
7068
  var src_exports = {};
6788
7069
  __export(src_exports, {
@@ -6804,405 +7085,38 @@ __export(src_exports, {
6804
7085
  TreeView: () => TreeView,
6805
7086
  byTestId: () => byTestId,
6806
7087
  byTestIdCssSelector: () => byTestIdCssSelector,
6807
- click: () => click,
6808
7088
  config: () => config,
6809
- contextMenu: () => contextMenu,
6810
- createDriver: () => createDriver,
6811
7089
  disabledLocator: () => disabledLocator,
6812
7090
  editorFactory: () => editorFactory,
6813
- elementIsNotPresent: () => elementIsNotPresent,
6814
7091
  readonlyLocator: () => readonlyLocator,
6815
- signIn: () => signIn,
6816
- wait: () => safeWait,
6817
- waitElementIsClickable: () => waitElementIsClickable_default,
7092
+ wait: () => wait,
6818
7093
  waitElementIsVisible: () => waitElementIsVisible_default
6819
7094
  });
6820
7095
  module.exports = __toCommonJS(src_exports);
6821
- init_config();
6822
-
6823
- // src/pageObjects/pages/LoginPage.ts
6824
- init_AbstractPage();
6825
- init_config();
6826
- init_waitElementIsVisible();
6827
- init_actions();
6828
- init_locators();
6829
- var import_selenium_webdriver3 = require("selenium-webdriver");
6830
- var LOGIN_PATH = "/login";
6831
- var LoginPage = class extends AbstractPage {
6832
- usernameField = byTestId("loginField", "input");
6833
- passwordField = byTestId("passwordField", "input");
6834
- loginButton = byTestId("loginButton");
6835
- async locate() {
6836
- await super.locate();
6837
- const login = await this.driver.findElement(this.usernameField);
6838
- await waitElementIsVisible_default({
6839
- element: login,
6840
- driver: this.driver
6841
- });
6842
- }
6843
- get path() {
6844
- return LOGIN_PATH;
6845
- }
6846
- async enterUsername(username) {
6847
- await this.driver.findElement(this.usernameField).sendKeys(username);
6848
- }
6849
- async enterPassword(password) {
6850
- await this.driver.findElement(this.passwordField).sendKeys(password);
6851
- }
6852
- async clickLoginButton() {
6853
- await click(await this.driver.findElement(this.loginButton), this.driver);
6854
- await waitElementIsVisible_default({
6855
- driver: this.driver,
6856
- by: import_selenium_webdriver3.By.id("section"),
6857
- errorMessage: "Sing in not successful"
6858
- });
6859
- }
6860
- async loginWith(username, password) {
6861
- await this.enterUsername(username);
6862
- await this.enterPassword(password);
6863
- await this.clickLoginButton();
6864
- }
6865
- async authorize() {
6866
- await this.loginWith(config().auth.login, config().auth.password);
6867
- }
6868
- };
6869
-
6870
- // src/index.ts
6871
- init_locators();
6872
-
6873
- // src/utils/createDriver.ts
6874
- var import_selenium_webdriver4 = require("selenium-webdriver");
6875
- var import_node_path = __toESM(require("path"));
6876
- var import_node_fs = __toESM(require("fs"));
6877
- var import_node_os = __toESM(require("os"));
6878
- init_config();
6879
- var import_chrome = __toESM(require("selenium-webdriver/chrome"));
6880
- var import_firefox = __toESM(require("selenium-webdriver/firefox"));
6881
- function chromeOptions(builder, options) {
6882
- const ChromeOptions = new import_chrome.default.Options();
6883
- if (options.headless) {
6884
- ChromeOptions.addArguments(`--headless=new`);
6885
- ChromeOptions.addArguments(`--disable-gpu`);
6886
- ChromeOptions.addArguments(`--disable-dev-shm-usage`);
6887
- ChromeOptions.addArguments(`--window-size=1920,1080`);
6888
- }
6889
- const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
6890
- if (!import_node_fs.default.existsSync(userDataDir)) {
6891
- import_node_fs.default.mkdirSync(userDataDir, { recursive: true });
6892
- }
6893
- ChromeOptions.addArguments(`--user-data-dir=${userDataDir}`);
6894
- return builder.setChromeOptions(ChromeOptions);
6895
- }
6896
- function firefoxOptions(builder, options) {
6897
- const FirefoxOptions = new import_firefox.default.Options();
6898
- if (options.headless) {
6899
- FirefoxOptions.addArguments(`--headless`);
6900
- }
6901
- return builder.setFirefoxOptions(FirefoxOptions);
6902
- }
6903
- function setOptions(builder, browser, options) {
6904
- switch (browser) {
6905
- case "chrome":
6906
- return chromeOptions(builder, options);
6907
- case "firefox":
6908
- return firefoxOptions(builder, options);
6909
- default:
6910
- return builder;
6911
- }
6912
- }
6913
- var createDriver = async (browser) => {
6914
- const _browser = browser ?? config().browser;
6915
- const headless = config().headless === "true";
6916
- let builder = new import_selenium_webdriver4.Builder().forBrowser(_browser);
6917
- builder = setOptions(builder, _browser, { headless });
6918
- const driver = await builder.build();
6919
- const manage = driver.manage();
6920
- await manage.setTimeouts({ implicit: config().timeout });
6921
- if (!headless) {
6922
- await manage.window().maximize();
6923
- }
6924
- return driver;
6925
- };
6926
-
6927
- // src/utils/elementIsNotPresent.ts
6928
- var import_selenium_webdriver5 = require("selenium-webdriver");
6929
- var elementIsNotPresent = function elementIsNotPresent2(locator) {
6930
- return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
6931
- const elements = await driver.findElements(locator);
6932
- return elements.length == 0;
6933
- });
6934
- };
6935
-
6936
- // src/index.ts
6937
- init_waitElementIsVisible();
6938
- init_waitElementIsClickable();
6939
- init_wait();
6940
-
6941
- // src/utils/signIn.ts
6942
- async function signIn(driver) {
6943
- const webDriver = driver ?? await createDriver();
6944
- const loginPage = new LoginPage(webDriver);
6945
- await loginPage.locate();
6946
- await loginPage.authorize();
6947
- return webDriver;
6948
- }
6949
-
6950
- // src/index.ts
6951
- init_actions();
6952
- init_AbstractPage();
6953
-
6954
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
6955
- init_AbstractElement();
6956
-
6957
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
6958
- init_AbstractElementWithParent();
6959
- var import_selenium_webdriver6 = require("selenium-webdriver");
6960
- var SubsystemsPanelHeader = class extends AbstractElementWithParent {
6961
- async title() {
6962
- return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
6963
- }
6964
- };
6965
-
6966
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
6967
- var import_selenium_webdriver17 = require("selenium-webdriver");
6968
- init_wait();
6969
- init_locators();
6970
- init_Editors();
6971
-
6972
- // src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
6973
- init_actions();
6974
- init_fixElementStaleError();
6975
- init_waitElementIsVisible();
6976
- init_waitElementIsClickable();
6977
- var SubsystemItem = class {
6978
- bySelector;
6979
- driver;
6980
- constructor({ driver, bySelector }) {
6981
- this.bySelector = bySelector;
6982
- this.driver = driver;
6983
- }
6984
- async getElement() {
6985
- return fixElementStaleError(this.bySelector, this.driver);
6986
- }
6987
- async getTitle() {
6988
- await waitElementIsVisible_default(
6989
- {
6990
- by: this.bySelector,
6991
- driver: this.driver
6992
- }
6993
- );
6994
- const el = await this.getElement();
6995
- return await el.getAttribute("data-title");
6996
- }
6997
- async click() {
6998
- await waitElementIsClickable_default(
6999
- {
7000
- by: this.bySelector,
7001
- driver: this.driver
7002
- }
7003
- );
7004
- const el = await this.getElement();
7005
- await click(el, this.driver);
7006
- }
7007
- };
7008
-
7009
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
7010
- init_createDataTestId();
7011
- init_actions();
7012
- init_ClearButtonStrategy();
7013
- init_waitElementIsVisible();
7014
- init_fixElementStaleError();
7015
- var SEARCH_ITEM_SELECTOR = "search-item";
7016
- var BACK_BUTTON_SELECTOR = "subsystem-back-item";
7017
- var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
7018
- var byTitleCssSelector = (title) => {
7019
- return `span[data-title="${title}"]`;
7020
- };
7021
- var SubsystemsPanel = class extends AbstractElement {
7022
- header;
7023
- constructor(driver) {
7024
- super(driver);
7025
- this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
7026
- }
7027
- async headerTitle() {
7028
- const title = await this.header.title();
7029
- await safeWait(async () => await title.getText() != "", this.driver);
7030
- return title.getText();
7031
- }
7032
- getSearchComponent() {
7033
- return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.driver);
7034
- }
7035
- /**
7036
- * Находит сабсистему по заголовку
7037
- * @example
7038
- * const subsystemsPanel= new SubsystemsPanel();
7039
- * //...
7040
- * await subsystemsPanel.search('SubSystemTitle');
7041
- */
7042
- async search(title) {
7043
- const searchComponent = this.getSearchComponent();
7044
- await this.searchClear();
7045
- await searchComponent.setValue(title);
7046
- await safeWait(
7047
- async () => {
7048
- const findElement = await this.itemByTitle(title).getElement();
7049
- const classes = await findElement.getAttribute("class");
7050
- return classes.includes(SEARCH_ITEM_SELECTOR);
7051
- },
7052
- this.driver,
7053
- `Cannot find element: ${title}`
7054
- );
7055
- }
7056
- /**
7057
- * Очищает поиск сабсистем
7058
- * @example
7059
- * const subsystemsPanel= new SubsystemsPanel();
7060
- * //...
7061
- * await subsystemsPanel.searchClear();
7062
- */
7063
- async searchClear() {
7064
- const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
7065
- const clearBtn = await fixElementStaleError(import_selenium_webdriver17.By.css(clearBtnSelector), this.driver);
7066
- if (await clearBtn.isDisplayed()) {
7067
- await click(clearBtn, this.driver);
7068
- }
7069
- }
7070
- /**
7071
- * Возвращает сабсистему по имени
7072
- * @example
7073
- * const subsystemsPanel= new SubsystemsPanel();
7074
- * //...
7075
- * const subsystem = subsystemsPanel.item('SubSystemName');
7076
- */
7077
- item(name) {
7078
- const elementCSS = createSubSystemTestId(name);
7079
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
7080
- }
7081
- /**
7082
- * Возвращает сабсистему по заголовку
7083
- * @example
7084
- * const subsystemsPanel= new SubsystemsPanel();
7085
- * //...
7086
- * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
7087
- */
7088
- itemByTitle(title) {
7089
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(byTitleCssSelector(title)) });
7090
- }
7091
- /**
7092
- * Возвращается на уровень выше по сабсистемам
7093
- * @example
7094
- * const subsystemsPanel= new SubsystemsPanel();
7095
- * //...
7096
- * wait subsystemsPanel.back();
7097
- */
7098
- async back() {
7099
- const by = import_selenium_webdriver17.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
7100
- await waitElementIsVisible_default(
7101
- {
7102
- by,
7103
- driver: this.driver
7104
- }
7105
- );
7106
- await click(await fixElementStaleError(by, this.driver), this.driver);
7107
- }
7108
- };
7109
-
7110
- // src/index.ts
7111
- init_FormEdit();
7112
- init_ListForm();
7113
- init_TreeView();
7114
-
7115
- // src/pageObjects/elements/Forms/ReportForm.ts
7116
- init_FormEdit();
7117
- var ReportForm = class extends FormEdit {
7118
- constructor(driver) {
7119
- super(driver);
7120
- this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
7121
- this.saveButtonId = "#button-apply";
7122
- }
7123
- /**
7124
- * Знаходить поле/фільтр у формі репорту за ім'ям
7125
- * @example
7126
- * const formReport = new MyForm();
7127
- * //...
7128
- * expect(await formReport.filterField('Name').getValue()).toBe('test value');
7129
- */
7130
- filterField(name) {
7131
- return super.field(name);
7132
- }
7133
- };
7134
-
7135
- // src/index.ts
7136
- init_Editors();
7137
- init_FormField();
7138
- init_FormFilterField();
7139
- init_PanelFilterField();
7140
- init_FilterPanel();
7141
-
7142
- // src/pageObjects/elements/Dialog.ts
7143
- init_AbstractElement();
7144
- var import_selenium_webdriver34 = require("selenium-webdriver");
7145
- init_AbstractButton();
7146
- var DIALOG_CLASS = ".d5-dialog";
7147
- var DIALOG_TITLE_CLASS = ".dialog__title";
7148
- var DIALOG_TEXT_CLASS = ".dialog__text";
7149
- var DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
7150
- var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
7151
- var DialogButton = class extends AbstractButton {
7152
- text;
7153
- constructor(parentCssSelector, text, driver) {
7154
- super(parentCssSelector, "", driver);
7155
- this.text = text;
7156
- }
7157
- async getElement() {
7158
- const panel = await super.getElement();
7159
- return panel.findElement(import_selenium_webdriver34.By.xpath(buttonByTextXpath(this.text)));
7160
- }
7161
- buttonNotDisplayedError() {
7162
- return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
7163
- }
7164
- getTitle() {
7165
- throw new Error(`Method "getTitle()" is not working.`);
7166
- }
7167
- };
7168
- var Dialog = class extends AbstractElement {
7169
- constructor(driver) {
7170
- super(driver, DIALOG_CLASS);
7171
- }
7172
- get titleSelector() {
7173
- return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
7174
- }
7175
- get textSelector() {
7176
- return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
7177
- }
7178
- get buttonsSelector() {
7179
- return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
7180
- }
7181
- async title() {
7182
- const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.titleSelector));
7183
- return await el.getText();
7184
- }
7185
- async text() {
7186
- const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.textSelector));
7187
- return await el.getText();
7188
- }
7189
- button(text) {
7190
- return new DialogButton(this.buttonsSelector, text, this.driver);
7096
+ var init_src = __esm({
7097
+ "src/index.ts"() {
7098
+ init_config();
7099
+ init_LoginPage();
7100
+ init_locators();
7101
+ init_waitElementIsVisible();
7102
+ init_wait();
7103
+ init_AbstractPage();
7104
+ init_LoginPage();
7105
+ init_SubsystemsPanel();
7106
+ init_FormEdit();
7107
+ init_ListForm();
7108
+ init_TreeView();
7109
+ init_ReportForm();
7110
+ init_Editors();
7111
+ init_FormField();
7112
+ init_FormFilterField();
7113
+ init_PanelFilterField();
7114
+ init_FilterPanel();
7115
+ init_Dialog();
7116
+ init_ApiRequest();
7191
7117
  }
7192
- };
7193
-
7194
- // src/api/ApiRequest.ts
7195
- init_config();
7196
- var import_d5lib = __toESM(require_d5lib());
7197
- function ApiRequest(objectName, operation) {
7198
- const { auth } = config();
7199
- (0, import_d5lib.config)(auth);
7200
- const postInstance = (0, import_d5lib.post)(objectName, operation);
7201
- const invoke = async () => {
7202
- return postInstance.send(true);
7203
- };
7204
- return Object.assign(postInstance, { invoke });
7205
- }
7118
+ });
7119
+ init_src();
7206
7120
  // Annotate the CommonJS export names for ESM import in node:
7207
7121
  0 && (module.exports = {
7208
7122
  AbstractPage,
@@ -7223,17 +7137,11 @@ function ApiRequest(objectName, operation) {
7223
7137
  TreeView,
7224
7138
  byTestId,
7225
7139
  byTestIdCssSelector,
7226
- click,
7227
7140
  config,
7228
- contextMenu,
7229
- createDriver,
7230
7141
  disabledLocator,
7231
7142
  editorFactory,
7232
- elementIsNotPresent,
7233
7143
  readonlyLocator,
7234
- signIn,
7235
7144
  wait,
7236
- waitElementIsClickable,
7237
7145
  waitElementIsVisible
7238
7146
  });
7239
7147
  /*! For license information please see d5lib.js.LICENSE.txt */