d5-testing-library 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
8
11
  var __export = (target, all) => {
9
12
  for (var name in all)
10
13
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -27,88 +30,166 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
30
  ));
28
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
32
 
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- AbstractPage: () => AbstractPage,
34
- ControlClass: () => ControlClass,
35
- Dialog: () => Dialog,
36
- FilterPanel: () => FilterPanel,
37
- FormEdit: () => FormEdit,
38
- FormField: () => FormField,
39
- FormFilterField: () => FormFilterField,
40
- ListForm: () => ListForm,
41
- LoginPage: () => LoginPage,
42
- NumberEditor: () => NumberEditor,
43
- PanelFilterField: () => PanelFilterField,
44
- SubsystemsPanel: () => SubsystemsPanel,
45
- TextEditor: () => TextEditor,
46
- TreeView: () => TreeView,
47
- byTestId: () => byTestId,
48
- byTestIdCssSelector: () => byTestIdCssSelector,
49
- click: () => click,
50
- config: () => config,
51
- createDriver: () => createDriver,
52
- editorFactory: () => editorFactory,
53
- elementIsNotPresent: () => elementIsNotPresent,
54
- readonlyLocator: () => readonlyLocator,
55
- signIn: () => signIn,
56
- wait: () => wait,
57
- waitElementIsVisible: () => waitElementIsVisible
33
+ // src/config.ts
34
+ function config(cfg) {
35
+ return configInstance.config(cfg);
36
+ }
37
+ var process, driversMap, createConfigProxy, Config, configInstance;
38
+ var init_config = __esm({
39
+ "src/config.ts"() {
40
+ "use strict";
41
+ process = __toESM(require("process"));
42
+ driversMap = /* @__PURE__ */ new Map();
43
+ createConfigProxy = (config2) => {
44
+ return new Proxy(config2, {
45
+ get(_target, prop) {
46
+ if (prop === "driver") {
47
+ return driversMap.get(process.pid);
48
+ }
49
+ return Reflect.get(...arguments);
50
+ },
51
+ set(_target, prop, value) {
52
+ if (prop === "driver") {
53
+ driversMap.set(process.pid, value);
54
+ return true;
55
+ }
56
+ return Reflect.set(...arguments);
57
+ }
58
+ });
59
+ };
60
+ Config = class _Config {
61
+ static instance;
62
+ appConfig;
63
+ static getInstance() {
64
+ if (!_Config.instance) {
65
+ _Config.instance = new _Config();
66
+ }
67
+ return _Config.instance;
68
+ }
69
+ config = (cfg) => {
70
+ if (!cfg)
71
+ return createConfigProxy(this.appConfig);
72
+ this.appConfig = cfg;
73
+ };
74
+ };
75
+ configInstance = Config.getInstance();
76
+ }
58
77
  });
59
- module.exports = __toCommonJS(src_exports);
60
78
 
