d5-testing-library 1.9.0-alpha.3 → 1.9.0-alpha.33
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-VFV53QIZ.mjs +7 -0
- package/dist/ListForm-KIHLT7EU.mjs +7 -0
- package/dist/TreeView-TFBZB2UK.mjs +8 -0
- package/dist/{chunk-IYYD4X7U.mjs → chunk-EFNMD3S7.mjs} +1 -1
- package/dist/{chunk-SDT2W3SL.mjs → chunk-GVYXH7L3.mjs} +1 -1
- package/dist/{chunk-ROHBQLRX.mjs → chunk-RPSLW2WB.mjs} +399 -67
- package/dist/{chunk-GP4LKGNA.mjs → chunk-TSE33S3X.mjs} +175 -38
- package/dist/cjs/d5-testing-library.cjs +3474 -173
- package/dist/cjs/d5-testing-library.d.ts +84 -4
- package/dist/d5-testing-library.d.mts +84 -4
- package/dist/d5-testing-library.legacy-esm.js +2843 -5
- package/dist/d5-testing-library.mjs +2843 -5
- package/package.json +12 -12
- package/dist/FormEdit-3LEWNAX2.mjs +0 -7
- package/dist/ListForm-GQBL7TEK.mjs +0 -7
- package/dist/TreeView-SO5WRZ7F.mjs +0 -8
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
9
|
+
}) : x)(function(x) {
|
|
10
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
11
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
+
});
|
|
13
|
+
var __commonJS = (cb, mod) => function __require2() {
|
|
14
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
25
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
26
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
27
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
28
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
29
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
30
|
+
mod
|
|
31
|
+
));
|
|
32
|
+
|
|
1
33
|
// src/config.ts
|
|
2
34
|
var Config = class _Config {
|
|
3
35
|
static instance;
|
|
@@ -86,6 +118,9 @@ var AbstractElement = class {
|
|
|
86
118
|
async getDataTestId() {
|
|
87
119
|
return await this.getAttribute("data-testid");
|
|
88
120
|
}
|
|
121
|
+
async getDataDateMode() {
|
|
122
|
+
return await this.getAttribute("data-datemode");
|
|
123
|
+
}
|
|
89
124
|
};
|
|
90
125
|
|
|
91
126
|
// src/pageObjects/pages/AbstractPage.ts
|
|
@@ -170,6 +205,7 @@ var byTestId = (testId, element = "div") => {
|
|
|
170
205
|
return By2.css(byTestIdCssSelector(testId, element));
|
|
171
206
|
};
|
|
172
207
|
var readonlyLocator = "readonly";
|
|
208
|
+
var disabledLocator = "disabled";
|
|
173
209
|
|
|
174
210
|
// src/utils/waitElementIsClickable.ts
|
|
175
211
|
async function waitElementIsClickable({
|
|
@@ -217,6 +253,10 @@ var AbstractElementWithParent = class extends AbstractElement {
|
|
|
217
253
|
const classSting = await this.getClasses();
|
|
218
254
|
return classSting.includes(readonlyLocator);
|
|
219
255
|
}
|
|
256
|
+
async isDisabled() {
|
|
257
|
+
const classSting = await this.getClasses();
|
|
258
|
+
return classSting.includes(disabledLocator);
|
|
259
|
+
}
|
|
220
260
|
};
|
|
221
261
|
|
|
222
262
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
@@ -352,22 +392,34 @@ var ClearButtonStrategy = class {
|
|
|
352
392
|
}
|
|
353
393
|
};
|
|
354
394
|
|
|
395
|
+
// src/utils/withCustomTimeouts.ts
|
|
396
|
+
async function withCustomTimeouts({ driver, timeout, callback }) {
|
|
397
|
+
const { implicit: defaultTimeout } = await driver.manage().getTimeouts();
|
|
398
|
+
try {
|
|
399
|
+
await driver.manage().setTimeouts({ implicit: timeout ?? defaultTimeout });
|
|
400
|
+
return await callback();
|
|
401
|
+
} finally {
|
|
402
|
+
await driver.manage().setTimeouts({ implicit: defaultTimeout });
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
var withCustomTimeouts_default = withCustomTimeouts;
|
|
406
|
+
|
|
355
407
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
356
408
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
357
409
|
var combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
358
410
|
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
411
|
let err = null;
|
|
363
412
|
try {
|
|
364
|
-
await
|
|
365
|
-
|
|
366
|
-
|
|
413
|
+
await withCustomTimeouts_default({
|
|
414
|
+
driver,
|
|
415
|
+
timeout: delay ? void 0 : 200,
|
|
416
|
+
callback: async () => {
|
|
417
|
+
let optElement = await driver.findElement(By5.xpath(combinedValueXpath(optionValue)));
|
|
418
|
+
await click(optElement, driver);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
367
421
|
} catch (e) {
|
|
368
422
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
369
|
-
} finally {
|
|
370
|
-
await driver.manage().setTimeouts({ implicit });
|
|
371
423
|
}
|
|
372
424
|
if (err)
|
|
373
425
|
throw err;
|
|
@@ -427,7 +479,7 @@ var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
|
427
479
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
428
480
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
429
481
|
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
430
|
-
var
|
|
482
|
+
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
483
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
432
484
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
433
485
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -442,9 +494,15 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
442
494
|
}
|
|
443
495
|
await this.confirmSelection();
|
|
444
496
|
}
|
|
445
|
-
async waitOptionSelection() {
|
|
446
|
-
|
|
447
|
-
|
|
497
|
+
async waitOptionSelection(value) {
|
|
498
|
+
await safeWait(
|
|
499
|
+
async () => {
|
|
500
|
+
const elements = await this.driver.findElements(By6.xpath(getSelectedOptionXpath(value)));
|
|
501
|
+
if (elements.length === 0) return false;
|
|
502
|
+
return await elements[0].isDisplayed();
|
|
503
|
+
},
|
|
504
|
+
this.driver
|
|
505
|
+
);
|
|
448
506
|
}
|
|
449
507
|
async selectOption(inputEl, value, lastElement) {
|
|
450
508
|
try {
|
|
@@ -453,7 +511,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
453
511
|
await inputEl.sendKeys(value);
|
|
454
512
|
await dropDownOptionClick(value, this.driver);
|
|
455
513
|
}
|
|
456
|
-
await this.waitOptionSelection();
|
|
514
|
+
await this.waitOptionSelection(value);
|
|
457
515
|
if (value !== lastElement) {
|
|
458
516
|
await inputEl.clear();
|
|
459
517
|
}
|
|
@@ -548,47 +606,273 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
548
606
|
};
|
|
549
607
|
|
|
550
608
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
551
|
-
import { By as
|
|
609
|
+
import { By as By10 } from "selenium-webdriver";
|
|
552
610
|
|
|
553
611
|
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
554
|
-
import { By as
|
|
612
|
+
import { By as By9, Key as Key3 } from "selenium-webdriver";
|
|
555
613
|
|
|
556
614
|
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
557
|
-
var formatDMYDate = (date) => {
|
|
558
|
-
const [year, month, day] = date.
|
|
559
|
-
|
|
615
|
+
var formatDMYDate = (date, isTimeAllowed = false) => {
|
|
616
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
617
|
+
if (!isTimeAllowed) {
|
|
618
|
+
return `${day}${month}${year}`;
|
|
619
|
+
}
|
|
620
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
621
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
622
|
+
return `${day}${month}${year}${hours}${minutes}`;
|
|
623
|
+
};
|
|
624
|
+
var formatToDateTime = (dateString) => {
|
|
625
|
+
const [datePart, timePart] = dateString.split("T");
|
|
626
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
627
|
+
const [hours, minutes] = timePart.split(":").map(Number);
|
|
628
|
+
return new Date(year, month - 1, day, hours, minutes, 0, 0);
|
|
629
|
+
};
|
|
630
|
+
var getYearMonthDay = (date) => {
|
|
631
|
+
const [year, month, day] = date.toISOString().split("T")[0].split("-");
|
|
632
|
+
return { year: +year, month: +month, day: +day };
|
|
560
633
|
};
|
|
561
634
|
|
|
562
|
-
// src/pageObjects/elements/Editors/Date/
|
|
635
|
+
// src/pageObjects/elements/Editors/Date/DateSelectMode.ts
|
|
636
|
+
var DateSelectMode = class {
|
|
637
|
+
static isWeek(t) {
|
|
638
|
+
return t === "week" /* Week */;
|
|
639
|
+
}
|
|
640
|
+
static isMonth(t) {
|
|
641
|
+
return t === "month" /* Month */;
|
|
642
|
+
}
|
|
643
|
+
static isWeekOrMonth(t) {
|
|
644
|
+
return this.isWeek(t) || this.isMonth(t);
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
// src/pageObjects/elements/Editors/Date/Calendar.ts
|
|
649
|
+
import { By as By8 } from "selenium-webdriver";
|
|
563
650
|
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
564
651
|
var BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
565
652
|
var BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
566
653
|
var BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
654
|
+
var CALENDAR_CAPTION_SELECTOR = "dx-calendar-caption-button";
|
|
655
|
+
var CALENDAR_CELL_SELECTOR = "dx-calendar-cell";
|
|
656
|
+
var CALENDAR_PREVIOUS_SELECTOR = "dx-calendar-navigator-previous-month";
|
|
657
|
+
var CALENDAR_NEXT_SELECTOR = "dx-calendar-navigator-next-month";
|
|
658
|
+
var TEXT_EDITOR_SELECTOR = "dx-texteditor-input";
|
|
659
|
+
var movesToCalendarEndForWeek = 3;
|
|
660
|
+
var movesToCalendarEndForMonth = 1;
|
|
661
|
+
var Calendar = class extends AbstractElementWithParent {
|
|
662
|
+
_parentCssSelector;
|
|
663
|
+
constructor({ parentCssSelector, dateFieldDataTestID, driver }) {
|
|
664
|
+
super("", byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`), driver);
|
|
665
|
+
this._parentCssSelector = parentCssSelector;
|
|
666
|
+
}
|
|
667
|
+
async init() {
|
|
668
|
+
const dateField = await this.driver.findElement(By8.css(this._parentCssSelector));
|
|
669
|
+
const button = await dateField.findElement(By8.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
670
|
+
await click(button, this.driver);
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Переходимо на найвищий рівень календаря
|
|
674
|
+
*/
|
|
675
|
+
async moveToCalendarEnd(count) {
|
|
676
|
+
while (count >= 0) {
|
|
677
|
+
const calendarElement = await this.getElement();
|
|
678
|
+
const button = await calendarElement.findElement(By8.css(`.${CALENDAR_CAPTION_SELECTOR}`));
|
|
679
|
+
await click(button, this.driver);
|
|
680
|
+
count--;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Пошук та клік по правильному періоду (2010-2019, 2020-2029, і т.д.)
|
|
685
|
+
*/
|
|
686
|
+
async choosePeriodForYear(targetYear) {
|
|
687
|
+
let found = false;
|
|
688
|
+
while (!found) {
|
|
689
|
+
const calendarElement = await this.getElement();
|
|
690
|
+
const periodCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
691
|
+
for (const cell of periodCells) {
|
|
692
|
+
const text = await cell.getText();
|
|
693
|
+
if (text) {
|
|
694
|
+
const [start, end] = text.split("-").map(Number);
|
|
695
|
+
if (targetYear >= start && targetYear <= end) {
|
|
696
|
+
await click(cell, this.driver);
|
|
697
|
+
found = true;
|
|
698
|
+
break;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
if (!found) {
|
|
703
|
+
const firstPeriod = await periodCells[0].getText();
|
|
704
|
+
const [start] = firstPeriod.split("-").map(Number);
|
|
705
|
+
if (targetYear < start) {
|
|
706
|
+
const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
707
|
+
await click(prevBtn, this.driver);
|
|
708
|
+
} else {
|
|
709
|
+
const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
710
|
+
await click(nextBtn, this.driver);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* Пошук та клік по конкретному року з навігацією
|
|
717
|
+
*/
|
|
718
|
+
async chooseYear(targetYear) {
|
|
719
|
+
let found = false;
|
|
720
|
+
while (!found) {
|
|
721
|
+
const calendarElement = await this.getElement();
|
|
722
|
+
const yearCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR} span`));
|
|
723
|
+
for (const cell of yearCells) {
|
|
724
|
+
const text = await cell.getText();
|
|
725
|
+
const cellYear = Number(text);
|
|
726
|
+
if (!isNaN(cellYear) && cellYear === targetYear) {
|
|
727
|
+
await click(cell, this.driver);
|
|
728
|
+
found = true;
|
|
729
|
+
break;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
if (!found) {
|
|
733
|
+
const firstYearText = await yearCells[0].getText();
|
|
734
|
+
const lastYearText = await yearCells[yearCells.length - 1].getText();
|
|
735
|
+
const firstYear = Number(firstYearText);
|
|
736
|
+
const lastYear = Number(lastYearText);
|
|
737
|
+
if (targetYear < firstYear) {
|
|
738
|
+
const prevBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_PREVIOUS_SELECTOR}`));
|
|
739
|
+
await click(prevBtn, this.driver);
|
|
740
|
+
} else if (targetYear > lastYear) {
|
|
741
|
+
const nextBtn = await calendarElement.findElement(By8.css(`.${CALENDAR_NEXT_SELECTOR}`));
|
|
742
|
+
await click(nextBtn, this.driver);
|
|
743
|
+
} else {
|
|
744
|
+
throw new Error(`Year ${targetYear} is not in the visible range but navigation failed`);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
/**
|
|
750
|
+
* Пошук та клік по конкретному місяцю
|
|
751
|
+
*/
|
|
752
|
+
async chooseMonth(year, month) {
|
|
753
|
+
const calendarElement = await this.getElement();
|
|
754
|
+
const monthCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
755
|
+
for (const cell of monthCells) {
|
|
756
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
757
|
+
if (dataValue) {
|
|
758
|
+
const [cellYear, cellMonth] = dataValue.split("/").map(Number);
|
|
759
|
+
if (cellYear === year && cellMonth === month) {
|
|
760
|
+
await click(cell, this.driver);
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
throw new Error(`Month ${month} for year ${year} not found`);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* Пошук та клік по конкретному дню (ігноруємо дні з іншого місяця)
|
|
769
|
+
*/
|
|
770
|
+
async chooseDay(year, month, day) {
|
|
771
|
+
const calendarElement = await this.getElement();
|
|
772
|
+
const dayCells = await calendarElement.findElements(By8.css(`.${CALENDAR_CELL_SELECTOR}`));
|
|
773
|
+
for (const cell of dayCells) {
|
|
774
|
+
const dataValue = await cell.getAttribute("data-value");
|
|
775
|
+
if (dataValue) {
|
|
776
|
+
const [cellYear, cellMonth, cellDay] = dataValue.split("/").map(Number);
|
|
777
|
+
if (cellYear === year && cellMonth === month && cellDay === day) {
|
|
778
|
+
await click(cell, this.driver);
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
throw new Error(`Day ${day}.${month}.${year} not found`);
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Встановлення дати для тижня
|
|
787
|
+
*/
|
|
788
|
+
async setValueForWeek(date) {
|
|
789
|
+
const { year, month, day } = getYearMonthDay(date);
|
|
790
|
+
await this.moveToCalendarEnd(movesToCalendarEndForWeek);
|
|
791
|
+
await this.choosePeriodForYear(year);
|
|
792
|
+
await this.chooseYear(year);
|
|
793
|
+
await this.chooseMonth(year, month);
|
|
794
|
+
await this.chooseDay(year, month, day);
|
|
795
|
+
await this.save();
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Встановлення дати для місяця
|
|
799
|
+
*/
|
|
800
|
+
async setValueForMonth(date) {
|
|
801
|
+
const { year, month } = getYearMonthDay(date);
|
|
802
|
+
await this.moveToCalendarEnd(movesToCalendarEndForMonth);
|
|
803
|
+
await this.chooseYear(year);
|
|
804
|
+
await this.chooseMonth(year, month);
|
|
805
|
+
await this.save();
|
|
806
|
+
}
|
|
807
|
+
async getDateFromInput() {
|
|
808
|
+
const calendarPopoverElement = await this.getElement();
|
|
809
|
+
return calendarPopoverElement.findElement(
|
|
810
|
+
By8.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
async getDateToInput() {
|
|
814
|
+
const calendarPopoverElement = await this.getElement();
|
|
815
|
+
return calendarPopoverElement.findElement(
|
|
816
|
+
By8.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .${TEXT_EDITOR_SELECTOR}`)
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
async save() {
|
|
820
|
+
const btnOk = await this.driver.findElement(By8.css(`.${BTN_SAVE_SELECTOR}`));
|
|
821
|
+
await click(btnOk, this.driver);
|
|
822
|
+
}
|
|
823
|
+
};
|
|
824
|
+
|
|
825
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
826
|
+
var DATETIME_ALLOWED_SELECTOR = "dx-datebox-datetime";
|
|
567
827
|
var BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
568
828
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
569
829
|
super(parentCssSelector, elementCssSelector, driver);
|
|
570
830
|
this.setClearStrategy(new InputClearStrategy());
|
|
571
831
|
}
|
|
572
|
-
async
|
|
573
|
-
const dateField = await this.driver.findElement(
|
|
832
|
+
async getIsAllowedTime() {
|
|
833
|
+
const dateField = await this.driver.findElement(By9.css(`${this.getFullCssSelector()}`));
|
|
834
|
+
const classString = await dateField.getAttribute("class");
|
|
835
|
+
return classString.includes(DATETIME_ALLOWED_SELECTOR);
|
|
836
|
+
}
|
|
837
|
+
async initCalendar() {
|
|
574
838
|
const dateFieldDataTestID = await this.getDataTestId();
|
|
575
|
-
const
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
839
|
+
const calendar = new Calendar({
|
|
840
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
841
|
+
dateFieldDataTestID,
|
|
842
|
+
driver: this.driver
|
|
843
|
+
});
|
|
844
|
+
await calendar.init();
|
|
845
|
+
return calendar;
|
|
846
|
+
}
|
|
847
|
+
async setValueForWeek(value) {
|
|
848
|
+
const calendar = await this.initCalendar();
|
|
849
|
+
await calendar.setValueForWeek(value);
|
|
850
|
+
}
|
|
851
|
+
async setValueForMonth(value) {
|
|
852
|
+
const calendar = await this.initCalendar();
|
|
853
|
+
await calendar.setValueForMonth(value);
|
|
854
|
+
}
|
|
855
|
+
async setArrayValue(value) {
|
|
856
|
+
const calendar = await this.initCalendar();
|
|
857
|
+
const dateFromInput = await calendar.getDateFromInput();
|
|
858
|
+
const dateToInput = await calendar.getDateToInput();
|
|
584
859
|
await this.setSingleValue(value[0], dateFromInput);
|
|
585
860
|
await this.setSingleValue(value[1], dateToInput);
|
|
586
|
-
|
|
587
|
-
await click(btnOk, this.driver);
|
|
861
|
+
await calendar.save();
|
|
588
862
|
}
|
|
589
863
|
async setSingleValue(value, inputEl) {
|
|
864
|
+
const dateMode = await this.getDataDateMode();
|
|
865
|
+
if (DateSelectMode.isWeek(dateMode)) {
|
|
866
|
+
await this.setValueForWeek(value);
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
if (DateSelectMode.isMonth(dateMode)) {
|
|
870
|
+
await this.setValueForMonth(value);
|
|
871
|
+
return;
|
|
872
|
+
}
|
|
590
873
|
const actions = this.driver.actions({ async: true });
|
|
591
|
-
const
|
|
874
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
875
|
+
const formattedDate = formatDMYDate(value, isTimeAllowed);
|
|
592
876
|
await click(inputEl, this.driver);
|
|
593
877
|
await actions.move({ origin: inputEl }).sendKeys(Key3.HOME).perform();
|
|
594
878
|
await actions.move({ origin: inputEl }).sendKeys(formattedDate, Key3.ENTER).perform();
|
|
@@ -609,7 +893,7 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
609
893
|
this.setClearStrategy(new InputClearStrategy());
|
|
610
894
|
}
|
|
611
895
|
async getDateElement() {
|
|
612
|
-
return this.driver.findElement(
|
|
896
|
+
return this.driver.findElement(By10.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
613
897
|
}
|
|
614
898
|
async getDateValue() {
|
|
615
899
|
const inputEl = await this.getDateElement();
|
|
@@ -617,6 +901,10 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
617
901
|
}
|
|
618
902
|
async getValue() {
|
|
619
903
|
const value = await this.getDateValue();
|
|
904
|
+
const isTimeAllowed = await this.getIsAllowedTime();
|
|
905
|
+
if (isTimeAllowed) {
|
|
906
|
+
return value == "" ? null : formatToDateTime(value);
|
|
907
|
+
}
|
|
620
908
|
return value == "" ? null : new Date(value);
|
|
621
909
|
}
|
|
622
910
|
setValue(value) {
|
|
@@ -628,14 +916,14 @@ var SingleDateEditor = class extends BaseDateEditor {
|
|
|
628
916
|
};
|
|
629
917
|
|
|
630
918
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
631
|
-
import { By as
|
|
919
|
+
import { By as By11 } from "selenium-webdriver";
|
|
632
920
|
var DateRangeEditor = class extends BaseDateEditor {
|
|
633
921
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
634
922
|
super(parentCssSelector, elementCssSelector, driver);
|
|
635
923
|
this.setClearStrategy(new InputClearStrategy());
|
|
636
924
|
}
|
|
637
925
|
async getDateElement() {
|
|
638
|
-
return this.driver.findElement(
|
|
926
|
+
return this.driver.findElement(By11.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
639
927
|
}
|
|
640
928
|
async getDateValue() {
|
|
641
929
|
const inputEl = await this.getDateElement();
|
|
@@ -693,30 +981,30 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
693
981
|
};
|
|
694
982
|
|
|
695
983
|
// src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
|
|
696
|
-
import { By as
|
|
984
|
+
import { By as By12, Key as Key4 } from "selenium-webdriver";
|
|
697
985
|
var TAGS_SELECTOR2 = ".dx-tag .tag-text";
|
|
698
986
|
var DX_TAG_CONTAINER2 = "dx-tag-container";
|
|
699
987
|
var DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
|
|
700
988
|
var CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
|
|
701
989
|
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
|
|
702
|
-
var
|
|
990
|
+
var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
|
|
703
991
|
var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
|
|
704
992
|
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
993
|
let err = null;
|
|
709
994
|
try {
|
|
710
995
|
const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
|
|
711
|
-
await
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
996
|
+
await withCustomTimeouts_default({
|
|
997
|
+
driver,
|
|
998
|
+
timeout: delay ? void 0 : 600,
|
|
999
|
+
callback: async () => {
|
|
1000
|
+
const calendarPopoverElement = await driver.findElement(By12.css(calendarPopoverSelector));
|
|
1001
|
+
const customOptionList = calendarPopoverElement.findElement(By12.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
|
|
1002
|
+
const optElement = await customOptionList.findElement(By12.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
|
|
1003
|
+
await click(optElement, driver);
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
716
1006
|
} catch (e) {
|
|
717
1007
|
err = new Error(`Item not found: "${optionValue}"`);
|
|
718
|
-
} finally {
|
|
719
|
-
await driver.manage().setTimeouts({ implicit });
|
|
720
1008
|
}
|
|
721
1009
|
if (err)
|
|
722
1010
|
throw err;
|
|
@@ -735,7 +1023,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
|
735
1023
|
}
|
|
736
1024
|
}
|
|
737
1025
|
async waitOptionSelection() {
|
|
738
|
-
await fixElementStaleError(
|
|
1026
|
+
await fixElementStaleError(By12.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
739
1027
|
}
|
|
740
1028
|
async selectOption(inputEl, value, lastElement) {
|
|
741
1029
|
try {
|
|
@@ -759,7 +1047,7 @@ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
|
|
|
759
1047
|
return [];
|
|
760
1048
|
}
|
|
761
1049
|
const tags = await this.driver.findElements(
|
|
762
|
-
|
|
1050
|
+
By12.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
|
|
763
1051
|
);
|
|
764
1052
|
const values = [];
|
|
765
1053
|
for (const tag of tags) {
|
|
@@ -936,6 +1224,16 @@ var AbstractEditor = class extends AbstractElementWithParent {
|
|
|
936
1224
|
await this.initEditor();
|
|
937
1225
|
return this.editor.isReadonly();
|
|
938
1226
|
}
|
|
1227
|
+
/**
|
|
1228
|
+
* Возвращает значение true|false в зависимости isDisabled поле или нет
|
|
1229
|
+
* @example
|
|
1230
|
+
* expect(await formEdit.field('NumberFld').isDisabled()).toBe(true);
|
|
1231
|
+
* expect(await formEdit.field('TextFld').isDisabled()).toBe(false);
|
|
1232
|
+
*/
|
|
1233
|
+
async isDisabled() {
|
|
1234
|
+
await this.initEditor();
|
|
1235
|
+
return this.editor.isDisabled();
|
|
1236
|
+
}
|
|
939
1237
|
/**
|
|
940
1238
|
* Возвращает значение true|false в зависимости isDisplayed поле или нет
|
|
941
1239
|
* @example
|
|
@@ -971,9 +1269,10 @@ var FormField = class extends AbstractEditor {
|
|
|
971
1269
|
};
|
|
972
1270
|
|
|
973
1271
|
// src/pageObjects/elements/Forms/Form.ts
|
|
974
|
-
import { By as
|
|
1272
|
+
import { By as By16 } from "selenium-webdriver";
|
|
975
1273
|
|
|
976
1274
|
// src/pageObjects/elements/AbstractButton.ts
|
|
1275
|
+
var D5_BUTTON_IS_PRESSED = "d5-is-pressed";
|
|
977
1276
|
var AbstractButton = class extends AbstractElementWithParent {
|
|
978
1277
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
979
1278
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -999,10 +1298,19 @@ var AbstractButton = class extends AbstractElementWithParent {
|
|
|
999
1298
|
return false;
|
|
1000
1299
|
}
|
|
1001
1300
|
}
|
|
1301
|
+
async isPressed() {
|
|
1302
|
+
try {
|
|
1303
|
+
const button = await this.getElement();
|
|
1304
|
+
const classAttribute = await button.getAttribute("class");
|
|
1305
|
+
return classAttribute.includes(D5_BUTTON_IS_PRESSED);
|
|
1306
|
+
} catch {
|
|
1307
|
+
return false;
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1002
1310
|
};
|
|
1003
1311
|
|
|
1004
1312
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1005
|
-
import { By as
|
|
1313
|
+
import { By as By13 } from "selenium-webdriver";
|
|
1006
1314
|
var DXButton = class extends AbstractButton {
|
|
1007
1315
|
async getText() {
|
|
1008
1316
|
const classes = await this.getClasses();
|
|
@@ -1010,7 +1318,7 @@ var DXButton = class extends AbstractButton {
|
|
|
1010
1318
|
return null;
|
|
1011
1319
|
}
|
|
1012
1320
|
const el = await this.getElement();
|
|
1013
|
-
const textEl = el.findElement(
|
|
1321
|
+
const textEl = el.findElement(By13.className("dx-button-text"));
|
|
1014
1322
|
return await textEl.getText();
|
|
1015
1323
|
}
|
|
1016
1324
|
};
|
|
@@ -1043,7 +1351,7 @@ var Panel = class extends AbstractGroup {
|
|
|
1043
1351
|
};
|
|
1044
1352
|
|
|
1045
1353
|
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1046
|
-
import { By as
|
|
1354
|
+
import { By as By14 } from "selenium-webdriver";
|
|
1047
1355
|
var TabPanelItem = class extends AbstractGroup {
|
|
1048
1356
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1049
1357
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -1053,7 +1361,7 @@ var TabPanelItem = class extends AbstractGroup {
|
|
|
1053
1361
|
}
|
|
1054
1362
|
async isActive() {
|
|
1055
1363
|
const tabPanelItemElement = await this.getElement();
|
|
1056
|
-
const grandparentTab = await tabPanelItemElement.findElement(
|
|
1364
|
+
const grandparentTab = await tabPanelItemElement.findElement(By14.xpath('ancestor::div[@role="tab"][1]'));
|
|
1057
1365
|
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1058
1366
|
}
|
|
1059
1367
|
async getTitle() {
|
|
@@ -1070,7 +1378,7 @@ var TabPanel = class extends AbstractGroup {
|
|
|
1070
1378
|
};
|
|
1071
1379
|
|
|
1072
1380
|
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1073
|
-
import { By as
|
|
1381
|
+
import { By as By15 } from "selenium-webdriver";
|
|
1074
1382
|
var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1075
1383
|
var AccordionItem = class extends AbstractGroup {
|
|
1076
1384
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
@@ -1082,7 +1390,7 @@ var AccordionItem = class extends AbstractGroup {
|
|
|
1082
1390
|
}
|
|
1083
1391
|
async clickAccordionItemTitle() {
|
|
1084
1392
|
const accordionElement = await this.getElement();
|
|
1085
|
-
const accordTitleElement = await accordionElement.findElement(
|
|
1393
|
+
const accordTitleElement = await accordionElement.findElement(By15.className(ACCORDION_TITLE_CONTAINER));
|
|
1086
1394
|
await accordTitleElement.click();
|
|
1087
1395
|
}
|
|
1088
1396
|
async click() {
|
|
@@ -1236,7 +1544,15 @@ var AbstractForm = class extends AbstractPage {
|
|
|
1236
1544
|
async exists() {
|
|
1237
1545
|
try {
|
|
1238
1546
|
let elements = await this.driver.findElements(this.containerBy);
|
|
1239
|
-
|
|
1547
|
+
if (elements.length === 0) {
|
|
1548
|
+
return false;
|
|
1549
|
+
}
|
|
1550
|
+
await waitElementIsVisible_default({
|
|
1551
|
+
element: elements[0],
|
|
1552
|
+
errorMessage: "Element exists in DOM but is not visible",
|
|
1553
|
+
driver: this.driver
|
|
1554
|
+
});
|
|
1555
|
+
return true;
|
|
1240
1556
|
} catch (error) {
|
|
1241
1557
|
return false;
|
|
1242
1558
|
}
|
|
@@ -1270,15 +1586,15 @@ async function classDependencyInjector(formType) {
|
|
|
1270
1586
|
let SubFormFactoryClass;
|
|
1271
1587
|
switch (formType) {
|
|
1272
1588
|
case "1" /* LIST */:
|
|
1273
|
-
SubFormFactoryClass = (await import("./ListForm-
|
|
1589
|
+
SubFormFactoryClass = (await import("./ListForm-KIHLT7EU.mjs")).default;
|
|
1274
1590
|
break;
|
|
1275
1591
|
case "3" /* TREE */:
|
|
1276
|
-
SubFormFactoryClass = (await import("./TreeView-
|
|
1592
|
+
SubFormFactoryClass = (await import("./TreeView-TFBZB2UK.mjs")).default;
|
|
1277
1593
|
break;
|
|
1278
1594
|
case "2" /* EDIT */:
|
|
1279
1595
|
case "99" /* FREE_FORM */:
|
|
1280
1596
|
case "4" /* REPORT */:
|
|
1281
|
-
SubFormFactoryClass = (await import("./FormEdit-
|
|
1597
|
+
SubFormFactoryClass = (await import("./FormEdit-VFV53QIZ.mjs")).default;
|
|
1282
1598
|
break;
|
|
1283
1599
|
default:
|
|
1284
1600
|
throw new Error(`Unsupported form type ${formType}`);
|
|
@@ -1299,6 +1615,11 @@ var Form = class extends AbstractForm {
|
|
|
1299
1615
|
const value = await el.getAttribute("data-ismodal");
|
|
1300
1616
|
return value === "true";
|
|
1301
1617
|
}
|
|
1618
|
+
async isFullScreen() {
|
|
1619
|
+
const el = await this.getContainerElement();
|
|
1620
|
+
const value = await el.getAttribute("data-isfullscreen");
|
|
1621
|
+
return value === "true";
|
|
1622
|
+
}
|
|
1302
1623
|
/**
|
|
1303
1624
|
* Получение заголовка на формы
|
|
1304
1625
|
* @example
|
|
@@ -1307,17 +1628,23 @@ var Form = class extends AbstractForm {
|
|
|
1307
1628
|
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
1308
1629
|
*/
|
|
1309
1630
|
async getTitleText() {
|
|
1631
|
+
const getFullScreenTitle = async () => {
|
|
1632
|
+
let titleEl = await this.driver.findElement(By16.className("main-toolbar-form-title"));
|
|
1633
|
+
return titleEl.getText();
|
|
1634
|
+
};
|
|
1635
|
+
if (await this.isFullScreen()) {
|
|
1636
|
+
return getFullScreenTitle();
|
|
1637
|
+
}
|
|
1310
1638
|
if (await this.isModal()) {
|
|
1311
|
-
const
|
|
1639
|
+
const titleEl = await this.driver.findElement(By16.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
1312
1640
|
await waitElementIsVisible_default({
|
|
1313
|
-
element:
|
|
1641
|
+
element: titleEl,
|
|
1314
1642
|
driver: this.driver,
|
|
1315
1643
|
errorMessage: `Form title element is not visible`
|
|
1316
1644
|
});
|
|
1317
|
-
return
|
|
1645
|
+
return titleEl.getText();
|
|
1318
1646
|
}
|
|
1319
|
-
|
|
1320
|
-
return titleEl.getText();
|
|
1647
|
+
return getFullScreenTitle();
|
|
1321
1648
|
}
|
|
1322
1649
|
setSubFormMode() {
|
|
1323
1650
|
const testId = formTestId(this.formName);
|
|
@@ -1335,7 +1662,7 @@ var Form = class extends AbstractForm {
|
|
|
1335
1662
|
async subForm(name, options = {}) {
|
|
1336
1663
|
const { isDockPanel = false } = options;
|
|
1337
1664
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
1338
|
-
const byCssSelector =
|
|
1665
|
+
const byCssSelector = By16.css(cssSelector);
|
|
1339
1666
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
1340
1667
|
await waitElementIsVisible_default({
|
|
1341
1668
|
element: subFormEl,
|
|
@@ -1359,6 +1686,9 @@ var Form = class extends AbstractForm {
|
|
|
1359
1686
|
};
|
|
1360
1687
|
|
|
1361
1688
|
export {
|
|
1689
|
+
__require,
|
|
1690
|
+
__commonJS,
|
|
1691
|
+
__toESM,
|
|
1362
1692
|
config,
|
|
1363
1693
|
fixElementStaleError,
|
|
1364
1694
|
staleElementAction,
|
|
@@ -1371,12 +1701,14 @@ export {
|
|
|
1371
1701
|
byTestIdCssSelector,
|
|
1372
1702
|
byTestId,
|
|
1373
1703
|
readonlyLocator,
|
|
1704
|
+
disabledLocator,
|
|
1374
1705
|
waitElementIsClickable_default,
|
|
1375
1706
|
AbstractElementWithParent,
|
|
1376
1707
|
TextEditor,
|
|
1377
1708
|
NumberEditor,
|
|
1378
1709
|
ControlClass,
|
|
1379
1710
|
DX_CLEAR_BUTTON_AREA,
|
|
1711
|
+
withCustomTimeouts_default,
|
|
1380
1712
|
editorFactory,
|
|
1381
1713
|
createDocFilterTestId,
|
|
1382
1714
|
createHeaderFilterTestId,
|