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