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