d5-testing-library 1.3.1 → 1.4.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.
- package/dist/cjs/d5-testing-library.cjs +404 -143
- package/dist/d5-testing-library.d.ts +55 -22
- package/dist/d5-testing-library.legacy-esm.js +401 -142
- package/dist/d5-testing-library.mjs +401 -142
- package/package.json +1 -1
|
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
AbstractPage: () => AbstractPage,
|
|
34
|
+
ControlClass: () => ControlClass,
|
|
34
35
|
Dialog: () => Dialog,
|
|
35
36
|
FilterPanel: () => FilterPanel,
|
|
36
37
|
FormEdit: () => FormEdit,
|
|
@@ -42,6 +43,7 @@ __export(src_exports, {
|
|
|
42
43
|
PanelFilterField: () => PanelFilterField,
|
|
43
44
|
SubsystemsPanel: () => SubsystemsPanel,
|
|
44
45
|
TextEditor: () => TextEditor,
|
|
46
|
+
TreeView: () => TreeView,
|
|
45
47
|
byTestId: () => byTestId,
|
|
46
48
|
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
47
49
|
click: () => click,
|
|
@@ -186,6 +188,9 @@ var AbstractPage = class extends AbstractElement {
|
|
|
186
188
|
// src/utils/actions.ts
|
|
187
189
|
var click = async (webElement, driver) => {
|
|
188
190
|
driver = driver ?? config().driver;
|
|
191
|
+
if (!await webElement.isDisplayed()) {
|
|
192
|
+
await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
|
|
193
|
+
}
|
|
189
194
|
const actions = driver.actions({ async: true });
|
|
190
195
|
await actions.move({ origin: webElement }).click().perform();
|
|
191
196
|
};
|
|
@@ -311,7 +316,95 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
311
316
|
};
|
|
312
317
|
|
|
313
318
|
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
319
|
+
var import_selenium_webdriver8 = require("selenium-webdriver");
|
|
320
|
+
|
|
321
|
+
// src/utils/createDataTestId.ts
|
|
322
|
+
function createDataTestId(formName, itemType, itemName) {
|
|
323
|
+
return `${formName}-${itemType}-${itemName}`;
|
|
324
|
+
}
|
|
325
|
+
function createFieldTestId(formName, itemName) {
|
|
326
|
+
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
327
|
+
}
|
|
328
|
+
function createGroupTestId(formName, itemName) {
|
|
329
|
+
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
330
|
+
}
|
|
331
|
+
function createFilterTestId(formName, itemName, layout) {
|
|
332
|
+
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
333
|
+
}
|
|
334
|
+
function createDocFilterTestId(formName, itemName) {
|
|
335
|
+
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
336
|
+
}
|
|
337
|
+
function createLayoutFilterTestId(formName, itemName) {
|
|
338
|
+
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
339
|
+
}
|
|
340
|
+
function createTableId(formName) {
|
|
341
|
+
return `${"table" /* TABLE */}-${formName}`;
|
|
342
|
+
}
|
|
343
|
+
function createFormButtonTestId(formName, itemName) {
|
|
344
|
+
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// src/utils/waitElementIsClickable.ts
|
|
348
|
+
async function waitElementIsClickable({
|
|
349
|
+
element,
|
|
350
|
+
timeout,
|
|
351
|
+
errorMessage,
|
|
352
|
+
driver
|
|
353
|
+
}) {
|
|
354
|
+
driver = driver ?? config().driver;
|
|
355
|
+
await wait(async () => {
|
|
356
|
+
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
357
|
+
return await element.isDisplayed() && !isDisabled;
|
|
358
|
+
}, driver, errorMessage, timeout ?? config().timeout);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
362
|
+
var AbstractButton = class extends AbstractElementWithParent {
|
|
363
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
364
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
365
|
+
}
|
|
366
|
+
async click() {
|
|
367
|
+
const button = await this.getElement();
|
|
368
|
+
await waitElementIsClickable({
|
|
369
|
+
element: button,
|
|
370
|
+
errorMessage: this.buttonNotDisplayedError(),
|
|
371
|
+
driver: this.driver
|
|
372
|
+
});
|
|
373
|
+
await click(button, this.driver);
|
|
374
|
+
}
|
|
375
|
+
async isDisabled() {
|
|
376
|
+
const button = await this.getElement();
|
|
377
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
314
382
|
var import_selenium_webdriver7 = require("selenium-webdriver");
|
|
383
|
+
var DXButton = class extends AbstractButton {
|
|
384
|
+
async getText() {
|
|
385
|
+
const classes = await this.getClasses();
|
|
386
|
+
if (!classes.includes("dx-button-has-text")) {
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
const el = await this.getElement();
|
|
390
|
+
const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
|
|
391
|
+
return await textEl.getText();
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
// src/pageObjects/elements/FormButton.ts
|
|
396
|
+
var FormButton = class extends DXButton {
|
|
397
|
+
name;
|
|
398
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
399
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
|
|
400
|
+
this.name = name;
|
|
401
|
+
}
|
|
402
|
+
buttonNotDisplayedError() {
|
|
403
|
+
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
315
408
|
var AbstractForm = class extends AbstractPage {
|
|
316
409
|
containerCssSelector = "";
|
|
317
410
|
containerBy;
|
|
@@ -358,42 +451,22 @@ var AbstractForm = class extends AbstractPage {
|
|
|
358
451
|
*/
|
|
359
452
|
async getTitleText() {
|
|
360
453
|
if (await this.isModal()) {
|
|
361
|
-
const titleEl2 = await this.driver.findElement(
|
|
454
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver8.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
362
455
|
return titleEl2.getText();
|
|
363
456
|
}
|
|
364
|
-
let titleEl = await this.driver.findElement(
|
|
457
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver8.By.className("main-toolbar-form-title"));
|
|
365
458
|
return titleEl.getText();
|
|
366
459
|
}
|
|
460
|
+
button(name) {
|
|
461
|
+
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
462
|
+
}
|
|
367
463
|
};
|
|
368
464
|
|
|
369
465
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
370
|
-
var
|
|
371
|
-
|
|
372
|
-
// src/utils/createDataTestId.ts
|
|
373
|
-
function createDataTestId(formName, itemType, itemName) {
|
|
374
|
-
return `${formName}-${itemType}-${itemName}`;
|
|
375
|
-
}
|
|
376
|
-
function createFieldTestId(formName, itemName) {
|
|
377
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
378
|
-
}
|
|
379
|
-
function createGroupTestId(formName, itemName) {
|
|
380
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
381
|
-
}
|
|
382
|
-
function createFilterTestId(formName, itemName, layout) {
|
|
383
|
-
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
384
|
-
}
|
|
385
|
-
function createDocFilterTestId(formName, itemName) {
|
|
386
|
-
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
387
|
-
}
|
|
388
|
-
function createLayoutFilterTestId(formName, itemName) {
|
|
389
|
-
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
390
|
-
}
|
|
391
|
-
function createTableId(formName) {
|
|
392
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
393
|
-
}
|
|
466
|
+
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
394
467
|
|
|
395
468
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
396
|
-
var
|
|
469
|
+
var import_selenium_webdriver9 = require("selenium-webdriver");
|
|
397
470
|
|
|
398
471
|
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
399
472
|
var InputClearStrategy = class {
|
|
@@ -413,7 +486,7 @@ var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
|
413
486
|
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
414
487
|
}
|
|
415
488
|
async getInputElement() {
|
|
416
|
-
return this.driver.findElement(
|
|
489
|
+
return this.driver.findElement(import_selenium_webdriver9.By.css(this.getInputCssSelector()));
|
|
417
490
|
}
|
|
418
491
|
async getInputValue() {
|
|
419
492
|
const inputEl = await this.getInputElement();
|
|
@@ -422,7 +495,7 @@ var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
|
422
495
|
async setInputValue(value) {
|
|
423
496
|
const inputEl = await this.getInputElement();
|
|
424
497
|
await click(inputEl, this.driver);
|
|
425
|
-
await inputEl.sendKeys(value,
|
|
498
|
+
await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
|
|
426
499
|
}
|
|
427
500
|
async clear() {
|
|
428
501
|
await this.clearStrategy.clear(this);
|
|
@@ -458,6 +531,22 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
|
458
531
|
}
|
|
459
532
|
};
|
|
460
533
|
|
|
534
|
+
// src/pageObjects/elements/Editors/types.ts
|
|
535
|
+
var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
536
|
+
ControlClass2["Text"] = "text-control";
|
|
537
|
+
ControlClass2["TextArea"] = "text-area-control";
|
|
538
|
+
ControlClass2["Number"] = "number-control";
|
|
539
|
+
ControlClass2["CheckBox"] = "check-box";
|
|
540
|
+
ControlClass2["Multiselect"] = "multi-select-control";
|
|
541
|
+
ControlClass2["Select"] = "select-control";
|
|
542
|
+
ControlClass2["Switch"] = "switch-control";
|
|
543
|
+
ControlClass2["Date"] = "date-control";
|
|
544
|
+
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
545
|
+
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
546
|
+
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
547
|
+
return ControlClass2;
|
|
548
|
+
})(ControlClass || {});
|
|
549
|
+
|
|
461
550
|
// src/pageObjects/AbstractFormElement.ts
|
|
462
551
|
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
463
552
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
@@ -485,20 +574,17 @@ var CheckBox = class extends AbstractElementWithParent {
|
|
|
485
574
|
};
|
|
486
575
|
|
|
487
576
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
488
|
-
var
|
|
577
|
+
var import_selenium_webdriver11 = require("selenium-webdriver");
|
|
489
578
|
|
|
490
579
|
// src/utils/xpathHelper.ts
|
|
491
580
|
var XPathHelper = class {
|
|
492
|
-
static getRoleXpath(role) {
|
|
493
|
-
return `//div[@role='${role}']`;
|
|
494
|
-
}
|
|
495
581
|
static getClassAndValueXpath(cssClass, value) {
|
|
496
|
-
return
|
|
582
|
+
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
497
583
|
}
|
|
498
584
|
};
|
|
499
585
|
|
|
500
586
|
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
501
|
-
var
|
|
587
|
+
var import_selenium_webdriver10 = require("selenium-webdriver");
|
|
502
588
|
var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
503
589
|
var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
504
590
|
var ClearButtonStrategy = class {
|
|
@@ -509,7 +595,7 @@ var ClearButtonStrategy = class {
|
|
|
509
595
|
this._driver = driver;
|
|
510
596
|
}
|
|
511
597
|
async isEmptyEditorField() {
|
|
512
|
-
const editorContainer = await this._driver.findElement(
|
|
598
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver10.By.css(this.editorContainerClass));
|
|
513
599
|
const classAttribute = await editorContainer.getAttribute("class");
|
|
514
600
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
515
601
|
}
|
|
@@ -518,18 +604,31 @@ var ClearButtonStrategy = class {
|
|
|
518
604
|
throw new Error("This field is already empty");
|
|
519
605
|
}
|
|
520
606
|
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
521
|
-
const clearBtn = await this._driver.findElement(
|
|
607
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver10.By.css(clearBtnSelector));
|
|
522
608
|
await click(clearBtn, this._driver);
|
|
523
609
|
}
|
|
524
610
|
};
|
|
525
611
|
|
|
526
612
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
527
613
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
528
|
-
var
|
|
529
|
-
var
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
614
|
+
var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
615
|
+
var dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
616
|
+
const { implicit } = await driver.manage().getTimeouts();
|
|
617
|
+
let optElement = null;
|
|
618
|
+
const timeout = delay ? implicit : 200;
|
|
619
|
+
let err = null;
|
|
620
|
+
try {
|
|
621
|
+
await driver.manage().setTimeouts({ implicit: timeout });
|
|
622
|
+
optElement = await driver.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(optionValue)));
|
|
623
|
+
await click(optElement, driver);
|
|
624
|
+
} catch (e) {
|
|
625
|
+
err = new Error(`Item not found: "${optionValue}"`);
|
|
626
|
+
} finally {
|
|
627
|
+
await driver.manage().setTimeouts({ implicit });
|
|
628
|
+
}
|
|
629
|
+
if (err)
|
|
630
|
+
throw err;
|
|
631
|
+
};
|
|
533
632
|
var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
534
633
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
535
634
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -538,9 +637,12 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
|
538
637
|
async setSelectInputValue(value) {
|
|
539
638
|
const inputEl = await this.getInputElement();
|
|
540
639
|
await click(inputEl, this.driver);
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
640
|
+
try {
|
|
641
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
642
|
+
} catch {
|
|
643
|
+
await inputEl.sendKeys(value, import_selenium_webdriver11.Key.ENTER);
|
|
644
|
+
await dropDownOptionClick(value, this.driver);
|
|
645
|
+
}
|
|
544
646
|
}
|
|
545
647
|
async getValue() {
|
|
546
648
|
const value = await super.getInputValue();
|
|
@@ -579,7 +681,7 @@ var SwitchEditor = class extends AbstractElementWithParent {
|
|
|
579
681
|
};
|
|
580
682
|
|
|
581
683
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
582
|
-
var
|
|
684
|
+
var import_selenium_webdriver12 = require("selenium-webdriver");
|
|
583
685
|
var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
584
686
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
585
687
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
@@ -600,27 +702,32 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
600
702
|
await this.confirmSelection();
|
|
601
703
|
}
|
|
602
704
|
async waitOptionSelection() {
|
|
603
|
-
const option = await this.driver.findElement(
|
|
705
|
+
const option = await this.driver.findElement(import_selenium_webdriver12.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
|
|
604
706
|
await wait(() => option.isDisplayed(), this.driver);
|
|
605
707
|
}
|
|
606
708
|
async selectOption(inputEl, value, lastElement) {
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
709
|
+
try {
|
|
710
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
711
|
+
} catch {
|
|
712
|
+
await inputEl.sendKeys(value);
|
|
713
|
+
await dropDownOptionClick(value, this.driver);
|
|
714
|
+
}
|
|
610
715
|
await this.waitOptionSelection();
|
|
611
716
|
if (value !== lastElement) {
|
|
612
717
|
await inputEl.clear();
|
|
613
718
|
}
|
|
614
719
|
}
|
|
615
720
|
async confirmSelection() {
|
|
616
|
-
const btnOk = await this.driver.findElement(
|
|
721
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(BTN_OK_SELECTOR));
|
|
617
722
|
await click(btnOk, this.driver);
|
|
618
723
|
}
|
|
619
724
|
async getTagBoxInputValue() {
|
|
620
725
|
if (await this.isTagBoxEmpty()) {
|
|
621
726
|
return [];
|
|
622
727
|
}
|
|
623
|
-
const tags = await this.driver.findElements(
|
|
728
|
+
const tags = await this.driver.findElements(
|
|
729
|
+
import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
|
|
730
|
+
);
|
|
624
731
|
const values = [];
|
|
625
732
|
for (const tag of tags) {
|
|
626
733
|
values.push(await tag.getAttribute("textContent"));
|
|
@@ -648,24 +755,26 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
648
755
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
649
756
|
}
|
|
650
757
|
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
651
|
-
const clearBtn = await this.driver.findElement(
|
|
758
|
+
const clearBtn = await this.driver.findElement(
|
|
759
|
+
import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
760
|
+
);
|
|
652
761
|
await click(clearBtn, this.driver);
|
|
653
762
|
}
|
|
654
763
|
};
|
|
655
764
|
|
|
656
765
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
657
|
-
var
|
|
766
|
+
var import_selenium_webdriver13 = require("selenium-webdriver");
|
|
658
767
|
var ITEM_CLASS = "dx-buttongroup-item";
|
|
659
768
|
var SELECTED_CLASS = "dx-state-selected";
|
|
660
769
|
var ButtonGroup = class extends AbstractElementWithParent {
|
|
661
770
|
getItems() {
|
|
662
|
-
return this.driver.findElements(
|
|
771
|
+
return this.driver.findElements(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
663
772
|
}
|
|
664
773
|
getDataValue(el) {
|
|
665
774
|
return el.getAttribute("data-value");
|
|
666
775
|
}
|
|
667
776
|
async getValue() {
|
|
668
|
-
const selectedEl = await this.driver.findElement(
|
|
777
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
669
778
|
return this.getDataValue(selectedEl);
|
|
670
779
|
}
|
|
671
780
|
async setValue(value) {
|
|
@@ -698,26 +807,67 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
698
807
|
}
|
|
699
808
|
};
|
|
700
809
|
|
|
701
|
-
// src/pageObjects/elements/Editors/
|
|
702
|
-
var
|
|
703
|
-
|
|
810
|
+
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
811
|
+
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
812
|
+
|
|
813
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
814
|
+
var import_selenium_webdriver14 = require("selenium-webdriver");
|
|
815
|
+
|
|
816
|
+
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
817
|
+
var formatDMYDate = (date) => {
|
|
818
|
+
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
819
|
+
return `${day}${month}${year}`;
|
|
820
|
+
};
|
|
821
|
+
|
|
822
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
823
|
+
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
824
|
+
var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
825
|
+
var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
826
|
+
var BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
827
|
+
var BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
704
828
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
705
829
|
super(parentCssSelector, elementCssSelector, driver);
|
|
706
830
|
this.setClearStrategy(new InputClearStrategy());
|
|
707
831
|
}
|
|
708
|
-
async getDateElement() {
|
|
709
|
-
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
710
|
-
}
|
|
711
832
|
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
833
|
const actions = this.driver.actions({ async: true });
|
|
719
|
-
|
|
720
|
-
|
|
834
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver14.By.css(`${this.getFullCssSelector()}`));
|
|
835
|
+
const dateFieldDataTestID = await this.getDataTestId();
|
|
836
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
837
|
+
const dateInputEl = await this.getInputElement();
|
|
838
|
+
await dateInputEl.clear();
|
|
839
|
+
if (Array.isArray(value)) {
|
|
840
|
+
const formattedDates = value.map(formatDMYDate);
|
|
841
|
+
const button = await dateField.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
842
|
+
await button.click();
|
|
843
|
+
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver14.By.css(calendarPopoverSelector));
|
|
844
|
+
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
845
|
+
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver14.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
846
|
+
await dateFromInput.click();
|
|
847
|
+
await dateFromInput.sendKeys(formattedDates[0]);
|
|
848
|
+
await dateToInput.click();
|
|
849
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
|
|
850
|
+
await dateToInput.sendKeys(formattedDates[1]);
|
|
851
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.ENTER).perform();
|
|
852
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver14.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
853
|
+
await btnOk.click();
|
|
854
|
+
} else {
|
|
855
|
+
const formattedDate = formatDMYDate(value);
|
|
856
|
+
await click(dateInputEl, this.driver);
|
|
857
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver14.Key.HOME).perform();
|
|
858
|
+
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver14.Key.ENTER).perform();
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
};
|
|
862
|
+
|
|
863
|
+
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
864
|
+
var SingleDateEditor = class extends BaseDateEditor {
|
|
865
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
866
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
867
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
868
|
+
}
|
|
869
|
+
async getDateElement() {
|
|
870
|
+
return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
721
871
|
}
|
|
722
872
|
async getDateValue() {
|
|
723
873
|
const inputEl = await this.getDateElement();
|
|
@@ -735,27 +885,105 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
735
885
|
}
|
|
736
886
|
};
|
|
737
887
|
|
|
888
|
+
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
889
|
+
var import_selenium_webdriver16 = require("selenium-webdriver");
|
|
890
|
+
var DateRangeEditor = class extends BaseDateEditor {
|
|
891
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
892
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
893
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
894
|
+
}
|
|
895
|
+
async getDateElement() {
|
|
896
|
+
return this.driver.findElement(import_selenium_webdriver16.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
897
|
+
}
|
|
898
|
+
async getDateValue() {
|
|
899
|
+
const inputEl = await this.getDateElement();
|
|
900
|
+
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
901
|
+
const dateToStr = await inputEl.getAttribute("dateto");
|
|
902
|
+
const dateFrom = new Date(dateFromStr);
|
|
903
|
+
const dateTo = new Date(dateToStr);
|
|
904
|
+
return [dateFrom, dateTo];
|
|
905
|
+
}
|
|
906
|
+
async getValue() {
|
|
907
|
+
const values = await this.getDateValue();
|
|
908
|
+
return !values.length ? null : values;
|
|
909
|
+
}
|
|
910
|
+
setValue(value) {
|
|
911
|
+
if (typeof value === "object") {
|
|
912
|
+
return this.setDateValue(value);
|
|
913
|
+
}
|
|
914
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
915
|
+
}
|
|
916
|
+
};
|
|
917
|
+
|
|
918
|
+
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
919
|
+
var DateEditor = class extends AbstractDXEditorWithInput {
|
|
920
|
+
editorInstance = null;
|
|
921
|
+
initPromise;
|
|
922
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
923
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
924
|
+
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
925
|
+
}
|
|
926
|
+
async init(parentCssSelector, elementCssSelector, driver) {
|
|
927
|
+
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
928
|
+
}
|
|
929
|
+
async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
|
|
930
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
931
|
+
const classString = await elementInstance.getClasses();
|
|
932
|
+
switch (true) {
|
|
933
|
+
case classString.includes("date-control" /* Date */):
|
|
934
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
935
|
+
break;
|
|
936
|
+
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
937
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
938
|
+
break;
|
|
939
|
+
default:
|
|
940
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
async ensureInitialized() {
|
|
944
|
+
if (!this.editorInstance) {
|
|
945
|
+
await this.initPromise;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
async setValue(value) {
|
|
949
|
+
await this.ensureInitialized();
|
|
950
|
+
if (this.editorInstance) {
|
|
951
|
+
await this.editorInstance.setValue(value);
|
|
952
|
+
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
953
|
+
}
|
|
954
|
+
throw new Error("Editor instance is not initialized.");
|
|
955
|
+
}
|
|
956
|
+
async getValue() {
|
|
957
|
+
await this.ensureInitialized();
|
|
958
|
+
if (this.editorInstance) {
|
|
959
|
+
return this.editorInstance.getValue();
|
|
960
|
+
}
|
|
961
|
+
throw new Error("Editor instance is not initialized.");
|
|
962
|
+
}
|
|
963
|
+
};
|
|
964
|
+
|
|
738
965
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
739
966
|
var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
740
967
|
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
741
968
|
const classSting = await elementInstance.getClasses();
|
|
742
|
-
if (classSting.includes("text-control"))
|
|
969
|
+
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
743
970
|
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
744
|
-
if (classSting.includes("number-control"))
|
|
971
|
+
if (classSting.includes("number-control" /* Number */))
|
|
745
972
|
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
746
|
-
if (classSting.includes("check-box"))
|
|
973
|
+
if (classSting.includes("check-box" /* CheckBox */))
|
|
747
974
|
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
748
|
-
if (classSting.includes("multi-select-control"))
|
|
975
|
+
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
749
976
|
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
750
|
-
if (classSting.includes("select-control"))
|
|
977
|
+
if (classSting.includes("select-control" /* Select */))
|
|
751
978
|
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
752
|
-
if (classSting.includes("switch-control"))
|
|
979
|
+
if (classSting.includes("switch-control" /* Switch */))
|
|
753
980
|
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
754
|
-
if (classSting.includes("date-control"))
|
|
981
|
+
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
755
982
|
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
756
|
-
|
|
983
|
+
}
|
|
984
|
+
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
757
985
|
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
758
|
-
if (classSting.includes("button-group-field"))
|
|
986
|
+
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
759
987
|
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
760
988
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
761
989
|
};
|
|
@@ -883,8 +1111,8 @@ var FormGroup = class extends AbstractElementWithParent {
|
|
|
883
1111
|
|
|
884
1112
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
885
1113
|
var FormEdit = class extends AbstractForm {
|
|
886
|
-
saveButtonBy =
|
|
887
|
-
closeButtonBy =
|
|
1114
|
+
saveButtonBy = import_selenium_webdriver17.By.id("button-save");
|
|
1115
|
+
closeButtonBy = import_selenium_webdriver17.By.id("button-cancel");
|
|
888
1116
|
constructor(driver) {
|
|
889
1117
|
super(driver);
|
|
890
1118
|
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
@@ -947,16 +1175,16 @@ var FormEdit = class extends AbstractForm {
|
|
|
947
1175
|
};
|
|
948
1176
|
|
|
949
1177
|
// src/pageObjects/elements/Table/Table.ts
|
|
950
|
-
var
|
|
1178
|
+
var import_selenium_webdriver22 = require("selenium-webdriver");
|
|
951
1179
|
|
|
952
1180
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
953
|
-
var
|
|
1181
|
+
var import_selenium_webdriver20 = require("selenium-webdriver");
|
|
954
1182
|
|
|
955
1183
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
956
|
-
var
|
|
1184
|
+
var import_selenium_webdriver19 = require("selenium-webdriver");
|
|
957
1185
|
|
|
958
1186
|
// src/pageObjects/elements/Table/utils.ts
|
|
959
|
-
var
|
|
1187
|
+
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
960
1188
|
function getCssRowByIndexSelector(index) {
|
|
961
1189
|
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
962
1190
|
}
|
|
@@ -983,9 +1211,18 @@ var Cell = class extends AbstractElementWithParent {
|
|
|
983
1211
|
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
984
1212
|
}
|
|
985
1213
|
async getBooleanValue(cellEl) {
|
|
986
|
-
const booleanEl = await cellEl.findElement(
|
|
1214
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver19.By.className("boolean-widget"));
|
|
987
1215
|
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
988
1216
|
}
|
|
1217
|
+
async getTagsValue(cellEl) {
|
|
1218
|
+
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
1219
|
+
const tags = await cellEl.findElements(import_selenium_webdriver19.By.css(tagsCssSelector));
|
|
1220
|
+
const values = [];
|
|
1221
|
+
for (const tag of tags) {
|
|
1222
|
+
values.push(await tag.getAttribute("textContent"));
|
|
1223
|
+
}
|
|
1224
|
+
return values;
|
|
1225
|
+
}
|
|
989
1226
|
async getElement() {
|
|
990
1227
|
if (this._index == null) {
|
|
991
1228
|
this.index = await this.getCellIndex();
|
|
@@ -995,9 +1232,10 @@ var Cell = class extends AbstractElementWithParent {
|
|
|
995
1232
|
async getValue() {
|
|
996
1233
|
const cellEl = await this.getElement();
|
|
997
1234
|
const cellElClass = await cellEl.getAttribute("class");
|
|
998
|
-
if (cellElClass.includes("boolean-column"))
|
|
1235
|
+
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
999
1236
|
return this.getBooleanValue(cellEl);
|
|
1000
|
-
|
|
1237
|
+
if (cellElClass.includes("tags-column" /* Tags */))
|
|
1238
|
+
return this.getTagsValue(cellEl);
|
|
1001
1239
|
return cellEl.getText();
|
|
1002
1240
|
}
|
|
1003
1241
|
getIndex() {
|
|
@@ -1018,9 +1256,14 @@ var Row = class extends AbstractElementWithParent {
|
|
|
1018
1256
|
this.getColumnBy = getColumnBy;
|
|
1019
1257
|
}
|
|
1020
1258
|
_getCell({ index, name, title }) {
|
|
1021
|
-
return new Cell(
|
|
1022
|
-
|
|
1023
|
-
|
|
1259
|
+
return new Cell(
|
|
1260
|
+
this.getFullCssSelector(),
|
|
1261
|
+
() => {
|
|
1262
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
1263
|
+
},
|
|
1264
|
+
index,
|
|
1265
|
+
this.driver
|
|
1266
|
+
);
|
|
1024
1267
|
}
|
|
1025
1268
|
getCellByIndex(index) {
|
|
1026
1269
|
return this._getCell({ index });
|
|
@@ -1034,10 +1277,14 @@ var Row = class extends AbstractElementWithParent {
|
|
|
1034
1277
|
async select() {
|
|
1035
1278
|
const rowEl = await this.getElement();
|
|
1036
1279
|
await click(rowEl, this.driver);
|
|
1037
|
-
await wait(
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1280
|
+
await wait(
|
|
1281
|
+
async () => {
|
|
1282
|
+
const classes = await this.getClasses();
|
|
1283
|
+
return classes.includes(DX_SELECTION_CLASS);
|
|
1284
|
+
},
|
|
1285
|
+
this.driver,
|
|
1286
|
+
"Cannot select row"
|
|
1287
|
+
);
|
|
1041
1288
|
}
|
|
1042
1289
|
async isSelected() {
|
|
1043
1290
|
const result = await this.getAttribute("aria-selected");
|
|
@@ -1047,7 +1294,7 @@ var Row = class extends AbstractElementWithParent {
|
|
|
1047
1294
|
return this.index;
|
|
1048
1295
|
}
|
|
1049
1296
|
async getCells() {
|
|
1050
|
-
const cells = await this.driver.findElements(
|
|
1297
|
+
const cells = await this.driver.findElements(import_selenium_webdriver20.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
1051
1298
|
const result = [];
|
|
1052
1299
|
cells.forEach((_, index) => {
|
|
1053
1300
|
const newCell = this.getCellByIndex(index);
|
|
@@ -1057,14 +1304,22 @@ var Row = class extends AbstractElementWithParent {
|
|
|
1057
1304
|
}
|
|
1058
1305
|
async clickInlineButton(buttonClass) {
|
|
1059
1306
|
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(
|
|
1061
|
-
|
|
1307
|
+
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1308
|
+
this.index
|
|
1309
|
+
)}"] .${buttonClass}`;
|
|
1310
|
+
const button = await this.driver.findElement(
|
|
1311
|
+
import_selenium_webdriver20.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
1312
|
+
);
|
|
1062
1313
|
return click(button, this.driver);
|
|
1063
1314
|
}
|
|
1064
1315
|
async checkEditingMode(isEditing, msg) {
|
|
1065
|
-
await wait(
|
|
1066
|
-
|
|
1067
|
-
|
|
1316
|
+
await wait(
|
|
1317
|
+
async () => {
|
|
1318
|
+
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1319
|
+
},
|
|
1320
|
+
this.driver,
|
|
1321
|
+
msg
|
|
1322
|
+
);
|
|
1068
1323
|
}
|
|
1069
1324
|
async edit() {
|
|
1070
1325
|
await this.clickInlineButton("edit");
|
|
@@ -1081,19 +1336,18 @@ var Row = class extends AbstractElementWithParent {
|
|
|
1081
1336
|
};
|
|
1082
1337
|
|
|
1083
1338
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1084
|
-
var
|
|
1085
|
-
var getHeaderCssSelector = () => {
|
|
1086
|
-
return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1087
|
-
};
|
|
1339
|
+
var import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1088
1340
|
var Column = class extends AbstractElementWithParent {
|
|
1089
1341
|
_index;
|
|
1090
1342
|
_caption;
|
|
1091
1343
|
_name;
|
|
1092
|
-
|
|
1344
|
+
headerCssSelector;
|
|
1345
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
1093
1346
|
super(parentCssSelector, "", driver);
|
|
1094
1347
|
this._name = name;
|
|
1095
1348
|
this.index = index;
|
|
1096
1349
|
this._caption = caption;
|
|
1350
|
+
this.headerCssSelector = headerCssSelector;
|
|
1097
1351
|
}
|
|
1098
1352
|
set index(index) {
|
|
1099
1353
|
this._index = index;
|
|
@@ -1107,7 +1361,9 @@ var Column = class extends AbstractElementWithParent {
|
|
|
1107
1361
|
return super.getElement();
|
|
1108
1362
|
}
|
|
1109
1363
|
async getColumnHeaderIndexBy(cssSelector) {
|
|
1110
|
-
const column = await this.driver.findElement(
|
|
1364
|
+
const column = await this.driver.findElement(
|
|
1365
|
+
import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`)
|
|
1366
|
+
);
|
|
1111
1367
|
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1112
1368
|
}
|
|
1113
1369
|
async getIndexByCaption() {
|
|
@@ -1139,9 +1395,11 @@ var Column = class extends AbstractElementWithParent {
|
|
|
1139
1395
|
// src/pageObjects/elements/Table/Table.ts
|
|
1140
1396
|
var Table = class extends AbstractElementWithParent {
|
|
1141
1397
|
formName;
|
|
1142
|
-
|
|
1398
|
+
headerCssSelector;
|
|
1399
|
+
constructor(parentCssSelector, headerCssSelector, formName, driver) {
|
|
1143
1400
|
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
1144
1401
|
this.formName = formName;
|
|
1402
|
+
this.headerCssSelector = headerCssSelector;
|
|
1145
1403
|
}
|
|
1146
1404
|
getColumnBy = (args) => {
|
|
1147
1405
|
if (args.title) {
|
|
@@ -1162,6 +1420,7 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1162
1420
|
getColumnByTitle = (title) => {
|
|
1163
1421
|
return new Column({
|
|
1164
1422
|
parentCssSelector: this.getFullCssSelector(),
|
|
1423
|
+
headerCssSelector: this.headerCssSelector,
|
|
1165
1424
|
caption: title,
|
|
1166
1425
|
driver: this.driver
|
|
1167
1426
|
});
|
|
@@ -1169,6 +1428,7 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1169
1428
|
getColumnByName = (name) => {
|
|
1170
1429
|
return new Column({
|
|
1171
1430
|
parentCssSelector: this.getFullCssSelector(),
|
|
1431
|
+
headerCssSelector: this.headerCssSelector,
|
|
1172
1432
|
name,
|
|
1173
1433
|
driver: this.driver
|
|
1174
1434
|
});
|
|
@@ -1177,7 +1437,7 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1177
1437
|
return this.getRowByIndex(index).select();
|
|
1178
1438
|
}
|
|
1179
1439
|
async getRows() {
|
|
1180
|
-
const rows = await this.driver.findElements(
|
|
1440
|
+
const rows = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1181
1441
|
const result = [];
|
|
1182
1442
|
rows.forEach((_, index) => {
|
|
1183
1443
|
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
@@ -1186,7 +1446,9 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1186
1446
|
return result;
|
|
1187
1447
|
}
|
|
1188
1448
|
async getColumns() {
|
|
1189
|
-
const columns = await this.driver.findElements(
|
|
1449
|
+
const columns = await this.driver.findElements(
|
|
1450
|
+
import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
|
|
1451
|
+
);
|
|
1190
1452
|
const result = [];
|
|
1191
1453
|
columns.forEach((_, index) => {
|
|
1192
1454
|
const newCol = new Column({
|
|
@@ -1213,24 +1475,6 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1213
1475
|
}
|
|
1214
1476
|
};
|
|
1215
1477
|
|
|
1216
|
-
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1217
|
-
var AbstractButton = class extends AbstractElementWithParent {
|
|
1218
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1219
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
1220
|
-
}
|
|
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);
|
|
1227
|
-
}
|
|
1228
|
-
async isDisabled() {
|
|
1229
|
-
const button = await this.getElement();
|
|
1230
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
1231
|
-
}
|
|
1232
|
-
};
|
|
1233
|
-
|
|
1234
1478
|
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
1235
1479
|
var ToolbarGroupButton = class extends AbstractButton {
|
|
1236
1480
|
name;
|
|
@@ -1257,7 +1501,7 @@ var ToolbarButton = class extends AbstractButton {
|
|
|
1257
1501
|
};
|
|
1258
1502
|
|
|
1259
1503
|
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1260
|
-
var
|
|
1504
|
+
var import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1261
1505
|
|
|
1262
1506
|
// src/utils/typesUtil.ts
|
|
1263
1507
|
var types = {
|
|
@@ -1291,7 +1535,7 @@ var ToolbarMenu = class extends AbstractElementWithParent {
|
|
|
1291
1535
|
}
|
|
1292
1536
|
async toggle() {
|
|
1293
1537
|
const dropdown = await this.getElement();
|
|
1294
|
-
await dropdown.
|
|
1538
|
+
await click(dropdown, this.driver);
|
|
1295
1539
|
}
|
|
1296
1540
|
getCssSelectorToButton(name) {
|
|
1297
1541
|
return byTestId(`ftb-${this._formName}-${name}`);
|
|
@@ -1301,9 +1545,11 @@ var ToolbarMenu = class extends AbstractElementWithParent {
|
|
|
1301
1545
|
}
|
|
1302
1546
|
async goToButton(name, selector) {
|
|
1303
1547
|
const toolbarMenuItem = this.driver.findElement(selector);
|
|
1304
|
-
await
|
|
1305
|
-
|
|
1306
|
-
|
|
1548
|
+
await waitElementIsClickable({
|
|
1549
|
+
element: toolbarMenuItem,
|
|
1550
|
+
errorMessage: this.buttonNotDisplayedError(name),
|
|
1551
|
+
driver: this.driver
|
|
1552
|
+
});
|
|
1307
1553
|
await click(toolbarMenuItem, this.driver);
|
|
1308
1554
|
}
|
|
1309
1555
|
async clickButton(name) {
|
|
@@ -1322,12 +1568,12 @@ var ToolbarMenu = class extends AbstractElementWithParent {
|
|
|
1322
1568
|
async clickButtonByTitle(title) {
|
|
1323
1569
|
await this.toggle();
|
|
1324
1570
|
if (isString(title)) {
|
|
1325
|
-
const selector =
|
|
1571
|
+
const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(title));
|
|
1326
1572
|
await this.goToButton(title, selector);
|
|
1327
1573
|
}
|
|
1328
1574
|
if (isArray(title)) {
|
|
1329
1575
|
for (let t of title) {
|
|
1330
|
-
const selector =
|
|
1576
|
+
const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(t));
|
|
1331
1577
|
await this.goToButton(t, selector);
|
|
1332
1578
|
}
|
|
1333
1579
|
}
|
|
@@ -1424,7 +1670,7 @@ var FormFilterField = class extends AbstractEditor {
|
|
|
1424
1670
|
};
|
|
1425
1671
|
|
|
1426
1672
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
1427
|
-
var
|
|
1673
|
+
var import_selenium_webdriver24 = require("selenium-webdriver");
|
|
1428
1674
|
|
|
1429
1675
|
// src/pageObjects/elements/Filters/PanelFilterField.ts
|
|
1430
1676
|
var PanelFilterField = class extends AbstractEditor {
|
|
@@ -1479,7 +1725,7 @@ var FilterPanel = class extends AbstractElement {
|
|
|
1479
1725
|
async filterPanelButtons() {
|
|
1480
1726
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
1481
1727
|
const el = await this.getElement();
|
|
1482
|
-
return el.findElements(
|
|
1728
|
+
return el.findElements(import_selenium_webdriver24.By.css(selector));
|
|
1483
1729
|
}
|
|
1484
1730
|
constructor(formName, driver) {
|
|
1485
1731
|
super(driver, drawerSelector(formName));
|
|
@@ -1512,16 +1758,19 @@ var FilterPanel = class extends AbstractElement {
|
|
|
1512
1758
|
await this.driver.sleep(300);
|
|
1513
1759
|
}
|
|
1514
1760
|
async close() {
|
|
1515
|
-
const btn = await this.driver.findElement(
|
|
1761
|
+
const btn = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
1516
1762
|
await click(btn, this.driver);
|
|
1517
1763
|
}
|
|
1518
1764
|
};
|
|
1519
1765
|
|
|
1520
1766
|
// src/pageObjects/elements/Forms/ListForm.ts
|
|
1767
|
+
var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1521
1768
|
var ListForm = class extends AbstractForm {
|
|
1769
|
+
headerCssSelector;
|
|
1522
1770
|
constructor(driver) {
|
|
1523
1771
|
super(driver);
|
|
1524
1772
|
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
1773
|
+
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
1525
1774
|
}
|
|
1526
1775
|
/**
|
|
1527
1776
|
* Находит таблицу
|
|
@@ -1531,7 +1780,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1531
1780
|
* expect(listForm.table());
|
|
1532
1781
|
*/
|
|
1533
1782
|
table() {
|
|
1534
|
-
return new Table(this.containerCssSelector, this.formName, this.driver);
|
|
1783
|
+
return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
|
|
1535
1784
|
}
|
|
1536
1785
|
/**
|
|
1537
1786
|
* Находит группу на лист форме по имени
|
|
@@ -1577,8 +1826,18 @@ var ListForm = class extends AbstractForm {
|
|
|
1577
1826
|
}
|
|
1578
1827
|
};
|
|
1579
1828
|
|
|
1829
|
+
// src/pageObjects/elements/Forms/TreeView.ts
|
|
1830
|
+
var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
|
|
1831
|
+
var TreeView = class extends ListForm {
|
|
1832
|
+
constructor(driver) {
|
|
1833
|
+
super(driver);
|
|
1834
|
+
this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
|
|
1835
|
+
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
1836
|
+
}
|
|
1837
|
+
};
|
|
1838
|
+
|
|
1580
1839
|
// src/pageObjects/elements/Dialog.ts
|
|
1581
|
-
var
|
|
1840
|
+
var import_selenium_webdriver25 = require("selenium-webdriver");
|
|
1582
1841
|
var DIALOG_CLASS = ".d5-dialog";
|
|
1583
1842
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
1584
1843
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
@@ -1592,7 +1851,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
1592
1851
|
}
|
|
1593
1852
|
async getElement() {
|
|
1594
1853
|
const panel = await super.getElement();
|
|
1595
|
-
return panel.findElement(
|
|
1854
|
+
return panel.findElement(import_selenium_webdriver25.By.xpath(buttonByTextXpath2(this.text)));
|
|
1596
1855
|
}
|
|
1597
1856
|
buttonNotDisplayedError() {
|
|
1598
1857
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -1612,11 +1871,11 @@ var Dialog = class extends AbstractElement {
|
|
|
1612
1871
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
1613
1872
|
}
|
|
1614
1873
|
async title() {
|
|
1615
|
-
const el = await this.driver.findElement(
|
|
1874
|
+
const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.titleSelector));
|
|
1616
1875
|
return await el.getText();
|
|
1617
1876
|
}
|
|
1618
1877
|
async text() {
|
|
1619
|
-
const el = await this.driver.findElement(
|
|
1878
|
+
const el = await this.driver.findElement(import_selenium_webdriver25.By.css(this.textSelector));
|
|
1620
1879
|
return await el.getText();
|
|
1621
1880
|
}
|
|
1622
1881
|
button(text) {
|
|
@@ -1626,6 +1885,7 @@ var Dialog = class extends AbstractElement {
|
|
|
1626
1885
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1627
1886
|
0 && (module.exports = {
|
|
1628
1887
|
AbstractPage,
|
|
1888
|
+
ControlClass,
|
|
1629
1889
|
Dialog,
|
|
1630
1890
|
FilterPanel,
|
|
1631
1891
|
FormEdit,
|
|
@@ -1637,6 +1897,7 @@ var Dialog = class extends AbstractElement {
|
|
|
1637
1897
|
PanelFilterField,
|
|
1638
1898
|
SubsystemsPanel,
|
|
1639
1899
|
TextEditor,
|
|
1900
|
+
TreeView,
|
|
1640
1901
|
byTestId,
|
|
1641
1902
|
byTestIdCssSelector,
|
|
1642
1903
|
click,
|