d5-testing-library 1.8.0-alpha.9 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormEdit-QNZOB7PA.mjs +7 -0
- package/dist/ListForm-MXGUBMWS.mjs +7 -0
- package/dist/TreeView-VZBOZCFW.mjs +8 -0
- package/dist/{chunk-R3BWDLN3.mjs → chunk-32KSAOFJ.mjs} +171 -147
- package/dist/{chunk-VPTIEIX5.mjs → chunk-75FRHQCI.mjs} +3 -2
- package/dist/{chunk-4JWY3XDX.mjs → chunk-S62QEWWA.mjs} +444 -121
- package/dist/{chunk-XQTIDP34.mjs → chunk-XGIXXZD6.mjs} +3 -3
- package/dist/cjs/d5-testing-library.cjs +776 -325
- package/dist/{d5-testing-library.d.ts → d5-testing-library.d.mts} +194 -72
- package/dist/d5-testing-library.legacy-esm.js +83 -28
- package/dist/d5-testing-library.mjs +83 -28
- package/package.json +23 -11
- package/dist/FormEdit-ELCXSD63.mjs +0 -7
- package/dist/ListForm-A7HQKGCR.mjs +0 -7
- package/dist/TreeView-ANBLGS27.mjs +0 -8
|
@@ -34,29 +34,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
34
34
|
function config(cfg) {
|
|
35
35
|
return configInstance.config(cfg);
|
|
36
36
|
}
|
|
37
|
-
var
|
|
37
|
+
var Config, configInstance;
|
|
38
38
|
var init_config = __esm({
|
|
39
39
|
"src/config.ts"() {
|
|
40
40
|
"use strict";
|
|
41
|
-
process = __toESM(require("process"));
|
|
42
|
-
driversMap = /* @__PURE__ */ new Map();
|
|
43
|
-
createConfigProxy = (config2) => {
|
|
44
|
-
return new Proxy(config2, {
|
|
45
|
-
get(_target, prop) {
|
|
46
|
-
if (prop === "driver") {
|
|
47
|
-
return driversMap.get(process.pid);
|
|
48
|
-
}
|
|
49
|
-
return Reflect.get(...arguments);
|
|
50
|
-
},
|
|
51
|
-
set(_target, prop, value) {
|
|
52
|
-
if (prop === "driver") {
|
|
53
|
-
driversMap.set(process.pid, value);
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
return Reflect.set(...arguments);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
41
|
Config = class _Config {
|
|
61
42
|
static instance;
|
|
62
43
|
appConfig;
|
|
@@ -67,8 +48,7 @@ var init_config = __esm({
|
|
|
67
48
|
return _Config.instance;
|
|
68
49
|
}
|
|
69
50
|
config = (cfg) => {
|
|
70
|
-
if (!cfg)
|
|
71
|
-
return createConfigProxy(this.appConfig);
|
|
51
|
+
if (!cfg) return this.appConfig;
|
|
72
52
|
this.appConfig = cfg;
|
|
73
53
|
};
|
|
74
54
|
};
|
|
@@ -80,23 +60,38 @@ var init_config = __esm({
|
|
|
80
60
|
function fixElementStaleError(by, driver) {
|
|
81
61
|
const maxCount = 3;
|
|
82
62
|
let err;
|
|
83
|
-
const call = async (times
|
|
84
|
-
if (times > maxCount)
|
|
85
|
-
throw err;
|
|
63
|
+
const call = async (times) => {
|
|
64
|
+
if (times > maxCount) throw err;
|
|
86
65
|
try {
|
|
87
66
|
let el = await driver.findElement(by);
|
|
88
67
|
await el.getAttribute("class");
|
|
89
68
|
return el;
|
|
90
69
|
} catch (e) {
|
|
91
70
|
err = e;
|
|
92
|
-
if (e instanceof Error && e.
|
|
93
|
-
return call(
|
|
71
|
+
if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
|
|
72
|
+
return call(times + 1);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (err) throw err;
|
|
76
|
+
};
|
|
77
|
+
return call(0);
|
|
78
|
+
}
|
|
79
|
+
async function staleElementAction(action) {
|
|
80
|
+
const maxCount = 3;
|
|
81
|
+
let err;
|
|
82
|
+
const call = async (times) => {
|
|
83
|
+
if (times > maxCount) throw err;
|
|
84
|
+
try {
|
|
85
|
+
await action();
|
|
86
|
+
} catch (e) {
|
|
87
|
+
err = e;
|
|
88
|
+
if (e instanceof Error && e.message.toLowerCase().includes("stale element")) {
|
|
89
|
+
await call(times + 1);
|
|
94
90
|
}
|
|
95
91
|
}
|
|
96
|
-
if (err)
|
|
97
|
-
throw err;
|
|
92
|
+
if (err) throw err;
|
|
98
93
|
};
|
|
99
|
-
|
|
94
|
+
await call(0);
|
|
100
95
|
}
|
|
101
96
|
var init_fixElementStaleError = __esm({
|
|
102
97
|
"src/utils/fixElementStaleError.ts"() {
|
|
@@ -110,13 +105,12 @@ var init_AbstractElement = __esm({
|
|
|
110
105
|
"src/pageObjects/AbstractElement.ts"() {
|
|
111
106
|
"use strict";
|
|
112
107
|
import_selenium_webdriver = require("selenium-webdriver");
|
|
113
|
-
init_config();
|
|
114
108
|
init_fixElementStaleError();
|
|
115
109
|
AbstractElement = class {
|
|
116
110
|
driver;
|
|
117
111
|
elementCssSelector;
|
|
118
112
|
constructor(driver, elementCssSelector) {
|
|
119
|
-
this.driver = driver
|
|
113
|
+
this.driver = driver;
|
|
120
114
|
this.elementCssSelector = elementCssSelector;
|
|
121
115
|
}
|
|
122
116
|
getFullCssSelector() {
|
|
@@ -181,9 +175,17 @@ var init_AbstractPage = __esm({
|
|
|
181
175
|
|
|
182
176
|
// src/utils/wait.ts
|
|
183
177
|
async function wait(condition, driver, errorMessage, timeout) {
|
|
184
|
-
driver = driver ?? config().driver;
|
|
185
178
|
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
186
179
|
}
|
|
180
|
+
function safeWait(condition, driver, errorMessage, timeout) {
|
|
181
|
+
return wait(async () => {
|
|
182
|
+
try {
|
|
183
|
+
return await condition(driver);
|
|
184
|
+
} catch {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}, driver, errorMessage, timeout);
|
|
188
|
+
}
|
|
187
189
|
var init_wait = __esm({
|
|
188
190
|
"src/utils/wait.ts"() {
|
|
189
191
|
"use strict";
|
|
@@ -193,58 +195,89 @@ var init_wait = __esm({
|
|
|
193
195
|
|
|
194
196
|
// src/utils/waitElementIsVisible.ts
|
|
195
197
|
async function waitElementIsVisible({
|
|
196
|
-
element,
|
|
197
198
|
timeout,
|
|
198
199
|
errorMessage,
|
|
199
|
-
driver
|
|
200
|
+
driver,
|
|
201
|
+
...rest
|
|
200
202
|
}) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
203
|
+
await safeWait(async () => {
|
|
204
|
+
const searchedElement = "by" in rest ? await fixElementStaleError(rest.by, driver) : rest.element;
|
|
205
|
+
return await searchedElement.isDisplayed();
|
|
206
|
+
}, driver, errorMessage ?? "Element is not visible", timeout ?? config().timeout);
|
|
204
207
|
}
|
|
205
|
-
var
|
|
208
|
+
var waitElementIsVisible_default;
|
|
206
209
|
var init_waitElementIsVisible = __esm({
|
|
207
210
|
"src/utils/waitElementIsVisible.ts"() {
|
|
208
211
|
"use strict";
|
|
209
|
-
import_selenium_webdriver2 = require("selenium-webdriver");
|
|
210
212
|
init_config();
|
|
211
213
|
init_wait();
|
|
214
|
+
init_fixElementStaleError();
|
|
215
|
+
waitElementIsVisible_default = waitElementIsVisible;
|
|
212
216
|
}
|
|
213
217
|
});
|
|
214
218
|
|
|
215
219
|
// src/utils/actions.ts
|
|
216
|
-
var click;
|
|
220
|
+
var click, contextMenu;
|
|
217
221
|
var init_actions = __esm({
|
|
218
222
|
"src/utils/actions.ts"() {
|
|
219
223
|
"use strict";
|
|
220
|
-
init_config();
|
|
221
224
|
click = async (webElement, driver) => {
|
|
222
|
-
driver = driver ?? config().driver;
|
|
223
225
|
if (!await webElement.isDisplayed()) {
|
|
224
226
|
await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
|
|
225
227
|
}
|
|
226
228
|
const actions = driver.actions({ async: true });
|
|
227
229
|
await actions.move({ origin: webElement }).click().perform();
|
|
228
230
|
};
|
|
231
|
+
contextMenu = async (webElement, driver) => {
|
|
232
|
+
if (!await webElement.isDisplayed()) {
|
|
233
|
+
await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
|
|
234
|
+
}
|
|
235
|
+
const actions = driver.actions({ async: true });
|
|
236
|
+
await actions.move({ origin: webElement }).contextClick().perform();
|
|
237
|
+
};
|
|
229
238
|
}
|
|
230
239
|
});
|
|
231
240
|
|
|
232
241
|
// src/utils/locators.ts
|
|
233
|
-
var
|
|
242
|
+
var import_selenium_webdriver2, byTestIdCssSelector, byTestId, readonlyLocator;
|
|
234
243
|
var init_locators = __esm({
|
|
235
244
|
"src/utils/locators.ts"() {
|
|
236
245
|
"use strict";
|
|
237
|
-
|
|
246
|
+
import_selenium_webdriver2 = require("selenium-webdriver");
|
|
238
247
|
byTestIdCssSelector = (testId, element = "div") => {
|
|
239
248
|
return `${element}[data-testid="${testId}"]`;
|
|
240
249
|
};
|
|
241
250
|
byTestId = (testId, element = "div") => {
|
|
242
|
-
return
|
|
251
|
+
return import_selenium_webdriver2.By.css(byTestIdCssSelector(testId, element));
|
|
243
252
|
};
|
|
244
253
|
readonlyLocator = "readonly";
|
|
245
254
|
}
|
|
246
255
|
});
|
|
247
256
|
|
|
257
|
+
// src/utils/waitElementIsClickable.ts
|
|
258
|
+
async function waitElementIsClickable({
|
|
259
|
+
timeout,
|
|
260
|
+
errorMessage,
|
|
261
|
+
driver,
|
|
262
|
+
...rest
|
|
263
|
+
}) {
|
|
264
|
+
await safeWait(async () => {
|
|
265
|
+
const searchedElement = "by" in rest ? await fixElementStaleError(rest.by, driver) : rest.element;
|
|
266
|
+
const isDisabled = await searchedElement.getCssValue("pointer-events") === "none";
|
|
267
|
+
return await searchedElement.isDisplayed() && !isDisabled;
|
|
268
|
+
}, driver, errorMessage, timeout ?? config().timeout);
|
|
269
|
+
}
|
|
270
|
+
var waitElementIsClickable_default;
|
|
271
|
+
var init_waitElementIsClickable = __esm({
|
|
272
|
+
"src/utils/waitElementIsClickable.ts"() {
|
|
273
|
+
"use strict";
|
|
274
|
+
init_config();
|
|
275
|
+
init_wait();
|
|
276
|
+
init_fixElementStaleError();
|
|
277
|
+
waitElementIsClickable_default = waitElementIsClickable;
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
|
|
248
281
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
249
282
|
var AbstractElementWithParent;
|
|
250
283
|
var init_AbstractElementWithParent = __esm({
|
|
@@ -337,8 +370,9 @@ var init_TextEditor = __esm({
|
|
|
337
370
|
super(parentCssSelector, elementCssSelector, driver);
|
|
338
371
|
this.setClearStrategy(new InputClearStrategy());
|
|
339
372
|
}
|
|
340
|
-
getValue() {
|
|
341
|
-
|
|
373
|
+
async getValue() {
|
|
374
|
+
const value = await super.getInputValue();
|
|
375
|
+
return value == "" ? null : value;
|
|
342
376
|
}
|
|
343
377
|
setValue(value) {
|
|
344
378
|
return this.setInputValue(value);
|
|
@@ -417,10 +451,8 @@ var init_CheckBox = __esm({
|
|
|
417
451
|
CheckBox = class extends AbstractElementWithParent {
|
|
418
452
|
async getValue() {
|
|
419
453
|
const result = await this.getAttribute("aria-checked");
|
|
420
|
-
if (result === "true")
|
|
421
|
-
|
|
422
|
-
if (result === "false")
|
|
423
|
-
return 0;
|
|
454
|
+
if (result === "true") return 1;
|
|
455
|
+
if (result === "false") return 0;
|
|
424
456
|
return null;
|
|
425
457
|
}
|
|
426
458
|
async setValue(value) {
|
|
@@ -546,10 +578,8 @@ var init_SwitchEditor = __esm({
|
|
|
546
578
|
SwitchEditor = class extends AbstractElementWithParent {
|
|
547
579
|
async getValue() {
|
|
548
580
|
const result = await this.getAttribute("aria-label");
|
|
549
|
-
if (result === "ON")
|
|
550
|
-
|
|
551
|
-
if (result === "OFF")
|
|
552
|
-
return 0;
|
|
581
|
+
if (result === "ON") return 1;
|
|
582
|
+
if (result === "OFF") return 0;
|
|
553
583
|
return null;
|
|
554
584
|
}
|
|
555
585
|
async setValue(value) {
|
|
@@ -562,7 +592,7 @@ var init_SwitchEditor = __esm({
|
|
|
562
592
|
return;
|
|
563
593
|
}
|
|
564
594
|
await click(inputEl, this.driver);
|
|
565
|
-
await
|
|
595
|
+
await safeWait(async () => {
|
|
566
596
|
const updatedValue = await this.getValue();
|
|
567
597
|
return updatedValue !== currentValue;
|
|
568
598
|
}, this.driver);
|
|
@@ -583,6 +613,7 @@ var init_TagBox = __esm({
|
|
|
583
613
|
init_SelectBoxEditor();
|
|
584
614
|
init_ClearButtonStrategy();
|
|
585
615
|
init_fixElementStaleError();
|
|
616
|
+
init_wait();
|
|
586
617
|
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
587
618
|
DX_TAG_CONTAINER = "dx-tag-container";
|
|
588
619
|
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
@@ -603,7 +634,8 @@ var init_TagBox = __esm({
|
|
|
603
634
|
await this.confirmSelection();
|
|
604
635
|
}
|
|
605
636
|
async waitOptionSelection() {
|
|
606
|
-
await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
637
|
+
const option = await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
638
|
+
await safeWait(() => option.isDisplayed(), this.driver);
|
|
607
639
|
}
|
|
608
640
|
async selectOption(inputEl, value, lastElement) {
|
|
609
641
|
try {
|
|
@@ -695,8 +727,7 @@ var init_ButtonGroup = __esm({
|
|
|
695
727
|
break;
|
|
696
728
|
}
|
|
697
729
|
}
|
|
698
|
-
if (!buttonEl)
|
|
699
|
-
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
730
|
+
if (!buttonEl) throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
700
731
|
await click(buttonEl, this.driver);
|
|
701
732
|
}
|
|
702
733
|
};
|
|
@@ -756,33 +787,35 @@ var init_BaseDateEditor = __esm({
|
|
|
756
787
|
super(parentCssSelector, elementCssSelector, driver);
|
|
757
788
|
this.setClearStrategy(new InputClearStrategy());
|
|
758
789
|
}
|
|
759
|
-
async
|
|
760
|
-
const actions = this.driver.actions({ async: true });
|
|
790
|
+
async setArrayValue(value) {
|
|
761
791
|
const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()}`));
|
|
762
792
|
const dateFieldDataTestID = await this.getDataTestId();
|
|
763
|
-
const
|
|
764
|
-
|
|
765
|
-
await
|
|
793
|
+
const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
794
|
+
await click(button, this.driver);
|
|
795
|
+
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`)));
|
|
796
|
+
const dateFromInput = await calendarPopoverElement.findElement(
|
|
797
|
+
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`)
|
|
798
|
+
);
|
|
799
|
+
const dateToInput = await calendarPopoverElement.findElement(
|
|
800
|
+
import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`)
|
|
801
|
+
);
|
|
802
|
+
await this.setSingleValue(value[0], dateFromInput);
|
|
803
|
+
await this.setSingleValue(value[1], dateToInput);
|
|
804
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
805
|
+
await click(btnOk, this.driver);
|
|
806
|
+
}
|
|
807
|
+
async setSingleValue(value, inputEl) {
|
|
808
|
+
const actions = this.driver.actions({ async: true });
|
|
809
|
+
const formattedDate = formatDMYDate(value);
|
|
810
|
+
await click(inputEl, this.driver);
|
|
811
|
+
await actions.move({ origin: inputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
812
|
+
await actions.move({ origin: inputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
|
|
813
|
+
}
|
|
814
|
+
async setDateValue(value) {
|
|
766
815
|
if (Array.isArray(value)) {
|
|
767
|
-
|
|
768
|
-
const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
769
|
-
await button.click();
|
|
770
|
-
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(calendarPopoverSelector));
|
|
771
|
-
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
772
|
-
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
773
|
-
await dateFromInput.click();
|
|
774
|
-
await dateFromInput.sendKeys(formattedDates[0]);
|
|
775
|
-
await dateToInput.click();
|
|
776
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
777
|
-
await dateToInput.sendKeys(formattedDates[1]);
|
|
778
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.ENTER).perform();
|
|
779
|
-
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
780
|
-
await btnOk.click();
|
|
816
|
+
await this.setArrayValue(value);
|
|
781
817
|
} else {
|
|
782
|
-
|
|
783
|
-
await click(dateInputEl, this.driver);
|
|
784
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
785
|
-
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
|
|
818
|
+
await this.setSingleValue(value, await this.getInputElement());
|
|
786
819
|
}
|
|
787
820
|
}
|
|
788
821
|
};
|
|
@@ -873,15 +906,14 @@ var init_DateEditor = __esm({
|
|
|
873
906
|
init_types();
|
|
874
907
|
DateEditor = class extends AbstractDXEditorWithInput {
|
|
875
908
|
editorInstance = null;
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
async init(parentCssSelector, elementCssSelector, driver) {
|
|
882
|
-
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
909
|
+
async init() {
|
|
910
|
+
if (this.editorInstance) {
|
|
911
|
+
return this.editorInstance;
|
|
912
|
+
}
|
|
913
|
+
await this.setEditorInstance();
|
|
883
914
|
}
|
|
884
|
-
async
|
|
915
|
+
async setEditorInstance() {
|
|
916
|
+
const { parentCssSelector, elementCssSelector, driver } = this;
|
|
885
917
|
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
886
918
|
const classString = await elementInstance.getClasses();
|
|
887
919
|
switch (true) {
|
|
@@ -895,25 +927,14 @@ var init_DateEditor = __esm({
|
|
|
895
927
|
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
896
928
|
}
|
|
897
929
|
}
|
|
898
|
-
async ensureInitialized() {
|
|
899
|
-
if (!this.editorInstance) {
|
|
900
|
-
await this.initPromise;
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
930
|
async setValue(value) {
|
|
904
|
-
await this.
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
908
|
-
}
|
|
909
|
-
throw new Error("Editor instance is not initialized.");
|
|
931
|
+
await this.init();
|
|
932
|
+
await this.editorInstance.setValue(value);
|
|
933
|
+
await this.setEditorInstance();
|
|
910
934
|
}
|
|
911
935
|
async getValue() {
|
|
912
|
-
await this.
|
|
913
|
-
|
|
914
|
-
return this.editorInstance.getValue();
|
|
915
|
-
}
|
|
916
|
-
throw new Error("Editor instance is not initialized.");
|
|
936
|
+
await this.init();
|
|
937
|
+
return this.editorInstance.getValue();
|
|
917
938
|
}
|
|
918
939
|
};
|
|
919
940
|
}
|
|
@@ -1043,16 +1064,12 @@ var init_editorFactory = __esm({
|
|
|
1043
1064
|
const classSting = await elementInstance.getClasses();
|
|
1044
1065
|
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
1045
1066
|
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
1046
|
-
if (classSting.includes("number-control" /* Number */))
|
|
1047
|
-
|
|
1048
|
-
if (classSting.includes("
|
|
1049
|
-
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
1050
|
-
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
1051
|
-
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
1067
|
+
if (classSting.includes("number-control" /* Number */)) return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
1068
|
+
if (classSting.includes("check-box" /* CheckBox */)) return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
1069
|
+
if (classSting.includes("multi-select-control" /* Multiselect */)) return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
1052
1070
|
if (classSting.includes("select-control" /* Select */))
|
|
1053
1071
|
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
1054
|
-
if (classSting.includes("switch-control" /* Switch */))
|
|
1055
|
-
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
1072
|
+
if (classSting.includes("switch-control" /* Switch */)) return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
1056
1073
|
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
1057
1074
|
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1058
1075
|
}
|
|
@@ -1118,42 +1135,21 @@ var init_createDataTestId = __esm({
|
|
|
1118
1135
|
}
|
|
1119
1136
|
});
|
|
1120
1137
|
|
|
1121
|
-
// src/
|
|
1122
|
-
async function waitElementIsClickable({
|
|
1123
|
-
element,
|
|
1124
|
-
timeout,
|
|
1125
|
-
errorMessage,
|
|
1126
|
-
driver
|
|
1127
|
-
}) {
|
|
1128
|
-
driver = driver ?? config().driver;
|
|
1129
|
-
await wait(async () => {
|
|
1130
|
-
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
1131
|
-
return await element.isDisplayed() && !isDisabled;
|
|
1132
|
-
}, driver, errorMessage, timeout ?? config().timeout);
|
|
1133
|
-
}
|
|
1134
|
-
var init_waitElementIsClickable = __esm({
|
|
1135
|
-
"src/utils/waitElementIsClickable.ts"() {
|
|
1136
|
-
"use strict";
|
|
1137
|
-
init_config();
|
|
1138
|
-
init_wait();
|
|
1139
|
-
}
|
|
1140
|
-
});
|
|
1141
|
-
|
|
1142
|
-
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1138
|
+
// src/pageObjects/elements/AbstractButton.ts
|
|
1143
1139
|
var AbstractButton;
|
|
1144
1140
|
var init_AbstractButton = __esm({
|
|
1145
|
-
"src/pageObjects/elements/
|
|
1141
|
+
"src/pageObjects/elements/AbstractButton.ts"() {
|
|
1146
1142
|
"use strict";
|
|
1143
|
+
init_AbstractElementWithParent();
|
|
1147
1144
|
init_actions();
|
|
1148
1145
|
init_waitElementIsClickable();
|
|
1149
|
-
init_AbstractElementWithParent();
|
|
1150
1146
|
AbstractButton = class extends AbstractElementWithParent {
|
|
1151
1147
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1152
1148
|
super(parentCssSelector, elementCssSelector, driver);
|
|
1153
1149
|
}
|
|
1154
1150
|
async click() {
|
|
1155
1151
|
const button = await this.getElement();
|
|
1156
|
-
await
|
|
1152
|
+
await waitElementIsClickable_default({
|
|
1157
1153
|
element: button,
|
|
1158
1154
|
errorMessage: this.buttonNotDisplayedError(),
|
|
1159
1155
|
driver: this.driver
|
|
@@ -1165,8 +1161,12 @@ var init_AbstractButton = __esm({
|
|
|
1165
1161
|
return await button.getCssValue("pointer-events") === "none";
|
|
1166
1162
|
}
|
|
1167
1163
|
async isDisplayed() {
|
|
1168
|
-
|
|
1169
|
-
|
|
1164
|
+
try {
|
|
1165
|
+
const button = await this.getElement();
|
|
1166
|
+
return await button.isDisplayed();
|
|
1167
|
+
} catch {
|
|
1168
|
+
return false;
|
|
1169
|
+
}
|
|
1170
1170
|
}
|
|
1171
1171
|
};
|
|
1172
1172
|
}
|
|
@@ -1210,6 +1210,9 @@ var init_FormButton = __esm({
|
|
|
1210
1210
|
buttonNotDisplayedError() {
|
|
1211
1211
|
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1212
1212
|
}
|
|
1213
|
+
async getTitle() {
|
|
1214
|
+
return await this.getText();
|
|
1215
|
+
}
|
|
1213
1216
|
};
|
|
1214
1217
|
}
|
|
1215
1218
|
});
|
|
@@ -1353,16 +1356,11 @@ var init_groupFactory = __esm({
|
|
|
1353
1356
|
groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1354
1357
|
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1355
1358
|
const classSting = await elementInstance.getClasses();
|
|
1356
|
-
if (classSting.includes("tab-panel-group"))
|
|
1357
|
-
|
|
1358
|
-
if (classSting.includes("
|
|
1359
|
-
|
|
1360
|
-
if (classSting.includes("
|
|
1361
|
-
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1362
|
-
if (classSting.includes("accordion-group"))
|
|
1363
|
-
return new Accordion(parentCssSelector, elementCssSelector, driver);
|
|
1364
|
-
if (classSting.includes("d5-accordion-item"))
|
|
1365
|
-
return new AccordionItem(parentCssSelector, elementCssSelector, driver);
|
|
1359
|
+
if (classSting.includes("tab-panel-group")) return new TabPanel(parentCssSelector, elementCssSelector, driver);
|
|
1360
|
+
if (classSting.includes("tab-panel-item")) return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
|
|
1361
|
+
if (classSting.includes("panel-group")) return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1362
|
+
if (classSting.includes("accordion-group")) return new Accordion(parentCssSelector, elementCssSelector, driver);
|
|
1363
|
+
if (classSting.includes("d5-accordion-item")) return new AccordionItem(parentCssSelector, elementCssSelector, driver);
|
|
1366
1364
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1367
1365
|
};
|
|
1368
1366
|
}
|
|
@@ -1561,7 +1559,7 @@ var init_Cell = __esm({
|
|
|
1561
1559
|
Cell = class extends AbstractElementWithParent {
|
|
1562
1560
|
_index;
|
|
1563
1561
|
getCellIndex;
|
|
1564
|
-
constructor(parentCssSelector, getCellIndex,
|
|
1562
|
+
constructor(parentCssSelector, getCellIndex, driver, index) {
|
|
1565
1563
|
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
1566
1564
|
this.getCellIndex = getCellIndex;
|
|
1567
1565
|
this._index = index;
|
|
@@ -1581,7 +1579,30 @@ var init_Cell = __esm({
|
|
|
1581
1579
|
for (const tag of tags) {
|
|
1582
1580
|
values.push(await tag.getAttribute("textContent"));
|
|
1583
1581
|
}
|
|
1584
|
-
return values;
|
|
1582
|
+
return values.length ? values : null;
|
|
1583
|
+
}
|
|
1584
|
+
async getNumberValue(cellEl) {
|
|
1585
|
+
const value = (await cellEl.getText()).trim();
|
|
1586
|
+
return value == "" ? null : Number.parseFloat(value);
|
|
1587
|
+
}
|
|
1588
|
+
async getDateValue(cellEl, cellElClass) {
|
|
1589
|
+
const value = (await cellEl.getText()).trim();
|
|
1590
|
+
if (value === "") return null;
|
|
1591
|
+
const isWithTime = cellElClass.includes("with-time");
|
|
1592
|
+
try {
|
|
1593
|
+
if (isWithTime) {
|
|
1594
|
+
const [datePart, timePart] = value.split(", ");
|
|
1595
|
+
const [day, month, year] = datePart.split(".").map(Number);
|
|
1596
|
+
const [hours, minutes] = timePart.split(":").map(Number);
|
|
1597
|
+
return new Date(Date.UTC(year, month - 1, day, hours, minutes));
|
|
1598
|
+
} else {
|
|
1599
|
+
const [day, month, year] = value.split(".").map(Number);
|
|
1600
|
+
return new Date(Date.UTC(year, month - 1, day));
|
|
1601
|
+
}
|
|
1602
|
+
} catch (error) {
|
|
1603
|
+
console.error(`Error parsing date value "${value}":`, error);
|
|
1604
|
+
return null;
|
|
1605
|
+
}
|
|
1585
1606
|
}
|
|
1586
1607
|
async getElement() {
|
|
1587
1608
|
if (this._index == null) {
|
|
@@ -1592,11 +1613,12 @@ var init_Cell = __esm({
|
|
|
1592
1613
|
async getValue() {
|
|
1593
1614
|
const cellEl = await this.getElement();
|
|
1594
1615
|
const cellElClass = await cellEl.getAttribute("class");
|
|
1595
|
-
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
1596
|
-
|
|
1597
|
-
if (cellElClass.includes("
|
|
1598
|
-
|
|
1599
|
-
|
|
1616
|
+
if (cellElClass.includes("boolean-column" /* Boolean */)) return this.getBooleanValue(cellEl);
|
|
1617
|
+
if (cellElClass.includes("tags-column" /* Tags */)) return this.getTagsValue(cellEl);
|
|
1618
|
+
if (cellElClass.includes("number-column" /* Number */)) return this.getNumberValue(cellEl);
|
|
1619
|
+
if (cellElClass.includes("date-column" /* Date */)) return this.getDateValue(cellEl, cellElClass);
|
|
1620
|
+
const cellText = await cellEl.getText();
|
|
1621
|
+
return cellText == "" ? null : cellText;
|
|
1600
1622
|
}
|
|
1601
1623
|
getIndex() {
|
|
1602
1624
|
return this._index;
|
|
@@ -1624,6 +1646,13 @@ var init_Row = __esm({
|
|
|
1624
1646
|
index;
|
|
1625
1647
|
getColumnBy;
|
|
1626
1648
|
fixedTableContentCssSelector;
|
|
1649
|
+
/**
|
|
1650
|
+
* @param parentCssSelector
|
|
1651
|
+
* @param fixedTableContentCssSelector
|
|
1652
|
+
* @param index починається з 0 (в getCssRowByIndexSelector додається +1)
|
|
1653
|
+
* @param driver
|
|
1654
|
+
* @param getColumnBy
|
|
1655
|
+
*/
|
|
1627
1656
|
constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
|
|
1628
1657
|
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
1629
1658
|
this.index = index;
|
|
@@ -1636,8 +1665,8 @@ var init_Row = __esm({
|
|
|
1636
1665
|
() => {
|
|
1637
1666
|
return this.getColumnBy({ title, name }).getIndex();
|
|
1638
1667
|
},
|
|
1639
|
-
|
|
1640
|
-
|
|
1668
|
+
this.driver,
|
|
1669
|
+
index
|
|
1641
1670
|
);
|
|
1642
1671
|
}
|
|
1643
1672
|
getCellByIndex(index) {
|
|
@@ -1650,9 +1679,11 @@ var init_Row = __esm({
|
|
|
1650
1679
|
return this._getCell({ title });
|
|
1651
1680
|
}
|
|
1652
1681
|
async select() {
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1682
|
+
await staleElementAction(async () => {
|
|
1683
|
+
const rowEl = await this.getElement();
|
|
1684
|
+
await click(rowEl, this.driver);
|
|
1685
|
+
});
|
|
1686
|
+
await safeWait(
|
|
1656
1687
|
async () => {
|
|
1657
1688
|
const classes = await this.getClasses();
|
|
1658
1689
|
return classes.includes(DX_SELECTION_CLASS);
|
|
@@ -1681,14 +1712,14 @@ var init_Row = __esm({
|
|
|
1681
1712
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1682
1713
|
this.index
|
|
1683
1714
|
)}"] .${buttonClass}`;
|
|
1684
|
-
const
|
|
1685
|
-
|
|
1686
|
-
this.driver
|
|
1687
|
-
|
|
1688
|
-
|
|
1715
|
+
const by = import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`);
|
|
1716
|
+
await staleElementAction(async () => {
|
|
1717
|
+
const button = await fixElementStaleError(by, this.driver);
|
|
1718
|
+
await click(button, this.driver);
|
|
1719
|
+
});
|
|
1689
1720
|
}
|
|
1690
1721
|
async checkEditingMode(isEditing, msg) {
|
|
1691
|
-
await
|
|
1722
|
+
await safeWait(
|
|
1692
1723
|
async () => {
|
|
1693
1724
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1694
1725
|
},
|
|
@@ -1797,7 +1828,7 @@ var init_EditorButton = __esm({
|
|
|
1797
1828
|
}
|
|
1798
1829
|
async click() {
|
|
1799
1830
|
const button = await this.getElement();
|
|
1800
|
-
await
|
|
1831
|
+
await waitElementIsClickable_default({
|
|
1801
1832
|
element: button,
|
|
1802
1833
|
errorMessage: this.buttonNotDisplayedError(),
|
|
1803
1834
|
driver: this.driver
|
|
@@ -1888,6 +1919,21 @@ var init_AbstractEditor2 = __esm({
|
|
|
1888
1919
|
await this.initEditor();
|
|
1889
1920
|
return this.editor.isReadonly();
|
|
1890
1921
|
}
|
|
1922
|
+
/**
|
|
1923
|
+
* Возвращает значение true|false в зависимости isDisplayed поле или нет
|
|
1924
|
+
* @example
|
|
1925
|
+
* expect(await formEdit.field('NumberFld').isDisplayed()).toBe(true);
|
|
1926
|
+
* expect(await formEdit.field('TextFld').isDisplayed()).toBe(false);
|
|
1927
|
+
*/
|
|
1928
|
+
async isDisplayed() {
|
|
1929
|
+
try {
|
|
1930
|
+
await this.initEditor();
|
|
1931
|
+
const element = await this.getElement();
|
|
1932
|
+
return await element.isDisplayed();
|
|
1933
|
+
} catch {
|
|
1934
|
+
return false;
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1891
1937
|
/**
|
|
1892
1938
|
* Находит кнопку на поле по имени
|
|
1893
1939
|
* @example
|
|
@@ -1918,26 +1964,205 @@ var init_FormField = __esm({
|
|
|
1918
1964
|
}
|
|
1919
1965
|
});
|
|
1920
1966
|
|
|
1967
|
+
// src/utils/typesUtil.ts
|
|
1968
|
+
var import_util, types, type, isArray, isString;
|
|
1969
|
+
var init_typesUtil = __esm({
|
|
1970
|
+
"src/utils/typesUtil.ts"() {
|
|
1971
|
+
"use strict";
|
|
1972
|
+
import_util = require("selenium-webdriver/lib/util");
|
|
1973
|
+
types = {
|
|
1974
|
+
"[object Array]": "array",
|
|
1975
|
+
"[object Date]": "date",
|
|
1976
|
+
"[object Object]": "object",
|
|
1977
|
+
"[object String]": "string",
|
|
1978
|
+
"[object Null]": "null"
|
|
1979
|
+
};
|
|
1980
|
+
type = function(object) {
|
|
1981
|
+
const typeOfObject = Object.prototype.toString.call(object);
|
|
1982
|
+
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
1983
|
+
};
|
|
1984
|
+
isArray = function(value) {
|
|
1985
|
+
return type(value) === "array";
|
|
1986
|
+
};
|
|
1987
|
+
isString = function(object) {
|
|
1988
|
+
return typeof object === "string";
|
|
1989
|
+
};
|
|
1990
|
+
}
|
|
1991
|
+
});
|
|
1992
|
+
|
|
1993
|
+
// src/pageObjects/elements/AbstractDropDownMenuList.ts
|
|
1994
|
+
var AbstractDropDownMenuList;
|
|
1995
|
+
var init_AbstractDropDownMenuList = __esm({
|
|
1996
|
+
"src/pageObjects/elements/AbstractDropDownMenuList.ts"() {
|
|
1997
|
+
"use strict";
|
|
1998
|
+
init_AbstractElementWithParent();
|
|
1999
|
+
init_actions();
|
|
2000
|
+
init_waitElementIsClickable();
|
|
2001
|
+
init_fixElementStaleError();
|
|
2002
|
+
init_typesUtil();
|
|
2003
|
+
AbstractDropDownMenuList = class extends AbstractElementWithParent {
|
|
2004
|
+
buttonNotDisplayedError(name) {
|
|
2005
|
+
return `Menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
|
|
2006
|
+
}
|
|
2007
|
+
async clickItemBy(errorMessage, by) {
|
|
2008
|
+
await waitElementIsClickable_default({
|
|
2009
|
+
errorMessage,
|
|
2010
|
+
driver: this.driver,
|
|
2011
|
+
by
|
|
2012
|
+
});
|
|
2013
|
+
const menuItemElement = await fixElementStaleError(by, this.driver);
|
|
2014
|
+
await click(menuItemElement, this.driver);
|
|
2015
|
+
}
|
|
2016
|
+
async getElementByPath(path, getBy, returnLastElement = false) {
|
|
2017
|
+
let pathList = isString(path) ? [path] : path;
|
|
2018
|
+
let result = null;
|
|
2019
|
+
let index = 1;
|
|
2020
|
+
for (let text of pathList) {
|
|
2021
|
+
if (!returnLastElement || index < pathList.length) {
|
|
2022
|
+
await this.clickItemBy(this.buttonNotDisplayedError(text), getBy(text));
|
|
2023
|
+
} else {
|
|
2024
|
+
result = await fixElementStaleError(getBy(text), this.driver);
|
|
2025
|
+
}
|
|
2026
|
+
index++;
|
|
2027
|
+
}
|
|
2028
|
+
return result;
|
|
2029
|
+
}
|
|
2030
|
+
async clickButton(name) {
|
|
2031
|
+
await this.getElementByPath(name, this.getButtonNameBy.bind(this));
|
|
2032
|
+
}
|
|
2033
|
+
async clickButtonByTitle(title) {
|
|
2034
|
+
await this.getElementByPath(title, this.getButtonTitleBy.bind(this));
|
|
2035
|
+
}
|
|
2036
|
+
getMenuItemElementByTitle(title) {
|
|
2037
|
+
return this.getElementByPath(title, this.getButtonTitleBy.bind(this), true);
|
|
2038
|
+
}
|
|
2039
|
+
getMenuItemElementByName(name) {
|
|
2040
|
+
return this.getElementByPath(name, this.getButtonNameBy.bind(this), true);
|
|
2041
|
+
}
|
|
2042
|
+
isVisible() {
|
|
2043
|
+
return Promise.resolve(true);
|
|
2044
|
+
}
|
|
2045
|
+
};
|
|
2046
|
+
}
|
|
2047
|
+
});
|
|
2048
|
+
|
|
2049
|
+
// src/utils/cssToXPath.ts
|
|
2050
|
+
function cssClassesToXPath(classNames) {
|
|
2051
|
+
const classNamesList = classNames.split(".").filter((className) => !!className);
|
|
2052
|
+
const chained = classNamesList.map((className) => `contains(@class, "${className}")`).join(" and ");
|
|
2053
|
+
return `[${chained}]`;
|
|
2054
|
+
}
|
|
2055
|
+
var init_cssToXPath = __esm({
|
|
2056
|
+
"src/utils/cssToXPath.ts"() {
|
|
2057
|
+
"use strict";
|
|
2058
|
+
}
|
|
2059
|
+
});
|
|
2060
|
+
|
|
2061
|
+
// src/pageObjects/elements/DXContextMenuList.ts
|
|
2062
|
+
var import_selenium_webdriver24, CONTEXT_MENU_CLASS, CONTEXT_MENU_ITEM_TEXT_CLASS, DXContextMenuList;
|
|
2063
|
+
var init_DXContextMenuList = __esm({
|
|
2064
|
+
"src/pageObjects/elements/DXContextMenuList.ts"() {
|
|
2065
|
+
"use strict";
|
|
2066
|
+
init_AbstractDropDownMenuList();
|
|
2067
|
+
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
2068
|
+
init_cssToXPath();
|
|
2069
|
+
init_waitElementIsVisible();
|
|
2070
|
+
CONTEXT_MENU_CLASS = "dx-context-menu";
|
|
2071
|
+
CONTEXT_MENU_ITEM_TEXT_CLASS = "dx-menu-item-text";
|
|
2072
|
+
DXContextMenuList = class extends AbstractDropDownMenuList {
|
|
2073
|
+
/**
|
|
2074
|
+
* @param parentCssSelector
|
|
2075
|
+
* @param classNames - Список класів. Починається з крапки
|
|
2076
|
+
* @param driver
|
|
2077
|
+
*/
|
|
2078
|
+
constructor(parentCssSelector, classNames, driver) {
|
|
2079
|
+
super(parentCssSelector, `.${CONTEXT_MENU_CLASS}${classNames}`, driver);
|
|
2080
|
+
}
|
|
2081
|
+
getButtonTitleBy(title) {
|
|
2082
|
+
const buttonByTextXpath2 = (text) => `//span[contains(@class, "${CONTEXT_MENU_ITEM_TEXT_CLASS}") and contains(text(), "${text}")]`;
|
|
2083
|
+
const xpath = "//div" + cssClassesToXPath(this.elementCssSelector) + buttonByTextXpath2(title);
|
|
2084
|
+
return import_selenium_webdriver24.By.xpath(xpath);
|
|
2085
|
+
}
|
|
2086
|
+
async isVisible() {
|
|
2087
|
+
try {
|
|
2088
|
+
await waitElementIsVisible_default({
|
|
2089
|
+
element: await this.driver.findElement(import_selenium_webdriver24.By.css(`.dx-overlay-wrapper .dx-contextmenu`)),
|
|
2090
|
+
driver: this.driver,
|
|
2091
|
+
errorMessage: "Cannot find dropdown element"
|
|
2092
|
+
});
|
|
2093
|
+
} catch {
|
|
2094
|
+
return false;
|
|
2095
|
+
}
|
|
2096
|
+
}
|
|
2097
|
+
};
|
|
2098
|
+
}
|
|
2099
|
+
});
|
|
2100
|
+
|
|
2101
|
+
// src/pageObjects/elements/Table/elements/ContextMenu.ts
|
|
2102
|
+
var ContextMenu;
|
|
2103
|
+
var init_ContextMenu = __esm({
|
|
2104
|
+
"src/pageObjects/elements/Table/elements/ContextMenu.ts"() {
|
|
2105
|
+
"use strict";
|
|
2106
|
+
init_DXContextMenuList();
|
|
2107
|
+
init_locators();
|
|
2108
|
+
ContextMenu = class extends DXContextMenuList {
|
|
2109
|
+
_formName;
|
|
2110
|
+
_initFn;
|
|
2111
|
+
constructor(cssClass, formName, driver) {
|
|
2112
|
+
super("", cssClass, driver);
|
|
2113
|
+
this._formName = formName;
|
|
2114
|
+
}
|
|
2115
|
+
setInit(cb) {
|
|
2116
|
+
this._initFn = cb;
|
|
2117
|
+
return this;
|
|
2118
|
+
}
|
|
2119
|
+
getButtonNameBy(name) {
|
|
2120
|
+
return byTestId(`cm-${this._formName}-${name}`);
|
|
2121
|
+
}
|
|
2122
|
+
async clickButtonByTitle(title) {
|
|
2123
|
+
await this._initFn?.();
|
|
2124
|
+
await super.clickButtonByTitle(title);
|
|
2125
|
+
}
|
|
2126
|
+
async clickButton(name) {
|
|
2127
|
+
await this._initFn?.();
|
|
2128
|
+
await super.clickButton(name);
|
|
2129
|
+
}
|
|
2130
|
+
};
|
|
2131
|
+
}
|
|
2132
|
+
});
|
|
2133
|
+
|
|
1921
2134
|
// src/pageObjects/elements/Table/Table.ts
|
|
1922
|
-
var
|
|
2135
|
+
var import_selenium_webdriver25, Table;
|
|
1923
2136
|
var init_Table = __esm({
|
|
1924
2137
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
1925
2138
|
"use strict";
|
|
1926
|
-
|
|
2139
|
+
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
1927
2140
|
init_createDataTestId();
|
|
1928
2141
|
init_AbstractElementWithParent();
|
|
1929
2142
|
init_Row();
|
|
1930
2143
|
init_Column();
|
|
1931
2144
|
init_FormField();
|
|
2145
|
+
init_ContextMenu();
|
|
2146
|
+
init_actions();
|
|
1932
2147
|
Table = class extends AbstractElementWithParent {
|
|
1933
2148
|
formName;
|
|
1934
2149
|
headerCssSelector;
|
|
2150
|
+
contextMenuCssSelector;
|
|
1935
2151
|
fixedTableContentCssSelector;
|
|
1936
2152
|
tableContentCssSelector;
|
|
1937
|
-
constructor(
|
|
2153
|
+
constructor({
|
|
2154
|
+
parentCssSelector,
|
|
2155
|
+
contextMenuCssSelector,
|
|
2156
|
+
tableContentCssSelector,
|
|
2157
|
+
headerCssSelector,
|
|
2158
|
+
fixedTableContentCssSelector,
|
|
2159
|
+
formName,
|
|
2160
|
+
driver
|
|
2161
|
+
}) {
|
|
1938
2162
|
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
1939
2163
|
this.formName = formName;
|
|
1940
2164
|
this.headerCssSelector = headerCssSelector;
|
|
2165
|
+
this.contextMenuCssSelector = contextMenuCssSelector;
|
|
1941
2166
|
this.fixedTableContentCssSelector = fixedTableContentCssSelector;
|
|
1942
2167
|
this.tableContentCssSelector = tableContentCssSelector;
|
|
1943
2168
|
}
|
|
@@ -1947,10 +2172,18 @@ var init_Table = __esm({
|
|
|
1947
2172
|
}
|
|
1948
2173
|
return this.getColumnByName(args.name);
|
|
1949
2174
|
};
|
|
2175
|
+
/**
|
|
2176
|
+
* Отримати рядок по індексу.
|
|
2177
|
+
* @param index починається з 0
|
|
2178
|
+
*/
|
|
1950
2179
|
getRowByIndex(index) {
|
|
1951
2180
|
return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
|
|
1952
2181
|
}
|
|
2182
|
+
/**
|
|
2183
|
+
* @param index починається з 0
|
|
2184
|
+
*/
|
|
1953
2185
|
getColumnByIndex(index) {
|
|
2186
|
+
this.getRowByIndex(index);
|
|
1954
2187
|
return new Column({
|
|
1955
2188
|
parentCssSelector: this.getFullCssSelector(),
|
|
1956
2189
|
driver: this.driver,
|
|
@@ -1973,12 +2206,16 @@ var init_Table = __esm({
|
|
|
1973
2206
|
driver: this.driver
|
|
1974
2207
|
});
|
|
1975
2208
|
};
|
|
2209
|
+
/**
|
|
2210
|
+
* Вибрати рядок по індексу.
|
|
2211
|
+
* @param index починається з 0
|
|
2212
|
+
*/
|
|
1976
2213
|
selectRowByIndex(index) {
|
|
1977
2214
|
return this.getRowByIndex(index).select();
|
|
1978
2215
|
}
|
|
1979
2216
|
async getRows() {
|
|
1980
2217
|
const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
|
|
1981
|
-
const rows = await this.driver.findElements(
|
|
2218
|
+
const rows = await this.driver.findElements(import_selenium_webdriver25.By.css(rowsFullCssSelector));
|
|
1982
2219
|
const result = [];
|
|
1983
2220
|
rows.forEach((_, index) => {
|
|
1984
2221
|
const newRow = new Row(
|
|
@@ -1994,7 +2231,7 @@ var init_Table = __esm({
|
|
|
1994
2231
|
}
|
|
1995
2232
|
async getColumns() {
|
|
1996
2233
|
const columns = await this.driver.findElements(
|
|
1997
|
-
|
|
2234
|
+
import_selenium_webdriver25.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"] .header-template-text`)
|
|
1998
2235
|
);
|
|
1999
2236
|
const result = [];
|
|
2000
2237
|
columns.forEach((_, index) => {
|
|
@@ -2020,132 +2257,265 @@ var init_Table = __esm({
|
|
|
2020
2257
|
field(name) {
|
|
2021
2258
|
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
2022
2259
|
}
|
|
2260
|
+
/**
|
|
2261
|
+
* Возвращает список строк которые выделены
|
|
2262
|
+
* @returns Row[]
|
|
2263
|
+
* @example
|
|
2264
|
+
* const form = new MyForm();
|
|
2265
|
+
* //...
|
|
2266
|
+
* await form.getSelectedRows();
|
|
2267
|
+
*/
|
|
2268
|
+
async getSelectedRows() {
|
|
2269
|
+
const rows = await this.getRows();
|
|
2270
|
+
let result = [];
|
|
2271
|
+
for (const row of rows) {
|
|
2272
|
+
if (await row.isSelected()) {
|
|
2273
|
+
}
|
|
2274
|
+
result.push(row);
|
|
2275
|
+
}
|
|
2276
|
+
return result;
|
|
2277
|
+
}
|
|
2278
|
+
/**
|
|
2279
|
+
* Вызывает контекстное меню в области с данными.
|
|
2280
|
+
* @param fieldName - имя поля
|
|
2281
|
+
* @param [rowIndex] - индекс строки. Если значение не передано, то по умолчанию контекстное меню будет вызвано на первой выделенной строке.
|
|
2282
|
+
* @throws {Error} Если нет выделенных строк, то выбросит исключение.
|
|
2283
|
+
* @example
|
|
2284
|
+
* const form = new MyForm();
|
|
2285
|
+
* //...
|
|
2286
|
+
* await form.contextMenu('FieldName').clickButton('OpenFormButton');
|
|
2287
|
+
* // or
|
|
2288
|
+
* await form.contextMenu('FieldName', 3).clickButton(['Group', 'ButtonInGroup']);
|
|
2289
|
+
*/
|
|
2290
|
+
contextMenu(fieldName, rowIndex) {
|
|
2291
|
+
return new ContextMenu(this.contextMenuCssSelector, this.formName, this.driver).setInit(async () => {
|
|
2292
|
+
let row;
|
|
2293
|
+
if (rowIndex != null) {
|
|
2294
|
+
row = this.getRowByIndex(rowIndex);
|
|
2295
|
+
} else {
|
|
2296
|
+
[row] = await this.getSelectedRows();
|
|
2297
|
+
}
|
|
2298
|
+
if (!row)
|
|
2299
|
+
throw new Error("No row available row for context menu");
|
|
2300
|
+
const cellElement = await row.getCell(fieldName).getElement();
|
|
2301
|
+
await contextMenu(cellElement, this.driver);
|
|
2302
|
+
});
|
|
2303
|
+
}
|
|
2023
2304
|
};
|
|
2024
2305
|
}
|
|
2025
2306
|
});
|
|
2026
2307
|
|
|
2027
|
-
// src/pageObjects/elements/TableToolbar/
|
|
2028
|
-
var
|
|
2029
|
-
var
|
|
2030
|
-
"src/pageObjects/elements/TableToolbar/
|
|
2308
|
+
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
2309
|
+
var import_selenium_webdriver26, TOOLBAR_BUTTON_CLASS, TOOLBAR_BUTTON_TEXT_CLASS, getToolbarButtonSelector, getToolbarButtonTextSelector, ToolbarButton;
|
|
2310
|
+
var init_ToolbarButton = __esm({
|
|
2311
|
+
"src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
|
|
2031
2312
|
"use strict";
|
|
2313
|
+
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2032
2314
|
init_AbstractButton();
|
|
2033
|
-
|
|
2315
|
+
TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
2316
|
+
TOOLBAR_BUTTON_TEXT_CLASS = "dx-button-text";
|
|
2317
|
+
getToolbarButtonSelector = (name) => `#${TOOLBAR_BUTTON_CLASS}-${name}`;
|
|
2318
|
+
getToolbarButtonTextSelector = (name) => `${getToolbarButtonSelector(name)} .${TOOLBAR_BUTTON_TEXT_CLASS}`;
|
|
2319
|
+
ToolbarButton = class extends AbstractButton {
|
|
2034
2320
|
name;
|
|
2035
2321
|
constructor(parentCssSelector, name, driver) {
|
|
2036
|
-
super(parentCssSelector,
|
|
2322
|
+
super(parentCssSelector, getToolbarButtonSelector(name), driver);
|
|
2037
2323
|
this.name = name;
|
|
2038
2324
|
}
|
|
2039
2325
|
buttonNotDisplayedError() {
|
|
2040
2326
|
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
2041
2327
|
}
|
|
2328
|
+
async getTitle() {
|
|
2329
|
+
try {
|
|
2330
|
+
const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver26.By.css(getToolbarButtonTextSelector(this.name)));
|
|
2331
|
+
return await buttonTextContainer.getText();
|
|
2332
|
+
} catch (_) {
|
|
2333
|
+
return null;
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2042
2336
|
};
|
|
2043
2337
|
}
|
|
2044
2338
|
});
|
|
2045
2339
|
|
|
2046
|
-
// src/pageObjects/elements/TableToolbar/
|
|
2047
|
-
var
|
|
2048
|
-
var
|
|
2049
|
-
"src/pageObjects/elements/TableToolbar/
|
|
2340
|
+
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
2341
|
+
var import_selenium_webdriver27, ToolbarGroupButton;
|
|
2342
|
+
var init_ToolbarGroupButton = __esm({
|
|
2343
|
+
"src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
|
|
2050
2344
|
"use strict";
|
|
2051
2345
|
init_AbstractButton();
|
|
2052
|
-
|
|
2053
|
-
|
|
2346
|
+
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2347
|
+
init_ToolbarButton();
|
|
2348
|
+
ToolbarGroupButton = class extends AbstractButton {
|
|
2054
2349
|
name;
|
|
2055
2350
|
constructor(parentCssSelector, name, driver) {
|
|
2056
|
-
super(parentCssSelector,
|
|
2351
|
+
super(parentCssSelector, ``, driver);
|
|
2057
2352
|
this.name = name;
|
|
2058
2353
|
}
|
|
2059
2354
|
buttonNotDisplayedError() {
|
|
2060
2355
|
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
2061
2356
|
}
|
|
2357
|
+
async getTitle() {
|
|
2358
|
+
try {
|
|
2359
|
+
const buttonTextContainer = await this.driver.findElement(import_selenium_webdriver27.By.css(getToolbarButtonTextSelector(this.name)));
|
|
2360
|
+
return await buttonTextContainer.getText();
|
|
2361
|
+
} catch (_) {
|
|
2362
|
+
return null;
|
|
2363
|
+
}
|
|
2364
|
+
}
|
|
2062
2365
|
};
|
|
2063
2366
|
}
|
|
2064
2367
|
});
|
|
2065
2368
|
|
|
2066
|
-
// src/
|
|
2067
|
-
var
|
|
2068
|
-
var
|
|
2069
|
-
"src/
|
|
2369
|
+
// src/pageObjects/elements/AbstractDropDownMenuButton.ts
|
|
2370
|
+
var AbstractDropDownMenuButton;
|
|
2371
|
+
var init_AbstractDropDownMenuButton = __esm({
|
|
2372
|
+
"src/pageObjects/elements/AbstractDropDownMenuButton.ts"() {
|
|
2070
2373
|
"use strict";
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2374
|
+
init_AbstractElementWithParent();
|
|
2375
|
+
init_actions();
|
|
2376
|
+
AbstractDropDownMenuButton = class extends AbstractElementWithParent {
|
|
2377
|
+
_list;
|
|
2378
|
+
constructor(parentCssSelector, elementCssSelector, list, driver) {
|
|
2379
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
2380
|
+
this._list = list;
|
|
2381
|
+
}
|
|
2382
|
+
async openDropdownMenu() {
|
|
2383
|
+
const dropdown = await this.getElement();
|
|
2384
|
+
await click(dropdown, this.driver);
|
|
2385
|
+
await this._list.isVisible();
|
|
2386
|
+
}
|
|
2387
|
+
async clickButton(name) {
|
|
2388
|
+
await this.openDropdownMenu();
|
|
2389
|
+
await this._list.clickButton(name);
|
|
2390
|
+
}
|
|
2391
|
+
async clickButtonByTitle(title) {
|
|
2392
|
+
await this.openDropdownMenu();
|
|
2393
|
+
await this._list.clickButtonByTitle(title);
|
|
2394
|
+
}
|
|
2395
|
+
async getMenuItemElementByTitle(title) {
|
|
2396
|
+
await this.openDropdownMenu();
|
|
2397
|
+
return await this._list.getMenuItemElementByTitle(title);
|
|
2398
|
+
}
|
|
2399
|
+
async getMenuItemElementByName(name) {
|
|
2400
|
+
await this.openDropdownMenu();
|
|
2401
|
+
return await this._list.getMenuItemElementByName(name);
|
|
2402
|
+
}
|
|
2084
2403
|
};
|
|
2085
|
-
|
|
2086
|
-
|
|
2404
|
+
}
|
|
2405
|
+
});
|
|
2406
|
+
|
|
2407
|
+
// src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts
|
|
2408
|
+
var ToolbarMenuItem;
|
|
2409
|
+
var init_ToolbarMenuItem = __esm({
|
|
2410
|
+
"src/pageObjects/elements/TableToolbar/ToolbarMenuItem.ts"() {
|
|
2411
|
+
"use strict";
|
|
2412
|
+
ToolbarMenuItem = class {
|
|
2413
|
+
getMenuItem;
|
|
2414
|
+
name;
|
|
2415
|
+
constructor(getMenuItem, name) {
|
|
2416
|
+
this.getMenuItem = getMenuItem;
|
|
2417
|
+
this.name = name;
|
|
2418
|
+
}
|
|
2419
|
+
async click() {
|
|
2420
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2421
|
+
await menuItemElement.click();
|
|
2422
|
+
}
|
|
2423
|
+
async getTitle() {
|
|
2424
|
+
try {
|
|
2425
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2426
|
+
return await menuItemElement.getText();
|
|
2427
|
+
} catch (_) {
|
|
2428
|
+
return null;
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
async isDisabled() {
|
|
2432
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2433
|
+
return await menuItemElement.getCssValue("pointer-events") === "none";
|
|
2434
|
+
}
|
|
2435
|
+
async isDisplayed() {
|
|
2436
|
+
try {
|
|
2437
|
+
const menuItemElement = await this.getMenuItem(this.name);
|
|
2438
|
+
return await menuItemElement.isDisplayed();
|
|
2439
|
+
} catch (_) {
|
|
2440
|
+
return false;
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2087
2443
|
};
|
|
2088
2444
|
}
|
|
2089
2445
|
});
|
|
2090
2446
|
|
|
2091
2447
|
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
2092
|
-
var
|
|
2448
|
+
var SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, ToolbarMenuList, ToolbarMenu;
|
|
2093
2449
|
var init_ToolbarMenu = __esm({
|
|
2094
2450
|
"src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
|
|
2095
2451
|
"use strict";
|
|
2096
|
-
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2097
2452
|
init_typesUtil();
|
|
2098
|
-
init_AbstractElementWithParent();
|
|
2099
2453
|
init_locators();
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2454
|
+
init_AbstractDropDownMenuButton();
|
|
2455
|
+
init_DXContextMenuList();
|
|
2456
|
+
init_ToolbarMenuItem();
|
|
2103
2457
|
SPINDOWN_CLASS = ".dx-icon-spindown";
|
|
2104
2458
|
buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
|
|
2105
2459
|
getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
2106
|
-
|
|
2107
|
-
ToolbarMenu = class extends AbstractElementWithParent {
|
|
2460
|
+
ToolbarMenuList = class extends DXContextMenuList {
|
|
2108
2461
|
_formName;
|
|
2109
|
-
constructor(parentCssSelector,
|
|
2110
|
-
super(parentCssSelector,
|
|
2462
|
+
constructor(parentCssSelector, elementCssSelector, formName, driver) {
|
|
2463
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
2111
2464
|
this._formName = formName;
|
|
2112
2465
|
}
|
|
2113
|
-
|
|
2114
|
-
const dropdown = await this.getElement();
|
|
2115
|
-
await click(dropdown, this.driver);
|
|
2116
|
-
}
|
|
2117
|
-
getCssSelectorToButton(name) {
|
|
2466
|
+
getButtonNameBy(name) {
|
|
2118
2467
|
return byTestId(`ftb-${this._formName}-${name}`);
|
|
2119
2468
|
}
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
const
|
|
2125
|
-
|
|
2126
|
-
element: toolbarMenuItem,
|
|
2127
|
-
errorMessage: this.buttonNotDisplayedError(name),
|
|
2128
|
-
driver: this.driver
|
|
2129
|
-
});
|
|
2130
|
-
await click(toolbarMenuItem, this.driver);
|
|
2469
|
+
};
|
|
2470
|
+
ToolbarMenu = class extends AbstractDropDownMenuButton {
|
|
2471
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
2472
|
+
const fullSelector = getFullCssSelector(formName, name);
|
|
2473
|
+
const list = new ToolbarMenuList(parentCssSelector, ".toolbar-dropdown-context-menu", formName, driver);
|
|
2474
|
+
super(parentCssSelector, fullSelector, list, driver);
|
|
2131
2475
|
}
|
|
2132
|
-
|
|
2133
|
-
await this.openDropdownMenu();
|
|
2476
|
+
checkNameValue(name) {
|
|
2134
2477
|
if (!isString(name) && !isArray(name))
|
|
2135
2478
|
throw new Error(`"name" must be a string or array of string`);
|
|
2136
|
-
let lName = isString(name) ? [name] : name;
|
|
2137
|
-
for (let n of lName) {
|
|
2138
|
-
await this.goToButton(n, this.getCssSelectorToButton(n));
|
|
2139
|
-
}
|
|
2140
2479
|
}
|
|
2141
|
-
|
|
2142
|
-
await this.openDropdownMenu();
|
|
2480
|
+
checkTitleValue(title) {
|
|
2143
2481
|
if (!isString(title) && !isArray(title))
|
|
2144
2482
|
throw new Error(`"title" must be a string or array of string`);
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2483
|
+
}
|
|
2484
|
+
buttonByName(name) {
|
|
2485
|
+
this.checkNameValue(name);
|
|
2486
|
+
return new ToolbarMenuItem(this.getMenuItemElementByName.bind(this), name);
|
|
2487
|
+
}
|
|
2488
|
+
buttonByTitle(title) {
|
|
2489
|
+
this.checkTitleValue(title);
|
|
2490
|
+
return new ToolbarMenuItem(this.getMenuItemElementByTitle.bind(this), title);
|
|
2491
|
+
}
|
|
2492
|
+
async buttonIsDisplayed(name) {
|
|
2493
|
+
const button = this.buttonByName(name);
|
|
2494
|
+
return await button.isDisplayed();
|
|
2495
|
+
}
|
|
2496
|
+
async buttonByTitleIsDisplayed(title) {
|
|
2497
|
+
const button = this.buttonByTitle(title);
|
|
2498
|
+
return await button.isDisplayed();
|
|
2499
|
+
}
|
|
2500
|
+
async buttonTitle(name) {
|
|
2501
|
+
const button = this.buttonByName(name);
|
|
2502
|
+
return await button.getTitle();
|
|
2503
|
+
}
|
|
2504
|
+
async buttonIsDisabled(name) {
|
|
2505
|
+
const button = this.buttonByName(name);
|
|
2506
|
+
return await button.isDisabled();
|
|
2507
|
+
}
|
|
2508
|
+
async buttonByTitleIsDisabled(title) {
|
|
2509
|
+
const button = this.buttonByTitle(title);
|
|
2510
|
+
return await button.isDisabled();
|
|
2511
|
+
}
|
|
2512
|
+
async clickButton(name) {
|
|
2513
|
+
const button = this.buttonByName(name);
|
|
2514
|
+
await button.click();
|
|
2515
|
+
}
|
|
2516
|
+
async clickButtonByTitle(title) {
|
|
2517
|
+
const button = this.buttonByTitle(title);
|
|
2518
|
+
await button.click();
|
|
2149
2519
|
}
|
|
2150
2520
|
};
|
|
2151
2521
|
}
|
|
@@ -2173,8 +2543,7 @@ var init_ToolbarItem = __esm({
|
|
|
2173
2543
|
this._formName = formName;
|
|
2174
2544
|
}
|
|
2175
2545
|
async init() {
|
|
2176
|
-
if (this._button)
|
|
2177
|
-
return this._button;
|
|
2546
|
+
if (this._button) return this._button;
|
|
2178
2547
|
const classNames = await this.getClasses();
|
|
2179
2548
|
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
2180
2549
|
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
|
|
@@ -2198,6 +2567,10 @@ var init_ToolbarItem = __esm({
|
|
|
2198
2567
|
return false;
|
|
2199
2568
|
}
|
|
2200
2569
|
}
|
|
2570
|
+
async getTitle() {
|
|
2571
|
+
await this.init();
|
|
2572
|
+
return await this._button.getTitle();
|
|
2573
|
+
}
|
|
2201
2574
|
get menu() {
|
|
2202
2575
|
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
|
|
2203
2576
|
}
|
|
@@ -2227,11 +2600,11 @@ var init_FormToolbar = __esm({
|
|
|
2227
2600
|
});
|
|
2228
2601
|
|
|
2229
2602
|
// src/pageObjects/elements/Filters/FilterOperation.ts
|
|
2230
|
-
var
|
|
2603
|
+
var import_selenium_webdriver28, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
|
|
2231
2604
|
var init_FilterOperation = __esm({
|
|
2232
2605
|
"src/pageObjects/elements/Filters/FilterOperation.ts"() {
|
|
2233
2606
|
"use strict";
|
|
2234
|
-
|
|
2607
|
+
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2235
2608
|
init_fixElementStaleError();
|
|
2236
2609
|
init_AbstractElementWithParent();
|
|
2237
2610
|
init_locators();
|
|
@@ -2266,16 +2639,16 @@ var init_FilterOperation = __esm({
|
|
|
2266
2639
|
}
|
|
2267
2640
|
async initOperationWidget() {
|
|
2268
2641
|
const widgetButtonEl = await this.getElement();
|
|
2269
|
-
await
|
|
2642
|
+
await waitElementIsClickable_default({
|
|
2270
2643
|
element: widgetButtonEl,
|
|
2271
2644
|
errorMessage: "Widget operation is not clickable",
|
|
2272
2645
|
driver: this.driver
|
|
2273
2646
|
});
|
|
2274
|
-
const clickableElement = await widgetButtonEl.findElement(
|
|
2647
|
+
const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver28.By.className("dx-icon"));
|
|
2275
2648
|
await click(clickableElement, this.driver);
|
|
2276
2649
|
try {
|
|
2277
|
-
const widgetPopupEl = await this.driver.findElement(
|
|
2278
|
-
await
|
|
2650
|
+
const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver28.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
|
|
2651
|
+
await waitElementIsVisible_default({
|
|
2279
2652
|
element: widgetPopupEl,
|
|
2280
2653
|
errorMessage: `Operation widget popup is not visible`,
|
|
2281
2654
|
driver: this.driver
|
|
@@ -2289,13 +2662,12 @@ var init_FilterOperation = __esm({
|
|
|
2289
2662
|
throw new Error(`Operation with name "${operationName}" is not correct.`);
|
|
2290
2663
|
}
|
|
2291
2664
|
await this.initOperationWidget();
|
|
2292
|
-
const operationEl = await fixElementStaleError(
|
|
2665
|
+
const operationEl = await fixElementStaleError(import_selenium_webdriver28.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
|
|
2293
2666
|
await click(operationEl, this.driver);
|
|
2294
|
-
await
|
|
2667
|
+
await safeWait(
|
|
2295
2668
|
async () => {
|
|
2296
2669
|
const currOperationName = await this.getAttribute("data-operation");
|
|
2297
|
-
if (operationName === "isblank")
|
|
2298
|
-
return true;
|
|
2670
|
+
if (operationName === "isblank") return true;
|
|
2299
2671
|
return currOperationName === operationName;
|
|
2300
2672
|
},
|
|
2301
2673
|
this.driver,
|
|
@@ -2304,15 +2676,14 @@ var init_FilterOperation = __esm({
|
|
|
2304
2676
|
}
|
|
2305
2677
|
async getOperation() {
|
|
2306
2678
|
const result = await this.getAttribute("data-operation");
|
|
2307
|
-
if (!result)
|
|
2308
|
-
throw new Error("Operation not found");
|
|
2679
|
+
if (!result) throw new Error("Operation not found");
|
|
2309
2680
|
return result;
|
|
2310
2681
|
}
|
|
2311
2682
|
async setIsBlank(value) {
|
|
2312
2683
|
const currValue = await this.getIsBlank();
|
|
2313
2684
|
if (currValue !== value) {
|
|
2314
2685
|
await this.setOperation("isblank");
|
|
2315
|
-
await
|
|
2686
|
+
await safeWait(
|
|
2316
2687
|
async () => {
|
|
2317
2688
|
const currIsBlank = await this.getIsBlank();
|
|
2318
2689
|
return currIsBlank === value;
|
|
@@ -2394,7 +2765,8 @@ var init_FormFilterField = __esm({
|
|
|
2394
2765
|
async initOperation() {
|
|
2395
2766
|
return new FilterOperation({
|
|
2396
2767
|
parentCssSelector: this.parentCssSelector,
|
|
2397
|
-
filterTestID: createLayoutFilterTestId(this.formName, this.name)
|
|
2768
|
+
filterTestID: createLayoutFilterTestId(this.formName, this.name),
|
|
2769
|
+
driver: this.driver
|
|
2398
2770
|
});
|
|
2399
2771
|
}
|
|
2400
2772
|
/**
|
|
@@ -2501,7 +2873,8 @@ var init_PanelFilterField = __esm({
|
|
|
2501
2873
|
async initOperation() {
|
|
2502
2874
|
return new FilterOperation({
|
|
2503
2875
|
parentCssSelector: this.parentCssSelector,
|
|
2504
|
-
filterTestID: createDocFilterTestId(this.formName, this.name)
|
|
2876
|
+
filterTestID: createDocFilterTestId(this.formName, this.name),
|
|
2877
|
+
driver: this.driver
|
|
2505
2878
|
});
|
|
2506
2879
|
}
|
|
2507
2880
|
/**
|
|
@@ -2545,11 +2918,11 @@ var init_PanelFilterField = __esm({
|
|
|
2545
2918
|
});
|
|
2546
2919
|
|
|
2547
2920
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
2548
|
-
var
|
|
2921
|
+
var import_selenium_webdriver29, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
2549
2922
|
var init_FilterPanel = __esm({
|
|
2550
2923
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
2551
2924
|
"use strict";
|
|
2552
|
-
|
|
2925
|
+
import_selenium_webdriver29 = require("selenium-webdriver");
|
|
2553
2926
|
init_AbstractElement();
|
|
2554
2927
|
init_PanelFilterField();
|
|
2555
2928
|
init_actions();
|
|
@@ -2564,7 +2937,7 @@ var init_FilterPanel = __esm({
|
|
|
2564
2937
|
async filterPanelButtons() {
|
|
2565
2938
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
2566
2939
|
const el = await this.getElement();
|
|
2567
|
-
return el.findElements(
|
|
2940
|
+
return el.findElements(import_selenium_webdriver29.By.css(selector));
|
|
2568
2941
|
}
|
|
2569
2942
|
constructor(formName, driver) {
|
|
2570
2943
|
super(driver, drawerSelector(formName));
|
|
@@ -2597,7 +2970,7 @@ var init_FilterPanel = __esm({
|
|
|
2597
2970
|
await this.driver.sleep(300);
|
|
2598
2971
|
}
|
|
2599
2972
|
async close() {
|
|
2600
|
-
const btn = await this.driver.findElement(
|
|
2973
|
+
const btn = await this.driver.findElement(import_selenium_webdriver29.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
2601
2974
|
await click(btn, this.driver);
|
|
2602
2975
|
}
|
|
2603
2976
|
};
|
|
@@ -2633,12 +3006,12 @@ var init_HeaderFilterField = __esm({
|
|
|
2633
3006
|
});
|
|
2634
3007
|
|
|
2635
3008
|
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
2636
|
-
var
|
|
3009
|
+
var import_selenium_webdriver30, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
2637
3010
|
var init_ColumnFilter = __esm({
|
|
2638
3011
|
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
2639
3012
|
"use strict";
|
|
2640
3013
|
init_actions();
|
|
2641
|
-
|
|
3014
|
+
import_selenium_webdriver30 = require("selenium-webdriver");
|
|
2642
3015
|
init_HeaderFilterField();
|
|
2643
3016
|
init_waitElementIsVisible();
|
|
2644
3017
|
init_AbstractElement();
|
|
@@ -2663,11 +3036,11 @@ var init_ColumnFilter = __esm({
|
|
|
2663
3036
|
}
|
|
2664
3037
|
async getApplyButton() {
|
|
2665
3038
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
|
|
2666
|
-
return this.driver.findElement(
|
|
3039
|
+
return this.driver.findElement(import_selenium_webdriver30.By.css(selector));
|
|
2667
3040
|
}
|
|
2668
3041
|
async getCancelButton() {
|
|
2669
3042
|
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
|
|
2670
|
-
return this.driver.findElement(
|
|
3043
|
+
return this.driver.findElement(import_selenium_webdriver30.By.css(selector));
|
|
2671
3044
|
}
|
|
2672
3045
|
async apply() {
|
|
2673
3046
|
const btn = await this.getApplyButton();
|
|
@@ -2681,9 +3054,9 @@ var init_ColumnFilter = __esm({
|
|
|
2681
3054
|
const columnEl = await this._column.getElement();
|
|
2682
3055
|
const actions = this.driver.actions({ async: true });
|
|
2683
3056
|
await actions.move({ origin: columnEl }).perform();
|
|
2684
|
-
const elements = await columnEl.findElements(
|
|
3057
|
+
const elements = await columnEl.findElements(import_selenium_webdriver30.By.css(HEADER_FILTER_ICON));
|
|
2685
3058
|
let headerFilterIcon = null;
|
|
2686
|
-
await
|
|
3059
|
+
await safeWait(
|
|
2687
3060
|
async () => {
|
|
2688
3061
|
let result = false;
|
|
2689
3062
|
for (let element of elements) {
|
|
@@ -2698,12 +3071,11 @@ var init_ColumnFilter = __esm({
|
|
|
2698
3071
|
this.driver,
|
|
2699
3072
|
`HeaderFilter "${this._name}" is not visible`
|
|
2700
3073
|
);
|
|
2701
|
-
if (!headerFilterIcon)
|
|
2702
|
-
|
|
2703
|
-
await headerFilterIcon.click();
|
|
3074
|
+
if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
3075
|
+
await click(headerFilterIcon, this.driver);
|
|
2704
3076
|
const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
2705
3077
|
const filterEl = await filter.getElement();
|
|
2706
|
-
await
|
|
3078
|
+
await waitElementIsVisible_default({
|
|
2707
3079
|
element: filterEl,
|
|
2708
3080
|
driver: this.driver,
|
|
2709
3081
|
errorMessage: `Header filter is not visible`
|
|
@@ -2731,16 +3103,18 @@ var init_ColumnFilter = __esm({
|
|
|
2731
3103
|
*/
|
|
2732
3104
|
async setValue(value, operation, isBlank) {
|
|
2733
3105
|
const filter = await this.initFilter();
|
|
2734
|
-
const inputEl = await filter.getElement();
|
|
2735
|
-
await inputEl.click();
|
|
2736
3106
|
const filterOperation = new FilterOperation({
|
|
2737
3107
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
2738
|
-
filterTestID: createHeaderFilterTestId(this._formName, this._name)
|
|
3108
|
+
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3109
|
+
driver: this.driver
|
|
2739
3110
|
});
|
|
3111
|
+
const inputEl = await filter.getElement();
|
|
2740
3112
|
if (typeof operation === "string") {
|
|
3113
|
+
await inputEl.click();
|
|
2741
3114
|
await filterOperation.setOperation(operation);
|
|
2742
3115
|
}
|
|
2743
3116
|
if (typeof isBlank === "boolean") {
|
|
3117
|
+
await inputEl.click();
|
|
2744
3118
|
await filterOperation.setIsBlank(isBlank);
|
|
2745
3119
|
}
|
|
2746
3120
|
await filter.setValue(value);
|
|
@@ -2775,7 +3149,8 @@ var init_ColumnFilter = __esm({
|
|
|
2775
3149
|
await inputEl.click();
|
|
2776
3150
|
return new FilterOperation({
|
|
2777
3151
|
parentCssSelector: HEADER_FILTER_CONTAINER,
|
|
2778
|
-
filterTestID: createHeaderFilterTestId(this._formName, this._name)
|
|
3152
|
+
filterTestID: createHeaderFilterTestId(this._formName, this._name),
|
|
3153
|
+
driver: this.driver
|
|
2779
3154
|
});
|
|
2780
3155
|
}
|
|
2781
3156
|
/**
|
|
@@ -2825,7 +3200,7 @@ var ListForm_exports = {};
|
|
|
2825
3200
|
__export(ListForm_exports, {
|
|
2826
3201
|
default: () => ListForm
|
|
2827
3202
|
});
|
|
2828
|
-
var DATAGRID_HEADER_CSS_SELECTOR, DATAGRID_CONTENT_CSS_SELECTOR, FIXED_DATAGRID_CONTENT_CSS_SELECTOR, ListForm;
|
|
3203
|
+
var DATAGRID_HEADER_CSS_SELECTOR, DATAGRID_CONTENT_CSS_SELECTOR, FIXED_DATAGRID_CONTENT_CSS_SELECTOR, CONTEXT_MENU_CSS_SELECTOR, ListForm;
|
|
2829
3204
|
var init_ListForm = __esm({
|
|
2830
3205
|
"src/pageObjects/elements/Forms/ListForm.ts"() {
|
|
2831
3206
|
"use strict";
|
|
@@ -2838,16 +3213,19 @@ var init_ListForm = __esm({
|
|
|
2838
3213
|
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
2839
3214
|
DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
2840
3215
|
FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
3216
|
+
CONTEXT_MENU_CSS_SELECTOR = ".dx-datagrid";
|
|
2841
3217
|
ListForm = class extends Form {
|
|
2842
3218
|
headerCssSelector;
|
|
2843
3219
|
fixedTableContentCssSelector;
|
|
2844
3220
|
tableContentCssSelector;
|
|
3221
|
+
contextMenuCssSelector;
|
|
2845
3222
|
constructor(driver) {
|
|
2846
3223
|
super(driver);
|
|
2847
3224
|
this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
|
|
2848
3225
|
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
2849
3226
|
this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
|
|
2850
3227
|
this.tableContentCssSelector = DATAGRID_CONTENT_CSS_SELECTOR;
|
|
3228
|
+
this.contextMenuCssSelector = CONTEXT_MENU_CSS_SELECTOR;
|
|
2851
3229
|
}
|
|
2852
3230
|
/**
|
|
2853
3231
|
* Находит таблицу
|
|
@@ -2858,12 +3236,15 @@ var init_ListForm = __esm({
|
|
|
2858
3236
|
*/
|
|
2859
3237
|
table() {
|
|
2860
3238
|
return new Table(
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
3239
|
+
{
|
|
3240
|
+
parentCssSelector: this.containerCssSelector,
|
|
3241
|
+
headerCssSelector: this.headerCssSelector,
|
|
3242
|
+
fixedTableContentCssSelector: this.fixedTableContentCssSelector,
|
|
3243
|
+
formName: this.formName,
|
|
3244
|
+
driver: this.driver,
|
|
3245
|
+
contextMenuCssSelector: this.contextMenuCssSelector,
|
|
3246
|
+
tableContentCssSelector: this.tableContentCssSelector
|
|
3247
|
+
}
|
|
2867
3248
|
);
|
|
2868
3249
|
}
|
|
2869
3250
|
/**
|
|
@@ -2922,9 +3303,10 @@ var init_TreeView = __esm({
|
|
|
2922
3303
|
TreeView = class extends ListForm {
|
|
2923
3304
|
constructor(driver) {
|
|
2924
3305
|
super(driver);
|
|
2925
|
-
this.popupContainerCssSelector = `.popup.
|
|
3306
|
+
this.popupContainerCssSelector = `.popup.tree-view-${this.formName}`;
|
|
2926
3307
|
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
2927
3308
|
this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
|
|
3309
|
+
this.contextMenuCssSelector = ".dx-treelist-container";
|
|
2928
3310
|
this.tableContentCssSelector = TREELIST_CONTENT_CSS_SELECTOR;
|
|
2929
3311
|
}
|
|
2930
3312
|
};
|
|
@@ -2932,8 +3314,12 @@ var init_TreeView = __esm({
|
|
|
2932
3314
|
});
|
|
2933
3315
|
|
|
2934
3316
|
// src/pageObjects/elements/Forms/createSubFormInstance.ts
|
|
2935
|
-
function subformCssSelector(parentCssSelector, testId) {
|
|
2936
|
-
|
|
3317
|
+
function subformCssSelector(parentCssSelector, testId, isDockPanel = false) {
|
|
3318
|
+
if (isDockPanel) {
|
|
3319
|
+
return `${SECONDARY_DRAWER_LAYOUT_CONTENT} ${byTestIdCssSelector(testId)}`;
|
|
3320
|
+
} else {
|
|
3321
|
+
return `${parentCssSelector} ${byTestIdCssSelector(testId)}`;
|
|
3322
|
+
}
|
|
2937
3323
|
}
|
|
2938
3324
|
async function classDependencyInjector(formType) {
|
|
2939
3325
|
let SubFormFactoryClass;
|
|
@@ -2954,23 +3340,24 @@ async function classDependencyInjector(formType) {
|
|
|
2954
3340
|
}
|
|
2955
3341
|
return SubFormFactoryClass;
|
|
2956
3342
|
}
|
|
2957
|
-
var subFormTestId;
|
|
3343
|
+
var SECONDARY_DRAWER_LAYOUT_CONTENT, subFormTestId;
|
|
2958
3344
|
var init_createSubFormInstance = __esm({
|
|
2959
3345
|
"src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
|
|
2960
3346
|
"use strict";
|
|
2961
3347
|
init_locators();
|
|
2962
3348
|
init_types2();
|
|
3349
|
+
SECONDARY_DRAWER_LAYOUT_CONTENT = ".secondary-drawer-layout-content";
|
|
2963
3350
|
subFormTestId = (name) => `subform-${name}`;
|
|
2964
3351
|
}
|
|
2965
3352
|
});
|
|
2966
3353
|
|
|
2967
3354
|
// src/pageObjects/elements/Forms/Form.ts
|
|
2968
|
-
var
|
|
3355
|
+
var import_selenium_webdriver31, formTestId, Form;
|
|
2969
3356
|
var init_Form = __esm({
|
|
2970
3357
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
2971
3358
|
"use strict";
|
|
2972
3359
|
init_locators();
|
|
2973
|
-
|
|
3360
|
+
import_selenium_webdriver31 = require("selenium-webdriver");
|
|
2974
3361
|
init_AbstractForm();
|
|
2975
3362
|
init_waitElementIsVisible();
|
|
2976
3363
|
init_createSubFormInstance();
|
|
@@ -2995,10 +3382,15 @@ var init_Form = __esm({
|
|
|
2995
3382
|
*/
|
|
2996
3383
|
async getTitleText() {
|
|
2997
3384
|
if (await this.isModal()) {
|
|
2998
|
-
const titleEl2 = await this.driver.findElement(
|
|
3385
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver31.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
3386
|
+
await waitElementIsVisible_default({
|
|
3387
|
+
element: titleEl2,
|
|
3388
|
+
driver: this.driver,
|
|
3389
|
+
errorMessage: `Form title element is not visible`
|
|
3390
|
+
});
|
|
2999
3391
|
return titleEl2.getText();
|
|
3000
3392
|
}
|
|
3001
|
-
let titleEl = await this.driver.findElement(
|
|
3393
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver31.By.className("main-toolbar-form-title"));
|
|
3002
3394
|
return titleEl.getText();
|
|
3003
3395
|
}
|
|
3004
3396
|
setSubFormMode() {
|
|
@@ -3014,11 +3406,12 @@ var init_Form = __esm({
|
|
|
3014
3406
|
* //...
|
|
3015
3407
|
* expect(await form.subForm(name));
|
|
3016
3408
|
*/
|
|
3017
|
-
async subForm(name) {
|
|
3018
|
-
const
|
|
3019
|
-
const
|
|
3409
|
+
async subForm(name, options = {}) {
|
|
3410
|
+
const { isDockPanel = false } = options;
|
|
3411
|
+
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name), isDockPanel);
|
|
3412
|
+
const byCssSelector = import_selenium_webdriver31.By.css(cssSelector);
|
|
3020
3413
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
3021
|
-
await
|
|
3414
|
+
await waitElementIsVisible_default({
|
|
3022
3415
|
element: subFormEl,
|
|
3023
3416
|
driver: this.driver,
|
|
3024
3417
|
errorMessage: `Subform "${name}" is not visible`
|
|
@@ -3046,12 +3439,12 @@ var FormEdit_exports = {};
|
|
|
3046
3439
|
__export(FormEdit_exports, {
|
|
3047
3440
|
default: () => FormEdit
|
|
3048
3441
|
});
|
|
3049
|
-
var
|
|
3442
|
+
var import_selenium_webdriver32, FormEdit;
|
|
3050
3443
|
var init_FormEdit = __esm({
|
|
3051
3444
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
3052
3445
|
"use strict";
|
|
3053
3446
|
init_Form();
|
|
3054
|
-
|
|
3447
|
+
import_selenium_webdriver32 = require("selenium-webdriver");
|
|
3055
3448
|
init_FormField();
|
|
3056
3449
|
init_actions();
|
|
3057
3450
|
init_wait();
|
|
@@ -3087,7 +3480,7 @@ var init_FormEdit = __esm({
|
|
|
3087
3480
|
*/
|
|
3088
3481
|
async isSaveButtonDisabled() {
|
|
3089
3482
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3090
|
-
const saveButton = await this.driver.findElement(
|
|
3483
|
+
const saveButton = await this.driver.findElement(import_selenium_webdriver32.By.css(saveButtonCssSelector));
|
|
3091
3484
|
const result = await saveButton.getAttribute("aria-disabled");
|
|
3092
3485
|
return result === "true";
|
|
3093
3486
|
}
|
|
@@ -3100,8 +3493,8 @@ var init_FormEdit = __esm({
|
|
|
3100
3493
|
*/
|
|
3101
3494
|
async saveButtonClick() {
|
|
3102
3495
|
const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
|
|
3103
|
-
const saveButton = await this.driver.findElement(
|
|
3104
|
-
await
|
|
3496
|
+
const saveButton = await this.driver.findElement(import_selenium_webdriver32.By.css(saveButtonCssSelector));
|
|
3497
|
+
await safeWait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
3105
3498
|
await click(saveButton, this.driver);
|
|
3106
3499
|
}
|
|
3107
3500
|
/**
|
|
@@ -3113,7 +3506,7 @@ var init_FormEdit = __esm({
|
|
|
3113
3506
|
*/
|
|
3114
3507
|
async closeButtonClick() {
|
|
3115
3508
|
const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
|
|
3116
|
-
const closeButton = await this.driver.findElement(
|
|
3509
|
+
const closeButton = await this.driver.findElement(import_selenium_webdriver32.By.css(closeButtonCssSelector));
|
|
3117
3510
|
await click(closeButton, this.driver);
|
|
3118
3511
|
}
|
|
3119
3512
|
};
|
|
@@ -3142,13 +3535,15 @@ __export(src_exports, {
|
|
|
3142
3535
|
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
3143
3536
|
click: () => click,
|
|
3144
3537
|
config: () => config,
|
|
3538
|
+
contextMenu: () => contextMenu,
|
|
3145
3539
|
createDriver: () => createDriver,
|
|
3146
3540
|
editorFactory: () => editorFactory,
|
|
3147
3541
|
elementIsNotPresent: () => elementIsNotPresent,
|
|
3148
3542
|
readonlyLocator: () => readonlyLocator,
|
|
3149
3543
|
signIn: () => signIn,
|
|
3150
|
-
wait: () =>
|
|
3151
|
-
|
|
3544
|
+
wait: () => safeWait,
|
|
3545
|
+
waitElementIsClickable: () => waitElementIsClickable_default,
|
|
3546
|
+
waitElementIsVisible: () => waitElementIsVisible_default
|
|
3152
3547
|
});
|
|
3153
3548
|
module.exports = __toCommonJS(src_exports);
|
|
3154
3549
|
init_config();
|
|
@@ -3159,6 +3554,7 @@ init_config();
|
|
|
3159
3554
|
init_waitElementIsVisible();
|
|
3160
3555
|
init_actions();
|
|
3161
3556
|
init_locators();
|
|
3557
|
+
var import_selenium_webdriver3 = require("selenium-webdriver");
|
|
3162
3558
|
var LOGIN_PATH = "/login";
|
|
3163
3559
|
var LoginPage = class extends AbstractPage {
|
|
3164
3560
|
usernameField = byTestId("loginField", "input");
|
|
@@ -3167,7 +3563,7 @@ var LoginPage = class extends AbstractPage {
|
|
|
3167
3563
|
async locate() {
|
|
3168
3564
|
await super.locate();
|
|
3169
3565
|
const login = await this.driver.findElement(this.usernameField);
|
|
3170
|
-
await
|
|
3566
|
+
await waitElementIsVisible_default({
|
|
3171
3567
|
element: login,
|
|
3172
3568
|
driver: this.driver
|
|
3173
3569
|
});
|
|
@@ -3183,6 +3579,11 @@ var LoginPage = class extends AbstractPage {
|
|
|
3183
3579
|
}
|
|
3184
3580
|
async clickLoginButton() {
|
|
3185
3581
|
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
3582
|
+
await waitElementIsVisible_default({
|
|
3583
|
+
driver: this.driver,
|
|
3584
|
+
by: import_selenium_webdriver3.By.id("section"),
|
|
3585
|
+
errorMessage: "Sing in not successful"
|
|
3586
|
+
});
|
|
3186
3587
|
}
|
|
3187
3588
|
async loginWith(username, password) {
|
|
3188
3589
|
await this.enterUsername(username);
|
|
@@ -3200,8 +3601,38 @@ init_locators();
|
|
|
3200
3601
|
// src/utils/createDriver.ts
|
|
3201
3602
|
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
3202
3603
|
init_config();
|
|
3604
|
+
var import_chrome = __toESM(require("selenium-webdriver/chrome"));
|
|
3605
|
+
var import_firefox = __toESM(require("selenium-webdriver/firefox"));
|
|
3606
|
+
function chromeOptions(builder, options) {
|
|
3607
|
+
const ChromeOptions = new import_chrome.default.Options();
|
|
3608
|
+
if (options.headless) {
|
|
3609
|
+
ChromeOptions.addArguments(`--headless=new`);
|
|
3610
|
+
}
|
|
3611
|
+
return builder.setChromeOptions(ChromeOptions);
|
|
3612
|
+
}
|
|
3613
|
+
function firefoxOptions(builder, options) {
|
|
3614
|
+
const FirefoxOptions = new import_firefox.default.Options();
|
|
3615
|
+
if (options.headless) {
|
|
3616
|
+
FirefoxOptions.addArguments(`--headless`);
|
|
3617
|
+
}
|
|
3618
|
+
return builder.setFirefoxOptions(FirefoxOptions);
|
|
3619
|
+
}
|
|
3620
|
+
function setOptions(builder, browser, options) {
|
|
3621
|
+
switch (browser) {
|
|
3622
|
+
case "chrome":
|
|
3623
|
+
return chromeOptions(builder, options);
|
|
3624
|
+
case "firefox":
|
|
3625
|
+
return firefoxOptions(builder, options);
|
|
3626
|
+
default:
|
|
3627
|
+
return builder;
|
|
3628
|
+
}
|
|
3629
|
+
}
|
|
3203
3630
|
var createDriver = async (browser) => {
|
|
3204
|
-
const
|
|
3631
|
+
const _browser = browser ?? config().browser;
|
|
3632
|
+
const headless = config().headless === "true";
|
|
3633
|
+
let builder = new import_selenium_webdriver4.Builder().forBrowser(_browser);
|
|
3634
|
+
builder = setOptions(builder, _browser, { headless });
|
|
3635
|
+
const driver = await builder.build();
|
|
3205
3636
|
const manage = driver.manage();
|
|
3206
3637
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
3207
3638
|
await manage.window().maximize();
|
|
@@ -3219,13 +3650,12 @@ var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
|
3219
3650
|
|
|
3220
3651
|
// src/index.ts
|
|
3221
3652
|
init_waitElementIsVisible();
|
|
3653
|
+
init_waitElementIsClickable();
|
|
3222
3654
|
init_wait();
|
|
3223
3655
|
|
|
3224
3656
|
// src/utils/signIn.ts
|
|
3225
|
-
init_config();
|
|
3226
3657
|
async function signIn(driver) {
|
|
3227
3658
|
const webDriver = driver ?? await createDriver();
|
|
3228
|
-
config().driver = webDriver;
|
|
3229
3659
|
const loginPage = new LoginPage(webDriver);
|
|
3230
3660
|
await loginPage.locate();
|
|
3231
3661
|
await loginPage.authorize();
|
|
@@ -3257,6 +3687,8 @@ init_Editors();
|
|
|
3257
3687
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
3258
3688
|
init_actions();
|
|
3259
3689
|
init_fixElementStaleError();
|
|
3690
|
+
init_waitElementIsVisible();
|
|
3691
|
+
init_waitElementIsClickable();
|
|
3260
3692
|
var SubsystemItem = class {
|
|
3261
3693
|
bySelector;
|
|
3262
3694
|
driver;
|
|
@@ -3268,10 +3700,22 @@ var SubsystemItem = class {
|
|
|
3268
3700
|
return fixElementStaleError(this.bySelector, this.driver);
|
|
3269
3701
|
}
|
|
3270
3702
|
async getTitle() {
|
|
3703
|
+
await waitElementIsVisible_default(
|
|
3704
|
+
{
|
|
3705
|
+
by: this.bySelector,
|
|
3706
|
+
driver: this.driver
|
|
3707
|
+
}
|
|
3708
|
+
);
|
|
3271
3709
|
const el = await this.getElement();
|
|
3272
3710
|
return await el.getAttribute("data-title");
|
|
3273
3711
|
}
|
|
3274
3712
|
async click() {
|
|
3713
|
+
await waitElementIsClickable_default(
|
|
3714
|
+
{
|
|
3715
|
+
by: this.bySelector,
|
|
3716
|
+
driver: this.driver
|
|
3717
|
+
}
|
|
3718
|
+
);
|
|
3275
3719
|
const el = await this.getElement();
|
|
3276
3720
|
await click(el, this.driver);
|
|
3277
3721
|
}
|
|
@@ -3282,6 +3726,7 @@ init_createDataTestId();
|
|
|
3282
3726
|
init_actions();
|
|
3283
3727
|
init_ClearButtonStrategy();
|
|
3284
3728
|
init_waitElementIsVisible();
|
|
3729
|
+
init_fixElementStaleError();
|
|
3285
3730
|
var SEARCH_ITEM_SELECTOR = "search-item";
|
|
3286
3731
|
var BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
3287
3732
|
var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
@@ -3296,11 +3741,11 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3296
3741
|
}
|
|
3297
3742
|
async headerTitle() {
|
|
3298
3743
|
const title = await this.header.title();
|
|
3299
|
-
await
|
|
3744
|
+
await safeWait(async () => await title.getText() != "", this.driver);
|
|
3300
3745
|
return title.getText();
|
|
3301
3746
|
}
|
|
3302
3747
|
getSearchComponent() {
|
|
3303
|
-
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
|
|
3748
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR), this.driver);
|
|
3304
3749
|
}
|
|
3305
3750
|
/**
|
|
3306
3751
|
* Находит сабсистему по заголовку
|
|
@@ -3311,8 +3756,9 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3311
3756
|
*/
|
|
3312
3757
|
async search(title) {
|
|
3313
3758
|
const searchComponent = this.getSearchComponent();
|
|
3759
|
+
await this.searchClear();
|
|
3314
3760
|
await searchComponent.setValue(title);
|
|
3315
|
-
await
|
|
3761
|
+
await safeWait(
|
|
3316
3762
|
async () => {
|
|
3317
3763
|
const findElement = await this.itemByTitle(title).getElement();
|
|
3318
3764
|
const classes = await findElement.getAttribute("class");
|
|
@@ -3331,7 +3777,7 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3331
3777
|
*/
|
|
3332
3778
|
async searchClear() {
|
|
3333
3779
|
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
3334
|
-
const clearBtn = await
|
|
3780
|
+
const clearBtn = await fixElementStaleError(import_selenium_webdriver16.By.css(clearBtnSelector), this.driver);
|
|
3335
3781
|
if (await clearBtn.isDisplayed()) {
|
|
3336
3782
|
await click(clearBtn, this.driver);
|
|
3337
3783
|
}
|
|
@@ -3365,14 +3811,14 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
3365
3811
|
* wait subsystemsPanel.back();
|
|
3366
3812
|
*/
|
|
3367
3813
|
async back() {
|
|
3368
|
-
const
|
|
3369
|
-
await
|
|
3814
|
+
const by = import_selenium_webdriver16.By.css(`#aside .${BACK_BUTTON_SELECTOR}`);
|
|
3815
|
+
await waitElementIsVisible_default(
|
|
3370
3816
|
{
|
|
3371
|
-
|
|
3817
|
+
by,
|
|
3372
3818
|
driver: this.driver
|
|
3373
3819
|
}
|
|
3374
3820
|
);
|
|
3375
|
-
await click(
|
|
3821
|
+
await click(await fixElementStaleError(by, this.driver), this.driver);
|
|
3376
3822
|
}
|
|
3377
3823
|
};
|
|
3378
3824
|
|
|
@@ -3410,13 +3856,13 @@ init_FilterPanel();
|
|
|
3410
3856
|
|
|
3411
3857
|
// src/pageObjects/elements/Dialog.ts
|
|
3412
3858
|
init_AbstractElement();
|
|
3413
|
-
var
|
|
3859
|
+
var import_selenium_webdriver33 = require("selenium-webdriver");
|
|
3414
3860
|
init_AbstractButton();
|
|
3415
3861
|
var DIALOG_CLASS = ".d5-dialog";
|
|
3416
3862
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
3417
3863
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
3418
3864
|
var DIALOG_BUTTONS_PANEL_CLASS = ".dialog__buttons-panel";
|
|
3419
|
-
var
|
|
3865
|
+
var buttonByTextXpath = (text) => `.//span[contains(@class, "dx-button-text") and contains(text(), "${text}")]`;
|
|
3420
3866
|
var DialogButton = class extends AbstractButton {
|
|
3421
3867
|
text;
|
|
3422
3868
|
constructor(parentCssSelector, text, driver) {
|
|
@@ -3425,11 +3871,14 @@ var DialogButton = class extends AbstractButton {
|
|
|
3425
3871
|
}
|
|
3426
3872
|
async getElement() {
|
|
3427
3873
|
const panel = await super.getElement();
|
|
3428
|
-
return panel.findElement(
|
|
3874
|
+
return panel.findElement(import_selenium_webdriver33.By.xpath(buttonByTextXpath(this.text)));
|
|
3429
3875
|
}
|
|
3430
3876
|
buttonNotDisplayedError() {
|
|
3431
3877
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
3432
3878
|
}
|
|
3879
|
+
getTitle() {
|
|
3880
|
+
throw new Error(`Method "getTitle()" is not working.`);
|
|
3881
|
+
}
|
|
3433
3882
|
};
|
|
3434
3883
|
var Dialog = class extends AbstractElement {
|
|
3435
3884
|
constructor(driver) {
|
|
@@ -3445,11 +3894,11 @@ var Dialog = class extends AbstractElement {
|
|
|
3445
3894
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
3446
3895
|
}
|
|
3447
3896
|
async title() {
|
|
3448
|
-
const el = await this.driver.findElement(
|
|
3897
|
+
const el = await this.driver.findElement(import_selenium_webdriver33.By.css(this.titleSelector));
|
|
3449
3898
|
return await el.getText();
|
|
3450
3899
|
}
|
|
3451
3900
|
async text() {
|
|
3452
|
-
const el = await this.driver.findElement(
|
|
3901
|
+
const el = await this.driver.findElement(import_selenium_webdriver33.By.css(this.textSelector));
|
|
3453
3902
|
return await el.getText();
|
|
3454
3903
|
}
|
|
3455
3904
|
button(text) {
|
|
@@ -3477,11 +3926,13 @@ var Dialog = class extends AbstractElement {
|
|
|
3477
3926
|
byTestIdCssSelector,
|
|
3478
3927
|
click,
|
|
3479
3928
|
config,
|
|
3929
|
+
contextMenu,
|
|
3480
3930
|
createDriver,
|
|
3481
3931
|
editorFactory,
|
|
3482
3932
|
elementIsNotPresent,
|
|
3483
3933
|
readonlyLocator,
|
|
3484
3934
|
signIn,
|
|
3485
3935
|
wait,
|
|
3936
|
+
waitElementIsClickable,
|
|
3486
3937
|
waitElementIsVisible
|
|
3487
3938
|
});
|