61
- // src/config.ts
62
- var process = __toESM(require("process"));
63
- var driversMap = /* @__PURE__ */ new Map();
64
- var createConfigProxy = (config2) => {
65
- return new Proxy(config2, {
66
- get(_target, prop) {
67
- if (prop === "driver") {
68
- return driversMap.get(process.pid);
69
- }
70
- return Reflect.get(...arguments);
71
- },
72
- set(_target, prop, value) {
73
- if (prop === "driver") {
74
- driversMap.set(process.pid, value);
75
- return true;
76
- }
77
- return Reflect.set(...arguments);
78
- }
79
- });
80
- };
81
- var Config = class _Config {
82
- static instance;
83
- appConfig;
84
- static getInstance() {
85
- if (!_Config.instance) {
86
- _Config.instance = new _Config();
79
+ // src/utils/fixElementStaleError.ts
80
+ function fixElementStaleError(by, driver) {
81
+ const maxCount = 3;
82
+ let err;
83
+ const call = async (times = 0) => {
84
+ if (times > maxCount)
85
+ throw err;
86
+ try {
87
+ let el = await driver.findElement(by);
88
+ await el.getAttribute("class");
89
+ return el;
90
+ } catch (e) {
91
+ err = e;
92
+ if (e instanceof Error && e.name === "StaleElementReferenceError") {
93
+ return call(++times);
94
+ }
87
95
  }
88
- return _Config.instance;
89
- }
90
- config = (cfg) => {
91
- if (!cfg)
92
- return createConfigProxy(this.appConfig);
93
- this.appConfig = cfg;
96
+ if (err)
97
+ throw err;
94
98
  };
95
- };
96
- var configInstance = Config.getInstance();
97
- function config(cfg) {
98
- return configInstance.config(cfg);
99
+ return call();
99
100
  }
101
+ var init_fixElementStaleError = __esm({
102
+ "src/utils/fixElementStaleError.ts"() {
103
+ "use strict";
104
+ }
105
+ });
100
106
 
101
107
  // src/pageObjects/AbstractElement.ts
102
- var import_selenium_webdriver2 = require("selenium-webdriver");
108
+ var import_selenium_webdriver, AbstractElement;
109
+ var init_AbstractElement = __esm({
110
+ "src/pageObjects/AbstractElement.ts"() {
111
+ "use strict";
112
+ import_selenium_webdriver = require("selenium-webdriver");
113
+ init_config();
114
+ init_fixElementStaleError();
115
+ AbstractElement = class {
116
+ driver;
117
+ elementCssSelector;
118
+ constructor(driver, elementCssSelector) {
119
+ this.driver = driver || config().driver;
120
+ this.elementCssSelector = elementCssSelector;
121
+ }
122
+ getFullCssSelector() {
123
+ return this.elementCssSelector;
124
+ }
125
+ joinRelativeCssSelectors(selectors) {
126
+ return selectors.join(" ");
127
+ }
128
+ getElement() {
129
+ return fixElementStaleError(import_selenium_webdriver.By.css(this.getFullCssSelector()), this.driver);
130
+ }
131
+ async getAttribute(attr) {
132
+ const element = await this.getElement();
133
+ return await element.getAttribute(attr);
134
+ }
135
+ async getClasses() {
136
+ return await this.getAttribute("class");
137
+ }
138
+ async getDataTestId() {
139
+ return await this.getAttribute("data-testid");
140
+ }
141
+ };
142
+ }
143
+ });
103
144
 
104
- // src/utils/waitElementIsVisible.ts
105
- var import_selenium_webdriver = require("selenium-webdriver");
145
+ // src/pageObjects/pages/AbstractPage.ts
146
+ var AbstractPage;
147
+ var init_AbstractPage = __esm({
148
+ "src/pageObjects/pages/AbstractPage.ts"() {
149
+ "use strict";
150
+ init_config();
151
+ init_AbstractElement();
152
+ AbstractPage = class extends AbstractElement {
153
+ url;
154
+ host;
155
+ constructor(driver) {
156
+ super(driver);
157
+ this.host = config().auth.host;
158
+ this.url = this.host + this.prependHash(this.path);
159
+ }
160
+ prependHash(urlPath) {
161
+ if (!urlPath.startsWith("/#")) {
162
+ return `/#${urlPath}`;
163
+ }
164
+ return urlPath;
165
+ }
166
+ async goToUrl(url) {
167
+ await this.driver.get(url);
168
+ }
169
+ get path() {
170
+ return "/#";
171
+ }
172
+ async locate() {
173
+ await this.goToUrl(this.url);
174
+ }
175
+ async reloadPage() {
176
+ await this.driver.navigate().refresh();
177
+ }
178
+ };
179
+ }
180
+ });
106
181
 
107
182
  // src/utils/wait.ts
108
183
  async function wait(condition, driver, errorMessage, timeout) {
109
184
  driver = driver ?? config().driver;
110
185
  await driver.wait(condition, timeout ?? config().timeout, errorMessage);
111
186
  }
187
+ var init_wait = __esm({
188
+ "src/utils/wait.ts"() {
189
+ "use strict";
190
+ init_config();
191
+ }
192
+ });
112
193
 
113
194
  // src/utils/waitElementIsVisible.ts
114
195
  async function waitElementIsVisible({
@@ -118,205 +199,81 @@ async function waitElementIsVisible({
118
199
  driver
119
200
  }) {
120
201
  driver = driver ?? config().driver;
121
- const condition = import_selenium_webdriver.until.elementIsVisible(element);
202
+ const condition = import_selenium_webdriver2.until.elementIsVisible(element);
122
203
  await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
123
204
  }
124
-
125
- // src/pageObjects/AbstractElement.ts
126
- var AbstractElement = class {
127
- driver;
128
- elementCssSelector;
129
- constructor(driver, elementCssSelector) {
130
- this.driver = driver || config().driver;
131
- this.elementCssSelector = elementCssSelector;
132
- }
133
- getFullCssSelector() {
134
- return this.elementCssSelector;
135
- }
136
- joinRelativeCssSelectors(selectors) {
137
- return selectors.join(" ");
138
- }
139
- async getElement() {
140
- return this.driver.findElement(import_selenium_webdriver2.By.css(this.getFullCssSelector()));
141
- }
142
- async getAttribute(attr) {
143
- const element = await this.getElement();
144
- await waitElementIsVisible({
145
- element,
146
- driver: this.driver,
147
- errorMessage: `Element not found: ${this.getFullCssSelector()}`
148
- });
149
- return await element.getAttribute(attr);
150
- }
151
- async getClasses() {
152
- return await this.getAttribute("class");
205
+ var import_selenium_webdriver2;
206
+ var init_waitElementIsVisible = __esm({
207
+ "src/utils/waitElementIsVisible.ts"() {
208
+ "use strict";
209
+ import_selenium_webdriver2 = require("selenium-webdriver");
210
+ init_config();
211
+ init_wait();
153
212
  }
154
- async getDataTestId() {
155
- return await this.getAttribute("data-testid");
156
- }
157
- };
158
-
159
- // src/pageObjects/pages/AbstractPage.ts
160
- var AbstractPage = class extends AbstractElement {
161
- url;
162
- host;
163
- constructor(driver) {
164
- super(driver);
165
- this.host = config().auth.host;
166
- this.url = this.host + this.prependHash(this.path);
167
- }
168
- prependHash(urlPath) {
169
- if (!urlPath.startsWith("/#")) {
170
- return `/#${urlPath}`;
171
- }
172
- return urlPath;
173
- }
174
- async goToUrl(url) {
175
- await this.driver.get(url);
176
- }
177
- get path() {
178
- return "/#";
179
- }
180
- async locate() {
181
- await this.goToUrl(this.url);
182
- }
183
- async reloadPage() {
184
- await this.driver.navigate().refresh();
185
- }
186
- };
213
+ });
187
214
 
188
215
  // src/utils/actions.ts
189
- var click = async (webElement, driver) => {
190
- driver = driver ?? config().driver;
191
- if (!await webElement.isDisplayed()) {
192
- await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
216
+ var click;
217
+ var init_actions = __esm({
218
+ "src/utils/actions.ts"() {
219
+ "use strict";
220
+ init_config();
221
+ click = async (webElement, driver) => {
222
+ driver = driver ?? config().driver;
223
+ if (!await webElement.isDisplayed()) {
224
+ await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
225
+ }
226
+ const actions = driver.actions({ async: true });
227
+ await actions.move({ origin: webElement }).click().perform();
228
+ };
193
229
  }
194
- const actions = driver.actions({ async: true });
195
- await actions.move({ origin: webElement }).click().perform();
196
- };
230
+ });
197
231
 
198
232
  // src/utils/locators.ts
199
- var import_selenium_webdriver3 = require("selenium-webdriver");
200
- var byTestIdCssSelector = (testId, element = "div") => {
201
- return `${element}[data-testid="${testId}"]`;
202
- };
203
- var byTestId = (testId, element = "div") => {
204
- return import_selenium_webdriver3.By.css(byTestIdCssSelector(testId, element));
205
- };
206
- var readonlyLocator = "readonly";
207
-
208
- // src/pageObjects/pages/LoginPage.ts
209
- var LOGIN_PATH = "/login";
210
- var LoginPage = class extends AbstractPage {
211
- usernameField = byTestId("loginField", "input");
212
- passwordField = byTestId("passwordField", "input");
213
- loginButton = byTestId("loginButton");
214
- async locate() {
215
- await super.locate();
216
- const login = await this.driver.findElement(this.usernameField);
217
- await waitElementIsVisible({
218
- element: login,
219
- driver: this.driver
220
- });
221
- }
222
- get path() {
223
- return LOGIN_PATH;
224
- }
225
- async enterUsername(username) {
226
- await this.driver.findElement(this.usernameField).sendKeys(username);
227
- }
228
- async enterPassword(password) {
229
- await this.driver.findElement(this.passwordField).sendKeys(password);
230
- }
231
- async clickLoginButton() {
232
- await click(await this.driver.findElement(this.loginButton), this.driver);
233
- }
234
- async loginWith(username, password) {
235
- await this.enterUsername(username);
236
- await this.enterPassword(password);
237
- await this.clickLoginButton();
238
- }
239
- async authorize() {
240
- await this.loginWith(config().auth.login, config().auth.password);
233
+ var import_selenium_webdriver3, byTestIdCssSelector, byTestId, readonlyLocator;
234
+ var init_locators = __esm({
235
+ "src/utils/locators.ts"() {
236
+ "use strict";
237
+ import_selenium_webdriver3 = require("selenium-webdriver");
238
+ byTestIdCssSelector = (testId, element = "div") => {
239
+ return `${element}[data-testid="${testId}"]`;
240
+ };
241
+ byTestId = (testId, element = "div") => {
242
+ return import_selenium_webdriver3.By.css(byTestIdCssSelector(testId, element));
243
+ };
244
+ readonlyLocator = "readonly";
241
245
  }
242
- };
243
-
244
- // src/utils/createDriver.ts
245
- var import_selenium_webdriver4 = require("selenium-webdriver");
246
- var createDriver = async (browser) => {
247
- const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
248
- const manage = driver.manage();
249
- await manage.setTimeouts({ implicit: config().timeout });
250
- await manage.window().maximize();
251
- return driver;
252
- };
253
-
254
- // src/utils/elementIsNotPresent.ts
255
- var import_selenium_webdriver5 = require("selenium-webdriver");
256
- var elementIsNotPresent = function elementIsNotPresent2(locator) {
257
- return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
258
- const elements = await driver.findElements(locator);
259
- return elements.length == 0;
260
- });
261
- };
262
-
263
- // src/utils/signIn.ts
264
- async function signIn(driver) {
265
- const webDriver = driver ?? await createDriver();
266
- config().driver = webDriver;
267
- const loginPage = new LoginPage(webDriver);
268
- await loginPage.locate();
269
- await loginPage.authorize();
270
- return webDriver;
271
- }
246
+ });
272
247
 
273
248
  // src/pageObjects/AbstractElementWithParent.ts
274
- var AbstractElementWithParent = class extends AbstractElement {
275
- parentCssSelector;
276
- constructor(parentCssSelector, elementCssSelector, driver) {
277
- super(driver, elementCssSelector);
278
- this.parentCssSelector = parentCssSelector;
279
- }
280
- getFullCssSelector() {
281
- if (!this.elementCssSelector) {
282
- return this.parentCssSelector;
283
- }
284
- if (!this.parentCssSelector) {
285
- return this.elementCssSelector;
286
- }
287
- return `${this.parentCssSelector} ${this.elementCssSelector}`;
288
- }
289
- async isReadonly() {
290
- const fieldEl = await this.getElement();
291
- const classSting = await fieldEl.getAttribute("class");
292
- return classSting.includes(readonlyLocator);
293
- }
294
- };
295
-
296
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
297
- var import_selenium_webdriver6 = require("selenium-webdriver");
298
- var SubsystemsPanelHeader = class extends AbstractElementWithParent {
299
- async title() {
300
- return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
301
- }
302
- };
303
-
304
- // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
305
- var SubsystemsPanel = class extends AbstractElement {
306
- header;
307
- constructor(driver) {
308
- super(driver);
309
- this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
310
- }
311
- async headerTitle() {
312
- const title = await this.header.title();
313
- await wait(async () => await title.getText() != "", this.driver);
314
- return title.getText();
249
+ var AbstractElementWithParent;
250
+ var init_AbstractElementWithParent = __esm({
251
+ "src/pageObjects/AbstractElementWithParent.ts"() {
252
+ "use strict";
253
+ init_AbstractElement();
254
+ init_locators();
255
+ AbstractElementWithParent = class extends AbstractElement {
256
+ parentCssSelector;
257
+ constructor(parentCssSelector, elementCssSelector, driver) {
258
+ super(driver, elementCssSelector);
259
+ this.parentCssSelector = parentCssSelector;
260
+ }
261
+ getFullCssSelector() {
262
+ if (!this.elementCssSelector) {
263
+ return this.parentCssSelector;
264
+ }
265
+ if (!this.parentCssSelector) {
266
+ return this.elementCssSelector;
267
+ }
268
+ return `${this.parentCssSelector} ${this.elementCssSelector}`;
269
+ }
270
+ async isReadonly() {
271
+ const classSting = await this.getClasses();
272
+ return classSting.includes(readonlyLocator);
273
+ }
274
+ };
315
275
  }
316
- };
317
-
318
- // src/pageObjects/elements/Forms/AbstractForm.ts
319
- var import_selenium_webdriver8 = require("selenium-webdriver");
276
+ });
320
277
 
321
278
  // src/utils/createDataTestId.ts
322
279
  function createDataTestId(formName, itemType, itemName) {
@@ -343,6 +300,11 @@ function createTableId(formName) {
343
300
  function createFormButtonTestId(formName, itemName) {
344
301
  return createDataTestId(formName, "button" /* BUTTON */, itemName);
345
302
  }
303
+ var init_createDataTestId = __esm({
304
+ "src/utils/createDataTestId.ts"() {
305
+ "use strict";
306
+ }
307
+ });
346
308
 
347
309
  // src/utils/waitElementIsClickable.ts
348
310
  async function waitElementIsClickable({
@@ -357,1487 +319,2317 @@ async function waitElementIsClickable({
357
319
  return await element.isDisplayed() && !isDisabled;
358
320
  }, driver, errorMessage, timeout ?? config().timeout);
359
321
  }
322
+ var init_waitElementIsClickable = __esm({
323
+ "src/utils/waitElementIsClickable.ts"() {
324
+ "use strict";
325
+ init_config();
326
+ init_wait();
327
+ }
328
+ });
360
329
 
361
330
  // src/pageObjects/elements/TableToolbar/AbstractButton.ts
362
- var AbstractButton = class extends AbstractElementWithParent {
363
- constructor(parentCssSelector, elementCssSelector, driver) {
364
- super(parentCssSelector, elementCssSelector, driver);
365
- }
366
- async click() {
367
- const button = await this.getElement();
368
- await waitElementIsClickable({
369
- element: button,
370
- errorMessage: this.buttonNotDisplayedError(),
371
- driver: this.driver
372
- });
373
- await click(button, this.driver);
374
- }
375
- async isDisabled() {
376
- const button = await this.getElement();
377
- return await button.getCssValue("pointer-events") === "none";
331
+ var AbstractButton;
332
+ var init_AbstractButton = __esm({
333
+ "src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
334
+ "use strict";
335
+ init_AbstractElementWithParent();
336
+ init_actions();
337
+ init_waitElementIsClickable();
338
+ AbstractButton = class extends AbstractElementWithParent {
339
+ constructor(parentCssSelector, elementCssSelector, driver) {
340
+ super(parentCssSelector, elementCssSelector, driver);
341
+ }
342
+ async click() {
343
+ const button = await this.getElement();
344
+ await waitElementIsClickable({
345
+ element: button,
346
+ errorMessage: this.buttonNotDisplayedError(),
347
+ driver: this.driver
348
+ });
349
+ await click(button, this.driver);
350
+ }
351
+ async isDisabled() {
352
+ const button = await this.getElement();
353
+ return await button.getCssValue("pointer-events") === "none";
354
+ }
355
+ };
378
356
  }
379
- };
357
+ });
380
358
 
381
359
  // src/pageObjects/elements/DXComponents/DXButton.ts
382
- var import_selenium_webdriver7 = require("selenium-webdriver");
383
- var DXButton = class extends AbstractButton {
384
- async getText() {
385
- const classes = await this.getClasses();
386
- if (!classes.includes("dx-button-has-text")) {
387
- return null;
388
- }
389
- const el = await this.getElement();
390
- const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
391
- return await textEl.getText();
360
+ var import_selenium_webdriver7, DXButton;
361
+ var init_DXButton = __esm({
362
+ "src/pageObjects/elements/DXComponents/DXButton.ts"() {
363
+ "use strict";
364
+ init_AbstractButton();
365
+ import_selenium_webdriver7 = require("selenium-webdriver");
366
+ DXButton = class extends AbstractButton {
367
+ async getText() {
368
+ const classes = await this.getClasses();
369
+ if (!classes.includes("dx-button-has-text")) {
370
+ return null;
371
+ }
372
+ const el = await this.getElement();
373
+ const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
374
+ return await textEl.getText();
375
+ }
376
+ };
392
377
  }
393
- };
378
+ });
394
379
 
395
380
  // src/pageObjects/elements/FormButton.ts
396
- var FormButton = class extends DXButton {
397
- name;
398
- constructor(parentCssSelector, formName, name, driver) {
399
- super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
400
- this.name = name;
401
- }
402
- buttonNotDisplayedError() {
403
- return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
381
+ var FormButton;
382
+ var init_FormButton = __esm({
383
+ "src/pageObjects/elements/FormButton.ts"() {
384
+ "use strict";
385
+ init_locators();
386
+ init_createDataTestId();
387
+ init_DXButton();
388
+ FormButton = class extends DXButton {
389
+ name;
390
+ constructor(parentCssSelector, formName, name, driver) {
391
+ super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
392
+ this.name = name;
393
+ }
394
+ buttonNotDisplayedError() {
395
+ return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
396
+ }
397
+ };
404
398
  }
405
- };
399
+ });
406
400
 
407
- // src/pageObjects/elements/Forms/AbstractForm.ts
408
- var AbstractForm = class extends AbstractPage {
409
- containerCssSelector = "";
410
- containerBy;
411
- popupContainerCssSelector;
412
- constructor(driver) {
413
- super(driver);
414
- const testId = `form-content-wrapper-${this.formName}`;
415
- this.containerBy = byTestId(testId);
416
- this.containerCssSelector = byTestIdCssSelector(testId);
417
- }
418
- async isModal() {
419
- const el = await this.getContainerElement();
420
- const value = await el.getAttribute("data-ismodal");
421
- return value === "true";
422
- }
423
- getContainerElement = () => {
424
- return this.driver.findElement(this.containerBy);
425
- };
426
- get formName() {
427
- return "";
428
- }
429
- /**
430
- * Возвращает true если форма есть в DOM
431
- * @example
432
- * class MyForm extends FormEdit {}
433
- * //...
434
- * const formEdit = new MyForm();
435
- * expect(await formEdit.exists()).toBe(true);
436
- */
437
- async exists() {
438
- try {
439
- let elements = await this.driver.findElements(this.containerBy);
440
- return elements.length > 0;
441
- } catch (error) {
442
- return false;
443
- }
444
- }
445
- /**
446
- * Получение заголовка на формы
447
- * @example
448
- * const listForm = new MyForm();
449
- * //...
450
- * expect(await listForm.getTitleText()).toBe('MyFormTitle');
451
- */
452
- async getTitleText() {
453
- if (await this.isModal()) {
454
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver8.By.css(`${this.popupContainerCssSelector} .popup-title`));
455
- return titleEl2.getText();
456
- }
457
- let titleEl = await this.driver.findElement(import_selenium_webdriver8.By.className("main-toolbar-form-title"));
458
- return titleEl.getText();
459
- }
460
- button(name) {
461
- return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
401
+ // src/pageObjects/AbstractFormElement.ts
402
+ var AbstractFormElement;
403
+ var init_AbstractFormElement = __esm({
404
+ "src/pageObjects/AbstractFormElement.ts"() {
405
+ "use strict";
406
+ init_AbstractElementWithParent();
407
+ AbstractFormElement = class extends AbstractElementWithParent {
408
+ constructor(parentCssSelector, elementCssSelector, driver) {
409
+ super(parentCssSelector, elementCssSelector, driver);
410
+ }
411
+ };
462
412
  }
463
- };
464
-
465
- // src/pageObjects/elements/Forms/FormEdit.ts
466
- var import_selenium_webdriver17 = require("selenium-webdriver");
467
-
468
- // src/pageObjects/elements/Editors/AbstractEditor.ts
469
- var import_selenium_webdriver9 = require("selenium-webdriver");
413
+ });
470
414
 
471
- // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
472
- var InputClearStrategy = class {
473
- async clear(editor) {
474
- const inputEl = await editor.getInputElement();
475
- await inputEl.clear();
415
+ // src/pageObjects/elements/Groups/AbstractGroup.ts
416
+ var AbstractGroup;
417
+ var init_AbstractGroup = __esm({
418
+ "src/pageObjects/elements/Groups/AbstractGroup.ts"() {
419
+ "use strict";
420
+ init_AbstractElementWithParent();
421
+ AbstractGroup = class extends AbstractElementWithParent {
422
+ async isDisplayed() {
423
+ const groupElement = await this.getElement();
424
+ return await groupElement.isDisplayed();
425
+ }
426
+ };
476
427
  }
477
- };
428
+ });
478
429
 
479
- // src/pageObjects/elements/Editors/AbstractEditor.ts
480
- var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
481
- clearStrategy = new InputClearStrategy();
482
- setClearStrategy(strategy) {
483
- this.clearStrategy = strategy;
430
+ // src/pageObjects/elements/Groups/Panel.ts
431
+ var Panel;
432
+ var init_Panel = __esm({
433
+ "src/pageObjects/elements/Groups/Panel.ts"() {
434
+ "use strict";
435
+ init_AbstractGroup();
436
+ Panel = class extends AbstractGroup {
437
+ };
438
+ }
439
+ });
440
+
441
+ // src/pageObjects/elements/Groups/TabPanel.ts
442
+ var TabPanelItem, TabPanel;
443
+ var init_TabPanel = __esm({
444
+ "src/pageObjects/elements/Groups/TabPanel.ts"() {
445
+ "use strict";
446
+ init_AbstractGroup();
447
+ init_actions();
448
+ TabPanelItem = class extends AbstractGroup {
449
+ constructor(parentCssSelector, elementCssSelector, driver) {
450
+ super(parentCssSelector, elementCssSelector, driver);
451
+ }
452
+ async click() {
453
+ await click(await this.getElement(), this.driver);
454
+ }
455
+ async getTitle() {
456
+ return "";
457
+ }
458
+ };
459
+ TabPanel = class extends AbstractGroup {
460
+ item(name) {
461
+ return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
462
+ }
463
+ async getTitle() {
464
+ return "";
465
+ }
466
+ };
484
467
  }
485
- getInputCssSelector() {
486
- return `${this.getFullCssSelector()} .dx-texteditor-input`;
468
+ });
469
+
470
+ // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
471
+ var import_selenium_webdriver8, ACCORDION_TITLE_CONTAINER, AccordionItem;
472
+ var init_AccordionItem = __esm({
473
+ "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
474
+ "use strict";
475
+ init_AbstractGroup();
476
+ import_selenium_webdriver8 = require("selenium-webdriver");
477
+ init_actions();
478
+ ACCORDION_TITLE_CONTAINER = "accordion-title-container";
479
+ AccordionItem = class extends AbstractGroup {
480
+ constructor(parentCssSelector, elementCssSelector, driver) {
481
+ super(parentCssSelector, elementCssSelector, driver);
482
+ }
483
+ async getDataOpenedAccordItemAttr() {
484
+ const accordionElement = await this.getElement();
485
+ return await accordionElement.getAttribute("data-opened");
486
+ }
487
+ async clickAccordionItemTitle() {
488
+ const accordionElement = await this.getElement();
489
+ const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver8.By.className(ACCORDION_TITLE_CONTAINER));
490
+ await accordTitleElement.click();
491
+ }
492
+ async click() {
493
+ await click(await this.getElement(), this.driver);
494
+ }
495
+ async isExpanded() {
496
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
497
+ return dataOpened === "true";
498
+ }
499
+ async isCollapsed() {
500
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
501
+ return dataOpened === "false" || !dataOpened;
502
+ }
503
+ async expand() {
504
+ if (!await this.isExpanded()) {
505
+ await this.clickAccordionItemTitle();
506
+ }
507
+ }
508
+ async collapse() {
509
+ if (await this.isExpanded()) {
510
+ await this.clickAccordionItemTitle();
511
+ }
512
+ }
513
+ };
487
514
  }
488
- async getInputElement() {
489
- return this.driver.findElement(import_selenium_webdriver9.By.css(this.getInputCssSelector()));
515
+ });
516
+
517
+ // src/pageObjects/elements/Groups/Accordion/Accordion.ts
518
+ var Accordion;
519
+ var init_Accordion = __esm({
520
+ "src/pageObjects/elements/Groups/Accordion/Accordion.ts"() {
521
+ "use strict";
522
+ init_AbstractGroup();
523
+ init_AccordionItem();
524
+ Accordion = class extends AbstractGroup {
525
+ constructor(parentCssSelector, elementCssSelector, driver) {
526
+ super(parentCssSelector, elementCssSelector, driver);
527
+ }
528
+ item(name) {
529
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
530
+ }
531
+ };
490
532
  }
491
- async getInputValue() {
492
- const inputEl = await this.getInputElement();
493
- return inputEl.getAttribute("value");
533
+ });
534
+
535
+ // src/pageObjects/elements/Groups/groupFactory.ts
536
+ var groupFactory;
537
+ var init_groupFactory = __esm({
538
+ "src/pageObjects/elements/Groups/groupFactory.ts"() {
539
+ "use strict";
540
+ init_AbstractFormElement();
541
+ init_Panel();
542
+ init_TabPanel();
543
+ init_Accordion();
544
+ init_AccordionItem();
545
+ groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
546
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
547
+ const classSting = await elementInstance.getClasses();
548
+ if (classSting.includes("tab-panel-group"))
549
+ return new TabPanel(parentCssSelector, elementCssSelector, driver);
550
+ if (classSting.includes("tab-panel-item"))
551
+ return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
552
+ if (classSting.includes("panel-group"))
553
+ return new Panel(parentCssSelector, elementCssSelector, driver);
554
+ if (classSting.includes("accordion-group"))
555
+ return new Accordion(parentCssSelector, elementCssSelector, driver);
556
+ if (classSting.includes("d5-accordion-item"))
557
+ return new AccordionItem(parentCssSelector, elementCssSelector, driver);
558
+ throw new Error("Unknown type of group. Please write ticket to the support");
559
+ };
494
560
  }
495
- async setInputValue(value) {
496
- const inputEl = await this.getInputElement();
497
- await click(inputEl, this.driver);
498
- await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
561
+ });
562
+
563
+ // src/pageObjects/elements/FormGroup.ts
564
+ var FormGroup;
565
+ var init_FormGroup = __esm({
566
+ "src/pageObjects/elements/FormGroup.ts"() {
567
+ "use strict";
568
+ init_AbstractElementWithParent();
569
+ init_locators();
570
+ init_createDataTestId();
571
+ init_groupFactory();
572
+ init_AccordionItem();
573
+ FormGroup = class extends AbstractElementWithParent {
574
+ groupInstance;
575
+ constructor(parentCssSelector, formName, name, driver) {
576
+ super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
577
+ }
578
+ async initInstance() {
579
+ if (!this.groupInstance) {
580
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
581
+ }
582
+ }
583
+ /**
584
+ * Возвращает булевое значение доступна ли группа
585
+ * @example
586
+ * expect(await tableList.group('MainSuperPanel').isDisplayed();
587
+ */
588
+ async isDisplayed() {
589
+ try {
590
+ await this.initInstance();
591
+ return this.groupInstance.isDisplayed();
592
+ } catch {
593
+ return false;
594
+ }
595
+ }
596
+ /**
597
+ * Клик по элементам группы.
598
+ * Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
599
+ * @example
600
+ * expect(await tableList.group('TabPanel').itemClick('Tab');
601
+ * expect(await tableList.group('Accordion').itemClick('AccordionItem');
602
+ */
603
+ async itemClick(name) {
604
+ await this.initInstance();
605
+ const item = this.groupInstance.item?.(name);
606
+ await item?.click();
607
+ }
608
+ /**
609
+ * Метод работает если группа - это элемент аккордеона или вкладка таб панели
610
+ * @example
611
+ * expect(await tableList.group('Tab').click();
612
+ * expect(await tableList.group('AccordionItem').click();
613
+ */
614
+ async click() {
615
+ await this.initInstance();
616
+ await this.groupInstance.click?.();
617
+ }
618
+ async collapse() {
619
+ await this.initInstance();
620
+ if (this.groupInstance instanceof AccordionItem) {
621
+ await this.groupInstance.collapse();
622
+ }
623
+ }
624
+ async expand() {
625
+ await this.initInstance();
626
+ if (this.groupInstance instanceof AccordionItem) {
627
+ await this.groupInstance.expand();
628
+ }
629
+ }
630
+ async isExpanded() {
631
+ await this.initInstance();
632
+ if (this.groupInstance instanceof AccordionItem) {
633
+ return await this.groupInstance.isExpanded();
634
+ }
635
+ return false;
636
+ }
637
+ async isCollapsed() {
638
+ await this.initInstance();
639
+ if (this.groupInstance instanceof AccordionItem) {
640
+ return await this.groupInstance.isCollapsed();
641
+ }
642
+ return false;
643
+ }
644
+ };
499
645
  }
500
- async clear() {
501
- await this.clearStrategy.clear(this);
646
+ });
647
+
648
+ // src/pageObjects/elements/Forms/AbstractForm.ts
649
+ var AbstractForm;
650
+ var init_AbstractForm = __esm({
651
+ "src/pageObjects/elements/Forms/AbstractForm.ts"() {
652
+ "use strict";
653
+ init_AbstractPage();
654
+ init_FormButton();
655
+ init_FormGroup();
656
+ AbstractForm = class extends AbstractPage {
657
+ containerCssSelector = "";
658
+ _formName = "";
659
+ containerBy;
660
+ getContainerElement = () => {
661
+ return this.driver.findElement(this.containerBy);
662
+ };
663
+ set formName(name) {
664
+ this._formName = name;
665
+ }
666
+ get formName() {
667
+ return this._formName;
668
+ }
669
+ /**
670
+ * Возвращает true если форма есть в DOM
671
+ * @example
672
+ * class MyForm extends FormEdit {}
673
+ * //...
674
+ * const formEdit = new MyForm();
675
+ * expect(await formEdit.exists()).toBe(true);
676
+ */
677
+ async exists() {
678
+ try {
679
+ let elements = await this.driver.findElements(this.containerBy);
680
+ return elements.length > 0;
681
+ } catch (error) {
682
+ return false;
683
+ }
684
+ }
685
+ button(name) {
686
+ return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
687
+ }
688
+ /**
689
+ * Находит группу на форме по имени
690
+ * @example
691
+ * const formEdit = new MyForm();
692
+ * //...
693
+ * expect(await formEdit.group('Name');
694
+ */
695
+ group(name) {
696
+ return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
697
+ }
698
+ };
502
699
  }
503
- };
700
+ });
504
701
 
505
- // src/pageObjects/elements/Editors/TextEditor.ts
506
- var TextEditor = class extends AbstractDXEditorWithInput {
507
- constructor(parentCssSelector, elementCssSelector, driver) {
508
- super(parentCssSelector, elementCssSelector, driver);
509
- this.setClearStrategy(new InputClearStrategy());
702
+ // src/pageObjects/elements/Forms/types.ts
703
+ var init_types = __esm({
704
+ "src/pageObjects/elements/Forms/types.ts"() {
705
+ "use strict";
510
706
  }
511
- getValue() {
512
- return this.getInputValue();
707
+ });
708
+
709
+ // src/pageObjects/elements/Table/utils.ts
710
+ function getCssRowByIndexSelector(index) {
711
+ return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
712
+ }
713
+ function getCssCellByIndexSelector(index) {
714
+ return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
715
+ }
716
+ var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
717
+ var init_utils = __esm({
718
+ "src/pageObjects/elements/Table/utils.ts"() {
719
+ "use strict";
720
+ import_selenium_webdriver9 = require("selenium-webdriver");
721
+ getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
722
+ getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
723
+ getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
724
+ transformInputIndex = (index) => index + 1;
725
+ transformOutputIndex = (index) => +index - 1;
513
726
  }
514
- setValue(value) {
515
- return this.setInputValue(value);
727
+ });
728
+
729
+ // src/pageObjects/elements/Table/types.ts
730
+ var init_types2 = __esm({
731
+ "src/pageObjects/elements/Table/types.ts"() {
732
+ "use strict";
516
733
  }
517
- };
734
+ });
518
735
 
519
- // src/pageObjects/elements/Editors/NumberEditor.ts
520
- var NumberEditor = class extends AbstractDXEditorWithInput {
521
- constructor(parentCssSelector, elementCssSelector, driver) {
522
- super(parentCssSelector, elementCssSelector, driver);
523
- this.setClearStrategy(new InputClearStrategy());
736
+ // src/pageObjects/elements/Table/elements/Cell.ts
737
+ var import_selenium_webdriver10, Cell;
738
+ var init_Cell = __esm({
739
+ "src/pageObjects/elements/Table/elements/Cell.ts"() {
740
+ "use strict";
741
+ import_selenium_webdriver10 = require("selenium-webdriver");
742
+ init_AbstractElementWithParent();
743
+ init_utils();
744
+ init_types2();
745
+ Cell = class extends AbstractElementWithParent {
746
+ _index;
747
+ getCellIndex;
748
+ constructor(parentCssSelector, getCellIndex, index, driver) {
749
+ super(parentCssSelector, getCssCellByIndexSelector(index), driver);
750
+ this.getCellIndex = getCellIndex;
751
+ this._index = index;
752
+ }
753
+ set index(index) {
754
+ this._index = index;
755
+ this.elementCssSelector = getCssCellByIndexSelector(index);
756
+ }
757
+ async getBooleanValue(cellEl) {
758
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver10.By.className("boolean-widget"));
759
+ return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
760
+ }
761
+ async getTagsValue(cellEl) {
762
+ const tagsCssSelector = ".multiselect-container .multiselect-cell";
763
+ const tags = await cellEl.findElements(import_selenium_webdriver10.By.css(tagsCssSelector));
764
+ const values = [];
765
+ for (const tag of tags) {
766
+ values.push(await tag.getAttribute("textContent"));
767
+ }
768
+ return values;
769
+ }
770
+ async getElement() {
771
+ if (this._index == null) {
772
+ this.index = await this.getCellIndex();
773
+ }
774
+ return super.getElement();
775
+ }
776
+ async getValue() {
777
+ const cellEl = await this.getElement();
778
+ const cellElClass = await cellEl.getAttribute("class");
779
+ if (cellElClass.includes("boolean-column" /* Boolean */))
780
+ return this.getBooleanValue(cellEl);
781
+ if (cellElClass.includes("tags-column" /* Tags */))
782
+ return this.getTagsValue(cellEl);
783
+ return cellEl.getText();
784
+ }
785
+ getIndex() {
786
+ return this._index;
787
+ }
788
+ };
524
789
  }
525
- async getValue() {
526
- const value = await super.getInputValue();
527
- return value == "" ? null : Number.parseFloat(value);
790
+ });
791
+
792
+ // src/pageObjects/elements/Table/elements/Row.ts
793
+ var import_selenium_webdriver11, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
794
+ var init_Row = __esm({
795
+ "src/pageObjects/elements/Table/elements/Row.ts"() {
796
+ "use strict";
797
+ import_selenium_webdriver11 = require("selenium-webdriver");
798
+ init_Cell();
799
+ init_utils();
800
+ init_AbstractElementWithParent();
801
+ init_actions();
802
+ init_wait();
803
+ DX_SELECTION_CLASS = "dx-selection";
804
+ DX_ROW_EDIT_CLASS = "dx-edit-row";
805
+ DX_DATA_ROW_CLASS = "dx-data-row";
806
+ Row = class extends AbstractElementWithParent {
807
+ index;
808
+ getColumnBy;
809
+ constructor(parentCssSelector, index, driver, getColumnBy) {
810
+ super(parentCssSelector, getCssRowByIndexSelector(index), driver);
811
+ this.index = index;
812
+ this.getColumnBy = getColumnBy;
813
+ }
814
+ _getCell({ index, name, title }) {
815
+ return new Cell(
816
+ this.getFullCssSelector(),
817
+ () => {
818
+ return this.getColumnBy({ title, name }).getIndex();
819
+ },
820
+ index,
821
+ this.driver
822
+ );
823
+ }
824
+ getCellByIndex(index) {
825
+ return this._getCell({ index });
826
+ }
827
+ getCell(name) {
828
+ return this._getCell({ name });
829
+ }
830
+ getCellByTitle(title) {
831
+ return this._getCell({ title });
832
+ }
833
+ async select() {
834
+ const rowEl = await this.getElement();
835
+ await click(rowEl, this.driver);
836
+ await wait(
837
+ async () => {
838
+ const classes = await this.getClasses();
839
+ return classes.includes(DX_SELECTION_CLASS);
840
+ },
841
+ this.driver,
842
+ "Cannot select row"
843
+ );
844
+ }
845
+ async isSelected() {
846
+ const result = await this.getAttribute("aria-selected");
847
+ return result === "true";
848
+ }
849
+ getIndex() {
850
+ return this.index;
851
+ }
852
+ async getCells() {
853
+ const cells = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
854
+ const result = [];
855
+ cells.forEach((_, index) => {
856
+ const newCell = this.getCellByIndex(index);
857
+ result.push(newCell);
858
+ });
859
+ return result;
860
+ }
861
+ async clickInlineButton(buttonClass) {
862
+ const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
863
+ const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
864
+ this.index
865
+ )}"] .${buttonClass}`;
866
+ const button = await this.driver.findElement(
867
+ import_selenium_webdriver11.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
868
+ );
869
+ return click(button, this.driver);
870
+ }
871
+ async checkEditingMode(isEditing, msg) {
872
+ await wait(
873
+ async () => {
874
+ return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
875
+ },
876
+ this.driver,
877
+ msg
878
+ );
879
+ }
880
+ async edit() {
881
+ await this.clickInlineButton("edit");
882
+ await this.checkEditingMode(true, "Row did not switch to edit mode");
883
+ }
884
+ async save() {
885
+ await this.clickInlineButton("save");
886
+ await this.checkEditingMode(false, "Row did not saved");
887
+ }
888
+ async cancel() {
889
+ await this.clickInlineButton("cancel");
890
+ await this.checkEditingMode(false, "Row did not switch to normal mode");
891
+ }
892
+ };
528
893
  }
529
- setValue(value) {
530
- return this.setInputValue(value);
894
+ });
895
+
896
+ // src/pageObjects/elements/Table/elements/Column.ts
897
+ var import_selenium_webdriver12, Column;
898
+ var init_Column = __esm({
899
+ "src/pageObjects/elements/Table/elements/Column.ts"() {
900
+ "use strict";
901
+ import_selenium_webdriver12 = require("selenium-webdriver");
902
+ init_utils();
903
+ init_AbstractElementWithParent();
904
+ init_fixElementStaleError();
905
+ Column = class extends AbstractElementWithParent {
906
+ _index;
907
+ _caption;
908
+ _name;
909
+ headerCssSelector;
910
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
911
+ super(parentCssSelector, "", driver);
912
+ this._name = name;
913
+ this.index = index;
914
+ this._caption = caption;
915
+ this.headerCssSelector = headerCssSelector;
916
+ }
917
+ set index(index) {
918
+ this._index = index;
919
+ this.elementCssSelector = getColumnByIndexCssSelector(index);
920
+ }
921
+ get index() {
922
+ return this._index;
923
+ }
924
+ async getElement() {
925
+ await this.getIndex();
926
+ return super.getElement();
927
+ }
928
+ async getColumnHeaderIndexBy(cssSelector) {
929
+ const column = await fixElementStaleError(import_selenium_webdriver12.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
930
+ return transformOutputIndex(await column.getAttribute("aria-colindex"));
931
+ }
932
+ async getIndexByCaption() {
933
+ return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
934
+ }
935
+ async getIndexByName() {
936
+ return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
937
+ }
938
+ async caption() {
939
+ const el = await this.getElement();
940
+ return el.getText();
941
+ }
942
+ async getIndex() {
943
+ if (this.index != null) {
944
+ return this.index;
945
+ }
946
+ if (this._caption != null) {
947
+ this.index = await this.getIndexByCaption();
948
+ return this.index;
949
+ }
950
+ if (this._name != null) {
951
+ this.index = await this.getIndexByName();
952
+ return this.index;
953
+ }
954
+ throw new Error("Cant get the index in the column");
955
+ }
956
+ };
531
957
  }
532
- };
958
+ });
533
959
 
534
- // src/pageObjects/elements/Editors/types.ts
535
- var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
536
- ControlClass2["Text"] = "text-control";
537
- ControlClass2["TextArea"] = "text-area-control";
538
- ControlClass2["Number"] = "number-control";
539
- ControlClass2["CheckBox"] = "check-box";
540
- ControlClass2["Multiselect"] = "multi-select-control";
541
- ControlClass2["Select"] = "select-control";
542
- ControlClass2["Switch"] = "switch-control";
543
- ControlClass2["Date"] = "date-control";
544
- ControlClass2["SingleDateRange"] = "single-date-range-control";
545
- ControlClass2["BooleanSelector"] = "buttons-group";
546
- ControlClass2["ButtonGroup"] = "button-group-field";
547
- return ControlClass2;
548
- })(ControlClass || {});
960
+ // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
961
+ var InputClearStrategy;
962
+ var init_InputClearStrategy = __esm({
963
+ "src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
964
+ "use strict";
965
+ InputClearStrategy = class {
966
+ async clear(editor) {
967
+ const inputEl = await editor.getInputElement();
968
+ await inputEl.clear();
969
+ }
970
+ };
971
+ }
972
+ });
549
973
 
550
- // src/pageObjects/AbstractFormElement.ts
551
- var AbstractFormElement = class extends AbstractElementWithParent {
552
- constructor(parentCssSelector, elementCssSelector, driver) {
553
- super(parentCssSelector, elementCssSelector, driver);
974
+ // src/pageObjects/elements/Editors/AbstractEditor.ts
975
+ var import_selenium_webdriver13, AbstractDXEditorWithInput;
976
+ var init_AbstractEditor = __esm({
977
+ "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
978
+ "use strict";
979
+ import_selenium_webdriver13 = require("selenium-webdriver");
980
+ init_actions();
981
+ init_InputClearStrategy();
982
+ init_AbstractElementWithParent();
983
+ AbstractDXEditorWithInput = class extends AbstractElementWithParent {
984
+ clearStrategy = new InputClearStrategy();
985
+ setClearStrategy(strategy) {
986
+ this.clearStrategy = strategy;
987
+ }
988
+ getInputCssSelector() {
989
+ return `${this.getFullCssSelector()} .dx-texteditor-input`;
990
+ }
991
+ async getInputElement() {
992
+ return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
993
+ }
994
+ async getInputValue() {
995
+ const inputEl = await this.getInputElement();
996
+ return inputEl.getAttribute("value");
997
+ }
998
+ async setInputValue(value) {
999
+ const inputEl = await this.getInputElement();
1000
+ await click(inputEl, this.driver);
1001
+ await inputEl.sendKeys(value, import_selenium_webdriver13.Key.ENTER);
1002
+ }
1003
+ async clear() {
1004
+ await this.clearStrategy.clear(this);
1005
+ }
1006
+ };
554
1007
  }
555
- };
1008
+ });
556
1009
 
557
- // src/pageObjects/elements/Editors/CheckBox.ts
558
- var CheckBox = class extends AbstractElementWithParent {
559
- async getValue() {
560
- const result = await this.getAttribute("aria-checked");
561
- if (result === "true")
562
- return 1;
563
- if (result === "false")
564
- return 0;
565
- return null;
566
- }
567
- async setValue(value) {
568
- const inputEl = await this.getElement();
569
- const currentValue = await this.getValue();
570
- if (currentValue !== value) {
571
- await click(inputEl, this.driver);
572
- }
1010
+ // src/pageObjects/elements/Editors/TextEditor.ts
1011
+ var TextEditor;
1012
+ var init_TextEditor = __esm({
1013
+ "src/pageObjects/elements/Editors/TextEditor.ts"() {
1014
+ "use strict";
1015
+ init_AbstractEditor();
1016
+ init_InputClearStrategy();
1017
+ TextEditor = class extends AbstractDXEditorWithInput {
1018
+ constructor(parentCssSelector, elementCssSelector, driver) {
1019
+ super(parentCssSelector, elementCssSelector, driver);
1020
+ this.setClearStrategy(new InputClearStrategy());
1021
+ }
1022
+ getValue() {
1023
+ return this.getInputValue();
1024
+ }
1025
+ setValue(value) {
1026
+ return this.setInputValue(value);
1027
+ }
1028
+ };
573
1029
  }
574
- };
1030
+ });
575
1031
 
576
- // src/pageObjects/elements/Editors/SelectBoxEditor.ts
577
- var import_selenium_webdriver11 = require("selenium-webdriver");
1032
+ // src/pageObjects/elements/Editors/NumberEditor.ts
1033
+ var NumberEditor;
1034
+ var init_NumberEditor = __esm({
1035
+ "src/pageObjects/elements/Editors/NumberEditor.ts"() {
1036
+ "use strict";
1037
+ init_AbstractEditor();
1038
+ init_InputClearStrategy();
1039
+ NumberEditor = class extends AbstractDXEditorWithInput {
1040
+ constructor(parentCssSelector, elementCssSelector, driver) {
1041
+ super(parentCssSelector, elementCssSelector, driver);
1042
+ this.setClearStrategy(new InputClearStrategy());
1043
+ }
1044
+ async getValue() {
1045
+ const value = await super.getInputValue();
1046
+ return value == "" ? null : Number.parseFloat(value);
1047
+ }
1048
+ setValue(value) {
1049
+ return this.setInputValue(value);
1050
+ }
1051
+ };
1052
+ }
1053
+ });
1054
+
1055
+ // src/pageObjects/elements/Editors/types.ts
1056
+ var ControlClass;
1057
+ var init_types3 = __esm({
1058
+ "src/pageObjects/elements/Editors/types.ts"() {
1059
+ "use strict";
1060
+ ControlClass = /* @__PURE__ */ ((ControlClass2) => {
1061
+ ControlClass2["Text"] = "text-control";
1062
+ ControlClass2["TextArea"] = "text-area-control";
1063
+ ControlClass2["Number"] = "number-control";
1064
+ ControlClass2["CheckBox"] = "check-box";
1065
+ ControlClass2["Multiselect"] = "multi-select-control";
1066
+ ControlClass2["Select"] = "select-control";
1067
+ ControlClass2["Switch"] = "switch-control";
1068
+ ControlClass2["Date"] = "date-control";
1069
+ ControlClass2["SingleDateRange"] = "single-date-range-control";
1070
+ ControlClass2["BooleanSelector"] = "buttons-group";
1071
+ ControlClass2["ButtonGroup"] = "button-group-field";
1072
+ return ControlClass2;
1073
+ })(ControlClass || {});
1074
+ }
1075
+ });
1076
+
1077
+ // src/pageObjects/elements/Editors/CheckBox.ts
1078
+ var CheckBox;
1079
+ var init_CheckBox = __esm({
1080
+ "src/pageObjects/elements/Editors/CheckBox.ts"() {
1081
+ "use strict";
1082
+ init_actions();
1083
+ init_AbstractElementWithParent();
1084
+ CheckBox = class extends AbstractElementWithParent {
1085
+ async getValue() {
1086
+ const result = await this.getAttribute("aria-checked");
1087
+ if (result === "true")
1088
+ return 1;
1089
+ if (result === "false")
1090
+ return 0;
1091
+ return null;
1092
+ }
1093
+ async setValue(value) {
1094
+ const inputEl = await this.getElement();
1095
+ const currentValue = await this.getValue();
1096
+ if (currentValue !== value) {
1097
+ await click(inputEl, this.driver);
1098
+ }
1099
+ }
1100
+ };
1101
+ }
1102
+ });
578
1103
 
579
1104
  // src/utils/xpathHelper.ts
580
- var XPathHelper = class {
581
- static getClassAndValueXpath(cssClass, value) {
582
- return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
1105
+ var XPathHelper;
1106
+ var init_xpathHelper = __esm({
1107
+ "src/utils/xpathHelper.ts"() {
1108
+ "use strict";
1109
+ XPathHelper = class {
1110
+ static getClassAndValueXpath(cssClass, value) {
1111
+ return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
1112
+ }
1113
+ };
583
1114
  }
584
- };
1115
+ });
585
1116
 
586
1117
  // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
587
- var import_selenium_webdriver10 = require("selenium-webdriver");
588
- var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
589
- var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
590
- var ClearButtonStrategy = class {
591
- editorContainerClass;
592
- _driver;
593
- constructor(editorContainerClass, driver) {
594
- this.editorContainerClass = editorContainerClass;
595
- this._driver = driver;
596
- }
597
- async isEmptyEditorField() {
598
- const editorContainer = await this._driver.findElement(import_selenium_webdriver10.By.css(this.editorContainerClass));
599
- const classAttribute = await editorContainer.getAttribute("class");
600
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
601
- }
602
- async clear() {
603
- if (await this.isEmptyEditorField()) {
604
- throw new Error("This field is already empty");
605
- }
606
- const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
607
- const clearBtn = await this._driver.findElement(import_selenium_webdriver10.By.css(clearBtnSelector));
608
- await click(clearBtn, this._driver);
1118
+ var import_selenium_webdriver14, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
1119
+ var init_ClearButtonStrategy = __esm({
1120
+ "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
1121
+ "use strict";
1122
+ import_selenium_webdriver14 = require("selenium-webdriver");
1123
+ init_actions();
1124
+ DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
1125
+ DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
1126
+ ClearButtonStrategy = class {
1127
+ editorContainerClass;
1128
+ _driver;
1129
+ constructor(editorContainerClass, driver) {
1130
+ this.editorContainerClass = editorContainerClass;
1131
+ this._driver = driver;
1132
+ }
1133
+ async isEmptyEditorField() {
1134
+ const editorContainer = await this._driver.findElement(import_selenium_webdriver14.By.css(this.editorContainerClass));
1135
+ const classAttribute = await editorContainer.getAttribute("class");
1136
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
1137
+ }
1138
+ async clear() {
1139
+ if (await this.isEmptyEditorField()) {
1140
+ throw new Error("This field is already empty");
1141
+ }
1142
+ const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
1143
+ const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
1144
+ await click(clearBtn, this._driver);
1145
+ }
1146
+ };
609
1147
  }
610
- };
1148
+ });
611
1149
 
612
1150
  // src/pageObjects/elements/Editors/SelectBoxEditor.ts
613
- var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
614
- var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
615
- var dropDownOptionClick = async (optionValue, driver, delay = true) => {
616
- const { implicit } = await driver.manage().getTimeouts();
617
- let optElement = null;
618
- const timeout = delay ? implicit : 200;
619
- let err = null;
620
- try {
621
- await driver.manage().setTimeouts({ implicit: timeout });
622
- optElement = await driver.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(optionValue)));
623
- await click(optElement, driver);
624
- } catch (e) {
625
- err = new Error(`Item not found: "${optionValue}"`);
626
- } finally {
627
- await driver.manage().setTimeouts({ implicit });
628
- }
629
- if (err)
630
- throw err;
631
- };
632
- var SelectBoxEditor = class extends AbstractDXEditorWithInput {
633
- constructor(parentCssSelector, elementCssSelector, driver) {
634
- super(parentCssSelector, elementCssSelector, driver);
635
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
636
- }
637
- async setSelectInputValue(value) {
638
- const inputEl = await this.getInputElement();
639
- await click(inputEl, this.driver);
640
- try {
641
- await dropDownOptionClick(value, this.driver, false);
642
- } catch {
643
- await inputEl.sendKeys(value, import_selenium_webdriver11.Key.ENTER);
644
- await dropDownOptionClick(value, this.driver);
645
- }
646
- }
647
- async getValue() {
648
- const value = await super.getInputValue();
649
- return value == "" ? null : value;
650
- }
651
- setValue(value) {
652
- return this.setSelectInputValue(value);
1151
+ var import_selenium_webdriver15, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
1152
+ var init_SelectBoxEditor = __esm({
1153
+ "src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
1154
+ "use strict";
1155
+ init_AbstractEditor();
1156
+ import_selenium_webdriver15 = require("selenium-webdriver");
1157
+ init_xpathHelper();
1158
+ init_actions();
1159
+ init_ClearButtonStrategy();
1160
+ SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
1161
+ combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
1162
+ dropDownOptionClick = async (optionValue, driver, delay = true) => {
1163
+ const { implicit } = await driver.manage().getTimeouts();
1164
+ let optElement = null;
1165
+ const timeout = delay ? implicit : 200;
1166
+ let err = null;
1167
+ try {
1168
+ await driver.manage().setTimeouts({ implicit: timeout });
1169
+ optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
1170
+ await click(optElement, driver);
1171
+ } catch (e) {
1172
+ err = new Error(`Item not found: "${optionValue}"`);
1173
+ } finally {
1174
+ await driver.manage().setTimeouts({ implicit });
1175
+ }
1176
+ if (err)
1177
+ throw err;
1178
+ };
1179
+ SelectBoxEditor = class extends AbstractDXEditorWithInput {
1180
+ constructor(parentCssSelector, elementCssSelector, driver) {
1181
+ super(parentCssSelector, elementCssSelector, driver);
1182
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1183
+ }
1184
+ async setSelectInputValue(value) {
1185
+ const inputEl = await this.getInputElement();
1186
+ await click(inputEl, this.driver);
1187
+ try {
1188
+ await dropDownOptionClick(value, this.driver, false);
1189
+ } catch {
1190
+ await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
1191
+ await dropDownOptionClick(value, this.driver);
1192
+ }
1193
+ }
1194
+ async getValue() {
1195
+ const value = await super.getInputValue();
1196
+ return value == "" ? null : value;
1197
+ }
1198
+ setValue(value) {
1199
+ return this.setSelectInputValue(value);
1200
+ }
1201
+ };
653
1202
  }
654
- };
1203
+ });
655
1204
 
656
1205
  // src/pageObjects/elements/Editors/SwitchEditor.ts
657
- var SwitchEditor = class extends AbstractElementWithParent {
658
- async getValue() {
659
- const result = await this.getAttribute("aria-label");
660
- if (result === "ON")
661
- return 1;
662
- if (result === "OFF")
663
- return 0;
664
- return null;
665
- }
666
- async setValue(value) {
667
- if (value !== 0 && value !== 1) {
668
- value = value ? 1 : 0;
669
- }
670
- const inputEl = await this.getElement();
671
- const currentValue = await this.getValue();
672
- if (currentValue === value) {
673
- return;
674
- }
675
- await click(inputEl, this.driver);
676
- await wait(async () => {
677
- const updatedValue = await this.getValue();
678
- return updatedValue !== currentValue;
679
- }, this.driver);
1206
+ var SwitchEditor;
1207
+ var init_SwitchEditor = __esm({
1208
+ "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
1209
+ "use strict";
1210
+ init_actions();
1211
+ init_AbstractElementWithParent();
1212
+ init_wait();
1213
+ SwitchEditor = class extends AbstractElementWithParent {
1214
+ async getValue() {
1215
+ const result = await this.getAttribute("aria-label");
1216
+ if (result === "ON")
1217
+ return 1;
1218
+ if (result === "OFF")
1219
+ return 0;
1220
+ return null;
1221
+ }
1222
+ async setValue(value) {
1223
+ if (value !== 0 && value !== 1) {
1224
+ value = value ? 1 : 0;
1225
+ }
1226
+ const inputEl = await this.getElement();
1227
+ const currentValue = await this.getValue();
1228
+ if (currentValue === value) {
1229
+ return;
1230
+ }
1231
+ await click(inputEl, this.driver);
1232
+ await wait(async () => {
1233
+ const updatedValue = await this.getValue();
1234
+ return updatedValue !== currentValue;
1235
+ }, this.driver);
1236
+ }
1237
+ };
680
1238
  }
681
- };
1239
+ });
682
1240
 
683
1241
  // src/pageObjects/elements/Editors/TagBox.ts
684
- var import_selenium_webdriver12 = require("selenium-webdriver");
685
- var TAGS_SELECTOR = ".dx-tag .tag-text";
686
- var DX_TAG_CONTAINER = "dx-tag-container";
687
- var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
688
- var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
689
- var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
690
- var TagBox = class extends AbstractDXEditorWithInput {
691
- constructor(parentCssSelector, elementCssSelector, driver) {
692
- super(parentCssSelector, elementCssSelector, driver);
693
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
694
- }
695
- async setTagBoxInputValue(values) {
696
- const lastElement = values[values.length - 1];
697
- const inputEl = await this.getInputElement();
698
- await inputEl.click();
699
- for (const value of values) {
700
- await this.selectOption(inputEl, value, lastElement);
701
- }
702
- await this.confirmSelection();
703
- }
704
- async waitOptionSelection() {
705
- const option = await this.driver.findElement(import_selenium_webdriver12.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
706
- await wait(() => option.isDisplayed(), this.driver);
707
- }
708
- async selectOption(inputEl, value, lastElement) {
709
- try {
710
- await dropDownOptionClick(value, this.driver, false);
711
- } catch {
712
- await inputEl.sendKeys(value);
713
- await dropDownOptionClick(value, this.driver);
714
- }
715
- await this.waitOptionSelection();
716
- if (value !== lastElement) {
717
- await inputEl.clear();
718
- }
719
- }
720
- async confirmSelection() {
721
- const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(BTN_OK_SELECTOR));
722
- await click(btnOk, this.driver);
723
- }
724
- async getTagBoxInputValue() {
725
- if (await this.isTagBoxEmpty()) {
726
- return [];
727
- }
728
- const tags = await this.driver.findElements(
729
- import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
730
- );
731
- const values = [];
732
- for (const tag of tags) {
733
- values.push(await tag.getAttribute("textContent"));
734
- }
735
- return values;
736
- }
737
- async isTagBoxEmpty() {
738
- const classAttribute = await this.getClasses();
739
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
740
- }
741
- async getValue() {
742
- const value = await this.getTagBoxInputValue();
743
- return value.length ? value : null;
744
- }
745
- async setValue(values) {
746
- if (!Array.isArray(values)) {
747
- throw new Error("The provided value is not an array");
748
- }
749
- await this.setTagBoxInputValue(values);
750
- }
751
- async remove(itemText) {
752
- const tagValues = await this.getValue();
753
- const tagExists = tagValues.includes(itemText);
754
- if (!tagExists) {
755
- throw new Error(`The tag with the text: ${itemText} was not found`);
756
- }
757
- const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
758
- const clearBtn = await this.driver.findElement(
759
- import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
760
- );
761
- await click(clearBtn, this.driver);
1242
+ var import_selenium_webdriver16, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
1243
+ var init_TagBox = __esm({
1244
+ "src/pageObjects/elements/Editors/TagBox.ts"() {
1245
+ "use strict";
1246
+ init_AbstractEditor();
1247
+ import_selenium_webdriver16 = require("selenium-webdriver");
1248
+ init_actions();
1249
+ init_locators();
1250
+ init_SelectBoxEditor();
1251
+ init_ClearButtonStrategy();
1252
+ init_fixElementStaleError();
1253
+ TAGS_SELECTOR = ".dx-tag .tag-text";
1254
+ DX_TAG_CONTAINER = "dx-tag-container";
1255
+ DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
1256
+ BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
1257
+ TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
1258
+ TagBox = class extends AbstractDXEditorWithInput {
1259
+ constructor(parentCssSelector, elementCssSelector, driver) {
1260
+ super(parentCssSelector, elementCssSelector, driver);
1261
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1262
+ }
1263
+ async setTagBoxInputValue(values) {
1264
+ const lastElement = values[values.length - 1];
1265
+ const inputEl = await this.getInputElement();
1266
+ await inputEl.click();
1267
+ for (const value of values) {
1268
+ await this.selectOption(inputEl, value, lastElement);
1269
+ }
1270
+ await this.confirmSelection();
1271
+ }
1272
+ async waitOptionSelection() {
1273
+ await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
1274
+ }
1275
+ async selectOption(inputEl, value, lastElement) {
1276
+ try {
1277
+ await dropDownOptionClick(value, this.driver, false);
1278
+ } catch {
1279
+ await inputEl.sendKeys(value);
1280
+ await dropDownOptionClick(value, this.driver);
1281
+ }
1282
+ await this.waitOptionSelection();
1283
+ if (value !== lastElement) {
1284
+ await inputEl.clear();
1285
+ }
1286
+ }
1287
+ async confirmSelection() {
1288
+ const btnOk = await fixElementStaleError(import_selenium_webdriver16.By.css(BTN_OK_SELECTOR), this.driver);
1289
+ await click(btnOk, this.driver);
1290
+ }
1291
+ async getTagBoxInputValue() {
1292
+ if (await this.isTagBoxEmpty()) {
1293
+ return [];
1294
+ }
1295
+ const tags = await this.driver.findElements(
1296
+ import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
1297
+ );
1298
+ const values = [];
1299
+ for (const tag of tags) {
1300
+ values.push(await tag.getAttribute("textContent"));
1301
+ }
1302
+ return values;
1303
+ }
1304
+ async isTagBoxEmpty() {
1305
+ const classAttribute = await this.getClasses();
1306
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
1307
+ }
1308
+ async getValue() {
1309
+ const value = await this.getTagBoxInputValue();
1310
+ return value.length ? value : null;
1311
+ }
1312
+ async setValue(values) {
1313
+ if (!Array.isArray(values)) {
1314
+ throw new Error("The provided value is not an array");
1315
+ }
1316
+ await this.setTagBoxInputValue(values);
1317
+ }
1318
+ async remove(itemText) {
1319
+ const tagValues = await this.getValue();
1320
+ const tagExists = tagValues.includes(itemText);
1321
+ if (!tagExists) {
1322
+ throw new Error(`The tag with the text: ${itemText} was not found`);
1323
+ }
1324
+ const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
1325
+ const clearBtn = await this.driver.findElement(
1326
+ import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
1327
+ );
1328
+ await click(clearBtn, this.driver);
1329
+ }
1330
+ };
762
1331
  }
763
- };
1332
+ });
764
1333
 
765
1334
  // src/pageObjects/elements/Editors/ButtonGroup.ts
766
- var import_selenium_webdriver13 = require("selenium-webdriver");
767
- var ITEM_CLASS = "dx-buttongroup-item";
768
- var SELECTED_CLASS = "dx-state-selected";
769
- var ButtonGroup = class extends AbstractElementWithParent {
770
- getItems() {
771
- return this.driver.findElements(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
772
- }
773
- getDataValue(el) {
774
- return el.getAttribute("data-value");
775
- }
776
- async getValue() {
777
- const selectedEl = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
778
- return this.getDataValue(selectedEl);
779
- }
780
- async setValue(value) {
781
- const items = await this.getItems();
782
- let buttonEl = void 0;
783
- for (const item of items) {
784
- const text = await this.getDataValue(item);
785
- if (text == value) {
786
- buttonEl = item;
787
- break;
1335
+ var import_selenium_webdriver17, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
1336
+ var init_ButtonGroup = __esm({
1337
+ "src/pageObjects/elements/Editors/ButtonGroup.ts"() {
1338
+ "use strict";
1339
+ init_actions();
1340
+ import_selenium_webdriver17 = require("selenium-webdriver");
1341
+ init_AbstractElementWithParent();
1342
+ ITEM_CLASS = "dx-buttongroup-item";
1343
+ SELECTED_CLASS = "dx-state-selected";
1344
+ ButtonGroup = class extends AbstractElementWithParent {
1345
+ getItems() {
1346
+ return this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
788
1347
  }
789
- }
790
- if (!buttonEl)
791
- throw new Error(`Cannot find item in button group with text: ${value}`);
792
- await click(buttonEl, this.driver);
1348
+ getDataValue(el) {
1349
+ return el.getAttribute("data-value");
1350
+ }
1351
+ async getValue() {
1352
+ const selectedEl = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
1353
+ return this.getDataValue(selectedEl);
1354
+ }
1355
+ async setValue(value) {
1356
+ const items = await this.getItems();
1357
+ let buttonEl = void 0;
1358
+ for (const item of items) {
1359
+ const text = await this.getDataValue(item);
1360
+ if (text == value) {
1361
+ buttonEl = item;
1362
+ break;
1363
+ }
1364
+ }
1365
+ if (!buttonEl)
1366
+ throw new Error(`Cannot find item in button group with text: ${value}`);
1367
+ await click(buttonEl, this.driver);
1368
+ }
1369
+ };
793
1370
  }
794
- };
1371
+ });
795
1372
 
796
1373
  // src/pageObjects/elements/Editors/BooleanSelector.ts
797
- var BooleanSelector = class extends ButtonGroup {
798
- // @ts-ignore
799
- async getValue() {
800
- const value = await super.getValue();
801
- return value === "null" ? null : value === "1" ? 1 : 0;
802
- }
803
- // @ts-ignore
804
- async setValue(value) {
805
- const val = value == null ? "null" : value ? "1" : "0";
806
- await super.setValue(val);
1374
+ var BooleanSelector;
1375
+ var init_BooleanSelector = __esm({
1376
+ "src/pageObjects/elements/Editors/BooleanSelector.ts"() {
1377
+ "use strict";
1378
+ init_ButtonGroup();
1379
+ BooleanSelector = class extends ButtonGroup {
1380
+ // @ts-ignore
1381
+ async getValue() {
1382
+ const value = await super.getValue();
1383
+ return value === "null" ? null : value === "1" ? 1 : 0;
1384
+ }
1385
+ // @ts-ignore
1386
+ async setValue(value) {
1387
+ const val = value == null ? "null" : value ? "1" : "0";
1388
+ await super.setValue(val);
1389
+ }
1390
+ };
807
1391
  }
808
- };
809
-
810
- // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
811
- var import_selenium_webdriver15 = require("selenium-webdriver");
812
-
813
- // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
814
- var import_selenium_webdriver14 = require("selenium-webdriver");
1392
+ });
815
1393
 
816
1394
  // src/pageObjects/elements/Editors/Date/utils.ts
817
- var formatDMYDate = (date) => {
818
- const [year, month, day] = date.toJSON().split("T")[0].split("-");
819
- return `${day}${month}${year}`;
820
- };
1395
+ var formatDMYDate;
1396
+ var init_utils2 = __esm({
1397
+ "src/pageObjects/elements/Editors/Date/utils.ts"() {
1398
+ "use strict";
1399
+ formatDMYDate = (date) => {
1400
+ const [year, month, day] = date.toJSON().split("T")[0].split("-");
1401
+ return `${day}${month}${year}`;
1402
+ };
1403
+ }
1404
+ });
821
1405
 
822
1406
  // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
823
- var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
824
- var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
825
- var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
826
- var BTN_SAVE_SELECTOR = "DateRange__button-save";
827
- var BaseDateEditor = class extends AbstractDXEditorWithInput {
828
- constructor(parentCssSelector, elementCssSelector, driver) {
829
- super(parentCssSelector, elementCssSelector, driver);
830
- this.setClearStrategy(new InputClearStrategy());
831
- }
832
- async setDateValue(value) {
833
- const actions = this.driver.actions({ async: true });
834
- const dateField = await this.driver.findElement(import_selenium_webdriver14.By.css(`${this.getFullCssSelector()}`));
835
- const dateFieldDataTestID = await this.getDataTestId();
836
- const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
837
- const dateInputEl = await this.getInputElement();
838
- await dateInputEl.clear();
839
- if (Array.isArray(value)) {
840
- const formattedDates = value.map(formatDMYDate);
841
- const button = await dateField.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
842
- await button.click();
843
- const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver14.By.css(calendarPopoverSelector));
844
- const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
845
- const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
846
- await dateFromInput.click();
847
- await dateFromInput.sendKeys(formattedDates[0]);
848
- await dateToInput.click();
849
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
850
- await dateToInput.sendKeys(formattedDates[1]);
851
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.ENTER).perform();
852
- const btnOk = await this.driver.findElement(import_selenium_webdriver14.By.css(`.${BTN_SAVE_SELECTOR}`));
853
- await btnOk.click();
854
- } else {
855
- const formattedDate = formatDMYDate(value);
856
- await click(dateInputEl, this.driver);
857
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
858
- await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver14.Key.ENTER).perform();
859
- }
1407
+ var import_selenium_webdriver18, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
1408
+ var init_BaseDateEditor = __esm({
1409
+ "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1410
+ "use strict";
1411
+ init_AbstractEditor();
1412
+ init_InputClearStrategy();
1413
+ import_selenium_webdriver18 = require("selenium-webdriver");
1414
+ init_locators();
1415
+ init_actions();
1416
+ init_utils2();
1417
+ BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
1418
+ BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
1419
+ BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
1420
+ BTN_SAVE_SELECTOR = "DateRange__button-save";
1421
+ BaseDateEditor = class extends AbstractDXEditorWithInput {
1422
+ constructor(parentCssSelector, elementCssSelector, driver) {
1423
+ super(parentCssSelector, elementCssSelector, driver);
1424
+ this.setClearStrategy(new InputClearStrategy());
1425
+ }
1426
+ async setDateValue(value) {
1427
+ const actions = this.driver.actions({ async: true });
1428
+ const dateField = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()}`));
1429
+ const dateFieldDataTestID = await this.getDataTestId();
1430
+ const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
1431
+ const dateInputEl = await this.getInputElement();
1432
+ await dateInputEl.clear();
1433
+ if (Array.isArray(value)) {
1434
+ const formattedDates = value.map(formatDMYDate);
1435
+ const button = await dateField.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
1436
+ await button.click();
1437
+ const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver18.By.css(calendarPopoverSelector));
1438
+ const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
1439
+ const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
1440
+ await dateFromInput.click();
1441
+ await dateFromInput.sendKeys(formattedDates[0]);
1442
+ await dateToInput.click();
1443
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1444
+ await dateToInput.sendKeys(formattedDates[1]);
1445
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.ENTER).perform();
1446
+ const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
1447
+ await btnOk.click();
1448
+ } else {
1449
+ const formattedDate = formatDMYDate(value);
1450
+ await click(dateInputEl, this.driver);
1451
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1452
+ await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
1453
+ }
1454
+ }
1455
+ };
860
1456
  }
861
- };
1457
+ });
862
1458
 
863
1459
  // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
864
- var SingleDateEditor = class extends BaseDateEditor {
865
- constructor(parentCssSelector, elementCssSelector, driver) {
866
- super(parentCssSelector, elementCssSelector, driver);
867
- this.setClearStrategy(new InputClearStrategy());
868
- }
869
- async getDateElement() {
870
- return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
871
- }
872
- async getDateValue() {
873
- const inputEl = await this.getDateElement();
874
- return inputEl.getAttribute("value");
875
- }
876
- async getValue() {
877
- const value = await this.getDateValue();
878
- return value == "" ? null : new Date(value);
879
- }
880
- setValue(value) {
881
- if (typeof value === "object") {
882
- return this.setDateValue(value);
883
- }
884
- throw new Error(`Value is incorrect. It should be Object`);
1460
+ var import_selenium_webdriver19, SingleDateEditor;
1461
+ var init_SingleDateEditor = __esm({
1462
+ "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
1463
+ "use strict";
1464
+ import_selenium_webdriver19 = require("selenium-webdriver");
1465
+ init_InputClearStrategy();
1466
+ init_BaseDateEditor();
1467
+ SingleDateEditor = class extends BaseDateEditor {
1468
+ constructor(parentCssSelector, elementCssSelector, driver) {
1469
+ super(parentCssSelector, elementCssSelector, driver);
1470
+ this.setClearStrategy(new InputClearStrategy());
1471
+ }
1472
+ async getDateElement() {
1473
+ return this.driver.findElement(import_selenium_webdriver19.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1474
+ }
1475
+ async getDateValue() {
1476
+ const inputEl = await this.getDateElement();
1477
+ return inputEl.getAttribute("value");
1478
+ }
1479
+ async getValue() {
1480
+ const value = await this.getDateValue();
1481
+ return value == "" ? null : new Date(value);
1482
+ }
1483
+ setValue(value) {
1484
+ if (typeof value === "object") {
1485
+ return this.setDateValue(value);
1486
+ }
1487
+ throw new Error(`Value is incorrect. It should be Object`);
1488
+ }
1489
+ };
885
1490
  }
886
- };
1491
+ });
887
1492
 
888
1493
  // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
889
- var import_selenium_webdriver16 = require("selenium-webdriver");
890
- var DateRangeEditor = class extends BaseDateEditor {
891
- constructor(parentCssSelector, elementCssSelector, driver) {
892
- super(parentCssSelector, elementCssSelector, driver);
893
- this.setClearStrategy(new InputClearStrategy());
894
- }
895
- async getDateElement() {
896
- return this.driver.findElement(import_selenium_webdriver16.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
897
- }
898
- async getDateValue() {
899
- const inputEl = await this.getDateElement();
900
- const dateFromStr = await inputEl.getAttribute("datefrom");
901
- const dateToStr = await inputEl.getAttribute("dateto");
902
- const dateFrom = new Date(dateFromStr);
903
- const dateTo = new Date(dateToStr);
904
- return [dateFrom, dateTo];
905
- }
906
- async getValue() {
907
- const values = await this.getDateValue();
908
- return !values.length ? null : values;
909
- }
910
- setValue(value) {
911
- if (typeof value === "object") {
912
- return this.setDateValue(value);
913
- }
914
- throw new Error(`Value is incorrect. It should be Object`);
1494
+ var import_selenium_webdriver20, DateRangeEditor;
1495
+ var init_DateRangeEditor = __esm({
1496
+ "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
1497
+ "use strict";
1498
+ import_selenium_webdriver20 = require("selenium-webdriver");
1499
+ init_InputClearStrategy();
1500
+ init_BaseDateEditor();
1501
+ DateRangeEditor = class extends BaseDateEditor {
1502
+ constructor(parentCssSelector, elementCssSelector, driver) {
1503
+ super(parentCssSelector, elementCssSelector, driver);
1504
+ this.setClearStrategy(new InputClearStrategy());
1505
+ }
1506
+ async getDateElement() {
1507
+ return this.driver.findElement(import_selenium_webdriver20.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1508
+ }
1509
+ async getDateValue() {
1510
+ const inputEl = await this.getDateElement();
1511
+ const dateFromStr = await inputEl.getAttribute("datefrom");
1512
+ const dateToStr = await inputEl.getAttribute("dateto");
1513
+ const dateFrom = new Date(dateFromStr);
1514
+ const dateTo = new Date(dateToStr);
1515
+ return [dateFrom, dateTo];
1516
+ }
1517
+ async getValue() {
1518
+ const values = await this.getDateValue();
1519
+ return !values.length ? null : values;
1520
+ }
1521
+ setValue(value) {
1522
+ if (typeof value === "object") {
1523
+ return this.setDateValue(value);
1524
+ }
1525
+ throw new Error(`Value is incorrect. It should be Object`);
1526
+ }
1527
+ };
915
1528
  }
916
- };
1529
+ });
917
1530
 
918
1531
  // src/pageObjects/elements/Editors/Date/DateEditor.ts
919
- var DateEditor = class extends AbstractDXEditorWithInput {
920
- editorInstance = null;
921
- initPromise;
922
- constructor(parentCssSelector, elementCssSelector, driver) {
923
- super(parentCssSelector, elementCssSelector, driver);
924
- this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
925
- }
926
- async init(parentCssSelector, elementCssSelector, driver) {
927
- await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
928
- }
929
- async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
930
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
931
- const classString = await elementInstance.getClasses();
932
- switch (true) {
933
- case classString.includes("date-control" /* Date */):
934
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
935
- break;
936
- case classString.includes("single-date-range-control" /* SingleDateRange */):
937
- this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
938
- break;
939
- default:
940
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
941
- }
942
- }
943
- async ensureInitialized() {
944
- if (!this.editorInstance) {
945
- await this.initPromise;
946
- }
947
- }
948
- async setValue(value) {
949
- await this.ensureInitialized();
950
- if (this.editorInstance) {
951
- await this.editorInstance.setValue(value);
952
- return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
953
- }
954
- throw new Error("Editor instance is not initialized.");
955
- }
956
- async getValue() {
957
- await this.ensureInitialized();
958
- if (this.editorInstance) {
959
- return this.editorInstance.getValue();
960
- }
961
- throw new Error("Editor instance is not initialized.");
1532
+ var DateEditor;
1533
+ var init_DateEditor = __esm({
1534
+ "src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
1535
+ "use strict";
1536
+ init_SingleDateEditor();
1537
+ init_DateRangeEditor();
1538
+ init_AbstractFormElement();
1539
+ init_AbstractEditor();
1540
+ init_types3();
1541
+ DateEditor = class extends AbstractDXEditorWithInput {
1542
+ editorInstance = null;
1543
+ initPromise;
1544
+ constructor(parentCssSelector, elementCssSelector, driver) {
1545
+ super(parentCssSelector, elementCssSelector, driver);
1546
+ this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
1547
+ }
1548
+ async init(parentCssSelector, elementCssSelector, driver) {
1549
+ await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
1550
+ }
1551
+ async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
1552
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1553
+ const classString = await elementInstance.getClasses();
1554
+ switch (true) {
1555
+ case classString.includes("date-control" /* Date */):
1556
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1557
+ break;
1558
+ case classString.includes("single-date-range-control" /* SingleDateRange */):
1559
+ this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
1560
+ break;
1561
+ default:
1562
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1563
+ }
1564
+ }
1565
+ async ensureInitialized() {
1566
+ if (!this.editorInstance) {
1567
+ await this.initPromise;
1568
+ }
1569
+ }
1570
+ async setValue(value) {
1571
+ await this.ensureInitialized();
1572
+ if (this.editorInstance) {
1573
+ await this.editorInstance.setValue(value);
1574
+ return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
1575
+ }
1576
+ throw new Error("Editor instance is not initialized.");
1577
+ }
1578
+ async getValue() {
1579
+ await this.ensureInitialized();
1580
+ if (this.editorInstance) {
1581
+ return this.editorInstance.getValue();
1582
+ }
1583
+ throw new Error("Editor instance is not initialized.");
1584
+ }
1585
+ };
962
1586
  }
963
- };
1587
+ });
964
1588
 
965
1589
  // src/pageObjects/elements/Editors/editorFactory.ts
966
- var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
967
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
968
- const classSting = await elementInstance.getClasses();
969
- if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
970
- return new TextEditor(parentCssSelector, elementCssSelector, driver);
971
- if (classSting.includes("number-control" /* Number */))
972
- return new NumberEditor(parentCssSelector, elementCssSelector, driver);
973
- if (classSting.includes("check-box" /* CheckBox */))
974
- return new CheckBox(parentCssSelector, elementCssSelector, driver);
975
- if (classSting.includes("multi-select-control" /* Multiselect */))
976
- return new TagBox(parentCssSelector, elementCssSelector, driver);
977
- if (classSting.includes("select-control" /* Select */))
978
- return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
979
- if (classSting.includes("switch-control" /* Switch */))
980
- return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
981
- if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
982
- return new DateEditor(parentCssSelector, elementCssSelector, driver);
983
- }
984
- if (classSting.includes("buttons-group" /* BooleanSelector */))
985
- return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
986
- if (classSting.includes("button-group-field" /* ButtonGroup */))
987
- return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
988
- throw new Error("Unknown type of editor. Please write ticket to the support");
989
- };
990
-
991
- // src/pageObjects/elements/AbstractEditor.ts
992
- var AbstractEditor = class extends AbstractElementWithParent {
993
- editor;
994
- constructor(parentCssSelector, elementCssSelector, driver) {
995
- super(parentCssSelector, elementCssSelector, driver);
996
- }
997
- async initEditor() {
998
- if (!this.editor) {
999
- this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1000
- }
1001
- }
1002
- /**
1003
- * Возвращает значение в поле
1004
- * @example
1005
- * expect(await formEdit.field('NumberFld').getValue()).toBe(10);
1006
- * expect(await formEdit.field('TextFld').getValue()).toBe('TestValue');
1007
- */
1008
- async getValue() {
1009
- await this.initEditor();
1010
- return this.editor.getValue();
1011
- }
1012
- /**
1013
- * Устанавливает значение в поле
1014
- * @example
1015
- * await formEdit.field('NumberFld').setValue(123);
1016
- * await formEdit.field('TextFld').setValue('TestValue');
1017
- */
1018
- async setValue(value) {
1019
- await this.initEditor();
1020
- return this.editor.setValue(value);
1021
- }
1022
- /**
1023
- * Очищает значение в поле
1024
- * @example
1025
- * await formEdit.field('NumberFld').clear();
1026
- */
1027
- async clear() {
1028
- await this.initEditor();
1029
- if (!this.editor.clear) {
1030
- throw new Error("The clear method is not available for this field type.");
1031
- }
1032
- return this.editor.clear();
1590
+ var editorFactory;
1591
+ var init_editorFactory = __esm({
1592
+ "src/pageObjects/elements/Editors/editorFactory.ts"() {
1593
+ "use strict";
1594
+ init_types3();
1595
+ init_AbstractFormElement();
1596
+ init_TextEditor();
1597
+ init_NumberEditor();
1598
+ init_CheckBox();
1599
+ init_SelectBoxEditor();
1600
+ init_SwitchEditor();
1601
+ init_TagBox();
1602
+ init_BooleanSelector();
1603
+ init_ButtonGroup();
1604
+ init_DateEditor();
1605
+ editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
1606
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1607
+ const classSting = await elementInstance.getClasses();
1608
+ if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
1609
+ return new TextEditor(parentCssSelector, elementCssSelector, driver);
1610
+ if (classSting.includes("number-control" /* Number */))
1611
+ return new NumberEditor(parentCssSelector, elementCssSelector, driver);
1612
+ if (classSting.includes("check-box" /* CheckBox */))
1613
+ return new CheckBox(parentCssSelector, elementCssSelector, driver);
1614
+ if (classSting.includes("multi-select-control" /* Multiselect */))
1615
+ return new TagBox(parentCssSelector, elementCssSelector, driver);
1616
+ if (classSting.includes("select-control" /* Select */))
1617
+ return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
1618
+ if (classSting.includes("switch-control" /* Switch */))
1619
+ return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
1620
+ if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
1621
+ return new DateEditor(parentCssSelector, elementCssSelector, driver);
1622
+ }
1623
+ if (classSting.includes("buttons-group" /* BooleanSelector */))
1624
+ return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
1625
+ if (classSting.includes("button-group-field" /* ButtonGroup */))
1626
+ return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
1627
+ throw new Error("Unknown type of editor. Please write ticket to the support");
1628
+ };
1033
1629
  }
1034
- /**
1035
- * Удаляет тег по переданному тексту
1036
- * @example
1037
- * await formEdit.field('TagBox').remove('test');
1038
- */
1039
- async remove(itemText) {
1040
- await this.initEditor();
1041
- if (!this.editor.remove) {
1042
- throw new Error("This method is only available for the TagBox field.");
1043
- }
1044
- return this.editor.remove(itemText);
1630
+ });
1631
+
1632
+ // src/pageObjects/elements/Editors/index.ts
1633
+ var init_Editors = __esm({
1634
+ "src/pageObjects/elements/Editors/index.ts"() {
1635
+ "use strict";
1636
+ init_TextEditor();
1637
+ init_NumberEditor();
1638
+ init_editorFactory();
1639
+ init_types3();
1045
1640
  }
1046
- /**
1047
- * Возвращает значение true|false в зависимости readOnly поле или нет
1048
- * @example
1049
- * expect(await formEdit.field('NumberFld').isReadonly()).toBe(true);
1050
- * expect(await formEdit.field('TextFld').isReadonly()).toBe(false);
1051
- */
1052
- async isReadonly() {
1053
- await this.initEditor();
1054
- return this.editor.isReadonly();
1641
+ });
1642
+
1643
+ // src/pageObjects/elements/AbstractEditor.ts
1644
+ var AbstractEditor;
1645
+ var init_AbstractEditor2 = __esm({
1646
+ "src/pageObjects/elements/AbstractEditor.ts"() {
1647
+ "use strict";
1648
+ init_AbstractElementWithParent();
1649
+ init_Editors();
1650
+ AbstractEditor = class extends AbstractElementWithParent {
1651
+ editor;
1652
+ constructor(parentCssSelector, elementCssSelector, driver) {
1653
+ super(parentCssSelector, elementCssSelector, driver);
1654
+ }
1655
+ async initEditor() {
1656
+ if (!this.editor) {
1657
+ this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1658
+ }
1659
+ }
1660
+ /**
1661
+ * Возвращает значение в поле
1662
+ * @example
1663
+ * expect(await formEdit.field('NumberFld').getValue()).toBe(10);
1664
+ * expect(await formEdit.field('TextFld').getValue()).toBe('TestValue');
1665
+ */
1666
+ async getValue() {
1667
+ await this.initEditor();
1668
+ return this.editor.getValue();
1669
+ }
1670
+ /**
1671
+ * Устанавливает значение в поле
1672
+ * @example
1673
+ * await formEdit.field('NumberFld').setValue(123);
1674
+ * await formEdit.field('TextFld').setValue('TestValue');
1675
+ */
1676
+ async setValue(value) {
1677
+ await this.initEditor();
1678
+ return this.editor.setValue(value);
1679
+ }
1680
+ /**
1681
+ * Очищает значение в поле
1682
+ * @example
1683
+ * await formEdit.field('NumberFld').clear();
1684
+ */
1685
+ async clear() {
1686
+ await this.initEditor();
1687
+ if (!this.editor.clear) {
1688
+ throw new Error("The clear method is not available for this field type.");
1689
+ }
1690
+ return this.editor.clear();
1691
+ }
1692
+ /**
1693
+ * Удаляет тег по переданному тексту
1694
+ * @example
1695
+ * await formEdit.field('TagBox').remove('test');
1696
+ */
1697
+ async remove(itemText) {
1698
+ await this.initEditor();
1699
+ if (!this.editor.remove) {
1700
+ throw new Error("This method is only available for the TagBox field.");
1701
+ }
1702
+ return this.editor.remove(itemText);
1703
+ }
1704
+ /**
1705
+ * Возвращает значение true|false в зависимости readOnly поле или нет
1706
+ * @example
1707
+ * expect(await formEdit.field('NumberFld').isReadonly()).toBe(true);
1708
+ * expect(await formEdit.field('TextFld').isReadonly()).toBe(false);
1709
+ */
1710
+ async isReadonly() {
1711
+ await this.initEditor();
1712
+ return this.editor.isReadonly();
1713
+ }
1714
+ };
1055
1715
  }
1056
- };
1716
+ });
1057
1717
 
1058
1718
  // src/pageObjects/elements/FormField.ts
1059
- var FormField = class extends AbstractEditor {
1060
- constructor(parentCssSelector, formName, name, driver) {
1061
- super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
1719
+ var FormField;
1720
+ var init_FormField = __esm({
1721
+ "src/pageObjects/elements/FormField.ts"() {
1722
+ "use strict";
1723
+ init_locators();
1724
+ init_createDataTestId();
1725
+ init_AbstractEditor2();
1726
+ FormField = class extends AbstractEditor {
1727
+ constructor(parentCssSelector, formName, name, driver) {
1728
+ super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
1729
+ }
1730
+ };
1062
1731
  }
1063
- };
1732
+ });
1064
1733
 
1065
- // src/pageObjects/elements/Groups/AbstractGroup.ts
1066
- var AbstractGroup = class extends AbstractElementWithParent {
1067
- async isDisplayed() {
1068
- const groupElement = await this.getElement();
1069
- return await groupElement.isDisplayed();
1734
+ // src/pageObjects/elements/Table/Table.ts
1735
+ var import_selenium_webdriver21, Table;
1736
+ var init_Table = __esm({
1737
+ "src/pageObjects/elements/Table/Table.ts"() {
1738
+ "use strict";
1739
+ import_selenium_webdriver21 = require("selenium-webdriver");
1740
+ init_createDataTestId();
1741
+ init_AbstractElementWithParent();
1742
+ init_Row();
1743
+ init_Column();
1744
+ init_FormField();
1745
+ Table = class extends AbstractElementWithParent {
1746
+ formName;
1747
+ headerCssSelector;
1748
+ constructor(parentCssSelector, headerCssSelector, formName, driver) {
1749
+ super(parentCssSelector, `#${createTableId(formName)}`, driver);
1750
+ this.formName = formName;
1751
+ this.headerCssSelector = headerCssSelector;
1752
+ }
1753
+ getColumnBy = (args) => {
1754
+ if (args.title) {
1755
+ return this.getColumnByTitle(args.title);
1756
+ }
1757
+ return this.getColumnByName(args.name);
1758
+ };
1759
+ getRowByIndex(index) {
1760
+ return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1761
+ }
1762
+ getColumnByIndex(index) {
1763
+ return new Column({
1764
+ parentCssSelector: this.getFullCssSelector(),
1765
+ driver: this.driver,
1766
+ index
1767
+ });
1768
+ }
1769
+ getColumnByTitle = (title) => {
1770
+ return new Column({
1771
+ parentCssSelector: this.getFullCssSelector(),
1772
+ headerCssSelector: this.headerCssSelector,
1773
+ caption: title,
1774
+ driver: this.driver
1775
+ });
1776
+ };
1777
+ getColumnByName = (name) => {
1778
+ return new Column({
1779
+ parentCssSelector: this.getFullCssSelector(),
1780
+ headerCssSelector: this.headerCssSelector,
1781
+ name,
1782
+ driver: this.driver
1783
+ });
1784
+ };
1785
+ selectRowByIndex(index) {
1786
+ return this.getRowByIndex(index).select();
1787
+ }
1788
+ async getRows() {
1789
+ const rows = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1790
+ const result = [];
1791
+ rows.forEach((_, index) => {
1792
+ const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1793
+ result.push(newRow);
1794
+ });
1795
+ return result;
1796
+ }
1797
+ async getColumns() {
1798
+ const columns = await this.driver.findElements(
1799
+ import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1800
+ );
1801
+ const result = [];
1802
+ columns.forEach((_, index) => {
1803
+ const newCol = new Column({
1804
+ parentCssSelector: this.getFullCssSelector(),
1805
+ index,
1806
+ driver: this.driver
1807
+ });
1808
+ result.push(newCol);
1809
+ });
1810
+ return result;
1811
+ }
1812
+ element() {
1813
+ return this.getElement();
1814
+ }
1815
+ /**
1816
+ * Находит поле когда форма находится в состоянии редактирования
1817
+ * @example
1818
+ * const form = new MyForm();
1819
+ * //...
1820
+ * expect(await form.field('Name').getValue()).toBe('test value');
1821
+ */
1822
+ field(name) {
1823
+ return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
1824
+ }
1825
+ };
1070
1826
  }
1071
- };
1072
-
1073
- // src/pageObjects/elements/Groups/Panel.ts
1074
- var Panel = class extends AbstractGroup {
1075
- };
1076
-
1077
- // src/pageObjects/elements/Groups/groupFactory.ts
1078
- var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
1079
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1080
- const classSting = await elementInstance.getClasses();
1081
- if (classSting.includes("panel-group"))
1082
- return new Panel(parentCssSelector, elementCssSelector, driver);
1083
- throw new Error("Unknown type of group. Please write ticket to the support");
1084
- };
1827
+ });
1085
1828
 
1086
- // src/pageObjects/elements/FormGroup.ts
1087
- var FormGroup = class extends AbstractElementWithParent {
1088
- editor;
1089
- constructor(parentCssSelector, formName, name, driver) {
1090
- super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
1091
- }
1092
- async initEditor() {
1093
- if (!this.editor) {
1094
- this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1095
- }
1829
+ // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
1830
+ var ToolbarGroupButton;
1831
+ var init_ToolbarGroupButton = __esm({
1832
+ "src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
1833
+ "use strict";
1834
+ init_AbstractButton();
1835
+ ToolbarGroupButton = class extends AbstractButton {
1836
+ name;
1837
+ constructor(parentCssSelector, name, driver) {
1838
+ super(parentCssSelector, ``, driver);
1839
+ this.name = name;
1840
+ }
1841
+ buttonNotDisplayedError() {
1842
+ return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1843
+ }
1844
+ };
1096
1845
  }
1097
- /**
1098
- * Возвращает булевое значение доступна ли группа
1099
- * @example
1100
- * expect(await tableList.group('MainSuperPanel').isDisplayed();
1101
- */
1102
- async isDisplayed() {
1103
- try {
1104
- await this.initEditor();
1105
- return this.editor.isDisplayed();
1106
- } catch {
1107
- return false;
1108
- }
1846
+ });
1847
+
1848
+ // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
1849
+ var TOOLBAR_BUTTON_CLASS, ToolbarButton;
1850
+ var init_ToolbarButton = __esm({
1851
+ "src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
1852
+ "use strict";
1853
+ init_AbstractButton();
1854
+ TOOLBAR_BUTTON_CLASS = "toolbar-button";
1855
+ ToolbarButton = class extends AbstractButton {
1856
+ name;
1857
+ constructor(parentCssSelector, name, driver) {
1858
+ super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
1859
+ this.name = name;
1860
+ }
1861
+ buttonNotDisplayedError() {
1862
+ return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1863
+ }
1864
+ };
1109
1865
  }
1110
- };
1866
+ });
1111
1867
 
1112
- // src/pageObjects/elements/Forms/FormEdit.ts
1113
- var FormEdit = class extends AbstractForm {
1114
- saveButtonBy = import_selenium_webdriver17.By.id("button-save");
1115
- closeButtonBy = import_selenium_webdriver17.By.id("button-cancel");
1116
- constructor(driver) {
1117
- super(driver);
1118
- this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
1868
+ // src/utils/typesUtil.ts
1869
+ var types, type, isArray, isString;
1870
+ var init_typesUtil = __esm({
1871
+ "src/utils/typesUtil.ts"() {
1872
+ "use strict";
1873
+ types = {
1874
+ "[object Array]": "array",
1875
+ "[object Date]": "date",
1876
+ "[object Object]": "object",
1877
+ "[object String]": "string",
1878
+ "[object Null]": "null"
1879
+ };
1880
+ type = function(object) {
1881
+ const typeOfObject = Object.prototype.toString.call(object);
1882
+ return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
1883
+ };
1884
+ isArray = function(value) {
1885
+ return type(value) === "array";
1886
+ };
1887
+ isString = function(object) {
1888
+ return typeof object === "string";
1889
+ };
1119
1890
  }
1120
- /**
1121
- * Находит поле формы редактирования по имени
1122
- * @example
1123
- * const formEdit = new MyForm();
1124
- * //...
1125
- * expect(await formEdit.field('Name').getValue()).toBe('test value');
1126
- */
1127
- field(name) {
1128
- return new FormField(this.containerCssSelector, this.formName, name, this.driver);
1891
+ });
1892
+
1893
+ // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1894
+ var import_selenium_webdriver22, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1895
+ var init_ToolbarMenu = __esm({
1896
+ "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1897
+ "use strict";
1898
+ import_selenium_webdriver22 = require("selenium-webdriver");
1899
+ init_typesUtil();
1900
+ init_AbstractElementWithParent();
1901
+ init_locators();
1902
+ init_actions();
1903
+ init_waitElementIsClickable();
1904
+ init_fixElementStaleError();
1905
+ SPINDOWN_CLASS = ".dx-icon-spindown";
1906
+ buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
1907
+ getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
1908
+ buttonByTextXpath = (text) => `.//span[contains(@class, "dx-menu-item-text") and contains(text(), "${text}")]`;
1909
+ ToolbarMenu = class extends AbstractElementWithParent {
1910
+ _formName;
1911
+ constructor(parentCssSelector, formName, name, driver) {
1912
+ super(parentCssSelector, getFullCssSelector(formName, name), driver);
1913
+ this._formName = formName;
1914
+ }
1915
+ async openDropdownMenu() {
1916
+ const dropdown = await this.getElement();
1917
+ await click(dropdown, this.driver);
1918
+ }
1919
+ getCssSelectorToButton(name) {
1920
+ return byTestId(`ftb-${this._formName}-${name}`);
1921
+ }
1922
+ buttonNotDisplayedError(name) {
1923
+ return `Toolbar menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
1924
+ }
1925
+ async goToButton(name, by) {
1926
+ const toolbarMenuItem = await fixElementStaleError(by, this.driver);
1927
+ await waitElementIsClickable({
1928
+ element: toolbarMenuItem,
1929
+ errorMessage: this.buttonNotDisplayedError(name),
1930
+ driver: this.driver
1931
+ });
1932
+ await click(toolbarMenuItem, this.driver);
1933
+ }
1934
+ async clickButton(name) {
1935
+ await this.openDropdownMenu();
1936
+ if (!isString(name) && !isArray(name))
1937
+ throw new Error(`"name" must be a string or array of string`);
1938
+ let lName = isString(name) ? [name] : name;
1939
+ for (let n of lName) {
1940
+ await this.goToButton(n, this.getCssSelectorToButton(n));
1941
+ }
1942
+ }
1943
+ async clickButtonByTitle(title) {
1944
+ await this.openDropdownMenu();
1945
+ if (!isString(title) && !isArray(title))
1946
+ throw new Error(`"title" must be a string or array of string`);
1947
+ let lTitle = isString(title) ? [title] : title;
1948
+ for (let t of lTitle) {
1949
+ await this.goToButton(t, import_selenium_webdriver22.By.xpath(buttonByTextXpath(t)));
1950
+ }
1951
+ }
1952
+ };
1129
1953
  }
1130
- /**
1131
- * Проверяет не отключена ли кнопка Сохранить
1132
- * @example
1133
- * const formEdit = new MyForm();
1134
- * //...
1135
- * await formEdit.isSaveButtonDisabled();
1136
- */
1137
- async isSaveButtonDisabled() {
1138
- const saveButton = await this.driver.findElement(this.saveButtonBy);
1139
- const result = await saveButton.getAttribute("aria-disabled");
1140
- return result === "true";
1954
+ });
1955
+
1956
+ // src/pageObjects/elements/TableToolbar/ToolbarItem.ts
1957
+ var GROUP_BUTTON_CLASS, toolbarItemSelector, ToolbarItem;
1958
+ var init_ToolbarItem = __esm({
1959
+ "src/pageObjects/elements/TableToolbar/ToolbarItem.ts"() {
1960
+ "use strict";
1961
+ init_AbstractElementWithParent();
1962
+ init_ToolbarGroupButton();
1963
+ init_ToolbarButton();
1964
+ init_locators();
1965
+ init_ToolbarMenu();
1966
+ GROUP_BUTTON_CLASS = "toolbar-group-button";
1967
+ toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
1968
+ ToolbarItem = class extends AbstractElementWithParent {
1969
+ _button;
1970
+ _formName;
1971
+ _itemName;
1972
+ constructor(parentCssSelector, formName, itemName, driver) {
1973
+ super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
1974
+ this._itemName = itemName;
1975
+ this._formName = formName;
1976
+ }
1977
+ async init() {
1978
+ if (this._button)
1979
+ return this._button;
1980
+ const classNames = await this.getClasses();
1981
+ if (classNames.includes(GROUP_BUTTON_CLASS)) {
1982
+ this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
1983
+ return;
1984
+ }
1985
+ this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
1986
+ }
1987
+ async click() {
1988
+ await this.init();
1989
+ await this._button.click();
1990
+ }
1991
+ async isDisabled() {
1992
+ await this.init();
1993
+ return await this._button.isDisabled();
1994
+ }
1995
+ get menu() {
1996
+ return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
1997
+ }
1998
+ };
1141
1999
  }
1142
- /**
1143
- * Находит группу формы редактирования по имени
1144
- * @example
1145
- * const formEdit = new MyForm();
1146
- * //...
1147
- * expect(await formEdit.group('Name');
1148
- */
1149
- group(name) {
1150
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
2000
+ });
2001
+
2002
+ // src/pageObjects/elements/TableToolbar/FormToolbar.ts
2003
+ var TABLE_TOOLBAR_CLASS, FormToolbar;
2004
+ var init_FormToolbar = __esm({
2005
+ "src/pageObjects/elements/TableToolbar/FormToolbar.ts"() {
2006
+ "use strict";
2007
+ init_AbstractElementWithParent();
2008
+ init_ToolbarItem();
2009
+ TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
2010
+ FormToolbar = class extends AbstractElementWithParent {
2011
+ formName;
2012
+ constructor(parentCssSelector, formName, driver) {
2013
+ super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
2014
+ this.formName = formName;
2015
+ }
2016
+ button(name) {
2017
+ return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
2018
+ }
2019
+ };
1151
2020
  }
1152
- /**
1153
- * Нажатие на кнопку Сохранить
1154
- * @example
1155
- * const formEdit = new MyForm();
1156
- * //...
1157
- * await formEdit.saveButtonClick();
1158
- */
1159
- async saveButtonClick() {
1160
- const saveButton = await this.driver.findElement(this.saveButtonBy);
1161
- await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
1162
- await click(saveButton, this.driver);
2021
+ });
2022
+
2023
+ // src/pageObjects/elements/Filters/FormFilterField.ts
2024
+ var FormFilterField;
2025
+ var init_FormFilterField = __esm({
2026
+ "src/pageObjects/elements/Filters/FormFilterField.ts"() {
2027
+ "use strict";
2028
+ init_locators();
2029
+ init_createDataTestId();
2030
+ init_AbstractEditor2();
2031
+ FormFilterField = class extends AbstractEditor {
2032
+ constructor(parentCssSelector, formName, name, driver) {
2033
+ super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
2034
+ }
2035
+ /**
2036
+ * Возвращает значение в поле
2037
+ * @example
2038
+ * expect(await form.formFilter('NumberFld').getValue()).toBe(10);
2039
+ * expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
2040
+ */
2041
+ async getValue() {
2042
+ return super.getValue();
2043
+ }
2044
+ /**
2045
+ * Устанавливает значение в поле
2046
+ * @example
2047
+ * await form.formFilter('NumberFld').setValue(123);
2048
+ * await form.formFilter('TextFld').setValue('TestValue');
2049
+ */
2050
+ async setValue(value) {
2051
+ return super.setValue(value);
2052
+ }
2053
+ /**
2054
+ * Очищает значение в поле
2055
+ * @example
2056
+ * await form.formFilter('NumberFld').clear();
2057
+ */
2058
+ async clear() {
2059
+ return super.clear();
2060
+ }
2061
+ /**
2062
+ * Удаляет тег по переданному тексту
2063
+ * @example
2064
+ * await form.formFilter('TagBox').remove('test');
2065
+ */
2066
+ async remove(itemText) {
2067
+ return super.remove(itemText);
2068
+ }
2069
+ };
1163
2070
  }
1164
- /**
1165
- * Нажатие на кнопку Закрить
1166
- * @example
1167
- * const formEdit = new MyForm();
1168
- * //...
1169
- * await formEdit.closeButtonClick();
1170
- */
1171
- async closeButtonClick() {
1172
- const closeButton = await this.driver.findElement(this.closeButtonBy);
1173
- await click(closeButton, this.driver);
2071
+ });
2072
+
2073
+ // src/pageObjects/elements/Filters/PanelFilterField.ts
2074
+ var PanelFilterField;
2075
+ var init_PanelFilterField = __esm({
2076
+ "src/pageObjects/elements/Filters/PanelFilterField.ts"() {
2077
+ "use strict";
2078
+ init_locators();
2079
+ init_createDataTestId();
2080
+ init_AbstractEditor2();
2081
+ PanelFilterField = class extends AbstractEditor {
2082
+ constructor(parentCssSelector, formName, name, driver) {
2083
+ super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
2084
+ }
2085
+ /**
2086
+ * Возвращает значение в поле
2087
+ * @example
2088
+ * expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
2089
+ * expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
2090
+ */
2091
+ async getValue() {
2092
+ return super.getValue();
2093
+ }
2094
+ /**
2095
+ * Устанавливает значение в поле
2096
+ * @example
2097
+ * await form.filterPanel.filterField('NumberFld').setValue(123);
2098
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue');
2099
+ */
2100
+ async setValue(value) {
2101
+ return super.setValue(value);
2102
+ }
2103
+ /**
2104
+ * Очищает значение в поле
2105
+ * @example
2106
+ * await form.filterPanel.filterField('NumberFld').clear();
2107
+ */
2108
+ async clear() {
2109
+ return super.clear();
2110
+ }
2111
+ /**
2112
+ * Удаляет тег по переданному тексту
2113
+ * @example
2114
+ * await form.filterPanel.filterField('TagBox').remove('test');
2115
+ */
2116
+ async remove(itemText) {
2117
+ return super.remove(itemText);
2118
+ }
2119
+ };
1174
2120
  }
1175
- };
2121
+ });
1176
2122
 
1177
- // src/pageObjects/elements/Table/Table.ts
1178
- var import_selenium_webdriver22 = require("selenium-webdriver");
2123
+ // src/pageObjects/elements/Filters/FilterPanel.ts
2124
+ var import_selenium_webdriver23, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2125
+ var init_FilterPanel = __esm({
2126
+ "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2127
+ "use strict";
2128
+ import_selenium_webdriver23 = require("selenium-webdriver");
2129
+ init_AbstractElement();
2130
+ init_PanelFilterField();
2131
+ init_actions();
2132
+ drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
2133
+ FILTER_PANEL_SELECTOR = ".filter-panel";
2134
+ CLOSE_SELECTOR = ".button-close";
2135
+ FilterPanel = class extends AbstractElement {
2136
+ _formName;
2137
+ get filterPanelSelector() {
2138
+ return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
2139
+ }
2140
+ async filterPanelButtons() {
2141
+ const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2142
+ const el = await this.getElement();
2143
+ return el.findElements(import_selenium_webdriver23.By.css(selector));
2144
+ }
2145
+ constructor(formName, driver) {
2146
+ super(driver, drawerSelector(formName));
2147
+ this._formName = formName;
2148
+ }
2149
+ /**
2150
+ * Возвращает фильтр на панели фильтрации
2151
+ * @returns {PanelFilterField}
2152
+ * @example
2153
+ * await form.filterPanel.filterField('NumberFld');
2154
+ */
2155
+ filterField(name) {
2156
+ return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
2157
+ }
2158
+ async apply() {
2159
+ const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
2160
+ await click(btn, this.driver);
2161
+ }
2162
+ async findButtonByTitle(title) {
2163
+ const buttons = await this.filterPanelButtons();
2164
+ for (const btn of buttons) {
2165
+ if (await btn.getText() === title) {
2166
+ return btn;
2167
+ }
2168
+ }
2169
+ }
2170
+ async clearAll() {
2171
+ const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
2172
+ await click(btn, this.driver);
2173
+ await this.driver.sleep(300);
2174
+ }
2175
+ async close() {
2176
+ const btn = await this.driver.findElement(import_selenium_webdriver23.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2177
+ await click(btn, this.driver);
2178
+ }
2179
+ };
2180
+ }
2181
+ });
1179
2182
 
1180
- // src/pageObjects/elements/Table/elements/Row.ts
1181
- var import_selenium_webdriver20 = require("selenium-webdriver");
2183
+ // src/pageObjects/elements/Forms/ListForm.ts
2184
+ var ListForm_exports = {};
2185
+ __export(ListForm_exports, {
2186
+ default: () => ListForm
2187
+ });
2188
+ var DATAGRID_HEADER_CSS_SELECTOR, ListForm;
2189
+ var init_ListForm = __esm({
2190
+ "src/pageObjects/elements/Forms/ListForm.ts"() {
2191
+ "use strict";
2192
+ init_Form();
2193
+ init_Table();
2194
+ init_FormToolbar();
2195
+ init_FormFilterField();
2196
+ init_FilterPanel();
2197
+ DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
2198
+ ListForm = class extends Form {
2199
+ headerCssSelector;
2200
+ constructor(driver) {
2201
+ super(driver);
2202
+ this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
2203
+ this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
2204
+ }
2205
+ /**
2206
+ * Находит таблицу
2207
+ * @example
2208
+ * const listForm = new MyForm();
2209
+ * //...
2210
+ * expect(listForm.table());
2211
+ */
2212
+ table() {
2213
+ return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
2214
+ }
2215
+ /**
2216
+ * Находит таблицу
2217
+ * @example
2218
+ * const listForm = new MyForm();
2219
+ * //...
2220
+ * expect(listForm.toolbarButton());
2221
+ */
2222
+ toolbarButton(name) {
2223
+ const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
2224
+ return toolbar.button(name);
2225
+ }
2226
+ /**
2227
+ * Фильтр который расположен на форме
2228
+ * @example
2229
+ * const listForm = new MyForm();
2230
+ * //...
2231
+ * expect(listForm.formFilter());
2232
+ */
2233
+ formFilter(name) {
2234
+ return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
2235
+ }
2236
+ /**
2237
+ * Модель панели фильтрации
2238
+ * @returns {FilterPanel}
2239
+ * @example
2240
+ * const listForm = new MyForm();
2241
+ * //...
2242
+ * expect(listForm.filterPanel());
2243
+ */
2244
+ get filterPanel() {
2245
+ return new FilterPanel(this.formName, this.driver);
2246
+ }
2247
+ };
2248
+ }
2249
+ });
1182
2250
 
1183
- // src/pageObjects/elements/Table/elements/Cell.ts
1184
- var import_selenium_webdriver19 = require("selenium-webdriver");
2251
+ // src/pageObjects/elements/Forms/TreeView.ts
2252
+ var TreeView_exports = {};
2253
+ __export(TreeView_exports, {
2254
+ default: () => TreeView
2255
+ });
2256
+ var TREELIST_HEADER_CSS_SELECTOR, TreeView;
2257
+ var init_TreeView = __esm({
2258
+ "src/pageObjects/elements/Forms/TreeView.ts"() {
2259
+ "use strict";
2260
+ init_ListForm();
2261
+ TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
2262
+ TreeView = class extends ListForm {
2263
+ constructor(driver) {
2264
+ super(driver);
2265
+ this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
2266
+ this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
2267
+ }
2268
+ };
2269
+ }
2270
+ });
1185
2271
 
1186
- // src/pageObjects/elements/Table/utils.ts
1187
- var import_selenium_webdriver18 = require("selenium-webdriver");
1188
- function getCssRowByIndexSelector(index) {
1189
- return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
2272
+ // src/pageObjects/elements/Forms/createSubFormInstance.ts
2273
+ function subformCssSelector(parentCssSelector, testId) {
2274
+ return `${parentCssSelector} ${byTestIdCssSelector(testId)}`;
1190
2275
  }
1191
- var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1192
- var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1193
- var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
1194
- function getCssCellByIndexSelector(index) {
1195
- return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
2276
+ async function classDependencyInjector(formType) {
2277
+ let SubFormFactoryClass;
2278
+ switch (formType) {
2279
+ case "1" /* LIST */:
2280
+ SubFormFactoryClass = (await Promise.resolve().then(() => (init_ListForm(), ListForm_exports))).default;
2281
+ break;
2282
+ case "3" /* TREE */:
2283
+ SubFormFactoryClass = (await Promise.resolve().then(() => (init_TreeView(), TreeView_exports))).default;
2284
+ break;
2285
+ case "2" /* EDIT */:
2286
+ case "99" /* FREE_FORM */:
2287
+ case "4" /* REPORT */:
2288
+ SubFormFactoryClass = (await Promise.resolve().then(() => (init_FormEdit(), FormEdit_exports))).default;
2289
+ break;
2290
+ default:
2291
+ throw new Error(`Unsupported form type ${formType}`);
2292
+ }
2293
+ return SubFormFactoryClass;
1196
2294
  }
1197
- var transformInputIndex = (index) => index + 1;
1198
- var transformOutputIndex = (index) => +index - 1;
1199
-
1200
- // src/pageObjects/elements/Table/elements/Cell.ts
1201
- var Cell = class extends AbstractElementWithParent {
1202
- _index;
1203
- getCellIndex;
1204
- constructor(parentCssSelector, getCellIndex, index, driver) {
1205
- super(parentCssSelector, getCssCellByIndexSelector(index), driver);
1206
- this.getCellIndex = getCellIndex;
1207
- this._index = index;
1208
- }
1209
- set index(index) {
1210
- this._index = index;
1211
- this.elementCssSelector = getCssCellByIndexSelector(index);
1212
- }
1213
- async getBooleanValue(cellEl) {
1214
- const booleanEl = await cellEl.findElement(import_selenium_webdriver19.By.className("boolean-widget"));
1215
- return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1216
- }
1217
- async getTagsValue(cellEl) {
1218
- const tagsCssSelector = ".multiselect-container .multiselect-cell";
1219
- const tags = await cellEl.findElements(import_selenium_webdriver19.By.css(tagsCssSelector));
1220
- const values = [];
1221
- for (const tag of tags) {
1222
- values.push(await tag.getAttribute("textContent"));
1223
- }
1224
- return values;
1225
- }
1226
- async getElement() {
1227
- if (this._index == null) {
1228
- this.index = await this.getCellIndex();
1229
- }
1230
- return super.getElement();
1231
- }
1232
- async getValue() {
1233
- const cellEl = await this.getElement();
1234
- const cellElClass = await cellEl.getAttribute("class");
1235
- if (cellElClass.includes("boolean-column" /* Boolean */))
1236
- return this.getBooleanValue(cellEl);
1237
- if (cellElClass.includes("tags-column" /* Tags */))
1238
- return this.getTagsValue(cellEl);
1239
- return cellEl.getText();
2295
+ var subFormTestId;
2296
+ var init_createSubFormInstance = __esm({
2297
+ "src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
2298
+ "use strict";
2299
+ init_locators();
2300
+ init_types();
2301
+ subFormTestId = (name) => `subform-${name}`;
1240
2302
  }
1241
- getIndex() {
1242
- return this._index;
1243
- }
1244
- };
2303
+ });
1245
2304
 
1246
- // src/pageObjects/elements/Table/elements/Row.ts
1247
- var DX_SELECTION_CLASS = "dx-selection";
1248
- var DX_ROW_EDIT_CLASS = "dx-edit-row";
1249
- var DX_DATA_ROW_CLASS = "dx-data-row";
1250
- var Row = class extends AbstractElementWithParent {
1251
- index;
1252
- getColumnBy;
1253
- constructor(parentCssSelector, index, driver, getColumnBy) {
1254
- super(parentCssSelector, getCssRowByIndexSelector(index), driver);
1255
- this.index = index;
1256
- this.getColumnBy = getColumnBy;
1257
- }
1258
- _getCell({ index, name, title }) {
1259
- return new Cell(
1260
- this.getFullCssSelector(),
1261
- () => {
1262
- return this.getColumnBy({ title, name }).getIndex();
1263
- },
1264
- index,
1265
- this.driver
1266
- );
1267
- }
1268
- getCellByIndex(index) {
1269
- return this._getCell({ index });
1270
- }
1271
- getCell(name) {
1272
- return this._getCell({ name });
1273
- }
1274
- getCellByTitle(title) {
1275
- return this._getCell({ title });
1276
- }
1277
- async select() {
1278
- const rowEl = await this.getElement();
1279
- await click(rowEl, this.driver);
1280
- await wait(
1281
- async () => {
1282
- const classes = await this.getClasses();
1283
- return classes.includes(DX_SELECTION_CLASS);
1284
- },
1285
- this.driver,
1286
- "Cannot select row"
1287
- );
1288
- }
1289
- async isSelected() {
1290
- const result = await this.getAttribute("aria-selected");
1291
- return result === "true";
1292
- }
1293
- getIndex() {
1294
- return this.index;
1295
- }
1296
- async getCells() {
1297
- const cells = await this.driver.findElements(import_selenium_webdriver20.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1298
- const result = [];
1299
- cells.forEach((_, index) => {
1300
- const newCell = this.getCellByIndex(index);
1301
- result.push(newCell);
1302
- });
1303
- return result;
1304
- }
1305
- async clickInlineButton(buttonClass) {
1306
- const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1307
- const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1308
- this.index
1309
- )}"] .${buttonClass}`;
1310
- const button = await this.driver.findElement(
1311
- import_selenium_webdriver20.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
1312
- );
1313
- return click(button, this.driver);
1314
- }
1315
- async checkEditingMode(isEditing, msg) {
1316
- await wait(
1317
- async () => {
1318
- return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
1319
- },
1320
- this.driver,
1321
- msg
1322
- );
1323
- }
1324
- async edit() {
1325
- await this.clickInlineButton("edit");
1326
- await this.checkEditingMode(true, "Row did not switch to edit mode");
1327
- }
1328
- async save() {
1329
- await this.clickInlineButton("save");
1330
- await this.checkEditingMode(false, "Row did not saved");
1331
- }
1332
- async cancel() {
1333
- await this.clickInlineButton("cancel");
1334
- await this.checkEditingMode(false, "Row did not switch to normal mode");
2305
+ // src/pageObjects/elements/Forms/Form.ts
2306
+ var import_selenium_webdriver24, formTestId, Form;
2307
+ var init_Form = __esm({
2308
+ "src/pageObjects/elements/Forms/Form.ts"() {
2309
+ "use strict";
2310
+ init_locators();
2311
+ import_selenium_webdriver24 = require("selenium-webdriver");
2312
+ init_AbstractForm();
2313
+ init_waitElementIsVisible();
2314
+ init_createSubFormInstance();
2315
+ formTestId = (formName) => `form-content-wrapper-${formName}`;
2316
+ Form = class extends AbstractForm {
2317
+ popupContainerCssSelector;
2318
+ constructor(driver) {
2319
+ super(driver);
2320
+ this.setSubFormMode();
2321
+ }
2322
+ async isModal() {
2323
+ const el = await this.getContainerElement();
2324
+ const value = await el.getAttribute("data-ismodal");
2325
+ return value === "true";
2326
+ }
2327
+ /**
2328
+ * Получение заголовка на формы
2329
+ * @example
2330
+ * const listForm = new MyForm();
2331
+ * //...
2332
+ * expect(await listForm.getTitleText()).toBe('MyFormTitle');
2333
+ */
2334
+ async getTitleText() {
2335
+ if (await this.isModal()) {
2336
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.popupContainerCssSelector} .popup-title`));
2337
+ return titleEl2.getText();
2338
+ }
2339
+ let titleEl = await this.driver.findElement(import_selenium_webdriver24.By.className("main-toolbar-form-title"));
2340
+ return titleEl.getText();
2341
+ }
2342
+ setSubFormMode() {
2343
+ const testId = formTestId(this.formName);
2344
+ this.containerBy = byTestId(testId);
2345
+ this.containerCssSelector = byTestIdCssSelector(testId);
2346
+ }
2347
+ /**
2348
+ * Возвращает сабформу
2349
+ * @returns {Promise<ListForm | TreeView | FormEdit>}
2350
+ * @example
2351
+ * const form = new MyForm();
2352
+ * //...
2353
+ * expect(await form.subForm(name));
2354
+ */
2355
+ async subForm(name) {
2356
+ const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2357
+ const byCssSelector = import_selenium_webdriver24.By.css(cssSelector);
2358
+ const subFormEl = await this.driver.findElement(byCssSelector);
2359
+ await waitElementIsVisible({
2360
+ element: subFormEl,
2361
+ driver: this.driver,
2362
+ errorMessage: `Subform "${name}" is not visible`
2363
+ });
2364
+ const formType = await subFormEl.getAttribute("data-formtype");
2365
+ const formName = await subFormEl.getAttribute("data-formname");
2366
+ let SubFormFactoryClass = await classDependencyInjector(formType);
2367
+ const SubForm = class extends SubFormFactoryClass {
2368
+ setSubFormMode() {
2369
+ this.containerCssSelector = cssSelector;
2370
+ this.containerBy = byCssSelector;
2371
+ }
2372
+ get formName() {
2373
+ return formName;
2374
+ }
2375
+ };
2376
+ return new SubForm(this.driver);
2377
+ }
2378
+ };
1335
2379
  }
1336
- };
2380
+ });
1337
2381
 
1338
- // src/pageObjects/elements/Table/elements/Column.ts
1339
- var import_selenium_webdriver21 = require("selenium-webdriver");
1340
- var Column = class extends AbstractElementWithParent {
1341
- _index;
1342
- _caption;
1343
- _name;
1344
- headerCssSelector;
1345
- constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
1346
- super(parentCssSelector, "", driver);
1347
- this._name = name;
1348
- this.index = index;
1349
- this._caption = caption;
1350
- this.headerCssSelector = headerCssSelector;
1351
- }
1352
- set index(index) {
1353
- this._index = index;
1354
- this.elementCssSelector = getColumnByIndexCssSelector(index);
1355
- }
1356
- get index() {
1357
- return this._index;
1358
- }
1359
- async getElement() {
1360
- await this.getIndex();
1361
- return super.getElement();
1362
- }
1363
- async getColumnHeaderIndexBy(cssSelector) {
1364
- const column = await this.driver.findElement(
1365
- import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`)
1366
- );
1367
- return transformOutputIndex(await column.getAttribute("aria-colindex"));
1368
- }
1369
- async getIndexByCaption() {
1370
- return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
1371
- }
1372
- async getIndexByName() {
1373
- return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
1374
- }
1375
- async caption() {
1376
- const el = await this.getElement();
1377
- return el.getText();
1378
- }
1379
- async getIndex() {
1380
- if (this.index != null) {
1381
- return this.index;
1382
- }
1383
- if (this._caption != null) {
1384
- this.index = await this.getIndexByCaption();
1385
- return this.index;
1386
- }
1387
- if (this._name != null) {
1388
- this.index = await this.getIndexByName();
1389
- return this.index;
1390
- }
1391
- throw new Error("Cant get the index in the column");
2382
+ // src/pageObjects/elements/Forms/FormEdit.ts
2383
+ var FormEdit_exports = {};
2384
+ __export(FormEdit_exports, {
2385
+ default: () => FormEdit
2386
+ });
2387
+ var import_selenium_webdriver25, FormEdit;
2388
+ var init_FormEdit = __esm({
2389
+ "src/pageObjects/elements/Forms/FormEdit.ts"() {
2390
+ "use strict";
2391
+ init_Form();
2392
+ import_selenium_webdriver25 = require("selenium-webdriver");
2393
+ init_FormField();
2394
+ init_actions();
2395
+ init_wait();
2396
+ FormEdit = class extends Form {
2397
+ saveButtonBy = import_selenium_webdriver25.By.id("button-save");
2398
+ closeButtonBy = import_selenium_webdriver25.By.id("button-cancel");
2399
+ constructor(driver) {
2400
+ super(driver);
2401
+ this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
2402
+ }
2403
+ /**
2404
+ * Находит поле формы редактирования по имени
2405
+ * @example
2406
+ * const formEdit = new MyForm();
2407
+ * //...
2408
+ * expect(await formEdit.field('Name').getValue()).toBe('test value');
2409
+ */
2410
+ field(name) {
2411
+ return new FormField(this.containerCssSelector, this.formName, name, this.driver);
2412
+ }
2413
+ /**
2414
+ * Проверяет не отключена ли кнопка Сохранить
2415
+ * @example
2416
+ * const formEdit = new MyForm();
2417
+ * //...
2418
+ * await formEdit.isSaveButtonDisabled();
2419
+ */
2420
+ async isSaveButtonDisabled() {
2421
+ const saveButton = await this.driver.findElement(this.saveButtonBy);
2422
+ const result = await saveButton.getAttribute("aria-disabled");
2423
+ return result === "true";
2424
+ }
2425
+ /**
2426
+ * Нажатие на кнопку Сохранить
2427
+ * @example
2428
+ * const formEdit = new MyForm();
2429
+ * //...
2430
+ * await formEdit.saveButtonClick();
2431
+ */
2432
+ async saveButtonClick() {
2433
+ const saveButton = await this.driver.findElement(this.saveButtonBy);
2434
+ await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
2435
+ await click(saveButton, this.driver);
2436
+ }
2437
+ /**
2438
+ * Нажатие на кнопку Закрить
2439
+ * @example
2440
+ * const formEdit = new MyForm();
2441
+ * //...
2442
+ * await formEdit.closeButtonClick();
2443
+ */
2444
+ async closeButtonClick() {
2445
+ const closeButton = await this.driver.findElement(this.closeButtonBy);
2446
+ await click(closeButton, this.driver);
2447
+ }
2448
+ };
1392
2449
  }
1393
- };
2450
+ });
1394
2451
 
1395
- // src/pageObjects/elements/Table/Table.ts
1396
- var Table = class extends AbstractElementWithParent {
1397
- formName;
1398
- headerCssSelector;
1399
- constructor(parentCssSelector, headerCssSelector, formName, driver) {
1400
- super(parentCssSelector, `#${createTableId(formName)}`, driver);
1401
- this.formName = formName;
1402
- this.headerCssSelector = headerCssSelector;
1403
- }
1404
- getColumnBy = (args) => {
1405
- if (args.title) {
1406
- return this.getColumnByTitle(args.title);
1407
- }
1408
- return this.getColumnByName(args.name);
1409
- };
1410
- getRowByIndex(index) {
1411
- return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1412
- }
1413
- getColumnByIndex(index) {
1414
- return new Column({
1415
- parentCssSelector: this.getFullCssSelector(),
1416
- driver: this.driver,
1417
- index
1418
- });
1419
- }
1420
- getColumnByTitle = (title) => {
1421
- return new Column({
1422
- parentCssSelector: this.getFullCssSelector(),
1423
- headerCssSelector: this.headerCssSelector,
1424
- caption: title,
1425
- driver: this.driver
1426
- });
1427
- };
1428
- getColumnByName = (name) => {
1429
- return new Column({
1430
- parentCssSelector: this.getFullCssSelector(),
1431
- headerCssSelector: this.headerCssSelector,
1432
- name,
2452
+ // src/index.ts
2453
+ var src_exports = {};
2454
+ __export(src_exports, {
2455
+ AbstractPage: () => AbstractPage,
2456
+ ControlClass: () => ControlClass,
2457
+ Dialog: () => Dialog,
2458
+ FilterPanel: () => FilterPanel,
2459
+ FormEdit: () => FormEdit,
2460
+ FormField: () => FormField,
2461
+ FormFilterField: () => FormFilterField,
2462
+ ListForm: () => ListForm,
2463
+ LoginPage: () => LoginPage,
2464
+ NumberEditor: () => NumberEditor,
2465
+ PanelFilterField: () => PanelFilterField,
2466
+ ReportForm: () => ReportForm,
2467
+ SubsystemsPanel: () => SubsystemsPanel,
2468
+ TextEditor: () => TextEditor,
2469
+ TreeView: () => TreeView,
2470
+ byTestId: () => byTestId,
2471
+ byTestIdCssSelector: () => byTestIdCssSelector,
2472
+ click: () => click,
2473
+ config: () => config,
2474
+ createDriver: () => createDriver,
2475
+ editorFactory: () => editorFactory,
2476
+ elementIsNotPresent: () => elementIsNotPresent,
2477
+ readonlyLocator: () => readonlyLocator,
2478
+ signIn: () => signIn,
2479
+ wait: () => wait,
2480
+ waitElementIsVisible: () => waitElementIsVisible
2481
+ });
2482
+ module.exports = __toCommonJS(src_exports);
2483
+ init_config();
2484
+
2485
+ // src/pageObjects/pages/LoginPage.ts
2486
+ init_AbstractPage();
2487
+ init_config();
2488
+ init_waitElementIsVisible();
2489
+ init_actions();
2490
+ init_locators();
2491
+ var LOGIN_PATH = "/login";
2492
+ var LoginPage = class extends AbstractPage {
2493
+ usernameField = byTestId("loginField", "input");
2494
+ passwordField = byTestId("passwordField", "input");
2495
+ loginButton = byTestId("loginButton");
2496
+ async locate() {
2497
+ await super.locate();
2498
+ const login = await this.driver.findElement(this.usernameField);
2499
+ await waitElementIsVisible({
2500
+ element: login,
1433
2501
  driver: this.driver
1434
2502
  });
1435
- };
1436
- selectRowByIndex(index) {
1437
- return this.getRowByIndex(index).select();
1438
- }
1439
- async getRows() {
1440
- const rows = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1441
- const result = [];
1442
- rows.forEach((_, index) => {
1443
- const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1444
- result.push(newRow);
1445
- });
1446
- return result;
1447
- }
1448
- async getColumns() {
1449
- const columns = await this.driver.findElements(
1450
- import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1451
- );
1452
- const result = [];
1453
- columns.forEach((_, index) => {
1454
- const newCol = new Column({
1455
- parentCssSelector: this.getFullCssSelector(),
1456
- index,
1457
- driver: this.driver
1458
- });
1459
- result.push(newCol);
1460
- });
1461
- return result;
1462
2503
  }
1463
- element() {
1464
- return this.getElement();
2504
+ get path() {
2505
+ return LOGIN_PATH;
1465
2506
  }
1466
- /**
1467
- * Находит поле когда форма находится в состоянии редактирования
1468
- * @example
1469
- * const form = new MyForm();
1470
- * //...
1471
- * expect(await form.field('Name').getValue()).toBe('test value');
1472
- */
1473
- field(name) {
1474
- return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
2507
+ async enterUsername(username) {
2508
+ await this.driver.findElement(this.usernameField).sendKeys(username);
1475
2509
  }
1476
- };
1477
-
1478
- // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
1479
- var ToolbarGroupButton = class extends AbstractButton {
1480
- name;
1481
- constructor(parentCssSelector, name, driver) {
1482
- super(parentCssSelector, ``, driver);
1483
- this.name = name;
2510
+ async enterPassword(password) {
2511
+ await this.driver.findElement(this.passwordField).sendKeys(password);
1484
2512
  }
1485
- buttonNotDisplayedError() {
1486
- return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
2513
+ async clickLoginButton() {
2514
+ await click(await this.driver.findElement(this.loginButton), this.driver);
1487
2515
  }
1488
- };
1489
-
1490
- // src/pageObjects/elements/TableToolbar/ToolbarButton.ts
1491
- var TOOLBAR_BUTTON_CLASS = "toolbar-button";
1492
- var ToolbarButton = class extends AbstractButton {
1493
- name;
1494
- constructor(parentCssSelector, name, driver) {
1495
- super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
1496
- this.name = name;
2516
+ async loginWith(username, password) {
2517
+ await this.enterUsername(username);
2518
+ await this.enterPassword(password);
2519
+ await this.clickLoginButton();
1497
2520
  }
1498
- buttonNotDisplayedError() {
1499
- return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
2521
+ async authorize() {
2522
+ await this.loginWith(config().auth.login, config().auth.password);
1500
2523
  }
1501
2524
  };
1502
2525
 
1503
- // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1504
- var import_selenium_webdriver23 = require("selenium-webdriver");
2526
+ // src/index.ts
2527
+ init_locators();
1505
2528
 
1506
- // src/utils/typesUtil.ts
1507
- var types = {
1508
- "[object Array]": "array",
1509
- "[object Date]": "date",
1510
- "[object Object]": "object",
1511
- "[object String]": "string",
1512
- "[object Null]": "null"
1513
- };
1514
- var type = function(object) {
1515
- const typeOfObject = Object.prototype.toString.call(object);
1516
- return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
1517
- };
1518
- var isArray = function(value) {
1519
- return type(value) === "array";
1520
- };
1521
- var isString = function(object) {
1522
- return typeof object === "string";
2529
+ // src/utils/createDriver.ts
2530
+ var import_selenium_webdriver4 = require("selenium-webdriver");
2531
+ init_config();
2532
+ var createDriver = async (browser) => {
2533
+ const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
2534
+ const manage = driver.manage();
2535
+ await manage.setTimeouts({ implicit: config().timeout });
2536
+ await manage.window().maximize();
2537
+ return driver;
1523
2538
  };
1524
2539
 
1525
- // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1526
- var SPINDOWN_CLASS = ".dx-icon-spindown";
1527
- var buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
1528
- var getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
1529
- var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-menu-item-text") and contains(text(), "${text}")]`;
1530
- var ToolbarMenu = class extends AbstractElementWithParent {
1531
- _formName;
1532
- constructor(parentCssSelector, formName, name, driver) {
1533
- super(parentCssSelector, getFullCssSelector(formName, name), driver);
1534
- this._formName = formName;
1535
- }
1536
- async toggle() {
1537
- const dropdown = await this.getElement();
1538
- await click(dropdown, this.driver);
1539
- }
1540
- getCssSelectorToButton(name) {
1541
- return byTestId(`ftb-${this._formName}-${name}`);
1542
- }
1543
- buttonNotDisplayedError(name) {
1544
- return `Toolbar menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
1545
- }
1546
- async goToButton(name, selector) {
1547
- const toolbarMenuItem = this.driver.findElement(selector);
1548
- await waitElementIsClickable({
1549
- element: toolbarMenuItem,
1550
- errorMessage: this.buttonNotDisplayedError(name),
1551
- driver: this.driver
1552
- });
1553
- await click(toolbarMenuItem, this.driver);
1554
- }
1555
- async clickButton(name) {
1556
- await this.toggle();
1557
- if (isString(name)) {
1558
- const selector = this.getCssSelectorToButton(name);
1559
- await this.goToButton(name, selector);
1560
- }
1561
- if (isArray(name)) {
1562
- for (let n of name) {
1563
- const selector = this.getCssSelectorToButton(n);
1564
- await this.goToButton(n, selector);
1565
- }
1566
- }
1567
- }
1568
- async clickButtonByTitle(title) {
1569
- await this.toggle();
1570
- if (isString(title)) {
1571
- const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(title));
1572
- await this.goToButton(title, selector);
1573
- }
1574
- if (isArray(title)) {
1575
- for (let t of title) {
1576
- const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(t));
1577
- await this.goToButton(t, selector);
1578
- }
1579
- }
1580
- }
2540
+ // src/utils/elementIsNotPresent.ts
2541
+ var import_selenium_webdriver5 = require("selenium-webdriver");
2542
+ var elementIsNotPresent = function elementIsNotPresent2(locator) {
2543
+ return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
2544
+ const elements = await driver.findElements(locator);
2545
+ return elements.length == 0;
2546
+ });
1581
2547
  };
1582
2548
 
1583
- // src/pageObjects/elements/TableToolbar/ToolbarItem.ts
1584
- var GROUP_BUTTON_CLASS = "toolbar-group-button";
1585
- var toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
1586
- var ToolbarItem = class extends AbstractElementWithParent {
1587
- _button;
1588
- _formName;
1589
- _itemName;
1590
- constructor(parentCssSelector, formName, itemName, driver) {
1591
- super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
1592
- this._itemName = itemName;
1593
- this._formName = formName;
1594
- }
1595
- async init() {
1596
- if (this._button)
1597
- return this._button;
1598
- const classNames = await this.getClasses();
1599
- if (classNames.includes(GROUP_BUTTON_CLASS)) {
1600
- this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
1601
- return;
1602
- }
1603
- this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
1604
- }
1605
- async click() {
1606
- await this.init();
1607
- await this._button.click();
1608
- }
1609
- async isDisabled() {
1610
- await this.init();
1611
- return await this._button.isDisabled();
1612
- }
1613
- get menu() {
1614
- return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
1615
- }
1616
- };
2549
+ // src/index.ts
2550
+ init_waitElementIsVisible();
2551
+ init_wait();
1617
2552
 
1618
- // src/pageObjects/elements/TableToolbar/FormToolbar.ts
1619
- var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
1620
- var FormToolbar = class extends AbstractElementWithParent {
1621
- formName;
1622
- constructor(parentCssSelector, formName, driver) {
1623
- super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
1624
- this.formName = formName;
1625
- }
1626
- button(name) {
1627
- return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
1628
- }
1629
- };
2553
+ // src/utils/signIn.ts
2554
+ init_config();
2555
+ async function signIn(driver) {
2556
+ const webDriver = driver ?? await createDriver();
2557
+ config().driver = webDriver;
2558
+ const loginPage = new LoginPage(webDriver);
2559
+ await loginPage.locate();
2560
+ await loginPage.authorize();
2561
+ return webDriver;
2562
+ }
1630
2563
 
1631
- // src/pageObjects/elements/Filters/FormFilterField.ts
1632
- var FormFilterField = class extends AbstractEditor {
1633
- constructor(parentCssSelector, formName, name, driver) {
1634
- super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
1635
- }
1636
- /**
1637
- * Возвращает значение в поле
1638
- * @example
1639
- * expect(await form.formFilter('NumberFld').getValue()).toBe(10);
1640
- * expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
1641
- */
1642
- async getValue() {
1643
- return super.getValue();
1644
- }
1645
- /**
1646
- * Устанавливает значение в поле
1647
- * @example
1648
- * await form.formFilter('NumberFld').setValue(123);
1649
- * await form.formFilter('TextFld').setValue('TestValue');
1650
- */
1651
- async setValue(value) {
1652
- return super.setValue(value);
1653
- }
1654
- /**
1655
- * Очищает значение в поле
1656
- * @example
1657
- * await form.formFilter('NumberFld').clear();
1658
- */
1659
- async clear() {
1660
- return super.clear();
1661
- }
1662
- /**
1663
- * Удаляет тег по переданному тексту
1664
- * @example
1665
- * await form.formFilter('TagBox').remove('test');
1666
- */
1667
- async remove(itemText) {
1668
- return super.remove(itemText);
1669
- }
1670
- };
2564
+ // src/index.ts
2565
+ init_actions();
2566
+ init_AbstractPage();
1671
2567
 
1672
- // src/pageObjects/elements/Filters/FilterPanel.ts
1673
- var import_selenium_webdriver24 = require("selenium-webdriver");
2568
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2569
+ init_AbstractElement();
1674
2570
 
1675
- // src/pageObjects/elements/Filters/PanelFilterField.ts
1676
- var PanelFilterField = class extends AbstractEditor {
1677
- constructor(parentCssSelector, formName, name, driver) {
1678
- super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
1679
- }
1680
- /**
1681
- * Возвращает значение в поле
1682
- * @example
1683
- * expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
1684
- * expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
1685
- */
1686
- async getValue() {
1687
- return super.getValue();
1688
- }
1689
- /**
1690
- * Устанавливает значение в поле
1691
- * @example
1692
- * await form.filterPanel.filterField('NumberFld').setValue(123);
1693
- * await form.filterPanel.filterField('TextFld').setValue('TestValue');
1694
- */
1695
- async setValue(value) {
1696
- return super.setValue(value);
1697
- }
1698
- /**
1699
- * Очищает значение в поле
1700
- * @example
1701
- * await form.filterPanel.filterField('NumberFld').clear();
1702
- */
1703
- async clear() {
1704
- return super.clear();
1705
- }
1706
- /**
1707
- * Удаляет тег по переданному тексту
1708
- * @example
1709
- * await form.filterPanel.filterField('TagBox').remove('test');
1710
- */
1711
- async remove(itemText) {
1712
- return super.remove(itemText);
2571
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
2572
+ init_AbstractElementWithParent();
2573
+ var import_selenium_webdriver6 = require("selenium-webdriver");
2574
+ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
2575
+ async title() {
2576
+ return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
1713
2577
  }
1714
2578
  };
1715
2579
 
1716
- // src/pageObjects/elements/Filters/FilterPanel.ts
1717
- var drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
1718
- var FILTER_PANEL_SELECTOR = ".filter-panel";
1719
- var CLOSE_SELECTOR = ".button-close";
1720
- var FilterPanel = class extends AbstractElement {
1721
- _formName;
1722
- get filterPanelSelector() {
1723
- return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
1724
- }
1725
- async filterPanelButtons() {
1726
- const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
1727
- const el = await this.getElement();
1728
- return el.findElements(import_selenium_webdriver24.By.css(selector));
1729
- }
1730
- constructor(formName, driver) {
1731
- super(driver, drawerSelector(formName));
1732
- this._formName = formName;
1733
- }
1734
- /**
1735
- * Возвращает фильтр на панели фильтрации
1736
- * @returns {PanelFilterField}
1737
- * @example
1738
- * await form.filterPanel.filterField('NumberFld');
1739
- */
1740
- filterField(name) {
1741
- return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
1742
- }
1743
- async apply() {
1744
- const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
1745
- await click(btn, this.driver);
1746
- }
1747
- async findButtonByTitle(title) {
1748
- const buttons = await this.filterPanelButtons();
1749
- for (const btn of buttons) {
1750
- if (await btn.getText() === title) {
1751
- return btn;
1752
- }
1753
- }
1754
- }
1755
- async clearAll() {
1756
- const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
1757
- await click(btn, this.driver);
1758
- await this.driver.sleep(300);
2580
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2581
+ init_wait();
2582
+ init_locators();
2583
+ var SubsystemsPanel = class extends AbstractElement {
2584
+ header;
2585
+ constructor(driver) {
2586
+ super(driver);
2587
+ this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
1759
2588
  }
1760
- async close() {
1761
- const btn = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
1762
- await click(btn, this.driver);
2589
+ async headerTitle() {
2590
+ const title = await this.header.title();
2591
+ await wait(async () => await title.getText() != "", this.driver);
2592
+ return title.getText();
1763
2593
  }
1764
2594
  };
1765
2595
 
1766
- // src/pageObjects/elements/Forms/ListForm.ts
1767
- var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1768
- var ListForm = class extends AbstractForm {
1769
- headerCssSelector;
2596
+ // src/index.ts
2597
+ init_FormEdit();
2598
+ init_ListForm();
2599
+ init_TreeView();
2600
+
2601
+ // src/pageObjects/elements/Forms/ReportForm.ts
2602
+ var import_selenium_webdriver26 = require("selenium-webdriver");
2603
+ init_FormEdit();
2604
+ var ReportForm = class extends FormEdit {
1770
2605
  constructor(driver) {
1771
2606
  super(driver);
1772
- this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
1773
- this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
2607
+ this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
2608
+ this.saveButtonBy = import_selenium_webdriver26.By.id("button-apply");
1774
2609
  }
1775
2610
  /**
1776
- * Находит таблицу
2611
+ * Знаходить поле/фільтр у формі репорту за ім'ям
1777
2612
  * @example
1778
- * const listForm = new MyForm();
2613
+ * const formReport = new MyForm();
1779
2614
  * //...
1780
- * expect(listForm.table());
2615
+ * expect(await formReport.filterField('Name').getValue()).toBe('test value');
1781
2616
  */
1782
- table() {
1783
- return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
1784
- }
1785
- /**
1786
- * Находит группу на лист форме по имени
1787
- * @example
1788
- * const formEdit = new MyForm();
1789
- * //...
1790
- * expect(await formEdit.group('Name');
1791
- */
1792
- group(name) {
1793
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
1794
- }
1795
- /**
1796
- * Находит таблицу
1797
- * @example
1798
- * const listForm = new MyForm();
1799
- * //...
1800
- * expect(listForm.toolbarButton());
1801
- */
1802
- toolbarButton(name) {
1803
- const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
1804
- return toolbar.button(name);
1805
- }
1806
- /**
1807
- * Фильтр который расположен на форме
1808
- * @example
1809
- * const listForm = new MyForm();
1810
- * //...
1811
- * expect(listForm.formFilter());
1812
- */
1813
- formFilter(name) {
1814
- return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
1815
- }
1816
- /**
1817
- * Модель панели фильтрации
1818
- * @returns {FilterPanel}
1819
- * @example
1820
- * const listForm = new MyForm();
1821
- * //...
1822
- * expect(listForm.filterPanel());
1823
- */
1824
- get filterPanel() {
1825
- return new FilterPanel(this.formName, this.driver);
2617
+ filterField(name) {
2618
+ return super.field(name);
1826
2619
  }
1827
2620
  };
1828
2621
 
1829
- // src/pageObjects/elements/Forms/TreeView.ts
1830
- var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
1831
- var TreeView = class extends ListForm {
1832
- constructor(driver) {
1833
- super(driver);
1834
- this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
1835
- this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
1836
- }
1837
- };
2622
+ // src/index.ts
2623
+ init_Editors();
2624
+ init_FormField();
2625
+ init_FormFilterField();
2626
+ init_PanelFilterField();
2627
+ init_FilterPanel();
1838
2628
 
1839
2629
  // src/pageObjects/elements/Dialog.ts
1840
- var import_selenium_webdriver25 = require("selenium-webdriver");
2630
+ init_AbstractElement();
2631
+ var import_selenium_webdriver27 = require("selenium-webdriver");
2632
+ init_AbstractButton();
1841
2633
  var DIALOG_CLASS = ".d5-dialog";
1842
2634
  var DIALOG_TITLE_CLASS = ".dialog__title";
1843
2635
  var DIALOG_TEXT_CLASS = ".dialog__text";
@@ -1851,7 +2643,7 @@ var DialogButton = class extends AbstractButton {
1851
2643
  }
1852
2644
  async getElement() {
1853
2645
  const panel = await super.getElement();
1854
- return panel.findElement(import_selenium_webdriver25.By.xpath(buttonByTextXpath2(this.text)));
2646
+ return panel.findElement(import_selenium_webdriver27.By.xpath(buttonByTextXpath2(this.text)));
1855
2647
  }
1856
2648
  buttonNotDisplayedError() {
1857
2649
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -1871,11 +2663,11 @@ var Dialog = class extends AbstractElement {
1871
2663
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
1872
2664
  }
1873
2665
  async title() {
1874
- const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.titleSelector));
2666
+ const el = await this.driver.findElement(import_selenium_webdriver27.By.css(this.titleSelector));
1875
2667
  return await el.getText();
1876
2668
  }
1877
2669
  async text() {
1878
- const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.textSelector));
2670
+ const el = await this.driver.findElement(import_selenium_webdriver27.By.css(this.textSelector));
1879
2671
  return await el.getText();
1880
2672
  }
1881
2673
  button(text) {
@@ -1895,6 +2687,7 @@ var Dialog = class extends AbstractElement {
1895
2687
  LoginPage,
1896
2688
  NumberEditor,
1897
2689
  PanelFilterField,
2690
+ ReportForm,
1898
2691
  SubsystemsPanel,
1899
2692
  TextEditor,
1900
2693
  TreeView,