d5-testing-library 1.9.0-alpha.2 → 1.9.0-alpha.22
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/README.md +1 -0
- package/dist/FormEdit-V2BBOANS.mjs +7 -0
- package/dist/ListForm-UBIG4ZP2.mjs +7 -0
- package/dist/TreeView-MIKFUI4Q.mjs +8 -0
- package/dist/{chunk-S62QEWWA.mjs → chunk-27XBX275.mjs} +121 -27
- package/dist/{chunk-32KSAOFJ.mjs → chunk-FRCMUAAY.mjs} +334 -64
- package/dist/{chunk-XGIXXZD6.mjs → chunk-GQKGCUVL.mjs} +1 -1
- package/dist/{chunk-75FRHQCI.mjs → chunk-ZWHGIJ3K.mjs} +4 -4
- package/dist/cjs/d5-testing-library.cjs +564 -160
- package/dist/cjs/d5-testing-library.d.ts +61 -2
- package/dist/d5-testing-library.d.mts +61 -2
- package/dist/d5-testing-library.legacy-esm.js +18 -5
- package/dist/d5-testing-library.mjs +18 -5
- package/package.json +7 -7
- package/dist/FormEdit-QNZOB7PA.mjs +0 -7
- package/dist/ListForm-MXGUBMWS.mjs +0 -7
- package/dist/TreeView-VZBOZCFW.mjs +0 -8
|
@@ -86,6 +86,9 @@ var AbstractElement = class {
|
|
|
86
86
|
async getDataTestId() {
|
|
87
87
|
return await this.getAttribute("data-testid");
|
|
88
88
|
}
|
|
89
|
+
async getDataDateMode() {
|
|
90
|
+
return await this.getAttribute("data-datemode");
|
|
91
|
+
}
|
|
89
92
|
};
|
|
90
93
|
|
|
91
94
|
// src/pageObjects/pages/AbstractPage.ts
|
|
@@ -352,22 +355,34 @@ var ClearButtonStrategy = class {
|
|
|
352
355
|
}
|
|
353
356
|
};
|
|
354
357
|
|
|
358
|
+
// src/utils/withCustomTimeouts.ts
|
|
359
|
+
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
360
|
+
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
361
|
+
try {
|
|
362
|
+
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
363
|
+
return await callback();
|
|
364
|
+
} finally {
|
|
365
|
+
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
var withCustomTimeouts_default = withCustomTimeouts;
|
|
369
|
+
|
|
355
370
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
356
371
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
357
372
|
var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
358
373
|
var dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
359
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
360
|
-
let optElement = null;
|
|
361
|
-
const timeout = delay ? implicit : 200;
|
|
362
374
|
let err = null;
|
|
363
375
|
try {
|
|
364
|
-
await
|
|
365
|
-
|
|
366
|
-
|
|
376
|
+
await withCustomTimeouts_default({
|
|
377
|
+
driver,
|
|
378
|
+
timeout: delay ? void 0 : 200,
|
|
379
|
+
callback: async () => {
|
|
380
|
+
let optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
|
|
381
|
+
await click(optElement, driver);
|
|
382
|
+
}
|
|
383
|
+
});
|
|
367
384
|
} catch (e) {
|
|
368
385
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
369
|
-
} finally {
|
|
370
|
-
await driver.manage().setTimeouts({ implicit });
|
|
371
386
|
}
|
|
372
387
|
if (err)
|
|
373
388
|
throw err;
|
|
@@ -427,7 +442,7 @@ var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
|
427
442
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
428
443
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
429
444
|
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
430
|
-
var
|
|
445
|
+
var getSelectedOptionXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//div[contains(@class, 'dx-list-item') and @aria-selected="true"]//div[contains(., "${value}")]`;
|
|
431
446
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
432
447
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
433
448
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -442,9 +457,15 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
442
457
|
}
|
|
443
458
|
await this.confirmSelection();
|
|
444
459
|
}
|
|
445
|
-
async waitOptionSelection() {
|
|
446
|
-
|
|
447
|
-
|
|
460
|
+
async waitOptionSelection(value) {
|
|
461
|
+
await safeWait(
|
|
462
|
+
async () => {
|
|
463
|
+
const elements = await this.driver.findElements(By6.xpath(getSelectedOptionXpath(value)));
|
|
464
|
+
if (elements.length === 0) return false;
|
|
465
|
+
return await elements[0].isDisplayed();
|
|
466
|
+
},
|
|
467
|
+
this.driver
|
|
468
|
+
);
|
|
448
469
|
}
|
|
449
470
|
async selectOption(inputEl, value, lastElement) {
|
|
450
471
|
try {
|
|
@@ -453,7 +474,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
453
474
|
await inputEl.sendKeys(value);
|
|
454
475
|
await dropDownOptionClick(value, this.driver);
|
|
455
476
|
}
|
|
456
|
-
await this.waitOptionSelection();
|
|
477
|
+
await this.waitOptionSelection(value);
|
|
457
478
|
if (value !== lastElement) {
|
|
458
479
|
await inputEl.clear();
|
|
459
480
|
}
|
|
@@ -548,47 +569,273 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
548
569
|
};
|
|
549
570
|
|
|
550
571
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
551
|
-
import { By as
|
|
572
|
+
import { By as By10 } from "selenium-webdriver";
|
|
552
573
|
|
|
553
574
|
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
554
|
-
import { By as
|
|
575
|
+
import { By as By9, Key as Key3 } from "selenium-webdriver";
|
|
555
576
|
|
|
556
577
|
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
557
|
-
var formatDMYDate = (date) => {
|
|
558
|
-
const [year, month, day] = date.
|
|
559
|
-
|
|
578
|
+
var formatDMYDate = (date, isTimeAllowed = false) => {
|
|
579
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
580
|
+
if (!isTimeAllowed) {
|
|
581
|
+
return `${day}${month}${year}`;
|
|
582
|
+
}
|
|
583
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
584
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
585
|
+
return `${day}${month}${year}${hours}${minutes}`;
|
|
586
|
+
};
|
|
587
|
+
var formatToDateTime = (dateString) => {
|
|
588
|
+
const [datePart, timePart] = dateString.split("T");
|
|
589
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
590
|
+
const [hours, minutes] = timePart.split(":").map(Number);
|
|
591
|
+
return new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
592
|
+
};
|
|
593
|
+
var getYearMonthDay = (date) => {
|
|
594
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
595
|
+
return { year: +year, month: +month, day: +day };
|
|
560
596
|
};
|
|
561
597
|
|
|
562
|
-
// src/pageObjects/elements/Editors/Date/
|
|
598
|
+
// src/pageObjects/elements/Editors/Date/DateSelectMode.ts
|
|
599
|
+
var DateSelectMode = class {
|
|
600
|
+
static isWeek(t) {
|
|
601
|
+
return t === "week" /* Week */;
|
|
602
|
+
}
|
|
603
|
+
static isMonth(t) {
|
|
604
|
+
return t === "month" /* Month */;
|
|
605
|
+
}
|
|
606
|
+
static isWeekOrMonth(t) {
|
|
607
|
+
return this.isWeek(t) || this.isMonth(t);
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
// src/pageObjects/elements/Editors/Date/Calendar.ts
|
|
612
|
+
import { By as By8 } from "selenium-webdriver";
|
|
563
613
|
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
564
614
|
var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
565
615
|
var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
566
616
|
var BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
617
|
+
var CALENDAR_CAPTION_SELECTOR = "dx-calendar-caption-button";
|
|
618
|
+
var CALENDAR_CELL_SELECTOR = "dx-calendar-cell";
|
|
619
|
+
var CALENDAR_PREVIOUS_SELECTOR = "dx-calendar-navigator-previous-month";
|
|
620
|
+
var CALENDAR_NEXT_SELECTOR = "dx-calendar-navigator-next-month";
|
|
621
|
+
var TEXT_EDITOR_SELECTOR = "dx-texteditor-input";
|
|
622
|
+
var movesToCalendarEndForWeek = 3;
|
|
623
|
+
var movesToCalendarEndForMonth = 1;
|
|
624
|
+
var Calendar = class extends AbstractElementWithParent {
|
|
625
|
+
_parentCssSelector;
|
|
626
|
+
constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
|
|
627
|
+
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
|
|
628
|
+
this._parentCssSelector = parentCssSelector;
|
|
629
|
+
}
|
|
630
|
+
async init() {
|
|
631
|
+
const dateField = await this.driver.findElement(By8.css(this._parentCssSelector));
|
|
632
|
+
const button = await dateField.findElement(By8.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
633
|
+
await click(button, this.driver);
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Переходимо на найвищий рівень календаря
|
|
637
|
+
*/
|
|
638
|
+
async moveToCalendarEnd(count) {
|
|
639
|
+
while (count >= 0) {
|
|
640
|
+
const calendarElement = await this.getElement();
|
|
641
|
+
const button = await calendarElement.findElement(By8.css(`.${CALENDAR_CAPTION_SELECTOR}`));
|
|
642
|
+
await click(button, this.driver);
|
|
643
|
+
count--;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
|
|
648
|
+
*/
|
|
649
|
+
async choosePeriodForYear(targetYear) {
|
|
650
|
+
let found = false;
|
|
651
|
+
while (!found) {
|
|
652
|
+
const calendarElement = await this.getElement();
|
|
653
|
+
const periodCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
654
|
+
for (const cell of periodCells) {
|
|
655
|
+
const text = await cell.getText();
|
|
656
|
+
if (text) {
|
|
657
|
+
const [start, end] = text.split("-").map(Number);
|
|
658
|
+
if (targetYear >= start && targetYear <= end) {
|
|
659
|
+
await click(cell, this.driver);
|
|
660
|
+
found = true;
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
if (!found) {
|
|
666
|
+
const firstPeriod = await periodCells[0].getText();
|
|
667
|
+
const [start] = firstPeriod.split("-").map(Number);
|
|
668
|
+
if (targetYear < start) {
|
|
669
|
+
const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
670
|
+
await click(prevBtn, this.driver);
|
|
671
|
+
} else {
|
|
672
|
+
const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
673
|
+
await click(nextBtn, this.driver);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Пошук та клік по конкретному року з навігацією
|
|
680
|
+
*/
|
|
681
|
+
async chooseYear(targetYear) {
|
|
682
|
+
let found = false;
|
|
683
|
+
while (!found) {
|
|
684
|
+
const calendarElement = await this.getElement();
|
|
685
|
+
const yearCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
686
|
+
for (const cell of yearCells) {
|
|
687
|
+
const text = await cell.getText();
|
|
688
|
+
const cellYear = Number(text);
|
|
689
|
+
if (!isNaN(cellYear) && cellYear === targetYear) {
|
|
690
|
+
await click(cell, this.driver);
|
|
691
|
+
found = true;
|
|
692
|
+
break;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
if (!found) {
|
|
696
|
+
const firstYearText = await yearCells[0].getText();
|
|
697
|
+
const lastYearText = await yearCells[yearCells.length - 1].getText();
|
|
698
|
+
const firstYear = Number(firstYearText);
|
|
699
|
+
const lastYear = Number(lastYearText);
|
|
700
|
+
if (targetYear < firstYear) {
|
|
701
|
+
const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
702
|
+
await click(prevBtn, this.driver);
|
|
703
|
+
} else if (targetYear > lastYear) {
|
|
704
|
+
const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
705
|
+
await click(nextBtn, this.driver);
|
|
706
|
+
} else {
|
|
707
|
+
throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Пошук та клік по конкретному місяцю
|
|
714
|
+
*/
|
|
715
|
+
async chooseMonth(year, month) {
|
|
716
|
+
const calendarElement = await this.getElement();
|
|
717
|
+
const monthCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
718
|
+
for (const cell of monthCells) {
|
|
719
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
720
|
+
if (dataValue) {
|
|
721
|
+
const [cellYear, cellMonth] = dataValue.split("/").map(Number);
|
|
722
|
+
if (cellYear === year && cellMonth === month) {
|
|
723
|
+
await click(cell, this.driver);
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
throw new Error(`Month ${month} for year ${year} not found`);
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
|
|
732
|
+
*/
|
|
733
|
+
async chooseDay(year, month, day) {
|
|
734
|
+
const calendarElement = await this.getElement();
|
|
735
|
+
const dayCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
736
|
+
for (const cell of dayCells) {
|
|
737
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
738
|
+
if (dataValue) {
|
|
739
|
+
const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
|
|
740
|
+
if (cellYear === year && cellMonth === month && cellDay === day) {
|
|
741
|
+
await click(cell, this.driver);
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
throw new Error(`Day ${day}.${month}.${year} not found`);
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Встановлення дати для тижня
|
|
750
|
+
*/
|
|
751
|
+
async setValueForWeek(date) {
|
|
752
|
+
const { year, month, day } = getYearMonthDay(date);
|
|
753
|
+
await this.moveToCalendarEnd(movesToCalendarEndForWeek);
|
|
754
|
+
await this.choosePeriodForYear(year);
|
|
755
|
+
await this.chooseYear(year);
|
|
756
|
+
await this.chooseMonth(year, month);
|
|
757
|
+
await this.chooseDay(year, month, day);
|
|
758
|
+
await this.save();
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Встановлення дати для місяця
|
|
762
|
+
*/
|
|
763
|
+
async setValueForMonth(date) {
|
|
764
|
+
const { year, month } = getYearMonthDay(date);
|
|
765
|
+
await this.moveToCalendarEnd(movesToCalendarEndForMonth);
|
|
766
|
+
await this.chooseYear(year);
|
|
767
|
+
await this.chooseMonth(year, month);
|
|
768
|
+
await this.save();
|
|
769
|
+
}
|
|
770
|
+
async getDateFromInput() {
|
|
771
|
+
const calendarPopoverElement = await this.getElement();
|
|
772
|
+
return calendarPopoverElement.findElement(
|
|
773
|
+
By8.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
774
|
+
);
|
|
775
|
+
}
|
|
776
|
+
async getDateToInput() {
|
|
777
|
+
const calendarPopoverElement = await this.getElement();
|
|
778
|
+
return calendarPopoverElement.findElement(
|
|
779
|
+
By8.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
async save() {
|
|
783
|
+
const btnOk = await this.driver.findElement(By8.css(`.${BTN_SAVE_SELECTOR}`));
|
|
784
|
+
await click(btnOk, this.driver);
|
|
785
|
+
}
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
789
|
+
var DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
|
|
567
790
|
var BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
568
791
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
569
792
|
super(parentCssSelector, elementCssSelector, driver);
|
|
570
793
|
this.setClearStrategy(new InputClearStrategy());
|
|
571
794
|
}
|
|
572
|
-
async
|
|
573
|
-
const dateField = await this.driver.findElement(
|
|
795
|
+
async getIsAllowedTime() {
|
|
796
|
+
const dateField = await this.driver.findElement(By9.css(`${this.getFullCssSelector()}`));
|
|
797
|
+
const classString = await dateField.getAttribute("class");
|
|
798
|
+
return classString.includes(DATETIME_ALLOWED_SELECTOR);
|
|
799
|
+
}
|
|
800
|
+
async initCalendar() {
|
|
574
801
|
const dateFieldDataTestID = await this.getDataTestId();
|
|
575
|
-
const
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
802
|
+
const calendar = new Calendar({
|
|
803
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
804
|
+
dateFieldDataTestID,
|
|
805
|
+
driver: this.driver
|
|
806
|
+
});
|
|
807
|
+
await calendar.init();
|
|
808
|
+
return calendar;
|
|
809
|
+
}
|
|
810
|
+
async setValueForWeek(value) {
|
|
811
|
+
const calendar = await this.initCalendar();
|
|
812
|
+
await calendar.setValueForWeek(value);
|
|
813
|
+
}
|
|
814
|
+
async setValueForMonth(value) {
|
|
815
|
+
const calendar = await this.initCalendar();
|
|
816
|
+
await calendar.setValueForMonth(value);
|
|
817
|
+
}
|
|
818
|
+
async setArrayValue(value) {
|
|
819
|
+
const calendar = await this.initCalendar();
|
|
820
|
+
const dateFromInput = await calendar.getDateFromInput();
|
|
821
|
+
const dateToInput = await calendar.getDateToInput();
|
|
584
822
|
await this.setSingleValue(value[0], dateFromInput);
|
|
585
823
|
await this.setSingleValue(value[1], dateToInput);
|
|
586
|
-
|
|
587
|
-
await click(btnOk, this.driver);
|
|
824
|
+
await calendar.save();
|
|
588
825
|
}
|
|
589
826
|
async setSingleValue(value, inputEl) {
|
|
827
|
+
const dateMode = await this.getDataDateMode();
|
|
828
|
+
if (DateSelectMode.isWeek(dateMode)) {
|
|
829
|
+
await this.setValueForWeek(value);
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
if (DateSelectMode.isMonth(dateMode)) {
|
|
833
|
+
await this.setValueForMonth(value);
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
590
836
|
const actions = this.driver.actions({ async: true });
|
|
591
|
-
const
|
|
837
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
838
|
+
const formattedDate = formatDMYDate(value, isTimeAllowed);
|
|
592
839
|
await click(inputEl, this.driver);
|
|
593
840
|
await actions.move({ origin: inputEl }).sendKeys(Key3.HOME).perform();
|
|
594
841
|
await actions.move({ origin: inputEl }).sendKeys(formattedDate, Key3.ENTER).perform();
|
|
@@ -609,7 +856,7 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
609
856
|
this.setClearStrategy(new InputClearStrategy());
|
|
610
857
|
}
|
|
611
858
|
async getDateElement() {
|
|
612
|
-
return this.driver.findElement(
|
|
859
|
+
return this.driver.findElement(By10.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
613
860
|
}
|
|
614
861
|
async getDateValue() {
|
|
615
862
|
const inputEl = await this.getDateElement();
|
|
@@ -617,6 +864,10 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
617
864
|
}
|
|
618
865
|
async getValue() {
|
|
619
866
|
const value = await this.getDateValue();
|
|
867
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
868
|
+
if (isTimeAllowed) {
|
|
869
|
+
return value == "" ? null : formatToDateTime(value);
|
|
870
|
+
}
|
|
620
871
|
return value == "" ? null : new Date(value);
|
|
621
872
|
}
|
|
622
873
|
setValue(value) {
|
|
@@ -628,14 +879,14 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
628
879
|
};
|
|
629
880
|
|
|
630
881
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
631
|
-
import { By as
|
|
882
|
+
import { By as By11 } from "selenium-webdriver";
|
|
632
883
|
var DateRangeEditor = class extends BaseDateEditor {
|
|
633
884
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
634
885
|
super(parentCssSelector, elementCssSelector, driver);
|
|
635
886
|
this.setClearStrategy(new InputClearStrategy());
|
|
636
887
|
}
|
|
637
888
|
async getDateElement() {
|
|
638
|
-
return this.driver.findElement(
|
|
889
|
+
return this.driver.findElement(By11.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
639
890
|
}
|
|
640
891
|
async getDateValue() {
|
|
641
892
|
const inputEl = await this.getDateElement();
|
|
@@ -693,30 +944,30 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
693
944
|
};
|
|
694
945
|
|
|
695
946
|
// src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
|
|
696
|
-
import { By as
|
|
947
|
+
import { By as By12, Key as Key4 } from "selenium-webdriver";
|
|
697
948
|
var TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
698
949
|
var DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
699
950
|
var DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
700
951
|
var CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
|
|
701
952
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
702
|
-
var
|
|
953
|
+
var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
703
954
|
var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
704
955
|
var dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
|
|
705
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
706
|
-
let optElement = null;
|
|
707
|
-
const timeout = delay ? implicit : 600;
|
|
708
956
|
let err = null;
|
|
709
957
|
try {
|
|
710
958
|
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
711
|
-
await
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
959
|
+
await withCustomTimeouts_default({
|
|
960
|
+
driver,
|
|
961
|
+
timeout: delay ? void 0 : 600,
|
|
962
|
+
callback: async () => {
|
|
963
|
+
const calendarPopoverElement = await driver.findElement(By12.css(calendarPopoverSelector));
|
|
964
|
+
const customOptionList = calendarPopoverElement.findElement(By12.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
965
|
+
const optElement = await customOptionList.findElement(By12.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
966
|
+
await click(optElement, driver);
|
|
967
|
+
}
|
|
968
|
+
});
|
|
716
969
|
} catch (e) {
|
|
717
970
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
718
|
-
} finally {
|
|
719
|
-
await driver.manage().setTimeouts({ implicit });
|
|
720
971
|
}
|
|
721
972
|
if (err)
|
|
722
973
|
throw err;
|
|
@@ -735,7 +986,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
|
735
986
|
}
|
|
736
987
|
}
|
|
737
988
|
async waitOptionSelection() {
|
|
738
|
-
await fixElementStaleError(
|
|
989
|
+
await fixElementStaleError(By12.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
739
990
|
}
|
|
740
991
|
async selectOption(inputEl, value, lastElement) {
|
|
741
992
|
try {
|
|
@@ -759,7 +1010,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
|
759
1010
|
return [];
|
|
760
1011
|
}
|
|
761
1012
|
const tags = await this.driver.findElements(
|
|
762
|
-
|
|
1013
|
+
By12.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
|
|
763
1014
|
);
|
|
764
1015
|
const values = [];
|
|
765
1016
|
for (const tag of tags) {
|
|
@@ -971,9 +1222,10 @@ var FormField = class extends AbstractEditor {
|
|
|
971
1222
|
};
|
|
972
1223
|
|
|
973
1224
|
// src/pageObjects/elements/Forms/Form.ts
|
|
974
|
-
import { By as
|
|
1225
|
+
import { By as By16 } from "selenium-webdriver";
|
|
975
1226
|
|
|
976
1227
|
// src/pageObjects/elements/AbstractButton.ts
|
|
1228
|
+
var D5_BUTTON_IS_PRESSED = "d5-is-pressed";
|
|
977
1229
|
var AbstractButton = class extends AbstractElementWithParent {
|
|
978
1230
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
979
1231
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -999,10 +1251,19 @@ var AbstractButton = class extends AbstractElementWithParent {
|
|
|
999
1251
|
return false;
|
|
1000
1252
|
}
|
|
1001
1253
|
}
|
|
1254
|
+
async isPressed() {
|
|
1255
|
+
try {
|
|
1256
|
+
const button = await this.getElement();
|
|
1257
|
+
const classAttribute = await button.getAttribute("class");
|
|
1258
|
+
return classAttribute.includes(D5_BUTTON_IS_PRESSED);
|
|
1259
|
+
} catch {
|
|
1260
|
+
return false;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1002
1263
|
};
|
|
1003
1264
|
|
|
1004
1265
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1005
|
-
import { By as
|
|
1266
|
+
import { By as By13 } from "selenium-webdriver";
|
|
1006
1267
|
var DXButton = class extends AbstractButton {
|
|
1007
1268
|
async getText() {
|
|
1008
1269
|
const classes = await this.getClasses();
|
|
@@ -1010,7 +1271,7 @@ var DXButton = class extends AbstractButton {
|
|
|
1010
1271
|
return null;
|
|
1011
1272
|
}
|
|
1012
1273
|
const el = await this.getElement();
|
|
1013
|
-
const textEl = el.findElement(
|
|
1274
|
+
const textEl = el.findElement(By13.className("dx-button-text"));
|
|
1014
1275
|
return await textEl.getText();
|
|
1015
1276
|
}
|
|
1016
1277
|
};
|
|
@@ -1043,7 +1304,7 @@ var Panel = class extends AbstractGroup {
|
|
|
1043
1304
|
};
|
|
1044
1305
|
|
|
1045
1306
|
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1046
|
-
import { By as
|
|
1307
|
+
import { By as By14 } from "selenium-webdriver";
|
|
1047
1308
|
var TabPanelItem = class extends AbstractGroup {
|
|
1048
1309
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1049
1310
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -1053,7 +1314,7 @@ var TabPanelItem = class extends AbstractGroup {
|
|
|
1053
1314
|
}
|
|
1054
1315
|
async isActive() {
|
|
1055
1316
|
const tabPanelItemElement = await this.getElement();
|
|
1056
|
-
const grandparentTab = await tabPanelItemElement.findElement(
|
|
1317
|
+
const grandparentTab = await tabPanelItemElement.findElement(By14.xpath('ancestor::div[@role="tab"][1]'));
|
|
1057
1318
|
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1058
1319
|
}
|
|
1059
1320
|
async getTitle() {
|
|
@@ -1070,7 +1331,7 @@ var TabPanel = class extends AbstractGroup {
|
|
|
1070
1331
|
};
|
|
1071
1332
|
|
|
1072
1333
|
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1073
|
-
import { By as
|
|
1334
|
+
import { By as By15 } from "selenium-webdriver";
|
|
1074
1335
|
var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1075
1336
|
var AccordionItem = class extends AbstractGroup {
|
|
1076
1337
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
@@ -1082,7 +1343,7 @@ var AccordionItem = class extends AbstractGroup {
|
|
|
1082
1343
|
}
|
|
1083
1344
|
async clickAccordionItemTitle() {
|
|
1084
1345
|
const accordionElement = await this.getElement();
|
|
1085
|
-
const accordTitleElement = await accordionElement.findElement(
|
|
1346
|
+
const accordTitleElement = await accordionElement.findElement(By15.className(ACCORDION_TITLE_CONTAINER));
|
|
1086
1347
|
await accordTitleElement.click();
|
|
1087
1348
|
}
|
|
1088
1349
|
async click() {
|
|
@@ -1236,7 +1497,15 @@ var AbstractForm = class extends AbstractPage {
|
|
|
1236
1497
|
async exists() {
|
|
1237
1498
|
try {
|
|
1238
1499
|
let elements = await this.driver.findElements(this.containerBy);
|
|
1239
|
-
|
|
1500
|
+
if (elements.length === 0) {
|
|
1501
|
+
return false;
|
|
1502
|
+
}
|
|
1503
|
+
await waitElementIsVisible_default({
|
|
1504
|
+
element: elements[0],
|
|
1505
|
+
errorMessage: "Element exists in DOM but is not visible",
|
|
1506
|
+
driver: this.driver
|
|
1507
|
+
});
|
|
1508
|
+
return true;
|
|
1240
1509
|
} catch (error) {
|
|
1241
1510
|
return false;
|
|
1242
1511
|
}
|
|
@@ -1270,15 +1539,15 @@ async function classDependencyInjector(formType) {
|
|
|
1270
1539
|
let SubFormFactoryClass;
|
|
1271
1540
|
switch (formType) {
|
|
1272
1541
|
case "1" /* LIST */:
|
|
1273
|
-
SubFormFactoryClass = (await import("./ListForm-
|
|
1542
|
+
SubFormFactoryClass = (await import("./ListForm-UBIG4ZP2.mjs")).default;
|
|
1274
1543
|
break;
|
|
1275
1544
|
case "3" /* TREE */:
|
|
1276
|
-
SubFormFactoryClass = (await import("./TreeView-
|
|
1545
|
+
SubFormFactoryClass = (await import("./TreeView-MIKFUI4Q.mjs")).default;
|
|
1277
1546
|
break;
|
|
1278
1547
|
case "2" /* EDIT */:
|
|
1279
1548
|
case "99" /* FREE_FORM */:
|
|
1280
1549
|
case "4" /* REPORT */:
|
|
1281
|
-
SubFormFactoryClass = (await import("./FormEdit-
|
|
1550
|
+
SubFormFactoryClass = (await import("./FormEdit-V2BBOANS.mjs")).default;
|
|
1282
1551
|
break;
|
|
1283
1552
|
default:
|
|
1284
1553
|
throw new Error(`Unsupported form type ${formType}`);
|
|
@@ -1308,7 +1577,7 @@ var Form = class extends AbstractForm {
|
|
|
1308
1577
|
*/
|
|
1309
1578
|
async getTitleText() {
|
|
1310
1579
|
if (await this.isModal()) {
|
|
1311
|
-
const titleEl2 = await this.driver.findElement(
|
|
1580
|
+
const titleEl2 = await this.driver.findElement(By16.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
1312
1581
|
await waitElementIsVisible_default({
|
|
1313
1582
|
element: titleEl2,
|
|
1314
1583
|
driver: this.driver,
|
|
@@ -1316,7 +1585,7 @@ var Form = class extends AbstractForm {
|
|
|
1316
1585
|
});
|
|
1317
1586
|
return titleEl2.getText();
|
|
1318
1587
|
}
|
|
1319
|
-
let titleEl = await this.driver.findElement(
|
|
1588
|
+
let titleEl = await this.driver.findElement(By16.className("main-toolbar-form-title"));
|
|
1320
1589
|
return titleEl.getText();
|
|
1321
1590
|
}
|
|
1322
1591
|
setSubFormMode() {
|
|
@@ -1335,7 +1604,7 @@ var Form = class extends AbstractForm {
|
|
|
1335
1604
|
async subForm(name, options = {}) {
|
|
1336
1605
|
const { isDockPanel = false } = options;
|
|
1337
1606
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
1338
|
-
const byCssSelector =
|
|
1607
|
+
const byCssSelector = By16.css(cssSelector);
|
|
1339
1608
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
1340
1609
|
await waitElementIsVisible_default({
|
|
1341
1610
|
element: subFormEl,
|
|
@@ -1377,6 +1646,7 @@ export {
|
|
|
1377
1646
|
NumberEditor,
|
|
1378
1647
|
ControlClass,
|
|
1379
1648
|
DX_CLEAR_BUTTON_AREA,
|
|
1649
|
+
withCustomTimeouts_default,
|
|
1380
1650
|
editorFactory,
|
|
1381
1651
|
createDocFilterTestId,
|
|
1382
1652
|
createHeaderFilterTestId,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ListForm
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-27XBX275.mjs";
|
|
4
4
|
|
|
5
5
|
// src/pageObjects/elements/Forms/TreeView.ts
|
|
6
|
-
var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content
|
|
7
|
-
var TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content
|
|
8
|
-
var FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-
|
|
6
|
+
var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
7
|
+
var TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
8
|
+
var FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
9
9
|
var TreeView = class extends ListForm {
|
|
10
10
|
constructor(driver) {
|
|
11
11
|
super(driver);
|