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

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,41 @@ 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
+ getLocator() {
80
+ return this.page.locator(`css=${this.getFullCssSelector()}`);
127
81
  }
128
82
  async getAttribute(attr) {
129
- const element = await this.getElement();
130
- return await element.getAttribute(attr);
83
+ const locator = this.getLocator();
84
+ if (await locator.isVisible()) {
85
+ return locator.getAttribute(attr);
86
+ }
87
+ return "";
131
88
  }
132
- async getClasses() {
133
- return await this.getAttribute("class");
89
+ getClasses() {
90
+ return this.getAttribute("class");
134
91
  }
135
- async getDataTestId() {
136
- return await this.getAttribute("data-testid");
92
+ getDataTestId() {
93
+ return this.getAttribute("data-testid");
137
94
  }
138
- async getDataDateMode() {
139
- return await this.getAttribute("data-datemode");
95
+ getDataDateMode() {
96
+ return this.getAttribute("data-datemode");
140
97
  }
141
98
  };
142
99
  }
@@ -147,15 +104,12 @@ var AbstractPage;
147
104
  var init_AbstractPage = __esm({
148
105
  "src/pageObjects/pages/AbstractPage.ts"() {
149
106
  "use strict";
150
- init_config();
151
107
  init_AbstractElement();
152
108
  AbstractPage = class extends AbstractElement {
153
109
  url;
154
- host;
155
- constructor(driver) {
156
- super(driver);
157
- this.host = config().auth.host;
158
- this.url = this.host + this.prependHash(this.path);
110
+ constructor(page) {
111
+ super(page);
112
+ this.url = this.prependHash(this.path);
159
113
  }
160
114
  prependHash(urlPath) {
161
115
  if (!urlPath.startsWith("/#")) {
@@ -164,7 +118,7 @@ var init_AbstractPage = __esm({
164
118
  return urlPath;
165
119
  }
166
120
  async goToUrl(url) {
167
- await this.driver.get(url);
121
+ await this.page.goto(url);
168
122
  }
169
123
  get path() {
170
124
  return "/#";
@@ -173,115 +127,99 @@ var init_AbstractPage = __esm({
173
127
  await this.goToUrl(this.url);
174
128
  }
175
129
  async reloadPage() {
176
- await this.driver.navigate().refresh();
130
+ await this.page.reload();
177
131
  }
178
132
  };
179
133
  }
180
134
  });
181
135
 
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"() {
136
+ // src/pageObjects/pages/LoginPage.ts
137
+ var LOGIN_PATH, LoginPage;
138
+ var init_LoginPage = __esm({
139
+ "src/pageObjects/pages/LoginPage.ts"() {
229
140
  "use strict";
230
- click = async (webElement, driver) => {
231
- if (!await webElement.isDisplayed()) {
232
- await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
141
+ init_AbstractPage();
142
+ LOGIN_PATH = "/login";
143
+ LoginPage = class extends AbstractPage {
144
+ async locate() {
145
+ await super.locate();
146
+ await this.page.getByTestId("loginField").waitFor({ state: "visible" });
233
147
  }
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);
148
+ get path() {
149
+ return LOGIN_PATH;
150
+ }
151
+ enterUsername(username) {
152
+ return this.page.getByTestId("loginField").fill(username);
153
+ }
154
+ enterPassword(password) {
155
+ return this.page.getByTestId("passwordField").fill(password);
156
+ }
157
+ async clickLoginButton() {
158
+ await this.page.getByTestId("loginButton").click();
159
+ }
160
+ async loginWith(username, password) {
161
+ await this.enterUsername(username);
162
+ await this.enterPassword(password);
163
+ await this.clickLoginButton();
240
164
  }
241
- const actions = driver.actions({ async: true });
242
- await actions.move({ origin: webElement }).contextClick().perform();
243
165
  };
244
166
  }
245
167
  });
246
168
 
247
169
  // src/utils/locators.ts
248
- var import_selenium_webdriver2, byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
170
+ var byTestIdCssSelector, byTestId, readonlyLocator, disabledLocator;
249
171
  var init_locators = __esm({
250
172
  "src/utils/locators.ts"() {
251
173
  "use strict";
252
- import_selenium_webdriver2 = require("selenium-webdriver");
253
174
  byTestIdCssSelector = (testId, element = "div") => {
254
175
  return `${element}[data-testid="${testId}"]`;
255
176
  };
256
177
  byTestId = (testId, element = "div") => {
257
- return import_selenium_webdriver2.By.css(byTestIdCssSelector(testId, element));
178
+ return byTestIdCssSelector(testId, element);
258
179
  };
259
180
  readonlyLocator = "readonly";
260
181
  disabledLocator = "disabled";
261
182
  }
262
183
  });
263
184
 
264
- // src/utils/waitElementIsClickable.ts
265
- async function waitElementIsClickable({
185
+ // src/utils/waitElementIsVisible.ts
186
+ async function waitElementIsVisible({
266
187
  timeout,
267
- errorMessage,
268
- driver,
269
- ...rest
188
+ locator
270
189
  }) {
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);
190
+ try {
191
+ await locator.waitFor({ state: "visible", timeout });
192
+ } catch {
193
+ throw new Error("Element is not visible");
194
+ }
276
195
  }
277
- var waitElementIsClickable_default;
278
- var init_waitElementIsClickable = __esm({
279
- "src/utils/waitElementIsClickable.ts"() {
196
+ var waitElementIsVisible_default;
197
+ var init_waitElementIsVisible = __esm({
198
+ "src/utils/waitElementIsVisible.ts"() {
199
+ "use strict";
200
+ waitElementIsVisible_default = waitElementIsVisible;
201
+ }
202
+ });
203
+
204
+ // src/utils/wait.ts
205
+ async function wait(condition, page, errorMessage, timeout = 3e4) {
206
+ const start = Date.now();
207
+ while (true) {
208
+ try {
209
+ const result = await condition();
210
+ if (result) return;
211
+ } catch {
212
+ }
213
+ if (Date.now() - start > timeout) {
214
+ const msg = errorMessage || `Timeout waiting for condition after ${timeout}ms`;
215
+ throw new Error(msg);
216
+ }
217
+ await page.waitForTimeout(100);
218
+ }
219
+ }
220
+ var init_wait = __esm({
221
+ "src/utils/wait.ts"() {
280
222
  "use strict";
281
- init_config();
282
- init_wait();
283
- init_fixElementStaleError();
284
- waitElementIsClickable_default = waitElementIsClickable;
285
223
  }
286
224
  });
287
225
 
@@ -293,9 +231,8 @@ var init_AbstractElementWithParent = __esm({
293
231
  init_AbstractElement();
294
232
  init_locators();
295
233
  AbstractElementWithParent = class extends AbstractElement {
296
- parentCssSelector;
297
- constructor(parentCssSelector, elementCssSelector, driver) {
298
- super(driver, elementCssSelector);
234
+ constructor(parentCssSelector, elementCssSelector, page) {
235
+ super(page, elementCssSelector);
299
236
  this.parentCssSelector = parentCssSelector;
300
237
  }
301
238
  getFullCssSelector() {
@@ -308,59 +245,92 @@ var init_AbstractElementWithParent = __esm({
308
245
  return `${this.parentCssSelector} ${this.elementCssSelector}`;
309
246
  }
310
247
  async isReadonly() {
311
- const classSting = await this.getClasses();
312
- return classSting.includes(readonlyLocator);
248
+ const classString = await this.getClasses();
249
+ return classString.includes(readonlyLocator);
313
250
  }
314
251
  async isDisabled() {
315
- const classSting = await this.getClasses();
316
- return classSting.includes(disabledLocator);
252
+ const classString = await this.getClasses();
253
+ return classString.includes(disabledLocator);
317
254
  }
318
255
  };
319
256
  }
320
257
  });
321
258
 
322
- // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
323
- var InputClearStrategy;
324
- var init_InputClearStrategy = __esm({
325
- "src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
259
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
260
+ var SubsystemsPanelHeader;
261
+ var init_SubsystemsPanelHeader = __esm({
262
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts"() {
326
263
  "use strict";
327
- InputClearStrategy = class {
328
- async clear(editor) {
329
- const inputEl = await editor.getInputElement();
330
- await inputEl.clear();
264
+ init_AbstractElementWithParent();
265
+ SubsystemsPanelHeader = class extends AbstractElementWithParent {
266
+ async title() {
267
+ return this.page.locator(this.getFullCssSelector());
268
+ }
269
+ };
270
+ }
271
+ });
272
+
273
+ // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
274
+ var DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
275
+ var init_ClearButtonStrategy = __esm({
276
+ "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
277
+ "use strict";
278
+ DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
279
+ DX_CLEAR_BUTTON_AREA = ".dx-clear-button-area .dx-icon-clear";
280
+ ClearButtonStrategy = class {
281
+ editorContainerSelector;
282
+ page;
283
+ constructor(editorContainerSelector, page) {
284
+ this.editorContainerSelector = editorContainerSelector;
285
+ this.page = page;
286
+ }
287
+ get editorContainer() {
288
+ return this.page.locator(this.editorContainerSelector);
289
+ }
290
+ async isEmptyEditorField() {
291
+ const classAttribute = await this.editorContainer.getAttribute("class");
292
+ return Boolean(classAttribute?.includes(DX_TEXTEDITOR_EMPTY));
293
+ }
294
+ async clear() {
295
+ if (await this.isEmptyEditorField()) {
296
+ return;
297
+ }
298
+ const clearButton = this.editorContainer.locator(`${DX_CLEAR_BUTTON_AREA}`);
299
+ if (await clearButton.isHidden()) {
300
+ return;
301
+ }
302
+ await clearButton.click();
331
303
  }
332
304
  };
333
305
  }
334
306
  });
335
307
 
336
308
  // src/pageObjects/elements/Editors/AbstractEditor.ts
337
- var import_selenium_webdriver7, AbstractDXEditorWithInput;
309
+ var AbstractDXEditorWithInput;
338
310
  var init_AbstractEditor = __esm({
339
311
  "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
340
312
  "use strict";
341
- import_selenium_webdriver7 = require("selenium-webdriver");
342
- init_actions();
343
- init_InputClearStrategy();
344
313
  init_AbstractElementWithParent();
314
+ init_ClearButtonStrategy();
345
315
  AbstractDXEditorWithInput = class extends AbstractElementWithParent {
346
- clearStrategy = new InputClearStrategy();
316
+ clearStrategy = new ClearButtonStrategy(this.getFullCssSelector(), this.page);
347
317
  setClearStrategy(strategy) {
348
318
  this.clearStrategy = strategy;
349
319
  }
350
320
  getInputCssSelector() {
351
321
  return `${this.getFullCssSelector()} .dx-texteditor-input`;
352
322
  }
353
- async getInputElement() {
354
- return this.driver.findElement(import_selenium_webdriver7.By.css(this.getInputCssSelector()));
323
+ getInputLocator() {
324
+ return this.page.locator(this.getInputCssSelector());
355
325
  }
356
- async getInputValue() {
357
- const inputEl = await this.getInputElement();
358
- return inputEl.getAttribute("value");
326
+ getInputValue() {
327
+ return this.getInputLocator().inputValue();
359
328
  }
360
329
  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);
330
+ const input = this.getInputLocator();
331
+ await input.click();
332
+ await input.fill(value + "");
333
+ await input.press("Enter");
364
334
  }
365
335
  async clear() {
366
336
  await this.clearStrategy.clear(this);
@@ -375,11 +345,11 @@ var init_TextEditor = __esm({
375
345
  "src/pageObjects/elements/Editors/TextEditor.ts"() {
376
346
  "use strict";
377
347
  init_AbstractEditor();
378
- init_InputClearStrategy();
348
+ init_ClearButtonStrategy();
379
349
  TextEditor = class extends AbstractDXEditorWithInput {
380
- constructor(parentCssSelector, elementCssSelector, driver) {
381
- super(parentCssSelector, elementCssSelector, driver);
382
- this.setClearStrategy(new InputClearStrategy());
350
+ constructor(parentCssSelector, elementCssSelector, page) {
351
+ super(parentCssSelector, elementCssSelector, page);
352
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
383
353
  }
384
354
  async getValue() {
385
355
  const value = await super.getInputValue();
@@ -398,11 +368,11 @@ var init_NumberEditor = __esm({
398
368
  "src/pageObjects/elements/Editors/NumberEditor.ts"() {
399
369
  "use strict";
400
370
  init_AbstractEditor();
401
- init_InputClearStrategy();
371
+ init_ClearButtonStrategy();
402
372
  NumberEditor = class extends AbstractDXEditorWithInput {
403
- constructor(parentCssSelector, elementCssSelector, driver) {
404
- super(parentCssSelector, elementCssSelector, driver);
405
- this.setClearStrategy(new InputClearStrategy());
373
+ constructor(parentCssSelector, elementCssSelector, page) {
374
+ super(parentCssSelector, elementCssSelector, page);
375
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
406
376
  }
407
377
  async getValue() {
408
378
  const value = await super.getInputValue();
@@ -445,8 +415,8 @@ var init_AbstractFormElement = __esm({
445
415
  "use strict";
446
416
  init_AbstractElementWithParent();
447
417
  AbstractFormElement = class extends AbstractElementWithParent {
448
- constructor(parentCssSelector, elementCssSelector, driver) {
449
- super(parentCssSelector, elementCssSelector, driver);
418
+ constructor(parentCssSelector, elementCssSelector, page) {
419
+ super(parentCssSelector, elementCssSelector, page);
450
420
  }
451
421
  };
452
422
  }
@@ -457,7 +427,6 @@ var CheckBox;
457
427
  var init_CheckBox = __esm({
458
428
  "src/pageObjects/elements/Editors/CheckBox.ts"() {
459
429
  "use strict";
460
- init_actions();
461
430
  init_AbstractElementWithParent();
462
431
  CheckBox = class extends AbstractElementWithParent {
463
432
  async getValue() {
@@ -467,10 +436,10 @@ var init_CheckBox = __esm({
467
436
  return null;
468
437
  }
469
438
  async setValue(value) {
470
- const inputEl = await this.getElement();
439
+ const inputEl = this.getLocator();
471
440
  const currentValue = await this.getValue();
472
441
  if (currentValue !== value) {
473
- await click(inputEl, this.driver);
442
+ await inputEl.click();
474
443
  }
475
444
  }
476
445
  };
@@ -490,105 +459,122 @@ var init_xpathHelper = __esm({
490
459
  }
491
460
  });
492
461
 
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 });
462
+ // src/utils/typesUtil.ts
463
+ function isEmptyValue(value) {
464
+ switch (true) {
465
+ case !isDefined(value):
466
+ case value === "":
467
+ case (isArray(value) && !value.length):
468
+ case (isObject(value) && isEmptyObject(value)):
469
+ return true;
534
470
  }
471
+ return false;
535
472
  }
536
- var withCustomTimeouts_default;
537
- var init_withCustomTimeouts = __esm({
538
- "src/utils/withCustomTimeouts.ts"() {
473
+ var types, isObject, isEmptyObject, type, isNull, isArray, isDefined, isString, isDate, isArrayOfDates, isUndefined;
474
+ var init_typesUtil = __esm({
475
+ "src/utils/typesUtil.ts"() {
539
476
  "use strict";
540
- withCustomTimeouts_default = withCustomTimeouts;
477
+ types = {
478
+ "[object Array]": "array",
479
+ "[object Date]": "date",
480
+ "[object Object]": "object",
481
+ "[object String]": "string",
482
+ "[object Null]": "null"
483
+ };
484
+ isObject = function(value) {
485
+ return type(value) === "object" && !isNull(value) && !isArray(value) && !isDate(value);
486
+ };
487
+ isEmptyObject = function(object) {
488
+ return !Object.keys(object).length;
489
+ };
490
+ type = function(object) {
491
+ const typeOfObject = Object.prototype.toString.call(object);
492
+ return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
493
+ };
494
+ isNull = function(value) {
495
+ return type(value) === "null";
496
+ };
497
+ isArray = function(value) {
498
+ return type(value) === "array";
499
+ };
500
+ isDefined = function(value) {
501
+ return value !== null && !isUndefined(value);
502
+ };
503
+ isString = function(object) {
504
+ return typeof object === "string";
505
+ };
506
+ isDate = function(object) {
507
+ return type(object) === "date";
508
+ };
509
+ isArrayOfDates = function(array) {
510
+ return isArray(array) && array.every(isDate);
511
+ };
512
+ isUndefined = (val) => val === void 0;
541
513
  }
542
514
  });
543
515
 
544
516
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
545
- var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
517
+ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
546
518
  var init_SelectBoxEditor = __esm({
547
519
  "src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
548
520
  "use strict";
549
521
  init_AbstractEditor();
550
- import_selenium_webdriver9 = require("selenium-webdriver");
551
- init_xpathHelper();
552
- init_actions();
553
522
  init_ClearButtonStrategy();
554
- init_withCustomTimeouts();
523
+ init_xpathHelper();
524
+ init_src();
525
+ init_typesUtil();
555
526
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
556
527
  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}"`);
528
+ dropDownOptionClick = async (optionValue, page, delay = true) => {
529
+ const locator = page.locator(`xpath=${combinedValueXpath(optionValue)}`);
530
+ if (delay) {
531
+ try {
532
+ await locator.waitFor({ state: "visible", timeout: 5e3 });
533
+ } catch {
534
+ throw new Error(`Item not found: "${optionValue}"`);
535
+ }
536
+ } else {
537
+ if (await locator.count() === 0) {
538
+ throw new Error(`Item not found: "${optionValue}"`);
539
+ }
570
540
  }
571
- if (err)
572
- throw err;
541
+ await locator.click();
573
542
  };
574
543
  SelectBoxEditor = class extends AbstractDXEditorWithInput {
575
- constructor(parentCssSelector, elementCssSelector, driver) {
576
- super(parentCssSelector, elementCssSelector, driver);
577
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
544
+ constructor(parentCssSelector, elementCssSelector, page) {
545
+ super(parentCssSelector, elementCssSelector, page);
546
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
547
+ }
548
+ getInputLocator() {
549
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
578
550
  }
579
551
  async setSelectInputValue(value) {
580
- const inputEl = await this.getInputElement();
581
- await click(inputEl, this.driver);
552
+ const inputEl = this.getInputLocator();
553
+ await inputEl.click();
582
554
  try {
583
- await dropDownOptionClick(value, this.driver, false);
555
+ await inputEl.fill(value);
556
+ await inputEl.press("Enter");
557
+ await dropDownOptionClick(value, this.page, false);
584
558
  } catch {
585
- await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
586
- await dropDownOptionClick(value, this.driver);
559
+ await dropDownOptionClick(value, this.page);
587
560
  }
588
561
  }
562
+ getHiddenInputValue() {
563
+ const hiddenInput = this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
564
+ return hiddenInput.getAttribute("value");
565
+ }
589
566
  async getValue() {
590
- const value = await super.getInputValue();
591
- return value == "" ? null : value;
567
+ let result = null;
568
+ await wait(async () => {
569
+ const hiddenValue = await this.getHiddenInputValue();
570
+ if (!isEmptyValue(hiddenValue)) {
571
+ const value = await super.getInputValue();
572
+ result = value;
573
+ return !isEmptyValue(value);
574
+ }
575
+ return true;
576
+ }, this.page);
577
+ return result === "" ? null : result;
592
578
  }
593
579
  setValue(value) {
594
580
  return this.setSelectInputValue(value);
@@ -602,7 +588,6 @@ var SwitchEditor;
602
588
  var init_SwitchEditor = __esm({
603
589
  "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
604
590
  "use strict";
605
- init_actions();
606
591
  init_AbstractElementWithParent();
607
592
  init_wait();
608
593
  SwitchEditor = class extends AbstractElementWithParent {
@@ -616,141 +601,139 @@ var init_SwitchEditor = __esm({
616
601
  if (value !== 0 && value !== 1) {
617
602
  value = value ? 1 : 0;
618
603
  }
619
- const inputEl = await this.getElement();
604
+ const inputEl = this.getLocator();
620
605
  const currentValue = await this.getValue();
621
606
  if (currentValue === value) {
622
607
  return;
623
608
  }
624
- await click(inputEl, this.driver);
625
- await safeWait(async () => {
609
+ await inputEl.click();
610
+ await wait(async () => {
626
611
  const updatedValue = await this.getValue();
627
612
  return updatedValue !== currentValue;
628
- }, this.driver);
613
+ }, this.page);
629
614
  }
630
615
  };
631
616
  }
632
617
  });
633
618
 
634
619
  // src/pageObjects/elements/Editors/TagBox.ts
635
- var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, getSelectedOptionXpath, TagBox;
620
+ var TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TagBox;
636
621
  var init_TagBox = __esm({
637
622
  "src/pageObjects/elements/Editors/TagBox.ts"() {
638
623
  "use strict";
639
624
  init_AbstractEditor();
640
- import_selenium_webdriver10 = require("selenium-webdriver");
641
- init_actions();
625
+ init_ClearButtonStrategy();
642
626
  init_locators();
643
627
  init_SelectBoxEditor();
644
- init_ClearButtonStrategy();
645
- init_fixElementStaleError();
646
628
  init_wait();
647
629
  TAGS_SELECTOR = ".dx-tag .tag-text";
648
630
  DX_TAG_CONTAINER = "dx-tag-container";
649
631
  DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
650
632
  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
633
  TagBox = class extends AbstractDXEditorWithInput {
653
- constructor(parentCssSelector, elementCssSelector, driver) {
654
- super(parentCssSelector, elementCssSelector, driver);
655
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
634
+ constructor(parentCssSelector, elementCssSelector, page) {
635
+ super(parentCssSelector, elementCssSelector, page);
636
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
637
+ }
638
+ getInputLocator() {
639
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
656
640
  }
657
641
  async setTagBoxInputValue(values) {
658
642
  const lastElement = values[values.length - 1];
659
- const inputEl = await this.getInputElement();
660
- await inputEl.click();
643
+ const input = this.getInputLocator();
644
+ await input.click();
661
645
  for (const value of values) {
662
- await this.selectOption(inputEl, value, lastElement);
646
+ await this.selectOption(input, value, lastElement);
663
647
  }
664
648
  await this.confirmSelection();
665
649
  }
666
650
  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
- );
651
+ const option = this.page.locator(`.dx-overlay-wrapper .dx-list-item[aria-selected="true"] >> text=${value}`);
652
+ await option.waitFor({ state: "visible", timeout: 5e3 });
675
653
  }
676
- async selectOption(inputEl, value, lastElement) {
654
+ async selectOption(input, value, lastElement) {
677
655
  try {
678
- await dropDownOptionClick(value, this.driver, false);
656
+ await dropDownOptionClick(value, this.page, false);
679
657
  } catch {
680
- await inputEl.sendKeys(value);
681
- await dropDownOptionClick(value, this.driver);
658
+ await input.fill(value);
659
+ await dropDownOptionClick(value, this.page, true);
682
660
  }
683
661
  await this.waitOptionSelection(value);
684
662
  if (value !== lastElement) {
685
- await inputEl.clear();
663
+ await input.fill("");
686
664
  }
687
665
  }
688
666
  async confirmSelection() {
689
- const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
690
- await click(btnOk, this.driver);
667
+ const btnOk = this.page.locator(BTN_OK_SELECTOR);
668
+ await btnOk.click();
691
669
  }
692
670
  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}`)
671
+ if (await this.isTagBoxEmpty()) return [];
672
+ let count = 0;
673
+ let tags = null;
674
+ await wait(
675
+ async () => {
676
+ tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`);
677
+ count = await tags.count();
678
+ return count > 0;
679
+ },
680
+ this.page
698
681
  );
699
682
  const values = [];
700
- for (const tag of tags) {
701
- values.push(await tag.getAttribute("textContent"));
683
+ if (tags) {
684
+ for (let i = 0; i < count; i++) {
685
+ const tag = tags.nth(i);
686
+ const text = await tag.innerText();
687
+ if (text) values.push(text.trim());
688
+ }
702
689
  }
703
690
  return values;
704
691
  }
705
692
  async isTagBoxEmpty() {
706
- const classAttribute = await this.getClasses();
707
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
693
+ const classAttr = await this.getClasses();
694
+ return classAttr.includes(DX_TEXTEDITOR_EMPTY2);
708
695
  }
709
696
  async getValue() {
710
697
  const value = await this.getTagBoxInputValue();
711
698
  return value.length ? value : null;
712
699
  }
713
700
  async setValue(values) {
714
- if (!Array.isArray(values)) {
715
- throw new Error("The provided value is not an array");
716
- }
701
+ if (!Array.isArray(values)) throw new Error("The provided value is not an array");
717
702
  await this.setTagBoxInputValue(values);
718
703
  }
719
704
  async remove(itemText) {
720
705
  const tagValues = await this.getValue();
721
- const tagExists = tagValues.includes(itemText);
722
- if (!tagExists) {
706
+ if (!tagValues.includes(itemText)) {
723
707
  throw new Error(`The tag with the text: ${itemText} was not found`);
724
708
  }
725
709
  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);
710
+ const clearBtn = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`);
711
+ await clearBtn.click();
730
712
  }
731
713
  };
732
714
  }
733
715
  });
734
716
 
735
717
  // src/pageObjects/elements/Editors/ButtonGroup.ts
736
- var import_selenium_webdriver11, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
718
+ var ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
737
719
  var init_ButtonGroup = __esm({
738
720
  "src/pageObjects/elements/Editors/ButtonGroup.ts"() {
739
721
  "use strict";
740
- init_actions();
741
- import_selenium_webdriver11 = require("selenium-webdriver");
742
722
  init_AbstractElementWithParent();
743
723
  ITEM_CLASS = "dx-buttongroup-item";
744
724
  SELECTED_CLASS = "dx-state-selected";
745
725
  ButtonGroup = class extends AbstractElementWithParent {
726
+ constructor(parentCssSelector, elementCssSelector, page) {
727
+ super(parentCssSelector, elementCssSelector, page);
728
+ }
746
729
  getItems() {
747
- return this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
730
+ return this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}`).all();
748
731
  }
749
- getDataValue(el) {
750
- return el.getAttribute("data-value");
732
+ async getDataValue(el) {
733
+ return await el.getAttribute("data-value");
751
734
  }
752
735
  async getValue() {
753
- const selectedEl = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
736
+ const selectedEl = this.page.locator(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`);
754
737
  return this.getDataValue(selectedEl);
755
738
  }
756
739
  async setValue(value) {
@@ -764,7 +747,7 @@ var init_ButtonGroup = __esm({
764
747
  }
765
748
  }
766
749
  if (!buttonEl) throw new Error(`Cannot find item in button group with text: ${value}`);
767
- await click(buttonEl, this.driver);
750
+ await buttonEl.click();
768
751
  }
769
752
  };
770
753
  }
@@ -838,14 +821,12 @@ var init_DateSelectMode = __esm({
838
821
  });
839
822
 
840
823
  // 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;
824
+ 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
825
  var init_Calendar = __esm({
843
826
  "src/pageObjects/elements/Editors/Date/Calendar.ts"() {
844
827
  "use strict";
845
828
  init_AbstractElementWithParent();
846
- import_selenium_webdriver12 = require("selenium-webdriver");
847
829
  init_locators();
848
- init_actions();
849
830
  init_utils();
850
831
  BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
851
832
  BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
@@ -860,131 +841,110 @@ var init_Calendar = __esm({
860
841
  movesToCalendarEndForMonth = 1;
861
842
  Calendar = class extends AbstractElementWithParent {
862
843
  _parentCssSelector;
863
- constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
864
- super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
844
+ constructor({ parentCssSelector, dateFieldDataTestID, page }) {
845
+ super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), page);
865
846
  this._parentCssSelector = parentCssSelector;
866
847
  }
848
+ get root() {
849
+ return this.getLocator();
850
+ }
867
851
  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);
852
+ const dateField = this.page.locator(this._parentCssSelector);
853
+ await dateField.locator(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`).click();
871
854
  }
872
- /**
873
- * Переходимо на найвищий рівень календаря
874
- */
875
855
  async moveToCalendarEnd(count) {
876
856
  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);
857
+ await this.root.locator(`.${CALENDAR_CAPTION_SELECTOR}`).click();
880
858
  count--;
881
859
  }
882
860
  }
883
- /**
884
- * Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
885
- */
886
861
  async choosePeriodForYear(targetYear) {
887
862
  let found = false;
888
863
  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();
864
+ const periodCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
865
+ const count = await periodCells.count();
866
+ for (let i = 0; i < count; i++) {
867
+ const cell = periodCells.nth(i);
868
+ const text = await cell.innerText();
893
869
  if (text) {
894
870
  const [start, end] = text.split("-").map(Number);
895
871
  if (targetYear >= start && targetYear <= end) {
896
- await click(cell, this.driver);
872
+ await cell.click();
897
873
  found = true;
898
874
  break;
899
875
  }
900
876
  }
901
877
  }
902
878
  if (!found) {
903
- const firstPeriod = await periodCells[0].getText();
904
- const [start] = firstPeriod.split("-").map(Number);
879
+ const firstText = await periodCells.first().innerText();
880
+ const [start] = firstText.split("-").map(Number);
905
881
  if (targetYear < start) {
906
- const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
907
- await click(prevBtn, this.driver);
882
+ await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
908
883
  } else {
909
- const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
910
- await click(nextBtn, this.driver);
884
+ await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
911
885
  }
912
886
  }
913
887
  }
914
888
  }
915
- /**
916
- * Пошук та клік по конкретному року з навігацією
917
- */
918
889
  async chooseYear(targetYear) {
919
890
  let found = false;
920
891
  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);
892
+ const yearCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR} span`);
893
+ const count = await yearCells.count();
894
+ for (let i = 0; i < count; i++) {
895
+ const cell = yearCells.nth(i);
896
+ const year = Number(await cell.innerText());
897
+ if (!isNaN(year) && year === targetYear) {
898
+ await cell.click();
928
899
  found = true;
929
900
  break;
930
901
  }
931
902
  }
932
903
  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);
904
+ const firstYear = Number(await yearCells.first().innerText());
905
+ const lastYear = Number(await yearCells.nth(count - 1).innerText());
937
906
  if (targetYear < firstYear) {
938
- const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
939
- await click(prevBtn, this.driver);
907
+ await this.root.locator(`.${CALENDAR_PREVIOUS_SELECTOR}`).click();
940
908
  } else if (targetYear > lastYear) {
941
- const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
942
- await click(nextBtn, this.driver);
909
+ await this.root.locator(`.${CALENDAR_NEXT_SELECTOR}`).click();
943
910
  } else {
944
911
  throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
945
912
  }
946
913
  }
947
914
  }
948
915
  }
949
- /**
950
- * Пошук та клік по конкретному місяцю
951
- */
952
916
  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) {
917
+ const monthCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
918
+ const count = await monthCells.count();
919
+ for (let i = 0; i < count; i++) {
920
+ const cell = monthCells.nth(i);
956
921
  const dataValue = await cell.getAttribute("data-value");
957
922
  if (dataValue) {
958
923
  const [cellYear, cellMonth] = dataValue.split("/").map(Number);
959
924
  if (cellYear === year && cellMonth === month) {
960
- await click(cell, this.driver);
925
+ await cell.click();
961
926
  return;
962
927
  }
963
928
  }
964
929
  }
965
930
  throw new Error(`Month ${month} for year ${year} not found`);
966
931
  }
967
- /**
968
- * Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
969
- */
970
932
  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) {
933
+ const dayCells = this.root.locator(`.${CALENDAR_CELL_SELECTOR}`);
934
+ const count = await dayCells.count();
935
+ for (let i = 0; i < count; i++) {
936
+ const cell = dayCells.nth(i);
974
937
  const dataValue = await cell.getAttribute("data-value");
975
938
  if (dataValue) {
976
939
  const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
977
940
  if (cellYear === year && cellMonth === month && cellDay === day) {
978
- await click(cell, this.driver);
941
+ await cell.click();
979
942
  return;
980
943
  }
981
944
  }
982
945
  }
983
946
  throw new Error(`Day ${day}.${month}.${year} not found`);
984
947
  }
985
- /**
986
- * Встановлення дати для тижня
987
- */
988
948
  async setValueForWeek(date) {
989
949
  const { year, month, day } = getYearMonthDay(date);
990
950
  await this.moveToCalendarEnd(movesToCalendarEndForWeek);
@@ -994,9 +954,6 @@ var init_Calendar = __esm({
994
954
  await this.chooseDay(year, month, day);
995
955
  await this.save();
996
956
  }
997
- /**
998
- * Встановлення дати для місяця
999
- */
1000
957
  async setValueForMonth(date) {
1001
958
  const { year, month } = getYearMonthDay(date);
1002
959
  await this.moveToCalendarEnd(movesToCalendarEndForMonth);
@@ -1004,46 +961,37 @@ var init_Calendar = __esm({
1004
961
  await this.chooseMonth(year, month);
1005
962
  await this.save();
1006
963
  }
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
- );
964
+ getDateFromInputLocator() {
965
+ return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
1012
966
  }
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
- );
967
+ getDateToInputLocator() {
968
+ return this.root.locator(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`);
1018
969
  }
1019
970
  async save() {
1020
- const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
1021
- await click(btnOk, this.driver);
971
+ await this.root.locator(`.${BTN_SAVE_SELECTOR}`).click();
1022
972
  }
1023
973
  };
1024
974
  }
1025
975
  });
1026
976
 
1027
977
  // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
1028
- var import_selenium_webdriver13, DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
978
+ var DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
1029
979
  var init_BaseDateEditor = __esm({
1030
980
  "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1031
981
  "use strict";
1032
982
  init_AbstractEditor();
1033
- init_InputClearStrategy();
1034
- import_selenium_webdriver13 = require("selenium-webdriver");
1035
- init_actions();
1036
983
  init_utils();
1037
984
  init_DateSelectMode();
1038
985
  init_Calendar();
986
+ init_ClearButtonStrategy();
1039
987
  DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
1040
988
  BaseDateEditor = class extends AbstractDXEditorWithInput {
1041
- constructor(parentCssSelector, elementCssSelector, driver) {
1042
- super(parentCssSelector, elementCssSelector, driver);
1043
- this.setClearStrategy(new InputClearStrategy());
989
+ constructor(parentCssSelector, elementCssSelector, page) {
990
+ super(parentCssSelector, elementCssSelector, page);
991
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1044
992
  }
1045
993
  async getIsAllowedTime() {
1046
- const dateField = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()}`));
994
+ const dateField = this.page.locator(`${this.getFullCssSelector()}`);
1047
995
  const classString = await dateField.getAttribute("class");
1048
996
  return classString.includes(DATETIME_ALLOWED_SELECTOR);
1049
997
  }
@@ -1052,7 +1000,7 @@ var init_BaseDateEditor = __esm({
1052
1000
  const calendar = new Calendar({
1053
1001
  parentCssSelector: this.getFullCssSelector(),
1054
1002
  dateFieldDataTestID,
1055
- driver: this.driver
1003
+ page: this.page
1056
1004
  });
1057
1005
  await calendar.init();
1058
1006
  return calendar;
@@ -1067,13 +1015,13 @@ var init_BaseDateEditor = __esm({
1067
1015
  }
1068
1016
  async setArrayValue(value) {
1069
1017
  const calendar = await this.initCalendar();
1070
- const dateFromInput = await calendar.getDateFromInput();
1071
- const dateToInput = await calendar.getDateToInput();
1018
+ const dateFromInput = calendar.getDateFromInputLocator();
1019
+ const dateToInput = calendar.getDateToInputLocator();
1072
1020
  await this.setSingleValue(value[0], dateFromInput);
1073
1021
  await this.setSingleValue(value[1], dateToInput);
1074
1022
  await calendar.save();
1075
1023
  }
1076
- async setSingleValue(value, inputEl) {
1024
+ async setSingleValue(value, input) {
1077
1025
  const dateMode = await this.getDataDateMode();
1078
1026
  if (DateSelectMode.isWeek(dateMode)) {
1079
1027
  await this.setValueForWeek(value);
@@ -1083,18 +1031,18 @@ var init_BaseDateEditor = __esm({
1083
1031
  await this.setValueForMonth(value);
1084
1032
  return;
1085
1033
  }
1086
- const actions = this.driver.actions({ async: true });
1087
1034
  const isTimeAllowed = await this.getIsAllowedTime();
1088
1035
  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();
1036
+ await input.click();
1037
+ await input.press("Home");
1038
+ await input.pressSequentially(formattedDate);
1039
+ await input.press("Enter");
1092
1040
  }
1093
1041
  async setDateValue(value) {
1094
1042
  if (Array.isArray(value)) {
1095
1043
  await this.setArrayValue(value);
1096
1044
  } else {
1097
- await this.setSingleValue(value, await this.getInputElement());
1045
+ await this.setSingleValue(value, this.getInputLocator());
1098
1046
  }
1099
1047
  }
1100
1048
  };
@@ -1102,77 +1050,84 @@ var init_BaseDateEditor = __esm({
1102
1050
  });
1103
1051
 
1104
1052
  // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
1105
- var import_selenium_webdriver14, SingleDateEditor;
1053
+ var SingleDateEditor;
1106
1054
  var init_SingleDateEditor = __esm({
1107
1055
  "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
1108
1056
  "use strict";
1109
- import_selenium_webdriver14 = require("selenium-webdriver");
1110
- init_InputClearStrategy();
1111
1057
  init_BaseDateEditor();
1112
1058
  init_utils();
1059
+ init_ClearButtonStrategy();
1060
+ init_src();
1113
1061
  SingleDateEditor = class extends BaseDateEditor {
1114
- constructor(parentCssSelector, elementCssSelector, driver) {
1115
- super(parentCssSelector, elementCssSelector, driver);
1116
- this.setClearStrategy(new InputClearStrategy());
1062
+ constructor(parentCssSelector, elementCssSelector, page) {
1063
+ super(parentCssSelector, elementCssSelector, page);
1064
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1117
1065
  }
1118
- async getDateElement() {
1119
- return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1066
+ getDateLocator() {
1067
+ return this.page.locator(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]");
1120
1068
  }
1121
1069
  async getDateValue() {
1122
- const inputEl = await this.getDateElement();
1123
- return inputEl.getAttribute("value");
1070
+ const input = this.getDateLocator();
1071
+ return input.getAttribute("value");
1124
1072
  }
1125
1073
  async getValue() {
1126
1074
  const value = await this.getDateValue();
1127
1075
  const isTimeAllowed = await this.getIsAllowedTime();
1128
1076
  if (isTimeAllowed) {
1129
- return value == "" ? null : formatToDateTime(value);
1077
+ return value === "" ? null : formatToDateTime(value);
1130
1078
  }
1131
- return value == "" ? null : new Date(value);
1079
+ return value === "" ? null : new Date(value);
1132
1080
  }
1133
- setValue(value) {
1134
- if (typeof value === "object") {
1135
- return this.setDateValue(value);
1081
+ async setValue(value) {
1082
+ if (value instanceof Date) {
1083
+ await wait(async () => {
1084
+ await this.setDateValue(value);
1085
+ const updatedValue = await this.getValue();
1086
+ return updatedValue.toDateString() === value.toDateString();
1087
+ }, this.page);
1088
+ } else {
1089
+ throw new Error(`Value is incorrect. It should be a Date object`);
1136
1090
  }
1137
- throw new Error(`Value is incorrect. It should be Object`);
1138
1091
  }
1139
1092
  };
1140
1093
  }
1141
1094
  });
1142
1095
 
1143
1096
  // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
1144
- var import_selenium_webdriver15, DateRangeEditor;
1097
+ var DateRangeEditor;
1145
1098
  var init_DateRangeEditor = __esm({
1146
1099
  "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
1147
1100
  "use strict";
1148
- import_selenium_webdriver15 = require("selenium-webdriver");
1149
- init_InputClearStrategy();
1150
1101
  init_BaseDateEditor();
1102
+ init_typesUtil();
1103
+ init_ClearButtonStrategy();
1151
1104
  DateRangeEditor = class extends BaseDateEditor {
1152
- constructor(parentCssSelector, elementCssSelector, driver) {
1153
- super(parentCssSelector, elementCssSelector, driver);
1154
- this.setClearStrategy(new InputClearStrategy());
1105
+ constructor(parentCssSelector, elementCssSelector, page) {
1106
+ super(parentCssSelector, elementCssSelector, page);
1107
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1155
1108
  }
1156
- async getDateElement() {
1157
- return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1109
+ getDateLocator() {
1110
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
1158
1111
  }
1159
1112
  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];
1113
+ const input = this.getDateLocator();
1114
+ const dateFromStr = await input.getAttribute("datefrom");
1115
+ const dateToStr = await input.getAttribute("dateto");
1116
+ const dateFrom = dateFromStr ? new Date(dateFromStr) : null;
1117
+ const dateTo = dateToStr ? new Date(dateToStr) : null;
1118
+ return dateFrom && dateTo ? [dateFrom, dateTo] : null;
1166
1119
  }
1167
1120
  async getValue() {
1168
1121
  const values = await this.getDateValue();
1169
- return !values.length ? null : values;
1122
+ return values?.length ? values : null;
1170
1123
  }
1171
- setValue(value) {
1172
- if (typeof value === "object") {
1173
- return this.setDateValue(value);
1124
+ async setValue(value) {
1125
+ if (isDate(value) || isArrayOfDates(value)) {
1126
+ const inputValue = Array.isArray(value) ? value : [value, value];
1127
+ await this.setDateValue(inputValue);
1128
+ return;
1174
1129
  }
1175
- throw new Error(`Value is incorrect. It should be Object`);
1130
+ throw new Error(`Value is incorrect. It should be a Date object or Date array`);
1176
1131
  }
1177
1132
  };
1178
1133
  }
@@ -1197,18 +1152,18 @@ var init_DateEditor = __esm({
1197
1152
  await this.setEditorInstance();
1198
1153
  }
1199
1154
  async setEditorInstance() {
1200
- const { parentCssSelector, elementCssSelector, driver } = this;
1201
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1155
+ const { parentCssSelector, elementCssSelector, page } = this;
1156
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1202
1157
  const classString = await elementInstance.getClasses();
1203
1158
  switch (true) {
1204
1159
  case classString.includes("date-control" /* Date */):
1205
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1160
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
1206
1161
  break;
1207
1162
  case classString.includes("single-date-range-control" /* SingleDateRange */):
1208
- this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
1163
+ this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, page);
1209
1164
  break;
1210
1165
  default:
1211
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1166
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, page);
1212
1167
  }
1213
1168
  }
1214
1169
  async setValue(value) {
@@ -1225,17 +1180,13 @@ var init_DateEditor = __esm({
1225
1180
  });
1226
1181
 
1227
1182
  // 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;
1183
+ var 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;
1229
1184
  var init_HeaderFilterDictionary = __esm({
1230
1185
  "src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
1231
1186
  "use strict";
1232
1187
  init_AbstractEditor();
1233
- import_selenium_webdriver16 = require("selenium-webdriver");
1234
- init_actions();
1235
- init_locators();
1236
1188
  init_ClearButtonStrategy();
1237
- init_fixElementStaleError();
1238
- init_withCustomTimeouts();
1189
+ init_locators();
1239
1190
  TAGS_SELECTOR2 = ".dx-tag .tag-text";
1240
1191
  DX_TAG_CONTAINER2 = "dx-tag-container";
1241
1192
  DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
@@ -1243,69 +1194,60 @@ var init_HeaderFilterDictionary = __esm({
1243
1194
  SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
1244
1195
  TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
1245
1196
  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;
1197
+ dropDownHeaderFilterDictionaryOptionClick = async (optionValue, page, dataTEST = "", delay = true) => {
1198
+ const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
1199
+ const calendarPopover = page.locator(calendarPopoverSelector);
1200
+ const customOptionList = calendarPopover.locator(`.${CUSTOM_OPTION_LIST_SELECTOR}`);
1201
+ const optElement = customOptionList.locator(`xpath=${combinedOptionHeaderFilterDictValueXpath(optionValue)}`);
1248
1202
  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}"`);
1203
+ await optElement.waitFor({ state: "visible", timeout: delay ? void 0 : 600 });
1204
+ await optElement.click();
1205
+ } catch {
1206
+ throw new Error(`Item not found: "${optionValue}"`);
1262
1207
  }
1263
- if (err)
1264
- throw err;
1265
1208
  };
1266
1209
  HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
1267
- constructor(parentCssSelector, elementCssSelector, driver) {
1268
- super(parentCssSelector, elementCssSelector, driver);
1269
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1210
+ constructor(parentCssSelector, elementCssSelector, page) {
1211
+ super(parentCssSelector, elementCssSelector, page);
1212
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), page));
1213
+ }
1214
+ getInputLocator() {
1215
+ return this.page.locator(`${this.getFullCssSelector()} .dx-texteditor-input`);
1270
1216
  }
1271
1217
  async setTagBoxInputValue(values) {
1272
1218
  const lastElement = values[values.length - 1];
1273
- const inputEl = await this.getInputElement();
1219
+ const inputEl = this.getInputLocator();
1274
1220
  await inputEl.click();
1275
1221
  for (const value of values) {
1276
1222
  await this.selectOption(inputEl, value, lastElement);
1277
1223
  }
1278
1224
  }
1279
1225
  async waitOptionSelection() {
1280
- await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
1226
+ const selectedItem = this.page.locator(TAG_BOX_LIST_ITEM_SELECTOR);
1227
+ await selectedItem.waitFor({ state: "visible" });
1281
1228
  }
1282
1229
  async selectOption(inputEl, value, lastElement) {
1283
1230
  try {
1284
- await inputEl.sendKeys(value);
1231
+ await inputEl.fill(value);
1285
1232
  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);
1233
+ await dropDownHeaderFilterDictionaryOptionClick(value, this.page, dataTEST);
1234
+ if (value !== lastElement) {
1235
+ await inputEl.fill("");
1290
1236
  }
1291
1237
  } catch (error) {
1292
1238
  throw error;
1293
1239
  }
1294
1240
  await this.waitOptionSelection();
1295
- if (value !== lastElement) {
1296
- await inputEl.clear();
1297
- }
1298
1241
  }
1299
1242
  async getHeaderFilterDictionaryInputValue() {
1300
1243
  if (await this.isHeaderFilterDictionaryEmpty()) {
1301
1244
  return [];
1302
1245
  }
1303
- const tags = await this.driver.findElements(
1304
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
1305
- );
1246
+ const tags = this.page.locator(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`);
1247
+ const count = await tags.count();
1306
1248
  const values = [];
1307
- for (const tag of tags) {
1308
- values.push(await tag.getAttribute("textContent"));
1249
+ for (let i = 0; i < count; i++) {
1250
+ values.push(await tags.nth(i).innerText() ?? "");
1309
1251
  }
1310
1252
  return values;
1311
1253
  }
@@ -1344,26 +1286,26 @@ var init_editorFactory = __esm({
1344
1286
  init_ButtonGroup();
1345
1287
  init_DateEditor();
1346
1288
  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);
1289
+ editorFactory = async (parentCssSelector, elementCssSelector, page) => {
1290
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1291
+ const classString = await elementInstance.getClasses();
1292
+ if ((classString.includes("text-control" /* Text */) || classString.includes("text-area-control" /* TextArea */)) && !classString.includes("single-date-range-control" /* SingleDateRange */))
1293
+ return new TextEditor(parentCssSelector, elementCssSelector, page);
1294
+ if (classString.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, page);
1295
+ if (classString.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, page);
1296
+ if (classString.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, page);
1297
+ if (classString.includes("select-control" /* Select */))
1298
+ return new SelectBoxEditor(parentCssSelector, elementCssSelector, page);
1299
+ if (classString.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, page);
1300
+ if (classString.includes("date-control" /* Date */) || classString.includes("single-date-range-control" /* SingleDateRange */)) {
1301
+ return new DateEditor(parentCssSelector, elementCssSelector, page);
1302
+ }
1303
+ if (classString.includes("buttons-group" /* BooleanSelector */))
1304
+ return new BooleanSelector(parentCssSelector, elementCssSelector, page);
1305
+ if (classString.includes("button-group-field" /* ButtonGroup */))
1306
+ return new ButtonGroup(parentCssSelector, elementCssSelector, page);
1307
+ if (classString.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
1308
+ return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, page);
1367
1309
  throw new Error("Unknown type of editor. Please write ticket to the support");
1368
1310
  };
1369
1311
  }
@@ -1380,6 +1322,35 @@ var init_Editors = __esm({
1380
1322
  }
1381
1323
  });
1382
1324
 
1325
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
1326
+ var SubsystemItem;
1327
+ var init_SubsystemItem = __esm({
1328
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts"() {
1329
+ "use strict";
1330
+ init_waitElementIsVisible();
1331
+ SubsystemItem = class {
1332
+ bySelector;
1333
+ page;
1334
+ constructor({ page, bySelector }) {
1335
+ this.bySelector = bySelector;
1336
+ this.page = page;
1337
+ }
1338
+ getElement() {
1339
+ return this.page.locator(this.bySelector);
1340
+ }
1341
+ async getTitle() {
1342
+ await waitElementIsVisible_default({ locator: this.getElement() });
1343
+ const el = this.getElement();
1344
+ return await el.getAttribute("data-title");
1345
+ }
1346
+ async click() {
1347
+ const el = this.getElement();
1348
+ await el.click();
1349
+ }
1350
+ };
1351
+ }
1352
+ });
1353
+
1383
1354
  // src/utils/createDataTestId.ts
1384
1355
  function createDataTestId(formName, itemType, itemName) {
1385
1356
  return `${formName}-${itemType}-${itemName}`;
@@ -1420,45 +1391,145 @@ var init_createDataTestId = __esm({
1420
1391
  }
1421
1392
  });
1422
1393
 
1394
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
1395
+ var SEARCH_ITEM_SELECTOR, BACK_BUTTON_SELECTOR, SEARCH_INPUT_SELECTOR, byTitleCssSelector, SubsystemsPanel;
1396
+ var init_SubsystemsPanel = __esm({
1397
+ "src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts"() {
1398
+ "use strict";
1399
+ init_AbstractElement();
1400
+ init_SubsystemsPanelHeader();
1401
+ init_wait();
1402
+ init_locators();
1403
+ init_Editors();
1404
+ init_SubsystemItem();
1405
+ init_createDataTestId();
1406
+ init_ClearButtonStrategy();
1407
+ init_waitElementIsVisible();
1408
+ SEARCH_ITEM_SELECTOR = "search-item";
1409
+ BACK_BUTTON_SELECTOR = "subsystem-back-item";
1410
+ SEARCH_INPUT_SELECTOR = "search-subsystem-input";
1411
+ byTitleCssSelector = (title) => {
1412
+ return `span[data-title="${title}"]`;
1413
+ };
1414
+ SubsystemsPanel = class extends AbstractElement {
1415
+ header;
1416
+ constructor(page) {
1417
+ super(page);
1418
+ this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.page);
1419
+ }
1420
+ async headerTitle() {
1421
+ const title = await this.header.title();
1422
+ await wait(async () => await title.innerText() != "", this.page);
1423
+ return title.innerText();
1424
+ }
1425
+ getSearchComponent() {
1426
+ return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.page);
1427
+ }
1428
+ /**
1429
+ * Находит сабсистему по заголовку
1430
+ * @example
1431
+ * const subsystemsPanel= new SubsystemsPanel();
1432
+ * //...
1433
+ * await subsystemsPanel.search('SubSystemTitle');
1434
+ */
1435
+ async search(title) {
1436
+ const searchComponent = this.getSearchComponent();
1437
+ await this.searchClear();
1438
+ await searchComponent.setValue(title);
1439
+ await wait(
1440
+ async () => {
1441
+ const findElement = this.itemByTitle(title).getElement();
1442
+ const classes = await findElement.getAttribute("class");
1443
+ return classes.includes(SEARCH_ITEM_SELECTOR);
1444
+ },
1445
+ this.page,
1446
+ `Cannot find element: ${title}`
1447
+ );
1448
+ }
1449
+ /**
1450
+ * Очищает поиск сабсистем
1451
+ * @example
1452
+ * const subsystemsPanel= new SubsystemsPanel();
1453
+ * //...
1454
+ * await subsystemsPanel.searchClear();
1455
+ */
1456
+ async searchClear() {
1457
+ const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} ${DX_CLEAR_BUTTON_AREA}`;
1458
+ const clearBtn = this.page.locator(clearBtnSelector);
1459
+ if (await clearBtn.isVisible()) {
1460
+ await clearBtn.click();
1461
+ }
1462
+ }
1463
+ /**
1464
+ * Возвращает сабсистему по имени
1465
+ * @example
1466
+ * const subsystemsPanel= new SubsystemsPanel();
1467
+ * //...
1468
+ * const subsystem = subsystemsPanel.item('SubSystemName');
1469
+ */
1470
+ item(name) {
1471
+ const elementCSS = createSubSystemTestId(name);
1472
+ return new SubsystemItem({ page: this.page, bySelector: `${byTestIdCssSelector(elementCSS, "span")}` });
1473
+ }
1474
+ /**
1475
+ * Возвращает сабсистему по заголовку
1476
+ * @example
1477
+ * const subsystemsPanel= new SubsystemsPanel();
1478
+ * //...
1479
+ * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
1480
+ */
1481
+ itemByTitle(title) {
1482
+ return new SubsystemItem({ page: this.page, bySelector: byTitleCssSelector(title) });
1483
+ }
1484
+ /**
1485
+ * Возвращается на уровень выше по сабсистемам
1486
+ * @example
1487
+ * const subsystemsPanel= new SubsystemsPanel();
1488
+ * //...
1489
+ * wait subsystemsPanel.back();
1490
+ */
1491
+ async back() {
1492
+ const locator = this.page.locator(`#aside .${BACK_BUTTON_SELECTOR}`);
1493
+ await waitElementIsVisible_default({ locator });
1494
+ await locator.click();
1495
+ }
1496
+ };
1497
+ }
1498
+ });
1499
+
1423
1500
  // src/pageObjects/elements/AbstractButton.ts
1424
1501
  var D5_BUTTON_IS_PRESSED, AbstractButton;
1425
1502
  var init_AbstractButton = __esm({
1426
1503
  "src/pageObjects/elements/AbstractButton.ts"() {
1427
1504
  "use strict";
1428
1505
  init_AbstractElementWithParent();
1429
- init_actions();
1430
- init_waitElementIsClickable();
1431
1506
  D5_BUTTON_IS_PRESSED = "d5-is-pressed";
1432
1507
  AbstractButton = class extends AbstractElementWithParent {
1433
- constructor(parentCssSelector, elementCssSelector, driver) {
1434
- super(parentCssSelector, elementCssSelector, driver);
1508
+ constructor(parentCssSelector, elementCssSelector, page) {
1509
+ super(parentCssSelector, elementCssSelector, page);
1510
+ }
1511
+ get button() {
1512
+ return this.getLocator();
1513
+ }
1514
+ getLocator() {
1515
+ return super.getLocator();
1435
1516
  }
1436
1517
  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);
1518
+ await this.button.click();
1444
1519
  }
1445
1520
  async isDisabled() {
1446
- const button = await this.getElement();
1447
- return await button.getCssValue("pointer-events") === "none";
1521
+ return await this.button.isDisabled();
1448
1522
  }
1449
- async isDisplayed() {
1450
- try {
1451
- const button = await this.getElement();
1452
- return await button.isDisplayed();
1453
- } catch {
1454
- return false;
1455
- }
1523
+ async isVisible() {
1524
+ return await this.button.isVisible();
1456
1525
  }
1457
1526
  async isPressed() {
1458
1527
  try {
1459
- const button = await this.getElement();
1460
- const classAttribute = await button.getAttribute("class");
1461
- return classAttribute.includes(D5_BUTTON_IS_PRESSED);
1528
+ if (await this.button.isVisible()) {
1529
+ const classAttribute = await this.button.getAttribute("class");
1530
+ return classAttribute.includes(D5_BUTTON_IS_PRESSED);
1531
+ }
1532
+ return false;
1462
1533
  } catch {
1463
1534
  return false;
1464
1535
  }
@@ -1468,21 +1539,22 @@ var init_AbstractButton = __esm({
1468
1539
  });
1469
1540
 
1470
1541
  // src/pageObjects/elements/DXComponents/DXButton.ts
1471
- var import_selenium_webdriver18, DXButton;
1542
+ var DXButton;
1472
1543
  var init_DXButton = __esm({
1473
1544
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1474
1545
  "use strict";
1475
1546
  init_AbstractButton();
1476
- import_selenium_webdriver18 = require("selenium-webdriver");
1477
1547
  DXButton = class extends AbstractButton {
1478
1548
  async getText() {
1479
1549
  const classes = await this.getClasses();
1480
- if (!classes.includes("dx-button-has-text")) {
1550
+ if (!classes?.includes("dx-button-has-text")) {
1551
+ return null;
1552
+ }
1553
+ const textEl = this.getLocator().locator(".dx-button-text");
1554
+ if (!await textEl.count()) {
1481
1555
  return null;
1482
1556
  }
1483
- const el = await this.getElement();
1484
- const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
1485
- return await textEl.getText();
1557
+ return await textEl.innerText();
1486
1558
  }
1487
1559
  };
1488
1560
  }
@@ -1498,8 +1570,8 @@ var init_FormButton = __esm({
1498
1570
  init_DXButton();
1499
1571
  FormButton = class extends DXButton {
1500
1572
  name;
1501
- constructor(parentCssSelector, formName, name, driver) {
1502
- super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
1573
+ constructor(parentCssSelector, formName, name, page) {
1574
+ super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), page);
1503
1575
  this.name = name;
1504
1576
  }
1505
1577
  buttonNotDisplayedError() {
@@ -1519,9 +1591,9 @@ var init_AbstractGroup = __esm({
1519
1591
  "use strict";
1520
1592
  init_AbstractElementWithParent();
1521
1593
  AbstractGroup = class extends AbstractElementWithParent {
1522
- async isDisplayed() {
1523
- const groupElement = await this.getElement();
1524
- return await groupElement.isDisplayed();
1594
+ async isVisible() {
1595
+ const groupElement = this.getLocator();
1596
+ return await groupElement.isVisible();
1525
1597
  }
1526
1598
  };
1527
1599
  }
@@ -1539,24 +1611,24 @@ var init_Panel = __esm({
1539
1611
  });
1540
1612
 
1541
1613
  // src/pageObjects/elements/Groups/TabPanel.ts
1542
- var import_selenium_webdriver19, TabPanelItem, TabPanel;
1614
+ var TabPanelItem, TabPanel;
1543
1615
  var init_TabPanel = __esm({
1544
1616
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1545
1617
  "use strict";
1546
1618
  init_AbstractGroup();
1547
- import_selenium_webdriver19 = require("selenium-webdriver");
1548
- init_actions();
1549
1619
  TabPanelItem = class extends AbstractGroup {
1550
- constructor(parentCssSelector, elementCssSelector, driver) {
1551
- super(parentCssSelector, elementCssSelector, driver);
1620
+ constructor(parentCssSelector, elementCssSelector, page) {
1621
+ super(parentCssSelector, elementCssSelector, page);
1622
+ }
1623
+ get itemElement() {
1624
+ return this.getLocator();
1552
1625
  }
1553
1626
  async click() {
1554
- await click(await this.getElement(), this.driver);
1627
+ await this.itemElement.click();
1555
1628
  }
1556
1629
  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";
1630
+ const tab = this.itemElement.locator('xpath=ancestor::div[@role="tab"][1]');
1631
+ return await tab.getAttribute("aria-selected") === "true";
1560
1632
  }
1561
1633
  async getTitle() {
1562
1634
  return "";
@@ -1564,7 +1636,11 @@ var init_TabPanel = __esm({
1564
1636
  };
1565
1637
  TabPanel = class extends AbstractGroup {
1566
1638
  item(name) {
1567
- return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
1639
+ return new TabPanelItem(
1640
+ this.getFullCssSelector(),
1641
+ `.tab-panel-item[data-groupname="${name}"]`,
1642
+ this.page
1643
+ );
1568
1644
  }
1569
1645
  async getTitle() {
1570
1646
  return "";
@@ -1574,37 +1650,35 @@ var init_TabPanel = __esm({
1574
1650
  });
1575
1651
 
1576
1652
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1577
- var import_selenium_webdriver20, ACCORDION_TITLE_CONTAINER, AccordionItem;
1653
+ var ACCORDION_TITLE_CONTAINER, AccordionItem;
1578
1654
  var init_AccordionItem = __esm({
1579
1655
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1580
1656
  "use strict";
1581
1657
  init_AbstractGroup();
1582
- import_selenium_webdriver20 = require("selenium-webdriver");
1583
- init_actions();
1584
- ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1658
+ ACCORDION_TITLE_CONTAINER = ".accordion-title-container";
1585
1659
  AccordionItem = class extends AbstractGroup {
1586
- constructor(parentCssSelector, elementCssSelector, driver) {
1587
- super(parentCssSelector, elementCssSelector, driver);
1660
+ constructor(parentCssSelector, elementCssSelector, page) {
1661
+ super(parentCssSelector, elementCssSelector, page);
1588
1662
  }
1589
1663
  async getDataOpenedAccordItemAttr() {
1590
- const accordionElement = await this.getElement();
1591
- return await accordionElement.getAttribute("data-opened");
1664
+ const locator = this.getLocator();
1665
+ if (await locator.isVisible()) {
1666
+ return locator.getAttribute("data-opened");
1667
+ }
1668
+ return "";
1592
1669
  }
1593
1670
  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();
1671
+ await this.getLocator().locator(ACCORDION_TITLE_CONTAINER).click();
1597
1672
  }
1598
1673
  async click() {
1599
- await click(await this.getElement(), this.driver);
1674
+ await this.getLocator().click();
1600
1675
  }
1601
1676
  async isExpanded() {
1602
- const dataOpened = await this.getDataOpenedAccordItemAttr();
1603
- return dataOpened === "true";
1677
+ return await this.getDataOpenedAccordItemAttr() === "true";
1604
1678
  }
1605
1679
  async isCollapsed() {
1606
- const dataOpened = await this.getDataOpenedAccordItemAttr();
1607
- return dataOpened === "false" || !dataOpened;
1680
+ const opened = await this.getDataOpenedAccordItemAttr();
1681
+ return opened === "false" || opened === null;
1608
1682
  }
1609
1683
  async expand() {
1610
1684
  if (!await this.isExpanded()) {
@@ -1628,11 +1702,11 @@ var init_Accordion = __esm({
1628
1702
  init_AbstractGroup();
1629
1703
  init_AccordionItem();
1630
1704
  Accordion = class extends AbstractGroup {
1631
- constructor(parentCssSelector, elementCssSelector, driver) {
1632
- super(parentCssSelector, elementCssSelector, driver);
1705
+ constructor(parentCssSelector, elementCssSelector, page) {
1706
+ super(parentCssSelector, elementCssSelector, page);
1633
1707
  }
1634
1708
  item(name) {
1635
- return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
1709
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.page);
1636
1710
  }
1637
1711
  };
1638
1712
  }
@@ -1648,14 +1722,14 @@ var init_groupFactory = __esm({
1648
1722
  init_TabPanel();
1649
1723
  init_Accordion();
1650
1724
  init_AccordionItem();
1651
- groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
1652
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1725
+ groupFactory = async (parentCssSelector, elementCssSelector, page) => {
1726
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, page);
1653
1727
  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);
1728
+ if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, page);
1729
+ if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, page);
1730
+ if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, page);
1731
+ if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, page);
1732
+ if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, page);
1659
1733
  throw new Error("Unknown type of group. Please write ticket to the support");
1660
1734
  };
1661
1735
  }
@@ -1674,23 +1748,23 @@ var init_FormGroup = __esm({
1674
1748
  init_TabPanel();
1675
1749
  FormGroup = class extends AbstractElementWithParent {
1676
1750
  groupInstance;
1677
- constructor(parentCssSelector, formName, name, driver) {
1678
- super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
1751
+ constructor(parentCssSelector, formName, name, page) {
1752
+ super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), page);
1679
1753
  }
1680
1754
  async initInstance() {
1681
1755
  if (!this.groupInstance) {
1682
- this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1756
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.page);
1683
1757
  }
1684
1758
  }
1685
1759
  /**
1686
1760
  * Возвращает булевое значение доступна ли группа
1687
1761
  * @example
1688
- * expect(await tableList.group('MainSuperPanel').isDisplayed();
1762
+ * expect(await tableList.group('MainSuperPanel').isVisible();
1689
1763
  */
1690
- async isDisplayed() {
1764
+ async isVisible() {
1691
1765
  try {
1692
1766
  await this.initInstance();
1693
- return this.groupInstance.isDisplayed();
1767
+ return this.groupInstance.isVisible();
1694
1768
  } catch {
1695
1769
  return false;
1696
1770
  }
@@ -1766,10 +1840,12 @@ var init_AbstractForm = __esm({
1766
1840
  AbstractForm = class extends AbstractPage {
1767
1841
  containerCssSelector = "";
1768
1842
  _formName = "";
1769
- containerBy;
1770
- getContainerElement = () => {
1771
- return this.driver.findElement(this.containerBy);
1772
- };
1843
+ get container() {
1844
+ return this.page.locator(this.containerCssSelector);
1845
+ }
1846
+ constructor(page) {
1847
+ super(page);
1848
+ }
1773
1849
  set formName(name) {
1774
1850
  this._formName = name;
1775
1851
  }
@@ -1786,22 +1862,20 @@ var init_AbstractForm = __esm({
1786
1862
  */
1787
1863
  async exists() {
1788
1864
  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
- });
1865
+ const container = this.page.locator(this.containerCssSelector);
1866
+ await waitElementIsVisible_default({ locator: container });
1798
1867
  return true;
1799
1868
  } catch (error) {
1800
1869
  return false;
1801
1870
  }
1802
1871
  }
1803
1872
  button(name) {
1804
- return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
1873
+ return new FormButton(
1874
+ this.containerCssSelector,
1875
+ this.formName,
1876
+ name,
1877
+ this.page
1878
+ );
1805
1879
  }
1806
1880
  /**
1807
1881
  * Находит группу на форме по имени
@@ -1811,7 +1885,12 @@ var init_AbstractForm = __esm({
1811
1885
  * expect(await formEdit.group('Name');
1812
1886
  */
1813
1887
  group(name) {
1814
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
1888
+ return new FormGroup(
1889
+ this.containerCssSelector,
1890
+ this.formName,
1891
+ name,
1892
+ this.page
1893
+ );
1815
1894
  }
1816
1895
  };
1817
1896
  }
@@ -1831,11 +1910,10 @@ function getCssRowByIndexSelector(index) {
1831
1910
  function getCssCellByIndexSelector(index) {
1832
1911
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1833
1912
  }
1834
- var import_selenium_webdriver21, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1913
+ var getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1835
1914
  var init_utils2 = __esm({
1836
1915
  "src/pageObjects/elements/Table/utils.ts"() {
1837
1916
  "use strict";
1838
- import_selenium_webdriver21 = require("selenium-webdriver");
1839
1917
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1840
1918
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1841
1919
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1852,19 +1930,18 @@ var init_types3 = __esm({
1852
1930
  });
1853
1931
 
1854
1932
  // src/pageObjects/elements/Table/elements/Cell.ts
1855
- var import_selenium_webdriver22, Cell;
1933
+ var Cell;
1856
1934
  var init_Cell = __esm({
1857
1935
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1858
1936
  "use strict";
1859
- import_selenium_webdriver22 = require("selenium-webdriver");
1860
1937
  init_AbstractElementWithParent();
1861
1938
  init_utils2();
1862
1939
  init_types3();
1863
1940
  Cell = class extends AbstractElementWithParent {
1864
1941
  _index;
1865
1942
  getCellIndex;
1866
- constructor(parentCssSelector, getCellIndex, driver, index) {
1867
- super(parentCssSelector, getCssCellByIndexSelector(index), driver);
1943
+ constructor(parentCssSelector, getCellIndex, page, index) {
1944
+ super(parentCssSelector, getCssCellByIndexSelector(index), page);
1868
1945
  this.getCellIndex = getCellIndex;
1869
1946
  this._index = index;
1870
1947
  }
@@ -1873,25 +1950,27 @@ var init_Cell = __esm({
1873
1950
  this.elementCssSelector = getCssCellByIndexSelector(index);
1874
1951
  }
1875
1952
  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;
1953
+ const booleanEl = cellEl.locator(".boolean-widget");
1954
+ const checked = await booleanEl.getAttribute("aria-checked");
1955
+ return checked === "true" ? 1 : 0;
1878
1956
  }
1879
1957
  async getTagsValue(cellEl) {
1880
- const tagsCssSelector = ".multiselect-container .multiselect-cell";
1881
- const tags = await cellEl.findElements(import_selenium_webdriver22.By.css(tagsCssSelector));
1958
+ const tags = cellEl.locator(".multiselect-container .multiselect-cell");
1959
+ const count = await tags.count();
1882
1960
  const values = [];
1883
- for (const tag of tags) {
1884
- values.push(await tag.getAttribute("textContent"));
1961
+ for (let i = 0; i < count; i++) {
1962
+ const text = await tags.nth(i).innerText();
1963
+ if (text) values.push(text.trim());
1885
1964
  }
1886
1965
  return values.length ? values : null;
1887
1966
  }
1888
1967
  async getNumberValue(cellEl) {
1889
- const value = (await cellEl.getText()).trim();
1890
- return value == "" ? null : Number.parseFloat(value);
1968
+ const text = (await cellEl.innerText())?.trim() ?? "";
1969
+ return text === "" ? null : Number.parseFloat(text);
1891
1970
  }
1892
1971
  async getDateValue(cellEl, cellElClass) {
1893
- const value = (await cellEl.getText()).trim();
1894
- if (value === "") return null;
1972
+ const value = (await cellEl.innerText())?.trim() ?? "";
1973
+ if (!value) return null;
1895
1974
  const getDate = (stringDate) => {
1896
1975
  const isWithTime = cellElClass.includes("with-time");
1897
1976
  try {
@@ -1917,21 +1996,21 @@ var init_Cell = __esm({
1917
1996
  }
1918
1997
  return getDate(value);
1919
1998
  }
1920
- async getElement() {
1999
+ async element() {
1921
2000
  if (this._index == null) {
1922
2001
  this.index = await this.getCellIndex();
1923
2002
  }
1924
- return super.getElement();
2003
+ return this.getLocator();
1925
2004
  }
1926
2005
  async getValue() {
1927
- const cellEl = await this.getElement();
1928
- const cellElClass = await cellEl.getAttribute("class");
2006
+ const cellEl = await this.element();
2007
+ const cellElClass = await cellEl.getAttribute("class") ?? "";
1929
2008
  if (cellElClass.includes("boolean-column" /* Boolean */)) return this.getBooleanValue(cellEl);
1930
2009
  if (cellElClass.includes("tags-column" /* Tags */)) return this.getTagsValue(cellEl);
1931
2010
  if (cellElClass.includes("number-column" /* Number */)) return this.getNumberValue(cellEl);
1932
2011
  if (cellElClass.includes("date-column" /* Date */)) return this.getDateValue(cellEl, cellElClass);
1933
- const cellText = await cellEl.getText();
1934
- return cellText == "" ? null : cellText;
2012
+ const cellText = (await cellEl.innerText())?.trim() ?? "";
2013
+ return cellText === "" ? null : cellText;
1935
2014
  }
1936
2015
  getIndex() {
1937
2016
  return this._index;
@@ -1941,17 +2020,14 @@ var init_Cell = __esm({
1941
2020
  });
1942
2021
 
1943
2022
  // 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;
2023
+ var DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, FIRST_CLICKED_CELL_SELECTOR, Row;
1945
2024
  var init_Row = __esm({
1946
2025
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1947
2026
  "use strict";
1948
- import_selenium_webdriver23 = require("selenium-webdriver");
1949
2027
  init_Cell();
1950
2028
  init_utils2();
1951
2029
  init_AbstractElementWithParent();
1952
- init_actions();
1953
2030
  init_wait();
1954
- init_fixElementStaleError();
1955
2031
  DX_SELECTION_CLASS = "dx-selection";
1956
2032
  DX_ROW_EDIT_CLASS = "dx-edit-row";
1957
2033
  DX_DATA_ROW_CLASS = "dx-data-row";
@@ -1964,11 +2040,11 @@ var init_Row = __esm({
1964
2040
  * @param parentCssSelector
1965
2041
  * @param fixedTableContentCssSelector
1966
2042
  * @param index починається з 0 (в getCssRowByIndexSelector додається +1)
1967
- * @param driver
2043
+ * @param page
1968
2044
  * @param getColumnBy
1969
2045
  */
1970
- constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
1971
- super(parentCssSelector, getCssRowByIndexSelector(index), driver);
2046
+ constructor(parentCssSelector, fixedTableContentCssSelector, index, page, getColumnBy) {
2047
+ super(parentCssSelector, getCssRowByIndexSelector(index), page);
1972
2048
  this.index = index;
1973
2049
  this.getColumnBy = getColumnBy;
1974
2050
  this.fixedTableContentCssSelector = fixedTableContentCssSelector;
@@ -1976,10 +2052,8 @@ var init_Row = __esm({
1976
2052
  _getCell({ index, name, title }) {
1977
2053
  return new Cell(
1978
2054
  this.getFullCssSelector(),
1979
- () => {
1980
- return this.getColumnBy({ title, name }).getIndex();
1981
- },
1982
- this.driver,
2055
+ () => this.getColumnBy({ title, name }).getIndex(),
2056
+ this.page,
1983
2057
  index
1984
2058
  );
1985
2059
  }
@@ -1993,61 +2067,56 @@ var init_Row = __esm({
1993
2067
  return this._getCell({ title });
1994
2068
  }
1995
2069
  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(
2070
+ const rowEl = this.getLocator();
2071
+ const classes = await this.getClasses();
2072
+ const isSelected = classes.includes(DX_SELECTION_CLASS);
2073
+ const clickedElement = rowEl.locator(FIRST_CLICKED_CELL_SELECTOR);
2074
+ if (isSelected && !preserve) {
2075
+ await this.page.keyboard.up("Control");
2076
+ }
2077
+ if (preserve && !isSelected) {
2078
+ await this.page.keyboard.down("Control");
2079
+ await clickedElement.click();
2080
+ return;
2081
+ }
2082
+ await clickedElement.click();
2083
+ await wait(
2011
2084
  async () => {
2012
- const classes = await this.getClasses();
2013
- return classes.includes(DX_SELECTION_CLASS);
2085
+ const classes2 = await this.getClasses();
2086
+ return classes2.includes(DX_SELECTION_CLASS);
2014
2087
  },
2015
- this.driver,
2088
+ this.page,
2016
2089
  "Cannot select row"
2017
2090
  );
2018
2091
  }
2019
2092
  async isSelected() {
2020
- const result = await this.getAttribute("aria-selected");
2021
- return result === "true";
2093
+ const rowEl = this.getLocator();
2094
+ const ariaSelected = await rowEl.getAttribute("aria-selected");
2095
+ return ariaSelected === "true";
2022
2096
  }
2023
2097
  getIndex() {
2024
2098
  return this.index;
2025
2099
  }
2026
2100
  async getCells() {
2027
- const cells = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
2101
+ const rowEl = this.getLocator();
2102
+ const cellsCount = await rowEl.locator('td[role="gridcell"]').count();
2028
2103
  const result = [];
2029
- cells.forEach((_, index) => {
2030
- const newCell = this.getCellByIndex(index);
2031
- result.push(newCell);
2032
- });
2104
+ for (let i = 0; i < cellsCount; i++) {
2105
+ result.push(this.getCellByIndex(i));
2106
+ }
2033
2107
  return result;
2034
2108
  }
2035
2109
  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
- });
2110
+ const buttonSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
2111
+ const button = this.page.locator(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonSelector}`);
2112
+ await button.click();
2044
2113
  }
2045
2114
  async checkEditingMode(isEditing, msg) {
2046
- await safeWait(
2115
+ await wait(
2047
2116
  async () => {
2048
2117
  return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
2049
2118
  },
2050
- this.driver,
2119
+ this.page,
2051
2120
  msg
2052
2121
  );
2053
2122
  }
@@ -2068,21 +2137,19 @@ var init_Row = __esm({
2068
2137
  });
2069
2138
 
2070
2139
  // src/pageObjects/elements/Table/elements/Column.ts
2071
- var import_selenium_webdriver24, Column;
2140
+ var Column;
2072
2141
  var init_Column = __esm({
2073
2142
  "src/pageObjects/elements/Table/elements/Column.ts"() {
2074
2143
  "use strict";
2075
- import_selenium_webdriver24 = require("selenium-webdriver");
2076
2144
  init_utils2();
2077
2145
  init_AbstractElementWithParent();
2078
- init_fixElementStaleError();
2079
2146
  Column = class extends AbstractElementWithParent {
2080
2147
  _index;
2081
2148
  _caption;
2082
2149
  _name;
2083
2150
  headerCssSelector;
2084
- constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
2085
- super(parentCssSelector, "", driver);
2151
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, page }) {
2152
+ super(parentCssSelector, "", page);
2086
2153
  this._name = name;
2087
2154
  this.index = index;
2088
2155
  this._caption = caption;
@@ -2090,17 +2157,17 @@ var init_Column = __esm({
2090
2157
  }
2091
2158
  set index(index) {
2092
2159
  this._index = index;
2093
- this.elementCssSelector = getColumnByIndexCssSelector(index);
2160
+ this.elementCssSelector = `${this.headerCssSelector} ${getColumnByIndexCssSelector(index)}`;
2094
2161
  }
2095
2162
  get index() {
2096
2163
  return this._index;
2097
2164
  }
2098
- async getElement() {
2165
+ async element() {
2099
2166
  await this.getIndex();
2100
- return super.getElement();
2167
+ return this.getLocator();
2101
2168
  }
2102
2169
  async getColumnHeaderIndexBy(cssSelector) {
2103
- const column = await fixElementStaleError(import_selenium_webdriver24.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
2170
+ const column = this.page.locator(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`);
2104
2171
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
2105
2172
  }
2106
2173
  async getIndexByCaption() {
@@ -2110,13 +2177,12 @@ var init_Column = __esm({
2110
2177
  return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
2111
2178
  }
2112
2179
  async caption() {
2113
- const el = await this.getElement();
2114
- return el.getText();
2180
+ const el = await this.element();
2181
+ const text = await el.innerText();
2182
+ return text?.trim() ?? null;
2115
2183
  }
2116
2184
  async getIndex() {
2117
- if (this.index != null) {
2118
- return this.index;
2119
- }
2185
+ if (this.index != null) return this.index;
2120
2186
  if (this._caption != null) {
2121
2187
  this.index = await this.getIndexByCaption();
2122
2188
  return this.index;
@@ -2125,7 +2191,7 @@ var init_Column = __esm({
2125
2191
  this.index = await this.getIndexByName();
2126
2192
  return this.index;
2127
2193
  }
2128
- throw new Error("Cant get the index in the column");
2194
+ throw new Error("Cannot get the index in the column");
2129
2195
  }
2130
2196
  };
2131
2197
  }
@@ -2139,31 +2205,24 @@ var init_EditorButton = __esm({
2139
2205
  init_locators();
2140
2206
  init_createDataTestId();
2141
2207
  init_AbstractElementWithParent();
2142
- init_waitElementIsClickable();
2143
- init_actions();
2144
2208
  EditorButton = class extends AbstractElementWithParent {
2145
2209
  name;
2146
- constructor(parentCssSelector, name, driver) {
2147
- super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
2210
+ constructor(parentCssSelector, name, page) {
2211
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), page);
2148
2212
  this.name = name;
2149
2213
  }
2150
2214
  buttonNotDisplayedError() {
2151
2215
  return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
2152
2216
  }
2153
2217
  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);
2218
+ const button = this.getLocator();
2219
+ await button.click();
2161
2220
  }
2162
- async isDisplayed() {
2221
+ async isVisible() {
2163
2222
  try {
2164
- const button = await this.getElement();
2165
- return await button.isDisplayed();
2166
- } catch (error) {
2223
+ const button = this.getLocator();
2224
+ return await button.isVisible();
2225
+ } catch {
2167
2226
  return false;
2168
2227
  }
2169
2228
  }
@@ -2181,12 +2240,12 @@ var init_AbstractEditor2 = __esm({
2181
2240
  init_EditorButton();
2182
2241
  AbstractEditor = class extends AbstractElementWithParent {
2183
2242
  editor;
2184
- constructor(parentCssSelector, elementCssSelector, driver) {
2185
- super(parentCssSelector, elementCssSelector, driver);
2243
+ constructor(parentCssSelector, elementCssSelector, page) {
2244
+ super(parentCssSelector, elementCssSelector, page);
2186
2245
  }
2187
2246
  async initEditor() {
2188
2247
  if (!this.editor) {
2189
- this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
2248
+ this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.page);
2190
2249
  }
2191
2250
  }
2192
2251
  /**
@@ -2254,16 +2313,16 @@ var init_AbstractEditor2 = __esm({
2254
2313
  return this.editor.isDisabled();
2255
2314
  }
2256
2315
  /**
2257
- * Возвращает значение true|false в зависимости isDisplayed поле или нет
2316
+ * Возвращает значение true|false в зависимости isVisible поле или нет
2258
2317
  * @example
2259
- * expect(await formEdit.field('NumberFld').isDisplayed()).toBe(true);
2260
- * expect(await formEdit.field('TextFld').isDisplayed()).toBe(false);
2318
+ * expect(await formEdit.field('NumberFld').isVisible()).toBe(true);
2319
+ * expect(await formEdit.field('TextFld').isVisible()).toBe(false);
2261
2320
  */
2262
- async isDisplayed() {
2321
+ async isVisible() {
2263
2322
  try {
2264
2323
  await this.initEditor();
2265
- const element = await this.getElement();
2266
- return await element.isDisplayed();
2324
+ const element = this.getLocator();
2325
+ return await element.isVisible();
2267
2326
  } catch {
2268
2327
  return false;
2269
2328
  }
@@ -2276,86 +2335,49 @@ var init_AbstractEditor2 = __esm({
2276
2335
  * await form.field('Name').button('editorButton).click()
2277
2336
  */
2278
2337
  button(name) {
2279
- return new EditorButton(this.getFullCssSelector(), name, this.driver);
2338
+ return new EditorButton(this.getFullCssSelector(), name, this.page);
2339
+ }
2340
+ };
2341
+ }
2342
+ });
2343
+
2344
+ // src/pageObjects/elements/FormField.ts
2345
+ var FormField;
2346
+ var init_FormField = __esm({
2347
+ "src/pageObjects/elements/FormField.ts"() {
2348
+ "use strict";
2349
+ init_locators();
2350
+ init_createDataTestId();
2351
+ init_AbstractEditor2();
2352
+ FormField = class extends AbstractEditor {
2353
+ constructor(parentCssSelector, formName, name, page) {
2354
+ super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), page);
2280
2355
  }
2281
2356
  };
2282
2357
  }
2283
2358
  });
2284
2359
 
2285
- // src/pageObjects/elements/FormField.ts
2286
- var FormField;
2287
- var init_FormField = __esm({
2288
- "src/pageObjects/elements/FormField.ts"() {
2289
- "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";
2323
- };
2324
- }
2325
- });
2326
-
2327
2360
  // src/pageObjects/elements/AbstractDropDownMenuList.ts
2328
2361
  var AbstractDropDownMenuList;
2329
2362
  var init_AbstractDropDownMenuList = __esm({
2330
2363
  "src/pageObjects/elements/AbstractDropDownMenuList.ts"() {
2331
2364
  "use strict";
2332
2365
  init_AbstractElementWithParent();
2333
- init_actions();
2334
- init_waitElementIsClickable();
2335
- init_fixElementStaleError();
2336
2366
  init_typesUtil();
2337
2367
  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);
2368
+ async clickItemBy(locator) {
2369
+ const menuItemElement = this.page.locator(locator);
2370
+ await menuItemElement.click();
2349
2371
  }
2350
- async getElementByPath(path2, getBy, returnLastElement = false) {
2351
- let pathList = isString(path2) ? [path2] : path2;
2372
+ async getElementByPath(path, getBy, returnLastElement = false) {
2373
+ let pathList = isString(path) ? [path] : path;
2352
2374
  let result = null;
2353
2375
  let index = 1;
2354
2376
  for (let text of pathList) {
2355
2377
  if (!returnLastElement || index < pathList.length) {
2356
- await this.clickItemBy(this.buttonNotDisplayedError(text), getBy(text));
2378
+ await this.clickItemBy(getBy(text));
2357
2379
  } else {
2358
- result = await fixElementStaleError(getBy(text), this.driver);
2380
+ result = this.page.locator(getBy(text));
2359
2381
  }
2360
2382
  index++;
2361
2383
  }
@@ -2380,26 +2402,12 @@ var init_AbstractDropDownMenuList = __esm({
2380
2402
  }
2381
2403
  });
2382
2404
 
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
2405
  // src/pageObjects/elements/DXContextMenuList.ts
2396
- var import_selenium_webdriver25, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2406
+ var CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
2397
2407
  var init_DXContextMenuList = __esm({
2398
2408
  "src/pageObjects/elements/DXContextMenuList.ts"() {
2399
2409
  "use strict";
2400
2410
  init_AbstractDropDownMenuList();
2401
- import_selenium_webdriver25 = require("selenium-webdriver");
2402
- init_cssToXPath();
2403
2411
  init_waitElementIsVisible();
2404
2412
  CONTEXT_MENU_CLASS = "dx-context-menu";
2405
2413
  CONTEXT_MENU_ITEM_TEXT_CLASS = "dx-menu-item-text";
@@ -2407,23 +2415,21 @@ var init_DXContextMenuList = __esm({
2407
2415
  /**
2408
2416
  * @param parentCssSelector
2409
2417
  * @param classNames - Список класів. Починається з крапки
2410
- * @param driver
2418
+ * @param page
2411
2419
  */
2412
- constructor(parentCssSelector, classNames, driver) {
2413
- super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, driver);
2420
+ constructor(parentCssSelector, classNames, page) {
2421
+ super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, page);
2414
2422
  }
2415
2423
  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);
2424
+ return `${this.elementCssSelector} span.${CONTEXT_MENU_ITEM_TEXT_CLASS}:has-text("${title}")`;
2419
2425
  }
2420
2426
  async isVisible() {
2421
2427
  try {
2428
+ const el = this.page.locator(`.dx-overlay-wrapper .${CONTEXT_MENU_CLASS}`);
2422
2429
  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"
2430
+ locator: el
2426
2431
  });
2432
+ return true;
2427
2433
  } catch {
2428
2434
  return false;
2429
2435
  }
@@ -2442,8 +2448,8 @@ var init_ContextMenu = __esm({
2442
2448
  ContextMenu = class extends DXContextMenuList {
2443
2449
  _formName;
2444
2450
  _initFn;
2445
- constructor(cssClass, formName, driver) {
2446
- super("", cssClass, driver);
2451
+ constructor(cssClass, formName, page) {
2452
+ super("", cssClass, page);
2447
2453
  this._formName = formName;
2448
2454
  }
2449
2455
  setInit(cb) {
@@ -2451,7 +2457,7 @@ var init_ContextMenu = __esm({
2451
2457
  return this;
2452
2458
  }
2453
2459
  getButtonNameBy(name) {
2454
- return byTestId(`cm-${this._formName}-${name}`);
2460
+ return byTestIdCssSelector(`cm-${this._formName}-${name}`);
2455
2461
  }
2456
2462
  async clickButtonByTitle(title) {
2457
2463
  await this._initFn?.();
@@ -2466,20 +2472,17 @@ var init_ContextMenu = __esm({
2466
2472
  });
2467
2473
 
2468
2474
  // src/pageObjects/elements/Table/Table.ts
2469
- var import_selenium_webdriver26, Table;
2475
+ var Table;
2470
2476
  var init_Table = __esm({
2471
2477
  "src/pageObjects/elements/Table/Table.ts"() {
2472
2478
  "use strict";
2473
- import_selenium_webdriver26 = require("selenium-webdriver");
2474
2479
  init_createDataTestId();
2475
2480
  init_AbstractElementWithParent();
2476
2481
  init_Row();
2477
2482
  init_Column();
2478
2483
  init_FormField();
2479
2484
  init_ContextMenu();
2480
- init_actions();
2481
2485
  init_wait();
2482
- init_withCustomTimeouts();
2483
2486
  Table = class extends AbstractElementWithParent {
2484
2487
  formName;
2485
2488
  headerCssSelector;
@@ -2493,9 +2496,9 @@ var init_Table = __esm({
2493
2496
  headerCssSelector,
2494
2497
  fixedTableContentCssSelector,
2495
2498
  formName,
2496
- driver
2499
+ page
2497
2500
  }) {
2498
- super(parentCssSelector, `#${createTableId(formName)}`, driver);
2501
+ super(parentCssSelector, `#${createTableId(formName)}`, page);
2499
2502
  this.formName = formName;
2500
2503
  this.headerCssSelector = headerCssSelector;
2501
2504
  this.contextMenuCssSelector = contextMenuCssSelector;
@@ -2513,7 +2516,7 @@ var init_Table = __esm({
2513
2516
  * @param index починається з 0
2514
2517
  */
2515
2518
  getRowByIndex(index) {
2516
- return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
2519
+ return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.page, this.getColumnBy);
2517
2520
  }
2518
2521
  /**
2519
2522
  * @param index починається з 0
@@ -2522,26 +2525,26 @@ var init_Table = __esm({
2522
2525
  this.getRowByIndex(index);
2523
2526
  return new Column({
2524
2527
  parentCssSelector: this.getFullCssSelector(),
2525
- driver: this.driver,
2528
+ page: this.page,
2526
2529
  index
2527
2530
  });
2528
2531
  }
2529
- getColumnByTitle = (title) => {
2532
+ getColumnByTitle(title) {
2530
2533
  return new Column({
2531
2534
  parentCssSelector: this.getFullCssSelector(),
2532
2535
  headerCssSelector: this.headerCssSelector,
2533
2536
  caption: title,
2534
- driver: this.driver
2537
+ page: this.page
2535
2538
  });
2536
- };
2537
- getColumnByName = (name) => {
2539
+ }
2540
+ getColumnByName(name) {
2538
2541
  return new Column({
2539
2542
  parentCssSelector: this.getFullCssSelector(),
2540
2543
  headerCssSelector: this.headerCssSelector,
2541
2544
  name,
2542
- driver: this.driver
2545
+ page: this.page
2543
2546
  });
2544
- };
2547
+ }
2545
2548
  /**
2546
2549
  * Вибрати рядок по індексу.
2547
2550
  * @param index починається з 0
@@ -2559,48 +2562,31 @@ var init_Table = __esm({
2559
2562
  await this.selectRowByIndex(index, true);
2560
2563
  }
2561
2564
  }
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
- });
2565
+ getRowElements() {
2566
+ const rowsSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
2567
+ return this.page.locator(rowsSelector);
2571
2568
  }
2572
2569
  async getRows() {
2573
- const rows = await this.getRowElements();
2570
+ const rowCount = await this.getRowElements().count();
2574
2571
  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
- });
2572
+ for (let i = 0; i < rowCount; i++) {
2573
+ result.push(this.getRowByIndex(i));
2574
+ }
2585
2575
  return result;
2586
2576
  }
2587
2577
  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`)
2578
+ const columnsLocator = this.page.locator(
2579
+ `${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`
2590
2580
  );
2581
+ const count = await columnsLocator.count();
2591
2582
  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
- });
2583
+ for (let i = 0; i < count; i++) {
2584
+ result.push(new Column({ parentCssSelector: this.getFullCssSelector(), page: this.page, index: i }));
2585
+ }
2600
2586
  return result;
2601
2587
  }
2602
2588
  element() {
2603
- return this.getElement();
2589
+ return this.getLocator();
2604
2590
  }
2605
2591
  /**
2606
2592
  * Находит поле когда форма находится в состоянии редактирования
@@ -2610,7 +2596,7 @@ var init_Table = __esm({
2610
2596
  * expect(await form.field('Name').getValue()).toBe('test value');
2611
2597
  */
2612
2598
  field(name) {
2613
- return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
2599
+ return new FormField(this.getFullCssSelector(), this.formName, name, this.page);
2614
2600
  }
2615
2601
  /**
2616
2602
  * Возвращает список строк которые выделены
@@ -2622,11 +2608,11 @@ var init_Table = __esm({
2622
2608
  */
2623
2609
  async getSelectedRows() {
2624
2610
  const rows = await this.getRows();
2625
- let result = [];
2611
+ const result = [];
2626
2612
  for (const row of rows) {
2627
2613
  if (await row.isSelected()) {
2614
+ result.push(row);
2628
2615
  }
2629
- result.push(row);
2630
2616
  }
2631
2617
  return result;
2632
2618
  }
@@ -2643,17 +2629,16 @@ var init_Table = __esm({
2643
2629
  * await form.contextMenu('FieldName', 3).clickButton(['Group', 'ButtonInGroup']);
2644
2630
  */
2645
2631
  contextMenu(fieldName, rowIndex) {
2646
- return new ContextMenu(this.contextMenuCssSelector, this.formName, this.driver).setInit(async () => {
2632
+ return new ContextMenu(this.contextMenuCssSelector, this.formName, this.page).setInit(async () => {
2647
2633
  let row;
2648
2634
  if (rowIndex != null) {
2649
2635
  row = this.getRowByIndex(rowIndex);
2650
2636
  } else {
2651
2637
  [row] = await this.getSelectedRows();
2652
2638
  }
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);
2639
+ if (!row) throw new Error("No row available row for context menu");
2640
+ const cellElement = await row.getCell(fieldName).element();
2641
+ await cellElement.click({ button: "right" });
2657
2642
  });
2658
2643
  }
2659
2644
  /**
@@ -2665,16 +2650,14 @@ var init_Table = __esm({
2665
2650
  * @returns {Promise<string>} Повертає значення комірки
2666
2651
  *
2667
2652
  * @example
2668
- * const table = new Table(driver);
2653
+ * const table = new Table(page);
2669
2654
  *
2670
2655
  * // Отримання значення комірки 'Name' в першому рядку (індекс 0)
2671
2656
  * const cellValue = await table.getCellValueByCellName('Name', 0);
2672
2657
  * expect(cellValue).toBe('Очікуване значення');
2673
2658
  */
2674
2659
  getCellValueByCellName(cellName, rowIndex) {
2675
- if (rowIndex == null) {
2676
- throw new Error("Error: getCellValue(): rowIndex is required");
2677
- }
2660
+ if (rowIndex == null) throw new Error("Error: getCellValue(): rowIndex is required");
2678
2661
  const row = this.getRowByIndex(rowIndex);
2679
2662
  return row.getCell(cellName).getValue();
2680
2663
  }
@@ -2684,19 +2667,15 @@ var init_Table = __esm({
2684
2667
  * @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
2685
2668
  *
2686
2669
  * @example
2687
- * const table = new Table(driver);
2670
+ * const table = new Table(page);
2688
2671
  *
2689
2672
  * // Перевірка чи порожня таблиця
2690
2673
  * const empty = await table.isEmpty();
2691
2674
  * expect(empty).toBe(true);
2692
2675
  */
2693
2676
  async isEmpty() {
2694
- try {
2695
- await this.waitRowsCount(0);
2696
- return true;
2697
- } catch {
2698
- return false;
2699
- }
2677
+ const rowCount = await this.getRowElements().count();
2678
+ return rowCount === 0;
2700
2679
  }
2701
2680
  /**
2702
2681
  * Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
@@ -2707,7 +2686,7 @@ var init_Table = __esm({
2707
2686
  * @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
2708
2687
  *
2709
2688
  * @example
2710
- * const table = new Table(driver);
2689
+ * const table = new Table(page);
2711
2690
  *
2712
2691
  * // Очікування, поки таблиця не стане порожньою
2713
2692
  * await table.waitRowsCount(0);
@@ -2717,21 +2696,20 @@ var init_Table = __esm({
2717
2696
  * console.log('Таблиця містить 5 рядків');
2718
2697
  */
2719
2698
  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}`);
2699
+ await wait(async () => {
2700
+ const rowsCount = await this.getRowElements().count();
2701
+ return rowsCount === count;
2702
+ }, this.page, `Rows count not equal: ${count}`);
2724
2703
  }
2725
2704
  };
2726
2705
  }
2727
2706
  });
2728
2707
 
2729
2708
  // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
2730
- var import_selenium_webdriver27, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
2709
+ var TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, getToolbarButtonTextByTestIdSelector, ToolbarButton;
2731
2710
  var init_ToolbarButton = __esm({
2732
2711
  "src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
2733
2712
  "use strict";
2734
- import_selenium_webdriver27 = require("selenium-webdriver");
2735
2713
  init_AbstractButton();
2736
2714
  init_locators();
2737
2715
  TOOLBAR_BUTTON_CLASS = "toolbar-button";
@@ -2741,8 +2719,8 @@ var init_ToolbarButton = __esm({
2741
2719
  getToolbarButtonTextByTestIdSelector = (testId) => `${byTestIdCssSelector(testId)} .${TOOLBAR_BUTTON_TEXT_CLASS}`;
2742
2720
  ToolbarButton = class extends AbstractButton {
2743
2721
  name;
2744
- constructor(parentCssSelector, name, driver) {
2745
- super(parentCssSelector, getToolbarButtonSelector(name), driver);
2722
+ constructor(parentCssSelector, name, page) {
2723
+ super(parentCssSelector, getToolbarButtonSelector(name), page);
2746
2724
  this.name = name;
2747
2725
  }
2748
2726
  buttonNotDisplayedError() {
@@ -2750,8 +2728,8 @@ var init_ToolbarButton = __esm({
2750
2728
  }
2751
2729
  async getTitle() {
2752
2730
  try {
2753
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
2754
- return await buttonTextContainer.getText();
2731
+ const buttonTextContainer = this.page.locator(getToolbarButtonTextSelector(this.name));
2732
+ return await buttonTextContainer.innerText();
2755
2733
  } catch (_) {
2756
2734
  return null;
2757
2735
  }
@@ -2761,17 +2739,16 @@ var init_ToolbarButton = __esm({
2761
2739
  });
2762
2740
 
2763
2741
  // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
2764
- var import_selenium_webdriver28, ToolbarGroupButton;
2742
+ var ToolbarGroupButton;
2765
2743
  var init_ToolbarGroupButton = __esm({
2766
2744
  "src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
2767
2745
  "use strict";
2768
2746
  init_AbstractButton();
2769
- import_selenium_webdriver28 = require("selenium-webdriver");
2770
2747
  init_ToolbarButton();
2771
2748
  ToolbarGroupButton = class extends AbstractButton {
2772
2749
  name;
2773
- constructor(parentCssSelector, name, driver) {
2774
- super(parentCssSelector, ``, driver);
2750
+ constructor(parentCssSelector, name, page) {
2751
+ super(parentCssSelector, ``, page);
2775
2752
  this.name = name;
2776
2753
  }
2777
2754
  buttonNotDisplayedError() {
@@ -2780,8 +2757,8 @@ var init_ToolbarGroupButton = __esm({
2780
2757
  async getTitle() {
2781
2758
  try {
2782
2759
  const buttonTestId = await this.getDataTestId();
2783
- const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver28.By.css(getToolbarButtonTextByTestIdSelector(buttonTestId)));
2784
- return await buttonTextContainer.getText();
2760
+ const buttonTextContainer = this.page.locator(getToolbarButtonTextByTestIdSelector(buttonTestId));
2761
+ return await buttonTextContainer.innerText();
2785
2762
  } catch (_) {
2786
2763
  return null;
2787
2764
  }
@@ -2796,16 +2773,15 @@ var init_AbstractDropDownMenuButton = __esm({
2796
2773
  "src/pageObjects/elements/AbstractDropDownMenuButton.ts"() {
2797
2774
  "use strict";
2798
2775
  init_AbstractElementWithParent();
2799
- init_actions();
2800
2776
  AbstractDropDownMenuButton = class extends AbstractElementWithParent {
2801
2777
  _list;
2802
- constructor(parentCssSelector, elementCssSelector, list, driver) {
2803
- super(parentCssSelector, elementCssSelector, driver);
2778
+ constructor(parentCssSelector, elementCssSelector, list, page) {
2779
+ super(parentCssSelector, elementCssSelector, page);
2804
2780
  this._list = list;
2805
2781
  }
2806
2782
  async openDropdownMenu() {
2807
- const dropdown = await this.getElement();
2808
- await click(dropdown, this.driver);
2783
+ const dropdown = this.getLocator();
2784
+ await dropdown.click();
2809
2785
  await this._list.isVisible();
2810
2786
  }
2811
2787
  async clickButton(name) {
@@ -2833,6 +2809,7 @@ var ToolbarMenuItem;
2833
2809
  var init_ToolbarMenuItem = __esm({
2834
2810
  "src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts"() {
2835
2811
  "use strict";
2812
+ init_waitElementIsVisible();
2836
2813
  ToolbarMenuItem = class {
2837
2814
  getMenuItem;
2838
2815
  name;
@@ -2840,26 +2817,44 @@ var init_ToolbarMenuItem = __esm({
2840
2817
  this.getMenuItem = getMenuItem;
2841
2818
  this.name = name;
2842
2819
  }
2820
+ isPressed() {
2821
+ throw new Error("Method not implemented.");
2822
+ }
2823
+ getLocator() {
2824
+ throw new Error("Method not implemented.");
2825
+ }
2843
2826
  async click() {
2844
- const menuItemElement = await this.getMenuItem(this.name);
2845
- await menuItemElement.click();
2827
+ try {
2828
+ const menuItemElement = await this.getMenuItem(this.name);
2829
+ await waitElementIsVisible_default({ locator: menuItemElement });
2830
+ await menuItemElement.click();
2831
+ } catch (error) {
2832
+ throw new Error(`Cannot click on toolbar menu item: ${this.name}`);
2833
+ }
2846
2834
  }
2847
2835
  async getTitle() {
2848
2836
  try {
2849
2837
  const menuItemElement = await this.getMenuItem(this.name);
2850
- return await menuItemElement.getText();
2838
+ await waitElementIsVisible_default({ locator: menuItemElement });
2839
+ return await menuItemElement.innerText();
2851
2840
  } catch (_) {
2852
2841
  return null;
2853
2842
  }
2854
2843
  }
2855
2844
  async isDisabled() {
2856
- const menuItemElement = await this.getMenuItem(this.name);
2857
- return await menuItemElement.getCssValue("pointer-events") === "none";
2845
+ try {
2846
+ const menuItemElement = await this.getMenuItem(this.name);
2847
+ await waitElementIsVisible_default({ locator: menuItemElement });
2848
+ return await menuItemElement.isDisabled();
2849
+ } catch (_) {
2850
+ return false;
2851
+ }
2858
2852
  }
2859
- async isDisplayed() {
2853
+ async isVisible() {
2860
2854
  try {
2861
2855
  const menuItemElement = await this.getMenuItem(this.name);
2862
- return await menuItemElement.isDisplayed();
2856
+ await waitElementIsVisible_default({ locator: menuItemElement });
2857
+ return await menuItemElement.isVisible();
2863
2858
  } catch (_) {
2864
2859
  return false;
2865
2860
  }
@@ -2883,8 +2878,8 @@ var init_ToolbarMenu = __esm({
2883
2878
  getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
2884
2879
  ToolbarMenuList = class extends DXContextMenuList {
2885
2880
  _formName;
2886
- constructor(parentCssSelector, elementCssSelector, formName, driver) {
2887
- super(parentCssSelector, elementCssSelector, driver);
2881
+ constructor(parentCssSelector, elementCssSelector, formName, page) {
2882
+ super(parentCssSelector, elementCssSelector, page);
2888
2883
  this._formName = formName;
2889
2884
  }
2890
2885
  getButtonNameBy(name) {
@@ -2892,10 +2887,10 @@ var init_ToolbarMenu = __esm({
2892
2887
  }
2893
2888
  };
2894
2889
  ToolbarMenu = class extends AbstractDropDownMenuButton {
2895
- constructor(parentCssSelector, formName, name, driver) {
2890
+ constructor(parentCssSelector, formName, name, page) {
2896
2891
  const fullSelector = getFullCssSelector(formName, name);
2897
- const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, driver);
2898
- super(parentCssSelector, fullSelector, list, driver);
2892
+ const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, page);
2893
+ super(parentCssSelector, fullSelector, list, page);
2899
2894
  }
2900
2895
  checkNameValue(name) {
2901
2896
  if (!isString(name) && !isArray(name))
@@ -2913,13 +2908,13 @@ var init_ToolbarMenu = __esm({
2913
2908
  this.checkTitleValue(title);
2914
2909
  return new ToolbarMenuItem(this.getMenuItemElementByTitle.bind(this), title);
2915
2910
  }
2916
- async buttonIsDisplayed(name) {
2911
+ async buttonIsVisible(name) {
2917
2912
  const button = this.buttonByName(name);
2918
- return await button.isDisplayed();
2913
+ return await button.isVisible();
2919
2914
  }
2920
- async buttonByTitleIsDisplayed(title) {
2915
+ async buttonByTitleIsVisible(title) {
2921
2916
  const button = this.buttonByTitle(title);
2922
- return await button.isDisplayed();
2917
+ return await button.isVisible();
2923
2918
  }
2924
2919
  async buttonTitle(name) {
2925
2920
  const button = this.buttonByName(name);
@@ -2955,14 +2950,15 @@ var init_ToolbarItem = __esm({
2955
2950
  init_ToolbarButton();
2956
2951
  init_locators();
2957
2952
  init_ToolbarMenu();
2953
+ init_waitElementIsVisible();
2958
2954
  GROUP_BUTTON_CLASS = "toolbar-group-button";
2959
2955
  toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
2960
2956
  ToolbarItem = class extends AbstractElementWithParent {
2961
2957
  _button;
2962
2958
  _formName;
2963
2959
  _itemName;
2964
- constructor(parentCssSelector, formName, itemName, driver) {
2965
- super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
2960
+ constructor(parentCssSelector, formName, itemName, page) {
2961
+ super(parentCssSelector, toolbarItemSelector(formName, itemName), page);
2966
2962
  this._itemName = itemName;
2967
2963
  this._formName = formName;
2968
2964
  }
@@ -2970,23 +2966,33 @@ var init_ToolbarItem = __esm({
2970
2966
  if (this._button) return this._button;
2971
2967
  const classNames = await this.getClasses();
2972
2968
  if (classNames.includes(GROUP_BUTTON_CLASS)) {
2973
- this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
2969
+ this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.page);
2974
2970
  return;
2975
2971
  }
2976
- this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
2972
+ this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.page);
2977
2973
  }
2978
2974
  async click() {
2979
- await this.init();
2980
- await this._button.click();
2975
+ try {
2976
+ await this.init();
2977
+ await waitElementIsVisible_default({ locator: this._button.getLocator() });
2978
+ await this._button.click();
2979
+ } catch (error) {
2980
+ throw new Error(`Cannot click on toolbar item: ${this._itemName}`);
2981
+ }
2981
2982
  }
2982
2983
  async isDisabled() {
2983
- await this.init();
2984
- return await this._button.isDisabled();
2984
+ try {
2985
+ await this.init();
2986
+ await waitElementIsVisible_default({ locator: this._button.getLocator() });
2987
+ return await this._button.isDisabled();
2988
+ } catch (error) {
2989
+ return false;
2990
+ }
2985
2991
  }
2986
- async isDisplayed() {
2992
+ async isVisible() {
2987
2993
  try {
2988
2994
  await this.init();
2989
- return this._button.isDisplayed();
2995
+ return this._button.isVisible();
2990
2996
  } catch (error) {
2991
2997
  return false;
2992
2998
  }
@@ -3000,11 +3006,15 @@ var init_ToolbarItem = __esm({
3000
3006
  }
3001
3007
  }
3002
3008
  async getTitle() {
3003
- await this.init();
3004
- return await this._button.getTitle();
3009
+ try {
3010
+ await this.init();
3011
+ return await this._button.getTitle();
3012
+ } catch (error) {
3013
+ return "";
3014
+ }
3005
3015
  }
3006
3016
  get menu() {
3007
- return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
3017
+ return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.page);
3008
3018
  }
3009
3019
  };
3010
3020
  }
@@ -3020,30 +3030,25 @@ var init_FormToolbar = __esm({
3020
3030
  TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
3021
3031
  FormToolbar = class extends AbstractElementWithParent {
3022
3032
  formName;
3023
- constructor(parentCssSelector, formName, driver) {
3024
- super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
3033
+ constructor(parentCssSelector, formName, page) {
3034
+ super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, page);
3025
3035
  this.formName = formName;
3026
3036
  }
3027
3037
  button(name) {
3028
- return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
3038
+ return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.page);
3029
3039
  }
3030
3040
  };
3031
3041
  }
3032
3042
  });
3033
3043
 
3034
3044
  // src/pageObjects/elements/Filters/FilterOperation.ts
3035
- var import_selenium_webdriver29, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
3045
+ var FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
3036
3046
  var init_FilterOperation = __esm({
3037
3047
  "src/pageObjects/elements/Filters/FilterOperation.ts"() {
3038
3048
  "use strict";
3039
- import_selenium_webdriver29 = require("selenium-webdriver");
3040
- init_fixElementStaleError();
3041
3049
  init_AbstractElementWithParent();
3042
3050
  init_locators();
3043
- init_actions();
3044
3051
  init_wait();
3045
- init_waitElementIsClickable();
3046
- init_waitElementIsVisible();
3047
3052
  FILTER_OPERATIONS = [
3048
3053
  "=",
3049
3054
  "<>",
@@ -3065,44 +3070,42 @@ var init_FilterOperation = __esm({
3065
3070
  getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
3066
3071
  FilterOperation = class extends AbstractElementWithParent {
3067
3072
  _testId;
3068
- constructor({ parentCssSelector, filterTestID, driver }) {
3069
- super(parentCssSelector, `${byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`)}`, driver);
3073
+ constructor({ parentCssSelector, filterTestID, page }) {
3074
+ super(
3075
+ parentCssSelector,
3076
+ byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`),
3077
+ page
3078
+ );
3070
3079
  this._testId = filterTestID;
3071
3080
  }
3081
+ popup() {
3082
+ return this.page.locator(
3083
+ byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)
3084
+ );
3085
+ }
3072
3086
  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
- }
3087
+ const widgetButton = this.getLocator();
3088
+ const icon = widgetButton.locator(".dx-icon");
3089
+ await icon.first().click();
3090
+ const popup = this.popup();
3091
+ await popup.waitFor({ state: "visible" });
3091
3092
  }
3092
3093
  async setOperation(operationName) {
3093
3094
  if (!FILTER_OPERATIONS.includes(operationName)) {
3094
3095
  throw new Error(`Operation with name "${operationName}" is not correct.`);
3095
3096
  }
3096
3097
  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(
3098
+ const operationItem = this.popup().locator(
3099
+ getWidgetInPopupSelector(operationName)
3100
+ );
3101
+ await operationItem.click();
3102
+ await wait(
3100
3103
  async () => {
3101
3104
  const currOperationName = await this.getAttribute("data-operation");
3102
3105
  if (operationName === "isblank") return true;
3103
3106
  return currOperationName === operationName;
3104
3107
  },
3105
- this.driver,
3108
+ this.page,
3106
3109
  "Operation is not changed"
3107
3110
  );
3108
3111
  }
@@ -3115,12 +3118,12 @@ var init_FilterOperation = __esm({
3115
3118
  const currValue = await this.getIsBlank();
3116
3119
  if (currValue !== value) {
3117
3120
  await this.setOperation("isblank");
3118
- await safeWait(
3121
+ await wait(
3119
3122
  async () => {
3120
3123
  const currIsBlank = await this.getIsBlank();
3121
3124
  return currIsBlank === value;
3122
3125
  },
3123
- this.driver,
3126
+ this.page,
3124
3127
  "Operation is not changed"
3125
3128
  );
3126
3129
  }
@@ -3145,8 +3148,8 @@ var init_FormFilterField = __esm({
3145
3148
  FormFilterField = class extends AbstractEditor {
3146
3149
  formName;
3147
3150
  name;
3148
- constructor(parentCssSelector, formName, name, driver) {
3149
- super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
3151
+ constructor(parentCssSelector, formName, name, page) {
3152
+ super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), page);
3150
3153
  this.formName = formName;
3151
3154
  this.name = name;
3152
3155
  }
@@ -3198,7 +3201,7 @@ var init_FormFilterField = __esm({
3198
3201
  return new FilterOperation({
3199
3202
  parentCssSelector: this.parentCssSelector,
3200
3203
  filterTestID: createLayoutFilterTestId(this.formName, this.name),
3201
- driver: this.driver
3204
+ page: this.page
3202
3205
  });
3203
3206
  }
3204
3207
  /**
@@ -3259,8 +3262,8 @@ var init_PanelFilterField = __esm({
3259
3262
  PanelFilterField = class extends AbstractEditor {
3260
3263
  formName;
3261
3264
  name;
3262
- constructor(parentCssSelector, formName, name, driver) {
3263
- super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
3265
+ constructor(parentCssSelector, formName, name, page) {
3266
+ super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), page);
3264
3267
  this.formName = formName;
3265
3268
  this.name = name;
3266
3269
  }
@@ -3312,7 +3315,7 @@ var init_PanelFilterField = __esm({
3312
3315
  return new FilterOperation({
3313
3316
  parentCssSelector: this.parentCssSelector,
3314
3317
  filterTestID: createDocFilterTestId(this.formName, this.name),
3315
- driver: this.driver
3318
+ page: this.page
3316
3319
  });
3317
3320
  }
3318
3321
  /**
@@ -3362,14 +3365,12 @@ var init_PanelFilterField = __esm({
3362
3365
  });
3363
3366
 
3364
3367
  // src/pageObjects/elements/Filters/FilterPanel.ts
3365
- var import_selenium_webdriver30, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
3368
+ var drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
3366
3369
  var init_FilterPanel = __esm({
3367
3370
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
3368
3371
  "use strict";
3369
- import_selenium_webdriver30 = require("selenium-webdriver");
3370
3372
  init_AbstractElement();
3371
3373
  init_PanelFilterField();
3372
- init_actions();
3373
3374
  drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
3374
3375
  FILTER_PANEL_SELECTOR = ".filter-panel";
3375
3376
  CLOSE_SELECTOR = ".button-close";
@@ -3380,11 +3381,10 @@ var init_FilterPanel = __esm({
3380
3381
  }
3381
3382
  async filterPanelButtons() {
3382
3383
  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));
3384
+ return this.page.locator(selector).all();
3385
3385
  }
3386
- constructor(formName, driver) {
3387
- super(driver, drawerSelector(formName));
3386
+ constructor(formName, page) {
3387
+ super(page, drawerSelector(formName));
3388
3388
  this._formName = formName;
3389
3389
  }
3390
3390
  /**
@@ -3394,28 +3394,28 @@ var init_FilterPanel = __esm({
3394
3394
  * await form.filterPanel.filterField('NumberFld');
3395
3395
  */
3396
3396
  filterField(name) {
3397
- return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
3397
+ return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.page);
3398
3398
  }
3399
3399
  async apply() {
3400
3400
  const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
3401
- await click(btn, this.driver);
3401
+ await btn.click();
3402
3402
  }
3403
3403
  async findButtonByTitle(title) {
3404
3404
  const buttons = await this.filterPanelButtons();
3405
3405
  for (const btn of buttons) {
3406
- if (await btn.getText() === title) {
3406
+ if (await btn.innerText() === title) {
3407
3407
  return btn;
3408
3408
  }
3409
3409
  }
3410
3410
  }
3411
3411
  async clearAll() {
3412
3412
  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);
3413
+ await btn.click();
3414
+ await this.page.waitForTimeout(300);
3415
3415
  }
3416
3416
  async close() {
3417
- const btn = await this.driver.findElement(import_selenium_webdriver30.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
3418
- await click(btn, this.driver);
3417
+ const btn = this.page.locator(`${this.elementCssSelector} ${CLOSE_SELECTOR}`);
3418
+ await btn.click();
3419
3419
  }
3420
3420
  };
3421
3421
  }
@@ -3430,8 +3430,8 @@ var init_HeaderFilterField = __esm({
3430
3430
  init_createDataTestId();
3431
3431
  init_AbstractEditor2();
3432
3432
  HeaderFilterField = class extends AbstractEditor {
3433
- constructor(parentCssSelector, formName, name, driver) {
3434
- super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
3433
+ constructor(parentCssSelector, formName, name, page) {
3434
+ super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), page);
3435
3435
  }
3436
3436
  async getValue() {
3437
3437
  return super.getValue();
@@ -3456,71 +3456,51 @@ var init_HeaderFilterField = __esm({
3456
3456
  });
3457
3457
 
3458
3458
  // 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;
3459
+ var APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
3460
3460
  var init_ColumnFilter = __esm({
3461
3461
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
3462
3462
  "use strict";
3463
- init_actions();
3464
- import_selenium_webdriver31 = require("selenium-webdriver");
3465
3463
  init_HeaderFilterField();
3466
- init_waitElementIsVisible();
3467
- init_AbstractElement();
3468
3464
  init_FilterOperation();
3469
3465
  init_createDataTestId();
3470
- init_wait();
3466
+ init_waitElementIsVisible();
3471
3467
  APPLY_SELECTOR = ".apply-button";
3472
3468
  CANCEL_SELECTOR = ".cancel-button";
3473
3469
  HEADER_FILTER_ICON = ".indicators-container .filter-icon";
3474
3470
  HEADER_FILTER_CONTAINER = ".header-filter";
3475
3471
  HEADER_FILTER_BUTTONS = ".header-filter-buttons";
3476
- ColumnFilter = class extends AbstractElement {
3472
+ ColumnFilter = class {
3477
3473
  _formName;
3478
3474
  _name;
3479
3475
  _column;
3480
- constructor(formName, name, column, driver) {
3481
- super(driver, HEADER_FILTER_CONTAINER);
3476
+ page;
3477
+ constructor(formName, name, column, page) {
3482
3478
  this._formName = formName;
3483
3479
  this._name = name;
3484
3480
  this._column = column;
3485
- this.driver = driver;
3481
+ this.page = page;
3486
3482
  }
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));
3483
+ getApplyButton() {
3484
+ return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`);
3490
3485
  }
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));
3486
+ getCancelButton() {
3487
+ return this.page.locator(`${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`);
3494
3488
  }
3495
3489
  async apply() {
3496
- const btn = await this.getApplyButton();
3497
- await click(btn, this.driver);
3490
+ await this.getApplyButton().click();
3498
3491
  }
3499
3492
  async cancel() {
3500
- const btn = await this.getCancelButton();
3501
- await click(btn, this.driver);
3493
+ await this.getCancelButton().click();
3502
3494
  }
3503
3495
  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
- });
3496
+ const columnEl = await this._column.element();
3497
+ await columnEl.hover();
3498
+ const headerFilterIcon = columnEl.locator(HEADER_FILTER_ICON);
3499
+ await headerFilterIcon.waitFor({ state: "visible" });
3500
+ await headerFilterIcon.click();
3501
+ const filter = new HeaderFilterField("", this._formName, this._name, this.page);
3502
+ const filterEl = filter.getLocator();
3503
+ await waitElementIsVisible_default({ locator: filterEl });
3524
3504
  return filter;
3525
3505
  }
3526
3506
  /**
@@ -3547,9 +3527,9 @@ var init_ColumnFilter = __esm({
3547
3527
  const filterOperation = new FilterOperation({
3548
3528
  parentCssSelector: HEADER_FILTER_CONTAINER,
3549
3529
  filterTestID: createHeaderFilterTestId(this._formName, this._name),
3550
- driver: this.driver
3530
+ page: this.page
3551
3531
  });
3552
- const inputEl = await filter.getElement();
3532
+ const inputEl = filter.getLocator();
3553
3533
  if (typeof operation === "string") {
3554
3534
  await inputEl.click();
3555
3535
  await filterOperation.setOperation(operation);
@@ -3559,7 +3539,7 @@ var init_ColumnFilter = __esm({
3559
3539
  await filterOperation.setIsBlank(isBlank);
3560
3540
  }
3561
3541
  await filter.setValue(value);
3562
- return this.apply();
3542
+ await this.apply();
3563
3543
  }
3564
3544
  /**
3565
3545
  * Очищает значение в поле
@@ -3586,12 +3566,12 @@ var init_ColumnFilter = __esm({
3586
3566
  */
3587
3567
  async initOperation() {
3588
3568
  const filter = await this.initFilter();
3589
- const inputEl = await filter.getElement();
3569
+ const inputEl = filter.getLocator();
3590
3570
  await inputEl.click();
3591
3571
  return new FilterOperation({
3592
3572
  parentCssSelector: HEADER_FILTER_CONTAINER,
3593
3573
  filterTestID: createHeaderFilterTestId(this._formName, this._name),
3594
- driver: this.driver
3574
+ page: this.page
3595
3575
  });
3596
3576
  }
3597
3577
  /**
@@ -3611,7 +3591,7 @@ var init_ColumnFilter = __esm({
3611
3591
  */
3612
3592
  async getOperation() {
3613
3593
  const filterOperation = await this.initOperation();
3614
- return await filterOperation.getOperation();
3594
+ return filterOperation.getOperation();
3615
3595
  }
3616
3596
  /**
3617
3597
  * Устанавливает операцию 'isblank' для фильтра
@@ -3630,7 +3610,7 @@ var init_ColumnFilter = __esm({
3630
3610
  */
3631
3611
  async getIsBlank() {
3632
3612
  const filterOperation = await this.initOperation();
3633
- return await filterOperation.getIsBlank();
3613
+ return filterOperation.getIsBlank();
3634
3614
  }
3635
3615
  async isReadonly() {
3636
3616
  const filter = await this.initFilter();
@@ -3672,8 +3652,8 @@ var init_ListForm = __esm({
3672
3652
  fixedTableContentCssSelector;
3673
3653
  tableContentCssSelector;
3674
3654
  contextMenuCssSelector;
3675
- constructor(driver) {
3676
- super(driver);
3655
+ constructor(page) {
3656
+ super(page);
3677
3657
  this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
3678
3658
  this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
3679
3659
  this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
@@ -3688,17 +3668,15 @@ var init_ListForm = __esm({
3688
3668
  * expect(listForm.table());
3689
3669
  */
3690
3670
  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
- );
3671
+ return new Table({
3672
+ parentCssSelector: this.containerCssSelector,
3673
+ headerCssSelector: this.headerCssSelector,
3674
+ fixedTableContentCssSelector: this.fixedTableContentCssSelector,
3675
+ formName: this.formName,
3676
+ page: this.page,
3677
+ contextMenuCssSelector: this.contextMenuCssSelector,
3678
+ tableContentCssSelector: this.tableContentCssSelector
3679
+ });
3702
3680
  }
3703
3681
  /**
3704
3682
  * Находит таблицу
@@ -3708,7 +3686,7 @@ var init_ListForm = __esm({
3708
3686
  * expect(listForm.toolbarButton());
3709
3687
  */
3710
3688
  toolbarButton(name) {
3711
- const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
3689
+ const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.page);
3712
3690
  return toolbar.button(name);
3713
3691
  }
3714
3692
  /**
@@ -3719,11 +3697,11 @@ var init_ListForm = __esm({
3719
3697
  * expect(listForm.formFilter());
3720
3698
  */
3721
3699
  formFilter(name) {
3722
- return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
3700
+ return new FormFilterField(this.containerCssSelector, this.formName, name, this.page);
3723
3701
  }
3724
3702
  columnFilter(name) {
3725
3703
  const column = this.table().getColumnByName(name);
3726
- return new ColumnFilter(this.formName, name, column, this.driver);
3704
+ return new ColumnFilter(this.formName, name, column, this.page);
3727
3705
  }
3728
3706
  /**
3729
3707
  * Модель панели фильтрации
@@ -3734,7 +3712,7 @@ var init_ListForm = __esm({
3734
3712
  * expect(listForm.filterPanel());
3735
3713
  */
3736
3714
  get filterPanel() {
3737
- return new FilterPanel(this.formName, this.driver);
3715
+ return new FilterPanel(this.formName, this.page);
3738
3716
  }
3739
3717
  };
3740
3718
  }
@@ -3754,8 +3732,8 @@ var init_TreeView = __esm({
3754
3732
  TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3755
3733
  FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
3756
3734
  TreeView = class extends ListForm {
3757
- constructor(driver) {
3758
- super(driver);
3735
+ constructor(page) {
3736
+ super(page);
3759
3737
  this.popupContainerCssSelector = `.popup.tree-view-${this.formName}`;
3760
3738
  this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
3761
3739
  this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
@@ -3805,29 +3783,28 @@ var init_createSubFormInstance = __esm({
3805
3783
  });
3806
3784
 
3807
3785
  // src/pageObjects/elements/Forms/Form.ts
3808
- var import_selenium_webdriver32, formTestId, Form;
3786
+ var formTestId, Form;
3809
3787
  var init_Form = __esm({
3810
3788
  "src/pageObjects/elements/Forms/Form.ts"() {
3811
3789
  "use strict";
3812
3790
  init_locators();
3813
- import_selenium_webdriver32 = require("selenium-webdriver");
3814
3791
  init_AbstractForm();
3815
- init_waitElementIsVisible();
3816
3792
  init_createSubFormInstance();
3793
+ init_waitElementIsVisible();
3817
3794
  formTestId = (formName) => `form-content-wrapper-${formName}`;
3818
3795
  Form = class extends AbstractForm {
3819
3796
  popupContainerCssSelector;
3820
- constructor(driver) {
3821
- super(driver);
3797
+ constructor(page) {
3798
+ super(page);
3822
3799
  this.setSubFormMode();
3823
3800
  }
3824
3801
  async isModal() {
3825
- const el = await this.getContainerElement();
3802
+ const el = this.getContainerElement();
3826
3803
  const value = await el.getAttribute("data-ismodal");
3827
3804
  return value === "true";
3828
3805
  }
3829
3806
  async isFullScreen() {
3830
- const el = await this.getContainerElement();
3807
+ const el = this.getContainerElement();
3831
3808
  const value = await el.getAttribute("data-isfullscreen");
3832
3809
  return value === "true";
3833
3810
  }
@@ -3837,29 +3814,27 @@ var init_Form = __esm({
3837
3814
  * const listForm = new MyForm();
3838
3815
  * //...
3839
3816
  * expect(await listForm.getTitleText()).toBe('MyFormTitle');
3817
+ * Получение заголовка на форме
3840
3818
  */
3841
3819
  async getTitleText() {
3842
3820
  const getFullScreenTitle = async () => {
3843
- let titleEl = await this.driver.findElement(import_selenium_webdriver32.By.className("main-toolbar-form-title"));
3844
- return titleEl.getText();
3821
+ const titleEl = this.page.locator(".main-toolbar-form-title");
3822
+ return titleEl.innerText();
3845
3823
  };
3846
3824
  if (await this.isFullScreen()) {
3847
3825
  return getFullScreenTitle();
3848
3826
  }
3849
3827
  if (await this.isModal()) {
3850
- const titleEl = await this.driver.findElement(import_selenium_webdriver32.By.css(`${this.popupContainerCssSelector} .popup-title`));
3828
+ const titleEl = this.page.locator(`${this.popupContainerCssSelector} .popup-title`);
3851
3829
  await waitElementIsVisible_default({
3852
- element: titleEl,
3853
- driver: this.driver,
3854
- errorMessage: `Form title element is not visible`
3830
+ locator: titleEl
3855
3831
  });
3856
- return titleEl.getText();
3832
+ return titleEl.innerText();
3857
3833
  }
3858
3834
  return getFullScreenTitle();
3859
3835
  }
3860
3836
  setSubFormMode() {
3861
3837
  const testId = formTestId(this.formName);
3862
- this.containerBy = byTestId(testId);
3863
3838
  this.containerCssSelector = byTestIdCssSelector(testId);
3864
3839
  }
3865
3840
  /**
@@ -3873,26 +3848,26 @@ var init_Form = __esm({
3873
3848
  async subForm(name, options = {}) {
3874
3849
  const { isDockPanel = false } = options;
3875
3850
  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);
3851
+ const subFormEl = this.page.locator(cssSelector);
3878
3852
  await waitElementIsVisible_default({
3879
- element: subFormEl,
3880
- driver: this.driver,
3881
- errorMessage: `Subform "${name}" is not visible`
3853
+ locator: subFormEl
3882
3854
  });
3883
3855
  const formType = await subFormEl.getAttribute("data-formtype");
3884
- const formName = await subFormEl.getAttribute("data-formname");
3885
- let SubFormFactoryClass = await classDependencyInjector(formType);
3856
+ const formName = await subFormEl.getAttribute("data-formname") ?? "";
3857
+ const SubFormFactoryClass = await classDependencyInjector(formType);
3886
3858
  const SubForm = class extends SubFormFactoryClass {
3887
3859
  setSubFormMode() {
3888
3860
  this.containerCssSelector = cssSelector;
3889
- this.containerBy = byCssSelector;
3861
+ this.containerBy = cssSelector;
3890
3862
  }
3891
3863
  get formName() {
3892
3864
  return formName;
3893
3865
  }
3894
3866
  };
3895
- return new SubForm(this.driver);
3867
+ return new SubForm(this.page);
3868
+ }
3869
+ getContainerElement() {
3870
+ return this.page.locator(this.containerCssSelector);
3896
3871
  }
3897
3872
  };
3898
3873
  }
@@ -3903,20 +3878,18 @@ var FormEdit_exports = {};
3903
3878
  __export(FormEdit_exports, {
3904
3879
  default: () => FormEdit
3905
3880
  });
3906
- var import_selenium_webdriver33, FormEdit;
3881
+ var FormEdit;
3907
3882
  var init_FormEdit = __esm({
3908
3883
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
3909
3884
  "use strict";
3910
3885
  init_Form();
3911
- import_selenium_webdriver33 = require("selenium-webdriver");
3912
3886
  init_FormField();
3913
- init_actions();
3914
3887
  init_wait();
3915
3888
  FormEdit = class extends Form {
3916
3889
  saveButtonId = "#button-save";
3917
3890
  closeButtonId = "#button-cancel";
3918
- constructor(driver) {
3919
- super(driver);
3891
+ constructor(page) {
3892
+ super(page);
3920
3893
  this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
3921
3894
  }
3922
3895
  async getButtonCssSelector(buttonId) {
@@ -3933,7 +3906,7 @@ var init_FormEdit = __esm({
3933
3906
  * expect(await formEdit.field('Name').getValue()).toBe('test value');
3934
3907
  */
3935
3908
  field(name) {
3936
- return new FormField(this.containerCssSelector, this.formName, name, this.driver);
3909
+ return new FormField(this.containerCssSelector, this.formName, name, this.page);
3937
3910
  }
3938
3911
  /**
3939
3912
  * Проверяет не отключена ли кнопка Сохранить
@@ -3944,7 +3917,7 @@ var init_FormEdit = __esm({
3944
3917
  */
3945
3918
  async isSaveButtonDisabled() {
3946
3919
  const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3947
- const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
3920
+ const saveButton = this.page.locator(saveButtonCssSelector);
3948
3921
  const result = await saveButton.getAttribute("aria-disabled");
3949
3922
  return result === "true";
3950
3923
  }
@@ -3957,9 +3930,9 @@ var init_FormEdit = __esm({
3957
3930
  */
3958
3931
  async saveButtonClick() {
3959
3932
  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);
3933
+ const saveButton = this.page.locator(saveButtonCssSelector);
3934
+ await wait(async () => !await this.isSaveButtonDisabled(), this.page, "Button is disabled");
3935
+ await saveButton.click();
3963
3936
  }
3964
3937
  /**
3965
3938
  * Нажатие на кнопку Закрить
@@ -3970,8 +3943,91 @@ var init_FormEdit = __esm({
3970
3943
  */
3971
3944
  async closeButtonClick() {
3972
3945
  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);
3946
+ const closeButton = this.page.locator(closeButtonCssSelector);
3947
+ await closeButton.click();
3948
+ }
3949
+ };
3950
+ }
3951
+ });
3952
+
3953
+ // src/pageObjects/elements/Forms/ReportForm.ts
3954
+ var ReportForm;
3955
+ var init_ReportForm = __esm({
3956
+ "src/pageObjects/elements/Forms/ReportForm.ts"() {
3957
+ "use strict";
3958
+ init_FormEdit();
3959
+ ReportForm = class extends FormEdit {
3960
+ constructor(page) {
3961
+ super(page);
3962
+ this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
3963
+ this.saveButtonId = "#button-apply";
3964
+ }
3965
+ /**
3966
+ * Знаходить поле/фільтр у формі репорту за ім'ям
3967
+ * @example
3968
+ * const formReport = new MyForm();
3969
+ * //...
3970
+ * expect(await formReport.filterField('Name').getValue()).toBe('test value');
3971
+ */
3972
+ filterField(name) {
3973
+ return super.field(name);
3974
+ }
3975
+ };
3976
+ }
3977
+ });
3978
+
3979
+ // src/pageObjects/elements/Dialog.ts
3980
+ var DIALOG_CLASS, DIALOG_TITLE_CLASS, DIALOG_TEXT_CLASS, DIALOG_BUTTONS_PANEL_CLASS, buttonByTextXpath, DialogButton, Dialog;
3981
+ var init_Dialog = __esm({
3982
+ "src/pageObjects/elements/Dialog.ts"() {
3983
+ "use strict";
3984
+ init_AbstractElement();
3985
+ init_AbstractButton();
3986
+ DIALOG_CLASS = ".d5-dialog";
3987
+ DIALOG_TITLE_CLASS = ".dialog__title";
3988
+ DIALOG_TEXT_CLASS = ".dialog__text";
3989
+ DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
3990
+ buttonByTextXpath = (text) => `xpath=.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
3991
+ DialogButton = class extends AbstractButton {
3992
+ text;
3993
+ constructor(parentCssSelector, text, page) {
3994
+ super(parentCssSelector, "", page);
3995
+ this.text = text;
3996
+ }
3997
+ getLocator() {
3998
+ const panel = super.getLocator();
3999
+ return panel.locator(buttonByTextXpath(this.text));
4000
+ }
4001
+ buttonNotDisplayedError() {
4002
+ return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
4003
+ }
4004
+ getTitle() {
4005
+ throw new Error(`Method "getTitle()" is not working.`);
4006
+ }
4007
+ };
4008
+ Dialog = class extends AbstractElement {
4009
+ constructor(page) {
4010
+ super(page, DIALOG_CLASS);
4011
+ }
4012
+ get titleSelector() {
4013
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TITLE_CLASS]);
4014
+ }
4015
+ get textSelector() {
4016
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_TEXT_CLASS]);
4017
+ }
4018
+ get buttonsSelector() {
4019
+ return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
4020
+ }
4021
+ async title() {
4022
+ const el = this.page.locator(this.titleSelector);
4023
+ return await el.innerText();
4024
+ }
4025
+ async text() {
4026
+ const el = this.page.locator(this.textSelector);
4027
+ return await el.innerText();
4028
+ }
4029
+ button(text) {
4030
+ return new DialogButton(this.buttonsSelector, text, this.page);
3975
4031
  }
3976
4032
  };
3977
4033
  }
@@ -6783,6 +6839,25 @@ var require_d5lib = __commonJS({
6783
6839
  }
6784
6840
  });
6785
6841
 
6842
+ // src/api/ApiRequest.ts
6843
+ function ApiRequest(objectName, operation) {
6844
+ const { auth } = config();
6845
+ (0, import_d5lib.config)(auth);
6846
+ const postInstance = (0, import_d5lib.post)(objectName, operation);
6847
+ const invoke = async () => {
6848
+ return postInstance.send(true);
6849
+ };
6850
+ return Object.assign(postInstance, { invoke });
6851
+ }
6852
+ var import_d5lib;
6853
+ var init_ApiRequest = __esm({
6854
+ "src/api/ApiRequest.ts"() {
6855
+ "use strict";
6856
+ init_config();
6857
+ import_d5lib = __toESM(require_d5lib());
6858
+ }
6859
+ });
6860
+
6786
6861
  // src/index.ts
6787
6862
  var src_exports = {};
6788
6863
  __export(src_exports, {
@@ -6804,405 +6879,38 @@ __export(src_exports, {
6804
6879
  TreeView: () => TreeView,
6805
6880
  byTestId: () => byTestId,
6806
6881
  byTestIdCssSelector: () => byTestIdCssSelector,
6807
- click: () => click,
6808
6882
  config: () => config,
6809
- contextMenu: () => contextMenu,
6810
- createDriver: () => createDriver,
6811
6883
  disabledLocator: () => disabledLocator,
6812
6884
  editorFactory: () => editorFactory,
6813
- elementIsNotPresent: () => elementIsNotPresent,
6814
6885
  readonlyLocator: () => readonlyLocator,
6815
- signIn: () => signIn,
6816
- wait: () => safeWait,
6817
- waitElementIsClickable: () => waitElementIsClickable_default,
6886
+ wait: () => wait,
6818
6887
  waitElementIsVisible: () => waitElementIsVisible_default
6819
6888
  });
6820
6889
  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);
6890
+ var init_src = __esm({
6891
+ "src/index.ts"() {
6892
+ init_config();
6893
+ init_LoginPage();
6894
+ init_locators();
6895
+ init_waitElementIsVisible();
6896
+ init_wait();
6897
+ init_AbstractPage();
6898
+ init_LoginPage();
6899
+ init_SubsystemsPanel();
6900
+ init_FormEdit();
6901
+ init_ListForm();
6902
+ init_TreeView();
6903
+ init_ReportForm();
6904
+ init_Editors();
6905
+ init_FormField();
6906
+ init_FormFilterField();
6907
+ init_PanelFilterField();
6908
+ init_FilterPanel();
6909
+ init_Dialog();
6910
+ init_ApiRequest();
7191
6911
  }
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
- }
6912
+ });
6913
+ init_src();
7206
6914
  // Annotate the CommonJS export names for ESM import in node:
7207
6915
  0 && (module.exports = {
7208
6916
  AbstractPage,
@@ -7223,17 +6931,11 @@ function ApiRequest(objectName, operation) {
7223
6931
  TreeView,
7224
6932
  byTestId,
7225
6933
  byTestIdCssSelector,
7226
- click,
7227
6934
  config,
7228
- contextMenu,
7229
- createDriver,
7230
6935
  disabledLocator,
7231
6936
  editorFactory,
7232
- elementIsNotPresent,
7233
6937
  readonlyLocator,
7234
- signIn,
7235
6938
  wait,
7236
- waitElementIsClickable,
7237
6939
  waitElementIsVisible
7238
6940
  });
7239
6941
  /*! For license information please see d5lib.js.LICENSE.txt */