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
|
@@ -132,6 +132,9 @@ var init_AbstractElement = __esm({
|
|
|
132
132
|
async getDataTestId() {
|
|
133
133
|
return await this.getAttribute("data-testid");
|
|
134
134
|
}
|
|
135
|
+
async getDataDateMode() {
|
|
136
|
+
return await this.getAttribute("data-datemode");
|
|
137
|
+
}
|
|
135
138
|
};
|
|
136
139
|
}
|
|
137
140
|
});
|
|
@@ -512,6 +515,24 @@ var init_ClearButtonStrategy = __esm({
|
|
|
512
515
|
}
|
|
513
516
|
});
|
|
514
517
|
|
|
518
|
+
// src/utils/withCustomTimeouts.ts
|
|
519
|
+
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
520
|
+
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
521
|
+
try {
|
|
522
|
+
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
523
|
+
return await callback();
|
|
524
|
+
} finally {
|
|
525
|
+
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
var withCustomTimeouts_default;
|
|
529
|
+
var init_withCustomTimeouts = __esm({
|
|
530
|
+
"src/utils/withCustomTimeouts.ts"() {
|
|
531
|
+
"use strict";
|
|
532
|
+
withCustomTimeouts_default = withCustomTimeouts;
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
|
|
515
536
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
516
537
|
var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
517
538
|
var init_SelectBoxEditor = __esm({
|
|
@@ -522,21 +543,22 @@ var init_SelectBoxEditor = __esm({
|
|
|
522
543
|
init_xpathHelper();
|
|
523
544
|
init_actions();
|
|
524
545
|
init_ClearButtonStrategy();
|
|
546
|
+
init_withCustomTimeouts();
|
|
525
547
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
526
548
|
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
527
549
|
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
528
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
529
|
-
let optElement = null;
|
|
530
|
-
const timeout = delay ? implicit : 200;
|
|
531
550
|
let err = null;
|
|
532
551
|
try {
|
|
533
|
-
await
|
|
534
|
-
|
|
535
|
-
|
|
552
|
+
await withCustomTimeouts_default({
|
|
553
|
+
driver,
|
|
554
|
+
timeout: delay ? void 0 : 200,
|
|
555
|
+
callback: async () => {
|
|
556
|
+
let optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
|
|
557
|
+
await click(optElement, driver);
|
|
558
|
+
}
|
|
559
|
+
});
|
|
536
560
|
} catch (e) {
|
|
537
561
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
538
|
-
} finally {
|
|
539
|
-
await driver.manage().setTimeouts({ implicit });
|
|
540
562
|
}
|
|
541
563
|
if (err)
|
|
542
564
|
throw err;
|
|
@@ -602,7 +624,7 @@ var init_SwitchEditor = __esm({
|
|
|
602
624
|
});
|
|
603
625
|
|
|
604
626
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
605
|
-
var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR,
|
|
627
|
+
var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, getSelectedOptionXpath, TagBox;
|
|
606
628
|
var init_TagBox = __esm({
|
|
607
629
|
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
608
630
|
"use strict";
|
|
@@ -618,7 +640,7 @@ var init_TagBox = __esm({
|
|
|
618
640
|
DX_TAG_CONTAINER = "dx-tag-container";
|
|
619
641
|
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
620
642
|
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
621
|
-
|
|
643
|
+
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}")]`;
|
|
622
644
|
TagBox = class extends AbstractDXEditorWithInput {
|
|
623
645
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
624
646
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -633,9 +655,15 @@ var init_TagBox = __esm({
|
|
|
633
655
|
}
|
|
634
656
|
await this.confirmSelection();
|
|
635
657
|
}
|
|
636
|
-
async waitOptionSelection() {
|
|
637
|
-
|
|
638
|
-
|
|
658
|
+
async waitOptionSelection(value) {
|
|
659
|
+
await safeWait(
|
|
660
|
+
async () => {
|
|
661
|
+
const elements = await this.driver.findElements(import_selenium_webdriver10.By.xpath(getSelectedOptionXpath(value)));
|
|
662
|
+
if (elements.length === 0) return false;
|
|
663
|
+
return await elements[0].isDisplayed();
|
|
664
|
+
},
|
|
665
|
+
this.driver
|
|
666
|
+
);
|
|
639
667
|
}
|
|
640
668
|
async selectOption(inputEl, value, lastElement) {
|
|
641
669
|
try {
|
|
@@ -644,7 +672,7 @@ var init_TagBox = __esm({
|
|
|
644
672
|
await inputEl.sendKeys(value);
|
|
645
673
|
await dropDownOptionClick(value, this.driver);
|
|
646
674
|
}
|
|
647
|
-
await this.waitOptionSelection();
|
|
675
|
+
await this.waitOptionSelection(value);
|
|
648
676
|
if (value !== lastElement) {
|
|
649
677
|
await inputEl.clear();
|
|
650
678
|
}
|
|
@@ -756,24 +784,57 @@ var init_BooleanSelector = __esm({
|
|
|
756
784
|
});
|
|
757
785
|
|
|
758
786
|
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
759
|
-
var formatDMYDate;
|
|
787
|
+
var formatDMYDate, formatToDateTime, getYearMonthDay;
|
|
760
788
|
var init_utils = __esm({
|
|
761
789
|
"src/pageObjects/elements/Editors/Date/utils.ts"() {
|
|
762
790
|
"use strict";
|
|
763
|
-
formatDMYDate = (date) => {
|
|
764
|
-
const [year, month, day] = date.
|
|
765
|
-
|
|
791
|
+
formatDMYDate = (date, isTimeAllowed = false) => {
|
|
792
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
793
|
+
if (!isTimeAllowed) {
|
|
794
|
+
return `${day}${month}${year}`;
|
|
795
|
+
}
|
|
796
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
797
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
798
|
+
return `${day}${month}${year}${hours}${minutes}`;
|
|
799
|
+
};
|
|
800
|
+
formatToDateTime = (dateString) => {
|
|
801
|
+
const [datePart, timePart] = dateString.split("T");
|
|
802
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
803
|
+
const [hours, minutes] = timePart.split(":").map(Number);
|
|
804
|
+
return new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
805
|
+
};
|
|
806
|
+
getYearMonthDay = (date) => {
|
|
807
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
808
|
+
return { year: +year, month: +month, day: +day };
|
|
766
809
|
};
|
|
767
810
|
}
|
|
768
811
|
});
|
|
769
812
|
|
|
770
|
-
// src/pageObjects/elements/Editors/Date/
|
|
771
|
-
var
|
|
772
|
-
var
|
|
773
|
-
"src/pageObjects/elements/Editors/Date/
|
|
813
|
+
// src/pageObjects/elements/Editors/Date/DateSelectMode.ts
|
|
814
|
+
var DateSelectMode;
|
|
815
|
+
var init_DateSelectMode = __esm({
|
|
816
|
+
"src/pageObjects/elements/Editors/Date/DateSelectMode.ts"() {
|
|
774
817
|
"use strict";
|
|
775
|
-
|
|
776
|
-
|
|
818
|
+
DateSelectMode = class {
|
|
819
|
+
static isWeek(t) {
|
|
820
|
+
return t === "week" /* Week */;
|
|
821
|
+
}
|
|
822
|
+
static isMonth(t) {
|
|
823
|
+
return t === "month" /* Month */;
|
|
824
|
+
}
|
|
825
|
+
static isWeekOrMonth(t) {
|
|
826
|
+
return this.isWeek(t) || this.isMonth(t);
|
|
827
|
+
}
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// src/pageObjects/elements/Editors/Date/Calendar.ts
|
|
833
|
+
var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, CALENDAR_CAPTION_SELECTOR, CALENDAR_CELL_SELECTOR, CALENDAR_PREVIOUS_SELECTOR, CALENDAR_NEXT_SELECTOR, TEXT_EDITOR_SELECTOR, movesToCalendarEndForWeek, movesToCalendarEndForMonth, Calendar;
|
|
834
|
+
var init_Calendar = __esm({
|
|
835
|
+
"src/pageObjects/elements/Editors/Date/Calendar.ts"() {
|
|
836
|
+
"use strict";
|
|
837
|
+
init_AbstractElementWithParent();
|
|
777
838
|
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
778
839
|
init_locators();
|
|
779
840
|
init_actions();
|
|
@@ -782,34 +843,244 @@ var init_BaseDateEditor = __esm({
|
|
|
782
843
|
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
783
844
|
BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
784
845
|
BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
846
|
+
CALENDAR_CAPTION_SELECTOR = "dx-calendar-caption-button";
|
|
847
|
+
CALENDAR_CELL_SELECTOR = "dx-calendar-cell";
|
|
848
|
+
CALENDAR_PREVIOUS_SELECTOR = "dx-calendar-navigator-previous-month";
|
|
849
|
+
CALENDAR_NEXT_SELECTOR = "dx-calendar-navigator-next-month";
|
|
850
|
+
TEXT_EDITOR_SELECTOR = "dx-texteditor-input";
|
|
851
|
+
movesToCalendarEndForWeek = 3;
|
|
852
|
+
movesToCalendarEndForMonth = 1;
|
|
853
|
+
Calendar = class extends AbstractElementWithParent {
|
|
854
|
+
_parentCssSelector;
|
|
855
|
+
constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
|
|
856
|
+
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
|
|
857
|
+
this._parentCssSelector = parentCssSelector;
|
|
858
|
+
}
|
|
859
|
+
async init() {
|
|
860
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(this._parentCssSelector));
|
|
861
|
+
const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
862
|
+
await click(button, this.driver);
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Переходимо на найвищий рівень календаря
|
|
866
|
+
*/
|
|
867
|
+
async moveToCalendarEnd(count) {
|
|
868
|
+
while (count >= 0) {
|
|
869
|
+
const calendarElement = await this.getElement();
|
|
870
|
+
const button = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_CAPTION_SELECTOR}`));
|
|
871
|
+
await click(button, this.driver);
|
|
872
|
+
count--;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
|
|
877
|
+
*/
|
|
878
|
+
async choosePeriodForYear(targetYear) {
|
|
879
|
+
let found = false;
|
|
880
|
+
while (!found) {
|
|
881
|
+
const calendarElement = await this.getElement();
|
|
882
|
+
const periodCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
883
|
+
for (const cell of periodCells) {
|
|
884
|
+
const text = await cell.getText();
|
|
885
|
+
if (text) {
|
|
886
|
+
const [start, end] = text.split("-").map(Number);
|
|
887
|
+
if (targetYear >= start && targetYear <= end) {
|
|
888
|
+
await click(cell, this.driver);
|
|
889
|
+
found = true;
|
|
890
|
+
break;
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
if (!found) {
|
|
895
|
+
const firstPeriod = await periodCells[0].getText();
|
|
896
|
+
const [start] = firstPeriod.split("-").map(Number);
|
|
897
|
+
if (targetYear < start) {
|
|
898
|
+
const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
899
|
+
await click(prevBtn, this.driver);
|
|
900
|
+
} else {
|
|
901
|
+
const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
902
|
+
await click(nextBtn, this.driver);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
/**
|
|
908
|
+
* Пошук та клік по конкретному року з навігацією
|
|
909
|
+
*/
|
|
910
|
+
async chooseYear(targetYear) {
|
|
911
|
+
let found = false;
|
|
912
|
+
while (!found) {
|
|
913
|
+
const calendarElement = await this.getElement();
|
|
914
|
+
const yearCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
915
|
+
for (const cell of yearCells) {
|
|
916
|
+
const text = await cell.getText();
|
|
917
|
+
const cellYear = Number(text);
|
|
918
|
+
if (!isNaN(cellYear) && cellYear === targetYear) {
|
|
919
|
+
await click(cell, this.driver);
|
|
920
|
+
found = true;
|
|
921
|
+
break;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
if (!found) {
|
|
925
|
+
const firstYearText = await yearCells[0].getText();
|
|
926
|
+
const lastYearText = await yearCells[yearCells.length - 1].getText();
|
|
927
|
+
const firstYear = Number(firstYearText);
|
|
928
|
+
const lastYear = Number(lastYearText);
|
|
929
|
+
if (targetYear < firstYear) {
|
|
930
|
+
const prevBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
931
|
+
await click(prevBtn, this.driver);
|
|
932
|
+
} else if (targetYear > lastYear) {
|
|
933
|
+
const nextBtn = await calendarElement.findElement(import_selenium_webdriver12.By.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
934
|
+
await click(nextBtn, this.driver);
|
|
935
|
+
} else {
|
|
936
|
+
throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
/**
|
|
942
|
+
* Пошук та клік по конкретному місяцю
|
|
943
|
+
*/
|
|
944
|
+
async chooseMonth(year, month) {
|
|
945
|
+
const calendarElement = await this.getElement();
|
|
946
|
+
const monthCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
947
|
+
for (const cell of monthCells) {
|
|
948
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
949
|
+
if (dataValue) {
|
|
950
|
+
const [cellYear, cellMonth] = dataValue.split("/").map(Number);
|
|
951
|
+
if (cellYear === year && cellMonth === month) {
|
|
952
|
+
await click(cell, this.driver);
|
|
953
|
+
return;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
throw new Error(`Month ${month} for year ${year} not found`);
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
|
|
961
|
+
*/
|
|
962
|
+
async chooseDay(year, month, day) {
|
|
963
|
+
const calendarElement = await this.getElement();
|
|
964
|
+
const dayCells = await calendarElement.findElements(import_selenium_webdriver12.By.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
965
|
+
for (const cell of dayCells) {
|
|
966
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
967
|
+
if (dataValue) {
|
|
968
|
+
const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
|
|
969
|
+
if (cellYear === year && cellMonth === month && cellDay === day) {
|
|
970
|
+
await click(cell, this.driver);
|
|
971
|
+
return;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
throw new Error(`Day ${day}.${month}.${year} not found`);
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* Встановлення дати для тижня
|
|
979
|
+
*/
|
|
980
|
+
async setValueForWeek(date) {
|
|
981
|
+
const { year, month, day } = getYearMonthDay(date);
|
|
982
|
+
await this.moveToCalendarEnd(movesToCalendarEndForWeek);
|
|
983
|
+
await this.choosePeriodForYear(year);
|
|
984
|
+
await this.chooseYear(year);
|
|
985
|
+
await this.chooseMonth(year, month);
|
|
986
|
+
await this.chooseDay(year, month, day);
|
|
987
|
+
await this.save();
|
|
988
|
+
}
|
|
989
|
+
/**
|
|
990
|
+
* Встановлення дати для місяця
|
|
991
|
+
*/
|
|
992
|
+
async setValueForMonth(date) {
|
|
993
|
+
const { year, month } = getYearMonthDay(date);
|
|
994
|
+
await this.moveToCalendarEnd(movesToCalendarEndForMonth);
|
|
995
|
+
await this.chooseYear(year);
|
|
996
|
+
await this.chooseMonth(year, month);
|
|
997
|
+
await this.save();
|
|
998
|
+
}
|
|
999
|
+
async getDateFromInput() {
|
|
1000
|
+
const calendarPopoverElement = await this.getElement();
|
|
1001
|
+
return calendarPopoverElement.findElement(
|
|
1002
|
+
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1003
|
+
);
|
|
1004
|
+
}
|
|
1005
|
+
async getDateToInput() {
|
|
1006
|
+
const calendarPopoverElement = await this.getElement();
|
|
1007
|
+
return calendarPopoverElement.findElement(
|
|
1008
|
+
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
1009
|
+
);
|
|
1010
|
+
}
|
|
1011
|
+
async save() {
|
|
1012
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
1013
|
+
await click(btnOk, this.driver);
|
|
1014
|
+
}
|
|
1015
|
+
};
|
|
1016
|
+
}
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
1020
|
+
var import_selenium_webdriver13, DATETIME_ALLOWED_SELECTOR, BaseDateEditor;
|
|
1021
|
+
var init_BaseDateEditor = __esm({
|
|
1022
|
+
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
1023
|
+
"use strict";
|
|
1024
|
+
init_AbstractEditor();
|
|
1025
|
+
init_InputClearStrategy();
|
|
1026
|
+
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
1027
|
+
init_actions();
|
|
1028
|
+
init_utils();
|
|
1029
|
+
init_DateSelectMode();
|
|
1030
|
+
init_Calendar();
|
|
1031
|
+
DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
|
|
785
1032
|
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
786
1033
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
787
1034
|
super(parentCssSelector, elementCssSelector, driver);
|
|
788
1035
|
this.setClearStrategy(new InputClearStrategy());
|
|
789
1036
|
}
|
|
790
|
-
async
|
|
791
|
-
const dateField = await this.driver.findElement(
|
|
1037
|
+
async getIsAllowedTime() {
|
|
1038
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver13.By.css(`${this.getFullCssSelector()}`));
|
|
1039
|
+
const classString = await dateField.getAttribute("class");
|
|
1040
|
+
return classString.includes(DATETIME_ALLOWED_SELECTOR);
|
|
1041
|
+
}
|
|
1042
|
+
async initCalendar() {
|
|
792
1043
|
const dateFieldDataTestID = await this.getDataTestId();
|
|
793
|
-
const
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
);
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
1044
|
+
const calendar = new Calendar({
|
|
1045
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1046
|
+
dateFieldDataTestID,
|
|
1047
|
+
driver: this.driver
|
|
1048
|
+
});
|
|
1049
|
+
await calendar.init();
|
|
1050
|
+
return calendar;
|
|
1051
|
+
}
|
|
1052
|
+
async setValueForWeek(value) {
|
|
1053
|
+
const calendar = await this.initCalendar();
|
|
1054
|
+
await calendar.setValueForWeek(value);
|
|
1055
|
+
}
|
|
1056
|
+
async setValueForMonth(value) {
|
|
1057
|
+
const calendar = await this.initCalendar();
|
|
1058
|
+
await calendar.setValueForMonth(value);
|
|
1059
|
+
}
|
|
1060
|
+
async setArrayValue(value) {
|
|
1061
|
+
const calendar = await this.initCalendar();
|
|
1062
|
+
const dateFromInput = await calendar.getDateFromInput();
|
|
1063
|
+
const dateToInput = await calendar.getDateToInput();
|
|
802
1064
|
await this.setSingleValue(value[0], dateFromInput);
|
|
803
1065
|
await this.setSingleValue(value[1], dateToInput);
|
|
804
|
-
|
|
805
|
-
await click(btnOk, this.driver);
|
|
1066
|
+
await calendar.save();
|
|
806
1067
|
}
|
|
807
1068
|
async setSingleValue(value, inputEl) {
|
|
1069
|
+
const dateMode = await this.getDataDateMode();
|
|
1070
|
+
if (DateSelectMode.isWeek(dateMode)) {
|
|
1071
|
+
await this.setValueForWeek(value);
|
|
1072
|
+
return;
|
|
1073
|
+
}
|
|
1074
|
+
if (DateSelectMode.isMonth(dateMode)) {
|
|
1075
|
+
await this.setValueForMonth(value);
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
808
1078
|
const actions = this.driver.actions({ async: true });
|
|
809
|
-
const
|
|
1079
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1080
|
+
const formattedDate = formatDMYDate(value, isTimeAllowed);
|
|
810
1081
|
await click(inputEl, this.driver);
|
|
811
|
-
await actions.move({ origin: inputEl }).sendKeys(
|
|
812
|
-
await actions.move({ origin: inputEl }).sendKeys(formattedDate,
|
|
1082
|
+
await actions.move({ origin: inputEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
|
|
1083
|
+
await actions.move({ origin: inputEl }).sendKeys(formattedDate, import_selenium_webdriver13.Key.ENTER).perform();
|
|
813
1084
|
}
|
|
814
1085
|
async setDateValue(value) {
|
|
815
1086
|
if (Array.isArray(value)) {
|
|
@@ -823,20 +1094,21 @@ var init_BaseDateEditor = __esm({
|
|
|
823
1094
|
});
|
|
824
1095
|
|
|
825
1096
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
826
|
-
var
|
|
1097
|
+
var import_selenium_webdriver14, SingleDateEditor;
|
|
827
1098
|
var init_SingleDateEditor = __esm({
|
|
828
1099
|
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
829
1100
|
"use strict";
|
|
830
|
-
|
|
1101
|
+
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
831
1102
|
init_InputClearStrategy();
|
|
832
1103
|
init_BaseDateEditor();
|
|
1104
|
+
init_utils();
|
|
833
1105
|
SingleDateEditor = class extends BaseDateEditor {
|
|
834
1106
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
835
1107
|
super(parentCssSelector, elementCssSelector, driver);
|
|
836
1108
|
this.setClearStrategy(new InputClearStrategy());
|
|
837
1109
|
}
|
|
838
1110
|
async getDateElement() {
|
|
839
|
-
return this.driver.findElement(
|
|
1111
|
+
return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
840
1112
|
}
|
|
841
1113
|
async getDateValue() {
|
|
842
1114
|
const inputEl = await this.getDateElement();
|
|
@@ -844,6 +1116,10 @@ var init_SingleDateEditor = __esm({
|
|
|
844
1116
|
}
|
|
845
1117
|
async getValue() {
|
|
846
1118
|
const value = await this.getDateValue();
|
|
1119
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
1120
|
+
if (isTimeAllowed) {
|
|
1121
|
+
return value == "" ? null : formatToDateTime(value);
|
|
1122
|
+
}
|
|
847
1123
|
return value == "" ? null : new Date(value);
|
|
848
1124
|
}
|
|
849
1125
|
setValue(value) {
|
|
@@ -857,11 +1133,11 @@ var init_SingleDateEditor = __esm({
|
|
|
857
1133
|
});
|
|
858
1134
|
|
|
859
1135
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
860
|
-
var
|
|
1136
|
+
var import_selenium_webdriver15, DateRangeEditor;
|
|
861
1137
|
var init_DateRangeEditor = __esm({
|
|
862
1138
|
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
863
1139
|
"use strict";
|
|
864
|
-
|
|
1140
|
+
import_selenium_webdriver15 = require("selenium-webdriver");
|
|
865
1141
|
init_InputClearStrategy();
|
|
866
1142
|
init_BaseDateEditor();
|
|
867
1143
|
DateRangeEditor = class extends BaseDateEditor {
|
|
@@ -870,7 +1146,7 @@ var init_DateRangeEditor = __esm({
|
|
|
870
1146
|
this.setClearStrategy(new InputClearStrategy());
|
|
871
1147
|
}
|
|
872
1148
|
async getDateElement() {
|
|
873
|
-
return this.driver.findElement(
|
|
1149
|
+
return this.driver.findElement(import_selenium_webdriver15.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
874
1150
|
}
|
|
875
1151
|
async getDateValue() {
|
|
876
1152
|
const inputEl = await this.getDateElement();
|
|
@@ -941,39 +1217,40 @@ var init_DateEditor = __esm({
|
|
|
941
1217
|
});
|
|
942
1218
|
|
|
943
1219
|
// src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
|
|
944
|
-
var
|
|
1220
|
+
var import_selenium_webdriver16, TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
|
|
945
1221
|
var init_HeaderFilterDictionary = __esm({
|
|
946
1222
|
"src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
|
|
947
1223
|
"use strict";
|
|
948
1224
|
init_AbstractEditor();
|
|
949
|
-
|
|
1225
|
+
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
950
1226
|
init_actions();
|
|
951
1227
|
init_locators();
|
|
952
1228
|
init_ClearButtonStrategy();
|
|
953
1229
|
init_fixElementStaleError();
|
|
1230
|
+
init_withCustomTimeouts();
|
|
954
1231
|
TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
955
1232
|
DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
956
1233
|
DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
957
1234
|
CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
|
|
958
1235
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
959
|
-
|
|
1236
|
+
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
960
1237
|
combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
961
1238
|
dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
|
|
962
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
963
|
-
let optElement = null;
|
|
964
|
-
const timeout = delay ? implicit : 600;
|
|
965
1239
|
let err = null;
|
|
966
1240
|
try {
|
|
967
1241
|
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
968
|
-
await
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
1242
|
+
await withCustomTimeouts_default({
|
|
1243
|
+
driver,
|
|
1244
|
+
timeout: delay ? void 0 : 600,
|
|
1245
|
+
callback: async () => {
|
|
1246
|
+
const calendarPopoverElement = await driver.findElement(import_selenium_webdriver16.By.css(calendarPopoverSelector));
|
|
1247
|
+
const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver16.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
1248
|
+
const optElement = await customOptionList.findElement(import_selenium_webdriver16.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
1249
|
+
await click(optElement, driver);
|
|
1250
|
+
}
|
|
1251
|
+
});
|
|
973
1252
|
} catch (e) {
|
|
974
1253
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
975
|
-
} finally {
|
|
976
|
-
await driver.manage().setTimeouts({ implicit });
|
|
977
1254
|
}
|
|
978
1255
|
if (err)
|
|
979
1256
|
throw err;
|
|
@@ -992,7 +1269,7 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
992
1269
|
}
|
|
993
1270
|
}
|
|
994
1271
|
async waitOptionSelection() {
|
|
995
|
-
await fixElementStaleError(
|
|
1272
|
+
await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
996
1273
|
}
|
|
997
1274
|
async selectOption(inputEl, value, lastElement) {
|
|
998
1275
|
try {
|
|
@@ -1001,7 +1278,7 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
1001
1278
|
await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
|
|
1002
1279
|
const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
|
|
1003
1280
|
for (let i = 0; i < textLength; i++) {
|
|
1004
|
-
await inputEl.sendKeys(
|
|
1281
|
+
await inputEl.sendKeys(import_selenium_webdriver16.Key.BACK_SPACE);
|
|
1005
1282
|
}
|
|
1006
1283
|
} catch (error) {
|
|
1007
1284
|
throw error;
|
|
@@ -1016,7 +1293,7 @@ var init_HeaderFilterDictionary = __esm({
|
|
|
1016
1293
|
return [];
|
|
1017
1294
|
}
|
|
1018
1295
|
const tags = await this.driver.findElements(
|
|
1019
|
-
|
|
1296
|
+
import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
|
|
1020
1297
|
);
|
|
1021
1298
|
const values = [];
|
|
1022
1299
|
for (const tag of tags) {
|
|
@@ -1136,13 +1413,14 @@ var init_createDataTestId = __esm({
|
|
|
1136
1413
|
});
|
|
1137
1414
|
|
|
1138
1415
|
// src/pageObjects/elements/AbstractButton.ts
|
|
1139
|
-
var AbstractButton;
|
|
1416
|
+
var D5_BUTTON_IS_PRESSED, AbstractButton;
|
|
1140
1417
|
var init_AbstractButton = __esm({
|
|
1141
1418
|
"src/pageObjects/elements/AbstractButton.ts"() {
|
|
1142
1419
|
"use strict";
|
|
1143
1420
|
init_AbstractElementWithParent();
|
|
1144
1421
|
init_actions();
|
|
1145
1422
|
init_waitElementIsClickable();
|
|
1423
|
+
D5_BUTTON_IS_PRESSED = "d5-is-pressed";
|
|
1146
1424
|
AbstractButton = class extends AbstractElementWithParent {
|
|
1147
1425
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1148
1426
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -1168,17 +1446,26 @@ var init_AbstractButton = __esm({
|
|
|
1168
1446
|
return false;
|
|
1169
1447
|
}
|
|
1170
1448
|
}
|
|
1449
|
+
async isPressed() {
|
|
1450
|
+
try {
|
|
1451
|
+
const button = await this.getElement();
|
|
1452
|
+
const classAttribute = await button.getAttribute("class");
|
|
1453
|
+
return classAttribute.includes(D5_BUTTON_IS_PRESSED);
|
|
1454
|
+
} catch {
|
|
1455
|
+
return false;
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1171
1458
|
};
|
|
1172
1459
|
}
|
|
1173
1460
|
});
|
|
1174
1461
|
|
|
1175
1462
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1176
|
-
var
|
|
1463
|
+
var import_selenium_webdriver18, DXButton;
|
|
1177
1464
|
var init_DXButton = __esm({
|
|
1178
1465
|
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
1179
1466
|
"use strict";
|
|
1180
1467
|
init_AbstractButton();
|
|
1181
|
-
|
|
1468
|
+
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1182
1469
|
DXButton = class extends AbstractButton {
|
|
1183
1470
|
async getText() {
|
|
1184
1471
|
const classes = await this.getClasses();
|
|
@@ -1186,7 +1473,7 @@ var init_DXButton = __esm({
|
|
|
1186
1473
|
return null;
|
|
1187
1474
|
}
|
|
1188
1475
|
const el = await this.getElement();
|
|
1189
|
-
const textEl = el.findElement(
|
|
1476
|
+
const textEl = el.findElement(import_selenium_webdriver18.By.className("dx-button-text"));
|
|
1190
1477
|
return await textEl.getText();
|
|
1191
1478
|
}
|
|
1192
1479
|
};
|
|
@@ -1244,12 +1531,12 @@ var init_Panel = __esm({
|
|
|
1244
1531
|
});
|
|
1245
1532
|
|
|
1246
1533
|
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1247
|
-
var
|
|
1534
|
+
var import_selenium_webdriver19, TabPanelItem, TabPanel;
|
|
1248
1535
|
var init_TabPanel = __esm({
|
|
1249
1536
|
"src/pageObjects/elements/Groups/TabPanel.ts"() {
|
|
1250
1537
|
"use strict";
|
|
1251
1538
|
init_AbstractGroup();
|
|
1252
|
-
|
|
1539
|
+
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1253
1540
|
init_actions();
|
|
1254
1541
|
TabPanelItem = class extends AbstractGroup {
|
|
1255
1542
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
@@ -1260,7 +1547,7 @@ var init_TabPanel = __esm({
|
|
|
1260
1547
|
}
|
|
1261
1548
|
async isActive() {
|
|
1262
1549
|
const tabPanelItemElement = await this.getElement();
|
|
1263
|
-
const grandparentTab = await tabPanelItemElement.findElement(
|
|
1550
|
+
const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver19.By.xpath('ancestor::div[@role="tab"][1]'));
|
|
1264
1551
|
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1265
1552
|
}
|
|
1266
1553
|
async getTitle() {
|
|
@@ -1279,12 +1566,12 @@ var init_TabPanel = __esm({
|
|
|
1279
1566
|
});
|
|
1280
1567
|
|
|
1281
1568
|
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1282
|
-
var
|
|
1569
|
+
var import_selenium_webdriver20, ACCORDION_TITLE_CONTAINER, AccordionItem;
|
|
1283
1570
|
var init_AccordionItem = __esm({
|
|
1284
1571
|
"src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
|
|
1285
1572
|
"use strict";
|
|
1286
1573
|
init_AbstractGroup();
|
|
1287
|
-
|
|
1574
|
+
import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1288
1575
|
init_actions();
|
|
1289
1576
|
ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1290
1577
|
AccordionItem = class extends AbstractGroup {
|
|
@@ -1297,7 +1584,7 @@ var init_AccordionItem = __esm({
|
|
|
1297
1584
|
}
|
|
1298
1585
|
async clickAccordionItemTitle() {
|
|
1299
1586
|
const accordionElement = await this.getElement();
|
|
1300
|
-
const accordTitleElement = await accordionElement.findElement(
|
|
1587
|
+
const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver20.By.className(ACCORDION_TITLE_CONTAINER));
|
|
1301
1588
|
await accordTitleElement.click();
|
|
1302
1589
|
}
|
|
1303
1590
|
async click() {
|
|
@@ -1467,6 +1754,7 @@ var init_AbstractForm = __esm({
|
|
|
1467
1754
|
init_AbstractPage();
|
|
1468
1755
|
init_FormButton();
|
|
1469
1756
|
init_FormGroup();
|
|
1757
|
+
init_waitElementIsVisible();
|
|
1470
1758
|
AbstractForm = class extends AbstractPage {
|
|
1471
1759
|
containerCssSelector = "";
|
|
1472
1760
|
_formName = "";
|
|
@@ -1491,7 +1779,15 @@ var init_AbstractForm = __esm({
|
|
|
1491
1779
|
async exists() {
|
|
1492
1780
|
try {
|
|
1493
1781
|
let elements = await this.driver.findElements(this.containerBy);
|
|
1494
|
-
|
|
1782
|
+
if (elements.length === 0) {
|
|
1783
|
+
return false;
|
|
1784
|
+
}
|
|
1785
|
+
await waitElementIsVisible_default({
|
|
1786
|
+
element: elements[0],
|
|
1787
|
+
errorMessage: "Element exists in DOM but is not visible",
|
|
1788
|
+
driver: this.driver
|
|
1789
|
+
});
|
|
1790
|
+
return true;
|
|
1495
1791
|
} catch (error) {
|
|
1496
1792
|
return false;
|
|
1497
1793
|
}
|
|
@@ -1527,11 +1823,11 @@ function getCssRowByIndexSelector(index) {
|
|
|
1527
1823
|
function getCssCellByIndexSelector(index) {
|
|
1528
1824
|
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1529
1825
|
}
|
|
1530
|
-
var
|
|
1826
|
+
var import_selenium_webdriver21, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
1531
1827
|
var init_utils2 = __esm({
|
|
1532
1828
|
"src/pageObjects/elements/Table/utils.ts"() {
|
|
1533
1829
|
"use strict";
|
|
1534
|
-
|
|
1830
|
+
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1535
1831
|
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1536
1832
|
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1537
1833
|
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
@@ -1548,11 +1844,11 @@ var init_types3 = __esm({
|
|
|
1548
1844
|
});
|
|
1549
1845
|
|
|
1550
1846
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1551
|
-
var
|
|
1847
|
+
var import_selenium_webdriver22, Cell;
|
|
1552
1848
|
var init_Cell = __esm({
|
|
1553
1849
|
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
1554
1850
|
"use strict";
|
|
1555
|
-
|
|
1851
|
+
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1556
1852
|
init_AbstractElementWithParent();
|
|
1557
1853
|
init_utils2();
|
|
1558
1854
|
init_types3();
|
|
@@ -1569,12 +1865,12 @@ var init_Cell = __esm({
|
|
|
1569
1865
|
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1570
1866
|
}
|
|
1571
1867
|
async getBooleanValue(cellEl) {
|
|
1572
|
-
const booleanEl = await cellEl.findElement(
|
|
1868
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver22.By.className("boolean-widget"));
|
|
1573
1869
|
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
1574
1870
|
}
|
|
1575
1871
|
async getTagsValue(cellEl) {
|
|
1576
1872
|
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
1577
|
-
const tags = await cellEl.findElements(
|
|
1873
|
+
const tags = await cellEl.findElements(import_selenium_webdriver22.By.css(tagsCssSelector));
|
|
1578
1874
|
const values = [];
|
|
1579
1875
|
for (const tag of tags) {
|
|
1580
1876
|
values.push(await tag.getAttribute("textContent"));
|
|
@@ -1594,7 +1890,7 @@ var init_Cell = __esm({
|
|
|
1594
1890
|
const [datePart, timePart] = value.split(", ");
|
|
1595
1891
|
const [day, month, year] = datePart.split(".").map(Number);
|
|
1596
1892
|
const [hours, minutes] = timePart.split(":").map(Number);
|
|
1597
|
-
return new Date(
|
|
1893
|
+
return new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
1598
1894
|
} else {
|
|
1599
1895
|
const [day, month, year] = value.split(".").map(Number);
|
|
1600
1896
|
return new Date(Date.UTC(year, month - 1, day));
|
|
@@ -1628,11 +1924,11 @@ var init_Cell = __esm({
|
|
|
1628
1924
|
});
|
|
1629
1925
|
|
|
1630
1926
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1631
|
-
var
|
|
1927
|
+
var import_selenium_webdriver23, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
|
|
1632
1928
|
var init_Row = __esm({
|
|
1633
1929
|
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
1634
1930
|
"use strict";
|
|
1635
|
-
|
|
1931
|
+
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1636
1932
|
init_Cell();
|
|
1637
1933
|
init_utils2();
|
|
1638
1934
|
init_AbstractElementWithParent();
|
|
@@ -1678,9 +1974,18 @@ var init_Row = __esm({
|
|
|
1678
1974
|
getCellByTitle(title) {
|
|
1679
1975
|
return this._getCell({ title });
|
|
1680
1976
|
}
|
|
1681
|
-
async select() {
|
|
1977
|
+
async select(preserve = false) {
|
|
1682
1978
|
await staleElementAction(async () => {
|
|
1683
1979
|
const rowEl = await this.getElement();
|
|
1980
|
+
const isSelected = (await this.getClasses()).includes(DX_SELECTION_CLASS);
|
|
1981
|
+
if (isSelected && !preserve) {
|
|
1982
|
+
await this.driver.actions({ async: true }).keyUp(import_selenium_webdriver23.Key.CONTROL).perform();
|
|
1983
|
+
}
|
|
1984
|
+
if (preserve && !isSelected) {
|
|
1985
|
+
await this.driver.actions({ async: true }).keyDown(import_selenium_webdriver23.Key.CONTROL).perform();
|
|
1986
|
+
await click(rowEl, this.driver);
|
|
1987
|
+
return;
|
|
1988
|
+
}
|
|
1684
1989
|
await click(rowEl, this.driver);
|
|
1685
1990
|
});
|
|
1686
1991
|
await safeWait(
|
|
@@ -1700,7 +2005,7 @@ var init_Row = __esm({
|
|
|
1700
2005
|
return this.index;
|
|
1701
2006
|
}
|
|
1702
2007
|
async getCells() {
|
|
1703
|
-
const cells = await this.driver.findElements(
|
|
2008
|
+
const cells = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
1704
2009
|
const result = [];
|
|
1705
2010
|
cells.forEach((_, index) => {
|
|
1706
2011
|
const newCell = this.getCellByIndex(index);
|
|
@@ -1712,7 +2017,7 @@ var init_Row = __esm({
|
|
|
1712
2017
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1713
2018
|
this.index
|
|
1714
2019
|
)}"] .${buttonClass}`;
|
|
1715
|
-
const by =
|
|
2020
|
+
const by = import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
|
|
1716
2021
|
await staleElementAction(async () => {
|
|
1717
2022
|
const button = await fixElementStaleError(by, this.driver);
|
|
1718
2023
|
await click(button, this.driver);
|
|
@@ -1744,11 +2049,11 @@ var init_Row = __esm({
|
|
|
1744
2049
|
});
|
|
1745
2050
|
|
|
1746
2051
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1747
|
-
var
|
|
2052
|
+
var import_selenium_webdriver24, Column;
|
|
1748
2053
|
var init_Column = __esm({
|
|
1749
2054
|
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
1750
2055
|
"use strict";
|
|
1751
|
-
|
|
2056
|
+
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
1752
2057
|
init_utils2();
|
|
1753
2058
|
init_AbstractElementWithParent();
|
|
1754
2059
|
init_fixElementStaleError();
|
|
@@ -1776,7 +2081,7 @@ var init_Column = __esm({
|
|
|
1776
2081
|
return super.getElement();
|
|
1777
2082
|
}
|
|
1778
2083
|
async getColumnHeaderIndexBy(cssSelector) {
|
|
1779
|
-
const column = await fixElementStaleError(
|
|
2084
|
+
const column = await fixElementStaleError(import_selenium_webdriver24.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
|
|
1780
2085
|
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1781
2086
|
}
|
|
1782
2087
|
async getIndexByCaption() {
|
|
@@ -2013,8 +2318,8 @@ var init_AbstractDropDownMenuList = __esm({
|
|
|
2013
2318
|
const menuItemElement = await fixElementStaleError(by, this.driver);
|
|
2014
2319
|
await click(menuItemElement, this.driver);
|
|
2015
2320
|
}
|
|
2016
|
-
async getElementByPath(
|
|
2017
|
-
let pathList = isString(
|
|
2321
|
+
async getElementByPath(path2, getBy, returnLastElement = false) {
|
|
2322
|
+
let pathList = isString(path2) ? [path2] : path2;
|
|
2018
2323
|
let result = null;
|
|
2019
2324
|
let index = 1;
|
|
2020
2325
|
for (let text of pathList) {
|
|
@@ -2059,12 +2364,12 @@ var init_cssToXPath = __esm({
|
|
|
2059
2364
|
});
|
|
2060
2365
|
|
|
2061
2366
|
// src/pageObjects/elements/DXContextMenuList.ts
|
|
2062
|
-
var
|
|
2367
|
+
var import_selenium_webdriver25, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
|
|
2063
2368
|
var init_DXContextMenuList = __esm({
|
|
2064
2369
|
"src/pageObjects/elements/DXContextMenuList.ts"() {
|
|
2065
2370
|
"use strict";
|
|
2066
2371
|
init_AbstractDropDownMenuList();
|
|
2067
|
-
|
|
2372
|
+
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2068
2373
|
init_cssToXPath();
|
|
2069
2374
|
init_waitElementIsVisible();
|
|
2070
2375
|
CONTEXT_MENU_CLASS = "dx-context-menu";
|
|
@@ -2081,12 +2386,12 @@ var init_DXContextMenuList = __esm({
|
|
|
2081
2386
|
getButtonTitleBy(title) {
|
|
2082
2387
|
const buttonByTextXpath2 = (text) => `//span[contains(@class, "${CONTEXT_MENU_ITEM_TEXT_CLASS}") and contains(text(), "${text}")]`;
|
|
2083
2388
|
const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
|
|
2084
|
-
return
|
|
2389
|
+
return import_selenium_webdriver25.By.xpath(xpath);
|
|
2085
2390
|
}
|
|
2086
2391
|
async isVisible() {
|
|
2087
2392
|
try {
|
|
2088
2393
|
await waitElementIsVisible_default({
|
|
2089
|
-
element: await this.driver.findElement(
|
|
2394
|
+
element: await this.driver.findElement(import_selenium_webdriver25.By.css(`.dx-overlay-wrapper .dx-context-menu`)),
|
|
2090
2395
|
driver: this.driver,
|
|
2091
2396
|
errorMessage: "Cannot find dropdown element"
|
|
2092
2397
|
});
|
|
@@ -2132,11 +2437,11 @@ var init_ContextMenu = __esm({
|
|
|
2132
2437
|
});
|
|
2133
2438
|
|
|
2134
2439
|
// src/pageObjects/elements/Table/Table.ts
|
|
2135
|
-
var
|
|
2440
|
+
var import_selenium_webdriver26, Table;
|
|
2136
2441
|
var init_Table = __esm({
|
|
2137
2442
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
2138
2443
|
"use strict";
|
|
2139
|
-
|
|
2444
|
+
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2140
2445
|
init_createDataTestId();
|
|
2141
2446
|
init_AbstractElementWithParent();
|
|
2142
2447
|
init_Row();
|
|
@@ -2144,6 +2449,8 @@ var init_Table = __esm({
|
|
|
2144
2449
|
init_FormField();
|
|
2145
2450
|
init_ContextMenu();
|
|
2146
2451
|
init_actions();
|
|
2452
|
+
init_wait();
|
|
2453
|
+
init_withCustomTimeouts();
|
|
2147
2454
|
Table = class extends AbstractElementWithParent {
|
|
2148
2455
|
formName;
|
|
2149
2456
|
headerCssSelector;
|
|
@@ -2209,13 +2516,32 @@ var init_Table = __esm({
|
|
|
2209
2516
|
/**
|
|
2210
2517
|
* Вибрати рядок по індексу.
|
|
2211
2518
|
* @param index починається з 0
|
|
2519
|
+
* @param preserve boolean який изначає, чи повинні раніше вибрані рядки залишатися вибраними
|
|
2212
2520
|
*/
|
|
2213
|
-
selectRowByIndex(index) {
|
|
2214
|
-
return this.getRowByIndex(index).select();
|
|
2521
|
+
selectRowByIndex(index, preserve = false) {
|
|
2522
|
+
return this.getRowByIndex(index).select(preserve);
|
|
2215
2523
|
}
|
|
2216
|
-
|
|
2524
|
+
/**
|
|
2525
|
+
* Вибрати масив рядків по індексу.
|
|
2526
|
+
* @param indexes починається з 0
|
|
2527
|
+
*/
|
|
2528
|
+
async selectRowsByIndexes(indexes) {
|
|
2529
|
+
for (const index of indexes) {
|
|
2530
|
+
await this.selectRowByIndex(index, true);
|
|
2531
|
+
}
|
|
2532
|
+
}
|
|
2533
|
+
getRowElements(timeout) {
|
|
2217
2534
|
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
2218
|
-
|
|
2535
|
+
return withCustomTimeouts_default({
|
|
2536
|
+
driver: this.driver,
|
|
2537
|
+
timeout,
|
|
2538
|
+
callback: () => {
|
|
2539
|
+
return this.driver.findElements(import_selenium_webdriver26.By.css(rowsFullCssSelector));
|
|
2540
|
+
}
|
|
2541
|
+
});
|
|
2542
|
+
}
|
|
2543
|
+
async getRows() {
|
|
2544
|
+
const rows = await this.getRowElements();
|
|
2219
2545
|
const result = [];
|
|
2220
2546
|
rows.forEach((_, index) => {
|
|
2221
2547
|
const newRow = new Row(
|
|
@@ -2231,7 +2557,7 @@ var init_Table = __esm({
|
|
|
2231
2557
|
}
|
|
2232
2558
|
async getColumns() {
|
|
2233
2559
|
const columns = await this.driver.findElements(
|
|
2234
|
-
|
|
2560
|
+
import_selenium_webdriver26.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`)
|
|
2235
2561
|
);
|
|
2236
2562
|
const result = [];
|
|
2237
2563
|
columns.forEach((_, index) => {
|
|
@@ -2301,16 +2627,82 @@ var init_Table = __esm({
|
|
|
2301
2627
|
await contextMenu(cellElement, this.driver);
|
|
2302
2628
|
});
|
|
2303
2629
|
}
|
|
2630
|
+
/**
|
|
2631
|
+
* Отримує значення комірки таблиці за ім'ям комірки та індексом рядка.
|
|
2632
|
+
*
|
|
2633
|
+
* @param {string} cellName - Ім'я комірки (поля) в таблиці
|
|
2634
|
+
* @param {number} rowIndex - Індекс рядка (починається з 0)
|
|
2635
|
+
* @throws {Error} Викидає помилку, якщо rowIndex не вказано
|
|
2636
|
+
* @returns {Promise<string>} Повертає значення комірки
|
|
2637
|
+
*
|
|
2638
|
+
* @example
|
|
2639
|
+
* const table = new Table(driver);
|
|
2640
|
+
*
|
|
2641
|
+
* // Отримання значення комірки 'Name' в першому рядку (індекс 0)
|
|
2642
|
+
* const cellValue = await table.getCellValueByCellName('Name', 0);
|
|
2643
|
+
* expect(cellValue).toBe('Очікуване значення');
|
|
2644
|
+
*/
|
|
2645
|
+
getCellValueByCellName(cellName, rowIndex) {
|
|
2646
|
+
if (rowIndex == null) {
|
|
2647
|
+
throw new Error("Error: getCellValue(): rowIndex is required");
|
|
2648
|
+
}
|
|
2649
|
+
const row = this.getRowByIndex(rowIndex);
|
|
2650
|
+
return row.getCell(cellName).getValue();
|
|
2651
|
+
}
|
|
2652
|
+
/**
|
|
2653
|
+
* Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
|
|
2654
|
+
*
|
|
2655
|
+
* @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
|
|
2656
|
+
*
|
|
2657
|
+
* @example
|
|
2658
|
+
* const table = new Table(driver);
|
|
2659
|
+
*
|
|
2660
|
+
* // Перевірка чи порожня таблиця
|
|
2661
|
+
* const empty = await table.isEmpty();
|
|
2662
|
+
* expect(empty).toBe(true);
|
|
2663
|
+
*/
|
|
2664
|
+
async isEmpty() {
|
|
2665
|
+
try {
|
|
2666
|
+
await this.waitRowsCount(0);
|
|
2667
|
+
return true;
|
|
2668
|
+
} catch {
|
|
2669
|
+
return false;
|
|
2670
|
+
}
|
|
2671
|
+
}
|
|
2672
|
+
/**
|
|
2673
|
+
* Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
|
|
2674
|
+
* Використовується для синхронізації тестів з динамічним завантаженням даних.
|
|
2675
|
+
*
|
|
2676
|
+
* @param {number} count - Очікувана кількість рядків у таблиці
|
|
2677
|
+
* @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
|
|
2678
|
+
* @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
|
|
2679
|
+
*
|
|
2680
|
+
* @example
|
|
2681
|
+
* const table = new Table(driver);
|
|
2682
|
+
*
|
|
2683
|
+
* // Очікування, поки таблиця не стане порожньою
|
|
2684
|
+
* await table.waitRowsCount(0);
|
|
2685
|
+
*
|
|
2686
|
+
* // Очікування, поки в таблиці не з'явиться 5 рядків
|
|
2687
|
+
* await table.waitRowsCount(5);
|
|
2688
|
+
* console.log('Таблиця містить 5 рядків');
|
|
2689
|
+
*/
|
|
2690
|
+
async waitRowsCount(count) {
|
|
2691
|
+
await safeWait(async () => {
|
|
2692
|
+
const rows = await this.getRowElements(1e3);
|
|
2693
|
+
return rows.length === count;
|
|
2694
|
+
}, this.driver, `Rows count not equal: ${count}`);
|
|
2695
|
+
}
|
|
2304
2696
|
};
|
|
2305
2697
|
}
|
|
2306
2698
|
});
|
|
2307
2699
|
|
|
2308
2700
|
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
2309
|
-
var
|
|
2701
|
+
var import_selenium_webdriver27, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, ToolbarButton;
|
|
2310
2702
|
var init_ToolbarButton = __esm({
|
|
2311
2703
|
"src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
|
|
2312
2704
|
"use strict";
|
|
2313
|
-
|
|
2705
|
+
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2314
2706
|
init_AbstractButton();
|
|
2315
2707
|
TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
2316
2708
|
TOOLBAR_BUTTON_TEXT_CLASS = "dx-button-text";
|
|
@@ -2327,7 +2719,7 @@ var init_ToolbarButton = __esm({
|
|
|
2327
2719
|
}
|
|
2328
2720
|
async getTitle() {
|
|
2329
2721
|
try {
|
|
2330
|
-
const buttonTextContainer = await this.driver.findElement(
|
|
2722
|
+
const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
|
|
2331
2723
|
return await buttonTextContainer.getText();
|
|
2332
2724
|
} catch (_) {
|
|
2333
2725
|
return null;
|
|
@@ -2338,12 +2730,12 @@ var init_ToolbarButton = __esm({
|
|
|
2338
2730
|
});
|
|
2339
2731
|
|
|
2340
2732
|
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
2341
|
-
var
|
|
2733
|
+
var import_selenium_webdriver28, ToolbarGroupButton;
|
|
2342
2734
|
var init_ToolbarGroupButton = __esm({
|
|
2343
2735
|
"src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
|
|
2344
2736
|
"use strict";
|
|
2345
2737
|
init_AbstractButton();
|
|
2346
|
-
|
|
2738
|
+
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2347
2739
|
init_ToolbarButton();
|
|
2348
2740
|
ToolbarGroupButton = class extends AbstractButton {
|
|
2349
2741
|
name;
|
|
@@ -2356,7 +2748,7 @@ var init_ToolbarGroupButton = __esm({
|
|
|
2356
2748
|
}
|
|
2357
2749
|
async getTitle() {
|
|
2358
2750
|
try {
|
|
2359
|
-
const buttonTextContainer = await this.driver.findElement(
|
|
2751
|
+
const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver28.By.css(getToolbarButtonTextSelector(this.name)));
|
|
2360
2752
|
return await buttonTextContainer.getText();
|
|
2361
2753
|
} catch (_) {
|
|
2362
2754
|
return null;
|
|
@@ -2567,6 +2959,14 @@ var init_ToolbarItem = __esm({
|
|
|
2567
2959
|
return false;
|
|
2568
2960
|
}
|
|
2569
2961
|
}
|
|
2962
|
+
async isPressed() {
|
|
2963
|
+
try {
|
|
2964
|
+
await this.init();
|
|
2965
|
+
return this._button.isPressed();
|
|
2966
|
+
} catch (error) {
|
|
2967
|
+
return false;
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2570
2970
|
async getTitle() {
|
|
2571
2971
|
await this.init();
|
|
2572
2972
|
return await this._button.getTitle();
|
|
@@ -2600,11 +3000,11 @@ var init_FormToolbar = __esm({
|
|
|
2600
3000
|
});
|
|
2601
3001
|
|
|
2602
3002
|
// src/pageObjects/elements/Filters/FilterOperation.ts
|
|
2603
|
-
var
|
|
3003
|
+
var import_selenium_webdriver29, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
|
|
2604
3004
|
var init_FilterOperation = __esm({
|
|
2605
3005
|
"src/pageObjects/elements/Filters/FilterOperation.ts"() {
|
|
2606
3006
|
"use strict";
|
|
2607
|
-
|
|
3007
|
+
import_selenium_webdriver29 = require("selenium-webdriver");
|
|
2608
3008
|
init_fixElementStaleError();
|
|
2609
3009
|
init_AbstractElementWithParent();
|
|
2610
3010
|
init_locators();
|
|
@@ -2644,10 +3044,10 @@ var init_FilterOperation = __esm({
|
|
|
2644
3044
|
errorMessage: "Widget operation is not clickable",
|
|
2645
3045
|
driver: this.driver
|
|
2646
3046
|
});
|
|
2647
|
-
const clickableElement = await widgetButtonEl.findElement(
|
|
3047
|
+
const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver29.By.className("dx-icon"));
|
|
2648
3048
|
await click(clickableElement, this.driver);
|
|
2649
3049
|
try {
|
|
2650
|
-
const widgetPopupEl = await this.driver.findElement(
|
|
3050
|
+
const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
|
|
2651
3051
|
await waitElementIsVisible_default({
|
|
2652
3052
|
element: widgetPopupEl,
|
|
2653
3053
|
errorMessage: `Operation widget popup is not visible`,
|
|
@@ -2662,7 +3062,7 @@ var init_FilterOperation = __esm({
|
|
|
2662
3062
|
throw new Error(`Operation with name "${operationName}" is not correct.`);
|
|
2663
3063
|
}
|
|
2664
3064
|
await this.initOperationWidget();
|
|
2665
|
-
const operationEl = await fixElementStaleError(
|
|
3065
|
+
const operationEl = await fixElementStaleError(import_selenium_webdriver29.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
|
|
2666
3066
|
await click(operationEl, this.driver);
|
|
2667
3067
|
await safeWait(
|
|
2668
3068
|
async () => {
|
|
@@ -2918,11 +3318,11 @@ var init_PanelFilterField = __esm({
|
|
|
2918
3318
|
});
|
|
2919
3319
|
|
|
2920
3320
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
2921
|
-
var
|
|
3321
|
+
var import_selenium_webdriver30, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
2922
3322
|
var init_FilterPanel = __esm({
|
|
2923
3323
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
2924
3324
|
"use strict";
|
|
2925
|
-
|
|
3325
|
+
import_selenium_webdriver30 = require("selenium-webdriver");
|
|
2926
3326
|
init_AbstractElement();
|
|
2927
3327
|
init_PanelFilterField();
|
|
2928
3328
|
init_actions();
|
|
@@ -2937,7 +3337,7 @@ var init_FilterPanel = __esm({
|
|
|
2937
3337
|
async filterPanelButtons() {
|
|
2938
3338
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
2939
3339
|
const el = await this.getElement();
|
|
2940
|
-
return el.findElements(
|
|
3340
|
+
return el.findElements(import_selenium_webdriver30.By.css(selector));
|
|
2941
3341
|
}
|
|
2942
3342
|
constructor(formName, driver) {
|
|
2943
3343
|
super(driver, drawerSelector(formName));
|
|
@@ -2970,7 +3370,7 @@ var init_FilterPanel = __esm({
|
|
|
2970
3370
|
await this.driver.sleep(300);
|
|
2971
3371
|
}
|
|
2972
3372
|
async close() {
|
|
2973
|
-
const btn = await this.driver.findElement(
|
|
3373
|
+
const btn = await this.driver.findElement(import_selenium_webdriver30.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
2974
3374
|
await click(btn, this.driver);
|
|
2975
3375
|
}
|
|
2976
3376
|
};
|
|
@@ -3006,12 +3406,12 @@ var init_HeaderFilterField = __esm({
|
|
|
3006
3406
|
});
|
|
3007
3407
|
|
|
3008
3408
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
3009
|
-
var
|
|
3409
|
+
var import_selenium_webdriver31, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
3010
3410
|
var init_ColumnFilter = __esm({
|
|
3011
3411
|
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
3012
3412
|
"use strict";
|
|
3013
3413
|
init_actions();
|
|
3014
|
-
|
|
3414
|
+
import_selenium_webdriver31 = require("selenium-webdriver");
|
|
3015
3415
|
init_HeaderFilterField();
|
|
3016
3416
|
init_waitElementIsVisible();
|
|
3017
3417
|
init_AbstractElement();
|
|
@@ -3020,7 +3420,7 @@ var init_ColumnFilter = __esm({
|
|
|
3020
3420
|
init_wait();
|
|
3021
3421
|
APPLY_SELECTOR = ".apply-button";
|
|
3022
3422
|
CANCEL_SELECTOR = ".cancel-button";
|
|
3023
|
-
HEADER_FILTER_ICON = ".
|
|
3423
|
+
HEADER_FILTER_ICON = ".indicators-container .filter-icon";
|
|
3024
3424
|
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
3025
3425
|
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
3026
3426
|
ColumnFilter = class extends AbstractElement {
|
|
@@ -3036,11 +3436,11 @@ var init_ColumnFilter = __esm({
|
|
|
3036
3436
|
}
|
|
3037
3437
|
async getApplyButton() {
|
|
3038
3438
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
|
|
3039
|
-
return this.driver.findElement(
|
|
3439
|
+
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3040
3440
|
}
|
|
3041
3441
|
async getCancelButton() {
|
|
3042
3442
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
|
|
3043
|
-
return this.driver.findElement(
|
|
3443
|
+
return this.driver.findElement(import_selenium_webdriver31.By.css(selector));
|
|
3044
3444
|
}
|
|
3045
3445
|
async apply() {
|
|
3046
3446
|
const btn = await this.getApplyButton();
|
|
@@ -3054,24 +3454,15 @@ var init_ColumnFilter = __esm({
|
|
|
3054
3454
|
const columnEl = await this._column.getElement();
|
|
3055
3455
|
const actions = this.driver.actions({ async: true });
|
|
3056
3456
|
await actions.move({ origin: columnEl }).perform();
|
|
3057
|
-
const
|
|
3058
|
-
let headerFilterIcon =
|
|
3457
|
+
const headerFilterIconBy = import_selenium_webdriver31.By.css(HEADER_FILTER_ICON);
|
|
3458
|
+
let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
|
|
3059
3459
|
await safeWait(
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
for (let element of elements) {
|
|
3063
|
-
if (await element.isDisplayed()) {
|
|
3064
|
-
headerFilterIcon = element;
|
|
3065
|
-
result = true;
|
|
3066
|
-
break;
|
|
3067
|
-
}
|
|
3068
|
-
}
|
|
3069
|
-
return result;
|
|
3460
|
+
() => {
|
|
3461
|
+
return headerFilterIcon.isDisplayed();
|
|
3070
3462
|
},
|
|
3071
3463
|
this.driver,
|
|
3072
3464
|
`HeaderFilter "${this._name}" is not visible`
|
|
3073
3465
|
);
|
|
3074
|
-
if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
3075
3466
|
await click(headerFilterIcon, this.driver);
|
|
3076
3467
|
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
3077
3468
|
const filterEl = await filter.getElement();
|
|
@@ -3210,9 +3601,9 @@ var init_ListForm = __esm({
|
|
|
3210
3601
|
init_FormFilterField();
|
|
3211
3602
|
init_FilterPanel();
|
|
3212
3603
|
init_ColumnFilter();
|
|
3213
|
-
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content
|
|
3214
|
-
DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content
|
|
3215
|
-
FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-
|
|
3604
|
+
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
3605
|
+
DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
3606
|
+
FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-sticky-columns .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
|
|
3216
3607
|
CONTEXT_MENU_CSS_SELECTOR = ".dx-datagrid";
|
|
3217
3608
|
ListForm = class extends Form {
|
|
3218
3609
|
headerCssSelector;
|
|
@@ -3297,9 +3688,9 @@ var init_TreeView = __esm({
|
|
|
3297
3688
|
"src/pageObjects/elements/Forms/TreeView.ts"() {
|
|
3298
3689
|
"use strict";
|
|
3299
3690
|
init_ListForm();
|
|
3300
|
-
TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content
|
|
3301
|
-
TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content
|
|
3302
|
-
FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-
|
|
3691
|
+
TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3692
|
+
TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3693
|
+
FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-sticky-columns .dx-treelist-content .dx-treelist-table.dx-treelist-table-fixed";
|
|
3303
3694
|
TreeView = class extends ListForm {
|
|
3304
3695
|
constructor(driver) {
|
|
3305
3696
|
super(driver);
|
|
@@ -3352,12 +3743,12 @@ var init_createSubFormInstance = __esm({
|
|
|
3352
3743
|
});
|
|
3353
3744
|
|
|
3354
3745
|
// src/pageObjects/elements/Forms/Form.ts
|
|
3355
|
-
var
|
|
3746
|
+
var import_selenium_webdriver32, formTestId, Form;
|
|
3356
3747
|
var init_Form = __esm({
|
|
3357
3748
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
3358
3749
|
"use strict";
|
|
3359
3750
|
init_locators();
|
|
3360
|
-
|
|
3751
|
+
import_selenium_webdriver32 = require("selenium-webdriver");
|
|
3361
3752
|
init_AbstractForm();
|
|
3362
3753
|
init_waitElementIsVisible();
|
|
3363
3754
|
init_createSubFormInstance();
|
|
@@ -3382,7 +3773,7 @@ var init_Form = __esm({
|
|
|
3382
3773
|
*/
|
|
3383
3774
|
async getTitleText() {
|
|
3384
3775
|
if (await this.isModal()) {
|
|
3385
|
-
const titleEl2 = await this.driver.findElement(
|
|
3776
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver32.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
3386
3777
|
await waitElementIsVisible_default({
|
|
3387
3778
|
element: titleEl2,
|
|
3388
3779
|
driver: this.driver,
|
|
@@ -3390,7 +3781,7 @@ var init_Form = __esm({
|
|
|
3390
3781
|
});
|
|
3391
3782
|
return titleEl2.getText();
|
|
3392
3783
|
}
|
|
3393
|
-
let titleEl = await this.driver.findElement(
|
|
3784
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver32.By.className("main-toolbar-form-title"));
|
|
3394
3785
|
return titleEl.getText();
|
|
3395
3786
|
}
|
|
3396
3787
|
setSubFormMode() {
|
|
@@ -3409,7 +3800,7 @@ var init_Form = __esm({
|
|
|
3409
3800
|
async subForm(name, options = {}) {
|
|
3410
3801
|
const { isDockPanel = false } = options;
|
|
3411
3802
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
3412
|
-
const byCssSelector =
|
|
3803
|
+
const byCssSelector = import_selenium_webdriver32.By.css(cssSelector);
|
|
3413
3804
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
3414
3805
|
await waitElementIsVisible_default({
|
|
3415
3806
|
element: subFormEl,
|
|
@@ -3439,12 +3830,12 @@ var FormEdit_exports = {};
|
|
|
3439
3830
|
__export(FormEdit_exports, {
|
|
3440
3831
|
default: () => FormEdit
|
|
3441
3832
|
});
|
|
3442
|
-
var
|
|
3833
|
+
var import_selenium_webdriver33, FormEdit;
|
|
3443
3834
|
var init_FormEdit = __esm({
|
|
3444
3835
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
3445
3836
|
"use strict";
|
|
3446
3837
|
init_Form();
|
|
3447
|
-
|
|
3838
|
+
import_selenium_webdriver33 = require("selenium-webdriver");
|
|
3448
3839
|
init_FormField();
|
|
3449
3840
|
init_actions();
|
|
3450
3841
|
init_wait();
|
|
@@ -3480,7 +3871,7 @@ var init_FormEdit = __esm({
|
|
|
3480
3871
|
*/
|
|
3481
3872
|
async isSaveButtonDisabled() {
|
|
3482
3873
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3483
|
-
const saveButton = await this.driver.findElement(
|
|
3874
|
+
const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
|
|
3484
3875
|
const result = await saveButton.getAttribute("aria-disabled");
|
|
3485
3876
|
return result === "true";
|
|
3486
3877
|
}
|
|
@@ -3493,7 +3884,7 @@ var init_FormEdit = __esm({
|
|
|
3493
3884
|
*/
|
|
3494
3885
|
async saveButtonClick() {
|
|
3495
3886
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3496
|
-
const saveButton = await this.driver.findElement(
|
|
3887
|
+
const saveButton = await this.driver.findElement(import_selenium_webdriver33.By.css(saveButtonCssSelector));
|
|
3497
3888
|
await safeWait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
3498
3889
|
await click(saveButton, this.driver);
|
|
3499
3890
|
}
|
|
@@ -3506,7 +3897,7 @@ var init_FormEdit = __esm({
|
|
|
3506
3897
|
*/
|
|
3507
3898
|
async closeButtonClick() {
|
|
3508
3899
|
const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
|
|
3509
|
-
const closeButton = await this.driver.findElement(
|
|
3900
|
+
const closeButton = await this.driver.findElement(import_selenium_webdriver33.By.css(closeButtonCssSelector));
|
|
3510
3901
|
await click(closeButton, this.driver);
|
|
3511
3902
|
}
|
|
3512
3903
|
};
|
|
@@ -3600,6 +3991,9 @@ init_locators();
|
|
|
3600
3991
|
|
|
3601
3992
|
// src/utils/createDriver.ts
|
|
3602
3993
|
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
3994
|
+
var import_node_path = __toESM(require("path"));
|
|
3995
|
+
var import_node_fs = __toESM(require("fs"));
|
|
3996
|
+
var import_node_os = __toESM(require("os"));
|
|
3603
3997
|
init_config();
|
|
3604
3998
|
var import_chrome = __toESM(require("selenium-webdriver/chrome"));
|
|
3605
3999
|
var import_firefox = __toESM(require("selenium-webdriver/firefox"));
|
|
@@ -3607,7 +4001,15 @@ function chromeOptions(builder, options) {
|
|
|
3607
4001
|
const ChromeOptions = new import_chrome.default.Options();
|
|
3608
4002
|
if (options.headless) {
|
|
3609
4003
|
ChromeOptions.addArguments(`--headless=new`);
|
|
4004
|
+
ChromeOptions.addArguments(`--disable-gpu`);
|
|
4005
|
+
ChromeOptions.addArguments(`--disable-dev-shm-usage`);
|
|
4006
|
+
ChromeOptions.addArguments(`--window-size=1920,1080`);
|
|
4007
|
+
}
|
|
4008
|
+
const userDataDir = import_node_path.default.join(import_node_os.default.tmpdir(), ".chrome-cache");
|
|
4009
|
+
if (!import_node_fs.default.existsSync(userDataDir)) {
|
|
4010
|
+
import_node_fs.default.mkdirSync(userDataDir, { recursive: true });
|
|
3610
4011
|
}
|
|
4012
|
+
ChromeOptions.addArguments(`--user-data-dir=${userDataDir}`);
|
|
3611
4013
|
return builder.setChromeOptions(ChromeOptions);
|
|
3612
4014
|
}
|
|
3613
4015
|
function firefoxOptions(builder, options) {
|
|
@@ -3635,7 +4037,9 @@ var createDriver = async (browser) => {
|
|
|
3635
4037
|
const driver = await builder.build();
|
|
3636
4038
|
const manage = driver.manage();
|
|
3637
4039
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
3638
|
-
|
|
4040
|
+
if (!headless) {
|
|
4041
|
+
await manage.window().maximize();
|
|
4042
|
+
}
|
|
3639
4043
|
return driver;
|
|
3640
4044
|
};
|
|
3641
4045
|
|
|
@@ -3679,7 +4083,7 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
|
3679
4083
|
};
|
|
3680
4084
|
|
|
3681
4085
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
3682
|
-
var
|
|
4086
|
+
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
3683
4087
|
init_wait();
|
|
3684
4088
|
init_locators();
|
|
3685
4089
|
init_Editors();
|
|
@@ -3777,7 +4181,7 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3777
4181
|
*/
|
|
3778
4182
|
async searchClear() {
|
|
3779
4183
|
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
3780
|
-
const clearBtn = await fixElementStaleError(
|
|
4184
|
+
const clearBtn = await fixElementStaleError(import_selenium_webdriver17.By.css(clearBtnSelector), this.driver);
|
|
3781
4185
|
if (await clearBtn.isDisplayed()) {
|
|
3782
4186
|
await click(clearBtn, this.driver);
|
|
3783
4187
|
}
|
|
@@ -3791,7 +4195,7 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3791
4195
|
*/
|
|
3792
4196
|
item(name) {
|
|
3793
4197
|
const elementCSS = createSubSystemTestId(name);
|
|
3794
|
-
return new SubsystemItem({ driver: this.driver, bySelector:
|
|
4198
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
|
|
3795
4199
|
}
|
|
3796
4200
|
/**
|
|
3797
4201
|
* Возвращает сабсистему по заголовку
|
|
@@ -3801,7 +4205,7 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3801
4205
|
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
3802
4206
|
*/
|
|
3803
4207
|
itemByTitle(title) {
|
|
3804
|
-
return new SubsystemItem({ driver: this.driver, bySelector:
|
|
4208
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver17.By.css(byTitleCssSelector(title)) });
|
|
3805
4209
|
}
|
|
3806
4210
|
/**
|
|
3807
4211
|
* Возвращается на уровень выше по сабсистемам
|
|
@@ -3811,7 +4215,7 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3811
4215
|
* wait subsystemsPanel.back();
|
|
3812
4216
|
*/
|
|
3813
4217
|
async back() {
|
|
3814
|
-
const by =
|
|
4218
|
+
const by = import_selenium_webdriver17.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
|
|
3815
4219
|
await waitElementIsVisible_default(
|
|
3816
4220
|
{
|
|
3817
4221
|
by,
|
|
@@ -3856,7 +4260,7 @@ init_FilterPanel();
|
|
|
3856
4260
|
|
|
3857
4261
|
// src/pageObjects/elements/Dialog.ts
|
|
3858
4262
|
init_AbstractElement();
|
|
3859
|
-
var
|
|
4263
|
+
var import_selenium_webdriver34 = require("selenium-webdriver");
|
|
3860
4264
|
init_AbstractButton();
|
|
3861
4265
|
var DIALOG_CLASS = ".d5-dialog";
|
|
3862
4266
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
@@ -3871,7 +4275,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
3871
4275
|
}
|
|
3872
4276
|
async getElement() {
|
|
3873
4277
|
const panel = await super.getElement();
|
|
3874
|
-
return panel.findElement(
|
|
4278
|
+
return panel.findElement(import_selenium_webdriver34.By.xpath(buttonByTextXpath(this.text)));
|
|
3875
4279
|
}
|
|
3876
4280
|
buttonNotDisplayedError() {
|
|
3877
4281
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -3894,11 +4298,11 @@ var Dialog = class extends AbstractElement {
|
|
|
3894
4298
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
3895
4299
|
}
|
|
3896
4300
|
async title() {
|
|
3897
|
-
const el = await this.driver.findElement(
|
|
4301
|
+
const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.titleSelector));
|
|
3898
4302
|
return await el.getText();
|
|
3899
4303
|
}
|
|
3900
4304
|
async text() {
|
|
3901
|
-
const el = await this.driver.findElement(
|
|
4305
|
+
const el = await this.driver.findElement(import_selenium_webdriver34.By.css(this.textSelector));
|
|
3902
4306
|
return await el.getText();
|
|
3903
4307
|
}
|
|
3904
4308
|
button(text) {
|