d5-testing-library 1.5.0 → 1.7.0-alpha.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-2OXEIJRD.mjs +7 -0
- package/dist/ListForm-NWULJ2P6.mjs +7 -0
- package/dist/TreeView-USLYNLBL.mjs +8 -0
- package/dist/{chunk-FP26UOTI.mjs → chunk-H6LCUGIP.mjs} +1 -1
- package/dist/{chunk-VWNH6HVN.mjs → chunk-ISIVPVER.mjs} +152 -32
- package/dist/{chunk-44JIUIEW.mjs → chunk-M7ZEJQ34.mjs} +1 -1
- package/dist/{chunk-NWWYF43G.mjs → chunk-PVVYHCDQ.mjs} +124 -2
- package/dist/cjs/d5-testing-library.cjs +1407 -995
- package/dist/d5-testing-library.d.ts +194 -64
- package/dist/d5-testing-library.legacy-esm.js +137 -8
- package/dist/d5-testing-library.mjs +137 -8
- package/package.json +4 -2
- package/dist/FormEdit-MZJH5R5H.mjs +0 -7
- package/dist/ListForm-HDVXB6CG.mjs +0 -7
- package/dist/TreeView-DE5RBMDD.mjs +0 -8
|
@@ -275,126 +275,120 @@ var init_AbstractElementWithParent = __esm({
|
|
|
275
275
|
}
|
|
276
276
|
});
|
|
277
277
|
|
|
278
|
-
// src/
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
function createFieldTestId(formName, itemName) {
|
|
283
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
284
|
-
}
|
|
285
|
-
function createGroupTestId(formName, itemName) {
|
|
286
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
287
|
-
}
|
|
288
|
-
function createFilterTestId(formName, itemName, layout) {
|
|
289
|
-
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
290
|
-
}
|
|
291
|
-
function createDocFilterTestId(formName, itemName) {
|
|
292
|
-
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
293
|
-
}
|
|
294
|
-
function createLayoutFilterTestId(formName, itemName) {
|
|
295
|
-
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
296
|
-
}
|
|
297
|
-
function createTableId(formName) {
|
|
298
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
299
|
-
}
|
|
300
|
-
function createFormButtonTestId(formName, itemName) {
|
|
301
|
-
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
302
|
-
}
|
|
303
|
-
var init_createDataTestId = __esm({
|
|
304
|
-
"src/utils/createDataTestId.ts"() {
|
|
278
|
+
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
279
|
+
var InputClearStrategy;
|
|
280
|
+
var init_InputClearStrategy = __esm({
|
|
281
|
+
"src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
|
|
305
282
|
"use strict";
|
|
283
|
+
InputClearStrategy = class {
|
|
284
|
+
async clear(editor) {
|
|
285
|
+
const inputEl = await editor.getInputElement();
|
|
286
|
+
await inputEl.clear();
|
|
287
|
+
}
|
|
288
|
+
};
|
|
306
289
|
}
|
|
307
290
|
});
|
|
308
291
|
|
|
309
|
-
// src/
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
errorMessage,
|
|
314
|
-
driver
|
|
315
|
-
}) {
|
|
316
|
-
driver = driver ?? config().driver;
|
|
317
|
-
await wait(async () => {
|
|
318
|
-
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
319
|
-
return await element.isDisplayed() && !isDisabled;
|
|
320
|
-
}, driver, errorMessage, timeout ?? config().timeout);
|
|
321
|
-
}
|
|
322
|
-
var init_waitElementIsClickable = __esm({
|
|
323
|
-
"src/utils/waitElementIsClickable.ts"() {
|
|
292
|
+
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
293
|
+
var import_selenium_webdriver7, AbstractDXEditorWithInput;
|
|
294
|
+
var init_AbstractEditor = __esm({
|
|
295
|
+
"src/pageObjects/elements/Editors/AbstractEditor.ts"() {
|
|
324
296
|
"use strict";
|
|
325
|
-
|
|
326
|
-
|
|
297
|
+
import_selenium_webdriver7 = require("selenium-webdriver");
|
|
298
|
+
init_actions();
|
|
299
|
+
init_InputClearStrategy();
|
|
300
|
+
init_AbstractElementWithParent();
|
|
301
|
+
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
302
|
+
clearStrategy = new InputClearStrategy();
|
|
303
|
+
setClearStrategy(strategy) {
|
|
304
|
+
this.clearStrategy = strategy;
|
|
305
|
+
}
|
|
306
|
+
getInputCssSelector() {
|
|
307
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
308
|
+
}
|
|
309
|
+
async getInputElement() {
|
|
310
|
+
return this.driver.findElement(import_selenium_webdriver7.By.css(this.getInputCssSelector()));
|
|
311
|
+
}
|
|
312
|
+
async getInputValue() {
|
|
313
|
+
const inputEl = await this.getInputElement();
|
|
314
|
+
return inputEl.getAttribute("value");
|
|
315
|
+
}
|
|
316
|
+
async setInputValue(value) {
|
|
317
|
+
const inputEl = await this.getInputElement();
|
|
318
|
+
await click(inputEl, this.driver);
|
|
319
|
+
await inputEl.sendKeys(value, import_selenium_webdriver7.Key.ENTER);
|
|
320
|
+
}
|
|
321
|
+
async clear() {
|
|
322
|
+
await this.clearStrategy.clear(this);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
327
325
|
}
|
|
328
326
|
});
|
|
329
327
|
|
|
330
|
-
// src/pageObjects/elements/
|
|
331
|
-
var
|
|
332
|
-
var
|
|
333
|
-
"src/pageObjects/elements/
|
|
328
|
+
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
329
|
+
var TextEditor;
|
|
330
|
+
var init_TextEditor = __esm({
|
|
331
|
+
"src/pageObjects/elements/Editors/TextEditor.ts"() {
|
|
334
332
|
"use strict";
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
AbstractButton = class extends AbstractElementWithParent {
|
|
333
|
+
init_AbstractEditor();
|
|
334
|
+
init_InputClearStrategy();
|
|
335
|
+
TextEditor = class extends AbstractDXEditorWithInput {
|
|
339
336
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
340
337
|
super(parentCssSelector, elementCssSelector, driver);
|
|
338
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
341
339
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
await waitElementIsClickable({
|
|
345
|
-
element: button,
|
|
346
|
-
errorMessage: this.buttonNotDisplayedError(),
|
|
347
|
-
driver: this.driver
|
|
348
|
-
});
|
|
349
|
-
await click(button, this.driver);
|
|
340
|
+
getValue() {
|
|
341
|
+
return this.getInputValue();
|
|
350
342
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
return await button.getCssValue("pointer-events") === "none";
|
|
343
|
+
setValue(value) {
|
|
344
|
+
return this.setInputValue(value);
|
|
354
345
|
}
|
|
355
346
|
};
|
|
356
347
|
}
|
|
357
348
|
});
|
|
358
349
|
|
|
359
|
-
// src/pageObjects/elements/
|
|
360
|
-
var
|
|
361
|
-
var
|
|
362
|
-
"src/pageObjects/elements/
|
|
350
|
+
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
351
|
+
var NumberEditor;
|
|
352
|
+
var init_NumberEditor = __esm({
|
|
353
|
+
"src/pageObjects/elements/Editors/NumberEditor.ts"() {
|
|
363
354
|
"use strict";
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
355
|
+
init_AbstractEditor();
|
|
356
|
+
init_InputClearStrategy();
|
|
357
|
+
NumberEditor = class extends AbstractDXEditorWithInput {
|
|
358
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
359
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
360
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
361
|
+
}
|
|
362
|
+
async getValue() {
|
|
363
|
+
const value = await super.getInputValue();
|
|
364
|
+
return value == "" ? null : Number.parseFloat(value);
|
|
365
|
+
}
|
|
366
|
+
setValue(value) {
|
|
367
|
+
return this.setInputValue(value);
|
|
375
368
|
}
|
|
376
369
|
};
|
|
377
370
|
}
|
|
378
371
|
});
|
|
379
372
|
|
|
380
|
-
// src/pageObjects/elements/
|
|
381
|
-
var
|
|
382
|
-
var
|
|
383
|
-
"src/pageObjects/elements/
|
|
373
|
+
// src/pageObjects/elements/Editors/types.ts
|
|
374
|
+
var ControlClass;
|
|
375
|
+
var init_types = __esm({
|
|
376
|
+
"src/pageObjects/elements/Editors/types.ts"() {
|
|
384
377
|
"use strict";
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
378
|
+
ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
379
|
+
ControlClass2["Text"] = "text-control";
|
|
380
|
+
ControlClass2["TextArea"] = "text-area-control";
|
|
381
|
+
ControlClass2["Number"] = "number-control";
|
|
382
|
+
ControlClass2["CheckBox"] = "check-box";
|
|
383
|
+
ControlClass2["Multiselect"] = "multi-select-control";
|
|
384
|
+
ControlClass2["Select"] = "select-control";
|
|
385
|
+
ControlClass2["Switch"] = "switch-control";
|
|
386
|
+
ControlClass2["Date"] = "date-control";
|
|
387
|
+
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
388
|
+
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
389
|
+
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
390
|
+
return ControlClass2;
|
|
391
|
+
})(ControlClass || {});
|
|
398
392
|
}
|
|
399
393
|
});
|
|
400
394
|
|
|
@@ -412,1117 +406,1260 @@ var init_AbstractFormElement = __esm({
|
|
|
412
406
|
}
|
|
413
407
|
});
|
|
414
408
|
|
|
415
|
-
// src/pageObjects/elements/
|
|
416
|
-
var
|
|
417
|
-
var
|
|
418
|
-
"src/pageObjects/elements/
|
|
409
|
+
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
410
|
+
var CheckBox;
|
|
411
|
+
var init_CheckBox = __esm({
|
|
412
|
+
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
419
413
|
"use strict";
|
|
414
|
+
init_actions();
|
|
420
415
|
init_AbstractElementWithParent();
|
|
421
|
-
|
|
422
|
-
async
|
|
423
|
-
const
|
|
424
|
-
|
|
416
|
+
CheckBox = class extends AbstractElementWithParent {
|
|
417
|
+
async getValue() {
|
|
418
|
+
const result = await this.getAttribute("aria-checked");
|
|
419
|
+
if (result === "true")
|
|
420
|
+
return 1;
|
|
421
|
+
if (result === "false")
|
|
422
|
+
return 0;
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
425
|
+
async setValue(value) {
|
|
426
|
+
const inputEl = await this.getElement();
|
|
427
|
+
const currentValue = await this.getValue();
|
|
428
|
+
if (currentValue !== value) {
|
|
429
|
+
await click(inputEl, this.driver);
|
|
430
|
+
}
|
|
425
431
|
}
|
|
426
432
|
};
|
|
427
433
|
}
|
|
428
434
|
});
|
|
429
435
|
|
|
430
|
-
// src/
|
|
431
|
-
var
|
|
432
|
-
var
|
|
433
|
-
"src/
|
|
436
|
+
// src/utils/xpathHelper.ts
|
|
437
|
+
var XPathHelper;
|
|
438
|
+
var init_xpathHelper = __esm({
|
|
439
|
+
"src/utils/xpathHelper.ts"() {
|
|
434
440
|
"use strict";
|
|
435
|
-
|
|
436
|
-
|
|
441
|
+
XPathHelper = class {
|
|
442
|
+
static getClassAndValueXpath(cssClass, value) {
|
|
443
|
+
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
444
|
+
}
|
|
437
445
|
};
|
|
438
446
|
}
|
|
439
447
|
});
|
|
440
448
|
|
|
441
|
-
// src/pageObjects/elements/
|
|
442
|
-
var import_selenium_webdriver8,
|
|
443
|
-
var
|
|
444
|
-
"src/pageObjects/elements/
|
|
449
|
+
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
450
|
+
var import_selenium_webdriver8, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
|
|
451
|
+
var init_ClearButtonStrategy = __esm({
|
|
452
|
+
"src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
|
|
445
453
|
"use strict";
|
|
446
|
-
init_AbstractGroup();
|
|
447
454
|
import_selenium_webdriver8 = require("selenium-webdriver");
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
455
|
+
init_actions();
|
|
456
|
+
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
457
|
+
DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
458
|
+
ClearButtonStrategy = class {
|
|
459
|
+
editorContainerClass;
|
|
460
|
+
_driver;
|
|
461
|
+
constructor(editorContainerClass, driver) {
|
|
462
|
+
this.editorContainerClass = editorContainerClass;
|
|
463
|
+
this._driver = driver;
|
|
453
464
|
}
|
|
454
|
-
|
|
455
|
-
|
|
465
|
+
async isEmptyEditorField() {
|
|
466
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver8.By.css(this.editorContainerClass));
|
|
467
|
+
const classAttribute = await editorContainer.getAttribute("class");
|
|
468
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
456
469
|
}
|
|
457
|
-
async
|
|
458
|
-
|
|
459
|
-
|
|
470
|
+
async clear() {
|
|
471
|
+
if (await this.isEmptyEditorField()) {
|
|
472
|
+
throw new Error("This field is already empty");
|
|
473
|
+
}
|
|
474
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
475
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
|
|
476
|
+
await click(clearBtn, this._driver);
|
|
460
477
|
}
|
|
461
478
|
};
|
|
462
479
|
}
|
|
463
480
|
});
|
|
464
481
|
|
|
465
|
-
// src/pageObjects/elements/
|
|
466
|
-
var
|
|
467
|
-
var
|
|
468
|
-
"src/pageObjects/elements/
|
|
482
|
+
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
483
|
+
var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
484
|
+
var init_SelectBoxEditor = __esm({
|
|
485
|
+
"src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
|
|
469
486
|
"use strict";
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
init_AbstractElementWithParent();
|
|
491
|
-
init_locators();
|
|
492
|
-
init_createDataTestId();
|
|
493
|
-
init_groupFactory();
|
|
494
|
-
FormGroup = class extends AbstractElementWithParent {
|
|
495
|
-
editor;
|
|
496
|
-
constructor(parentCssSelector, formName, name, driver) {
|
|
497
|
-
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
487
|
+
init_AbstractEditor();
|
|
488
|
+
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
489
|
+
init_xpathHelper();
|
|
490
|
+
init_actions();
|
|
491
|
+
init_ClearButtonStrategy();
|
|
492
|
+
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
493
|
+
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
494
|
+
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
495
|
+
const { implicit } = await driver.manage().getTimeouts();
|
|
496
|
+
let optElement = null;
|
|
497
|
+
const timeout = delay ? implicit : 200;
|
|
498
|
+
let err = null;
|
|
499
|
+
try {
|
|
500
|
+
await driver.manage().setTimeouts({ implicit: timeout });
|
|
501
|
+
optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
|
|
502
|
+
await click(optElement, driver);
|
|
503
|
+
} catch (e) {
|
|
504
|
+
err = new Error(`Item not found: "${optionValue}"`);
|
|
505
|
+
} finally {
|
|
506
|
+
await driver.manage().setTimeouts({ implicit });
|
|
498
507
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
508
|
+
if (err)
|
|
509
|
+
throw err;
|
|
510
|
+
};
|
|
511
|
+
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
512
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
513
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
514
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
503
515
|
}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
508
|
-
*/
|
|
509
|
-
async isDisplayed() {
|
|
516
|
+
async setSelectInputValue(value) {
|
|
517
|
+
const inputEl = await this.getInputElement();
|
|
518
|
+
await click(inputEl, this.driver);
|
|
510
519
|
try {
|
|
511
|
-
await this.
|
|
512
|
-
return this.editor.isDisplayed();
|
|
520
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
513
521
|
} catch {
|
|
514
|
-
|
|
522
|
+
await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
|
|
523
|
+
await dropDownOptionClick(value, this.driver);
|
|
515
524
|
}
|
|
516
525
|
}
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
await this.initEditor();
|
|
524
|
-
await this.editor.tabClick(name);
|
|
526
|
+
async getValue() {
|
|
527
|
+
const value = await super.getInputValue();
|
|
528
|
+
return value == "" ? null : value;
|
|
529
|
+
}
|
|
530
|
+
setValue(value) {
|
|
531
|
+
return this.setSelectInputValue(value);
|
|
525
532
|
}
|
|
526
533
|
};
|
|
527
534
|
}
|
|
528
535
|
});
|
|
529
536
|
|
|
530
|
-
// src/pageObjects/elements/
|
|
531
|
-
var
|
|
532
|
-
var
|
|
533
|
-
"src/pageObjects/elements/
|
|
537
|
+
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
538
|
+
var SwitchEditor;
|
|
539
|
+
var init_SwitchEditor = __esm({
|
|
540
|
+
"src/pageObjects/elements/Editors/SwitchEditor.ts"() {
|
|
534
541
|
"use strict";
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
this._formName = name;
|
|
547
|
-
}
|
|
548
|
-
get formName() {
|
|
549
|
-
return this._formName;
|
|
542
|
+
init_actions();
|
|
543
|
+
init_AbstractElementWithParent();
|
|
544
|
+
init_wait();
|
|
545
|
+
SwitchEditor = class extends AbstractElementWithParent {
|
|
546
|
+
async getValue() {
|
|
547
|
+
const result = await this.getAttribute("aria-label");
|
|
548
|
+
if (result === "ON")
|
|
549
|
+
return 1;
|
|
550
|
+
if (result === "OFF")
|
|
551
|
+
return 0;
|
|
552
|
+
return null;
|
|
550
553
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
* class MyForm extends FormEdit {}
|
|
555
|
-
* //...
|
|
556
|
-
* const formEdit = new MyForm();
|
|
557
|
-
* expect(await formEdit.exists()).toBe(true);
|
|
558
|
-
*/
|
|
559
|
-
async exists() {
|
|
560
|
-
try {
|
|
561
|
-
let elements = await this.driver.findElements(this.containerBy);
|
|
562
|
-
return elements.length > 0;
|
|
563
|
-
} catch (error) {
|
|
564
|
-
return false;
|
|
554
|
+
async setValue(value) {
|
|
555
|
+
if (value !== 0 && value !== 1) {
|
|
556
|
+
value = value ? 1 : 0;
|
|
565
557
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
*/
|
|
577
|
-
group(name) {
|
|
578
|
-
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
558
|
+
const inputEl = await this.getElement();
|
|
559
|
+
const currentValue = await this.getValue();
|
|
560
|
+
if (currentValue === value) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
await click(inputEl, this.driver);
|
|
564
|
+
await wait(async () => {
|
|
565
|
+
const updatedValue = await this.getValue();
|
|
566
|
+
return updatedValue !== currentValue;
|
|
567
|
+
}, this.driver);
|
|
579
568
|
}
|
|
580
569
|
};
|
|
581
570
|
}
|
|
582
571
|
});
|
|
583
572
|
|
|
584
|
-
// src/pageObjects/elements/
|
|
585
|
-
var
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
// src/pageObjects/elements/Table/utils.ts
|
|
592
|
-
function getCssRowByIndexSelector(index) {
|
|
593
|
-
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
594
|
-
}
|
|
595
|
-
function getCssCellByIndexSelector(index) {
|
|
596
|
-
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
597
|
-
}
|
|
598
|
-
var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
599
|
-
var init_utils = __esm({
|
|
600
|
-
"src/pageObjects/elements/Table/utils.ts"() {
|
|
601
|
-
"use strict";
|
|
602
|
-
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
603
|
-
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
604
|
-
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
605
|
-
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
606
|
-
transformInputIndex = (index) => index + 1;
|
|
607
|
-
transformOutputIndex = (index) => +index - 1;
|
|
608
|
-
}
|
|
609
|
-
});
|
|
610
|
-
|
|
611
|
-
// src/pageObjects/elements/Table/types.ts
|
|
612
|
-
var init_types2 = __esm({
|
|
613
|
-
"src/pageObjects/elements/Table/types.ts"() {
|
|
614
|
-
"use strict";
|
|
615
|
-
}
|
|
616
|
-
});
|
|
617
|
-
|
|
618
|
-
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
619
|
-
var import_selenium_webdriver10, Cell;
|
|
620
|
-
var init_Cell = __esm({
|
|
621
|
-
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
573
|
+
// src/pageObjects/elements/Editors/TagBox.ts
|
|
574
|
+
var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
|
|
575
|
+
var init_TagBox = __esm({
|
|
576
|
+
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
622
577
|
"use strict";
|
|
578
|
+
init_AbstractEditor();
|
|
623
579
|
import_selenium_webdriver10 = require("selenium-webdriver");
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
580
|
+
init_actions();
|
|
581
|
+
init_locators();
|
|
582
|
+
init_SelectBoxEditor();
|
|
583
|
+
init_ClearButtonStrategy();
|
|
584
|
+
init_fixElementStaleError();
|
|
585
|
+
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
586
|
+
DX_TAG_CONTAINER = "dx-tag-container";
|
|
587
|
+
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
588
|
+
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
589
|
+
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
590
|
+
TagBox = class extends AbstractDXEditorWithInput {
|
|
591
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
592
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
593
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
634
594
|
}
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
595
|
+
async setTagBoxInputValue(values) {
|
|
596
|
+
const lastElement = values[values.length - 1];
|
|
597
|
+
const inputEl = await this.getInputElement();
|
|
598
|
+
await inputEl.click();
|
|
599
|
+
for (const value of values) {
|
|
600
|
+
await this.selectOption(inputEl, value, lastElement);
|
|
601
|
+
}
|
|
602
|
+
await this.confirmSelection();
|
|
638
603
|
}
|
|
639
|
-
async
|
|
640
|
-
|
|
641
|
-
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
604
|
+
async waitOptionSelection() {
|
|
605
|
+
await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
|
|
642
606
|
}
|
|
643
|
-
async
|
|
644
|
-
|
|
645
|
-
|
|
607
|
+
async selectOption(inputEl, value, lastElement) {
|
|
608
|
+
try {
|
|
609
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
610
|
+
} catch {
|
|
611
|
+
await inputEl.sendKeys(value);
|
|
612
|
+
await dropDownOptionClick(value, this.driver);
|
|
613
|
+
}
|
|
614
|
+
await this.waitOptionSelection();
|
|
615
|
+
if (value !== lastElement) {
|
|
616
|
+
await inputEl.clear();
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
async confirmSelection() {
|
|
620
|
+
const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
|
|
621
|
+
await click(btnOk, this.driver);
|
|
622
|
+
}
|
|
623
|
+
async getTagBoxInputValue() {
|
|
624
|
+
if (await this.isTagBoxEmpty()) {
|
|
625
|
+
return [];
|
|
626
|
+
}
|
|
627
|
+
const tags = await this.driver.findElements(
|
|
628
|
+
import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
|
|
629
|
+
);
|
|
646
630
|
const values = [];
|
|
647
631
|
for (const tag of tags) {
|
|
648
632
|
values.push(await tag.getAttribute("textContent"));
|
|
649
633
|
}
|
|
650
634
|
return values;
|
|
651
635
|
}
|
|
652
|
-
async
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
}
|
|
656
|
-
return super.getElement();
|
|
636
|
+
async isTagBoxEmpty() {
|
|
637
|
+
const classAttribute = await this.getClasses();
|
|
638
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
657
639
|
}
|
|
658
640
|
async getValue() {
|
|
659
|
-
const
|
|
660
|
-
|
|
661
|
-
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
662
|
-
return this.getBooleanValue(cellEl);
|
|
663
|
-
if (cellElClass.includes("tags-column" /* Tags */))
|
|
664
|
-
return this.getTagsValue(cellEl);
|
|
665
|
-
return cellEl.getText();
|
|
641
|
+
const value = await this.getTagBoxInputValue();
|
|
642
|
+
return value.length ? value : null;
|
|
666
643
|
}
|
|
667
|
-
|
|
668
|
-
|
|
644
|
+
async setValue(values) {
|
|
645
|
+
if (!Array.isArray(values)) {
|
|
646
|
+
throw new Error("The provided value is not an array");
|
|
647
|
+
}
|
|
648
|
+
await this.setTagBoxInputValue(values);
|
|
649
|
+
}
|
|
650
|
+
async remove(itemText) {
|
|
651
|
+
const tagValues = await this.getValue();
|
|
652
|
+
const tagExists = tagValues.includes(itemText);
|
|
653
|
+
if (!tagExists) {
|
|
654
|
+
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
655
|
+
}
|
|
656
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
657
|
+
const clearBtn = await this.driver.findElement(
|
|
658
|
+
import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
659
|
+
);
|
|
660
|
+
await click(clearBtn, this.driver);
|
|
669
661
|
}
|
|
670
662
|
};
|
|
671
663
|
}
|
|
672
664
|
});
|
|
673
665
|
|
|
674
|
-
// src/pageObjects/elements/
|
|
675
|
-
var import_selenium_webdriver11,
|
|
676
|
-
var
|
|
677
|
-
"src/pageObjects/elements/
|
|
666
|
+
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
667
|
+
var import_selenium_webdriver11, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
|
|
668
|
+
var init_ButtonGroup = __esm({
|
|
669
|
+
"src/pageObjects/elements/Editors/ButtonGroup.ts"() {
|
|
678
670
|
"use strict";
|
|
671
|
+
init_actions();
|
|
679
672
|
import_selenium_webdriver11 = require("selenium-webdriver");
|
|
680
|
-
init_Cell();
|
|
681
|
-
init_utils();
|
|
682
673
|
init_AbstractElementWithParent();
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
Row = class extends AbstractElementWithParent {
|
|
689
|
-
index;
|
|
690
|
-
getColumnBy;
|
|
691
|
-
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
692
|
-
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
693
|
-
this.index = index;
|
|
694
|
-
this.getColumnBy = getColumnBy;
|
|
695
|
-
}
|
|
696
|
-
_getCell({ index, name, title }) {
|
|
697
|
-
return new Cell(
|
|
698
|
-
this.getFullCssSelector(),
|
|
699
|
-
() => {
|
|
700
|
-
return this.getColumnBy({ title, name }).getIndex();
|
|
701
|
-
},
|
|
702
|
-
index,
|
|
703
|
-
this.driver
|
|
704
|
-
);
|
|
674
|
+
ITEM_CLASS = "dx-buttongroup-item";
|
|
675
|
+
SELECTED_CLASS = "dx-state-selected";
|
|
676
|
+
ButtonGroup = class extends AbstractElementWithParent {
|
|
677
|
+
getItems() {
|
|
678
|
+
return this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
705
679
|
}
|
|
706
|
-
|
|
707
|
-
return
|
|
680
|
+
getDataValue(el) {
|
|
681
|
+
return el.getAttribute("data-value");
|
|
708
682
|
}
|
|
709
|
-
|
|
710
|
-
|
|
683
|
+
async getValue() {
|
|
684
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
685
|
+
return this.getDataValue(selectedEl);
|
|
711
686
|
}
|
|
712
|
-
|
|
713
|
-
|
|
687
|
+
async setValue(value) {
|
|
688
|
+
const items = await this.getItems();
|
|
689
|
+
let buttonEl = void 0;
|
|
690
|
+
for (const item of items) {
|
|
691
|
+
const text = await this.getDataValue(item);
|
|
692
|
+
if (text == value) {
|
|
693
|
+
buttonEl = item;
|
|
694
|
+
break;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
if (!buttonEl)
|
|
698
|
+
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
699
|
+
await click(buttonEl, this.driver);
|
|
714
700
|
}
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
// src/pageObjects/elements/Editors/BooleanSelector.ts
|
|
706
|
+
var BooleanSelector;
|
|
707
|
+
var init_BooleanSelector = __esm({
|
|
708
|
+
"src/pageObjects/elements/Editors/BooleanSelector.ts"() {
|
|
709
|
+
"use strict";
|
|
710
|
+
init_ButtonGroup();
|
|
711
|
+
BooleanSelector = class extends ButtonGroup {
|
|
712
|
+
// @ts-ignore
|
|
713
|
+
async getValue() {
|
|
714
|
+
const value = await super.getValue();
|
|
715
|
+
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
726
716
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
717
|
+
// @ts-ignore
|
|
718
|
+
async setValue(value) {
|
|
719
|
+
const val = value == null ? "null" : value ? "1" : "0";
|
|
720
|
+
await super.setValue(val);
|
|
730
721
|
}
|
|
731
|
-
|
|
732
|
-
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
727
|
+
var formatDMYDate;
|
|
728
|
+
var init_utils = __esm({
|
|
729
|
+
"src/pageObjects/elements/Editors/Date/utils.ts"() {
|
|
730
|
+
"use strict";
|
|
731
|
+
formatDMYDate = (date) => {
|
|
732
|
+
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
733
|
+
return `${day}${month}${year}`;
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
739
|
+
var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
|
|
740
|
+
var init_BaseDateEditor = __esm({
|
|
741
|
+
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
742
|
+
"use strict";
|
|
743
|
+
init_AbstractEditor();
|
|
744
|
+
init_InputClearStrategy();
|
|
745
|
+
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
746
|
+
init_locators();
|
|
747
|
+
init_actions();
|
|
748
|
+
init_utils();
|
|
749
|
+
BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
750
|
+
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
751
|
+
BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
752
|
+
BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
753
|
+
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
754
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
755
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
756
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
733
757
|
}
|
|
734
|
-
async
|
|
735
|
-
const
|
|
736
|
-
const
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
758
|
+
async setDateValue(value) {
|
|
759
|
+
const actions = this.driver.actions({ async: true });
|
|
760
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()}`));
|
|
761
|
+
const dateFieldDataTestID = await this.getDataTestId();
|
|
762
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
763
|
+
const dateInputEl = await this.getInputElement();
|
|
764
|
+
await dateInputEl.clear();
|
|
765
|
+
if (Array.isArray(value)) {
|
|
766
|
+
const formattedDates = value.map(formatDMYDate);
|
|
767
|
+
const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
768
|
+
await button.click();
|
|
769
|
+
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(calendarPopoverSelector));
|
|
770
|
+
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
771
|
+
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
772
|
+
await dateFromInput.click();
|
|
773
|
+
await dateFromInput.sendKeys(formattedDates[0]);
|
|
774
|
+
await dateToInput.click();
|
|
775
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
776
|
+
await dateToInput.sendKeys(formattedDates[1]);
|
|
777
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.ENTER).perform();
|
|
778
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
779
|
+
await btnOk.click();
|
|
780
|
+
} else {
|
|
781
|
+
const formattedDate = formatDMYDate(value);
|
|
782
|
+
await click(dateInputEl, this.driver);
|
|
783
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
|
|
784
|
+
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
|
|
785
|
+
}
|
|
742
786
|
}
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
});
|
|
790
|
+
|
|
791
|
+
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
792
|
+
var import_selenium_webdriver13, SingleDateEditor;
|
|
793
|
+
var init_SingleDateEditor = __esm({
|
|
794
|
+
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
795
|
+
"use strict";
|
|
796
|
+
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
797
|
+
init_InputClearStrategy();
|
|
798
|
+
init_BaseDateEditor();
|
|
799
|
+
SingleDateEditor = class extends BaseDateEditor {
|
|
800
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
801
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
802
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
752
803
|
}
|
|
753
|
-
async
|
|
754
|
-
|
|
755
|
-
async () => {
|
|
756
|
-
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
757
|
-
},
|
|
758
|
-
this.driver,
|
|
759
|
-
msg
|
|
760
|
-
);
|
|
804
|
+
async getDateElement() {
|
|
805
|
+
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
761
806
|
}
|
|
762
|
-
async
|
|
763
|
-
await this.
|
|
764
|
-
|
|
807
|
+
async getDateValue() {
|
|
808
|
+
const inputEl = await this.getDateElement();
|
|
809
|
+
return inputEl.getAttribute("value");
|
|
765
810
|
}
|
|
766
|
-
async
|
|
767
|
-
await this.
|
|
768
|
-
|
|
811
|
+
async getValue() {
|
|
812
|
+
const value = await this.getDateValue();
|
|
813
|
+
return value == "" ? null : new Date(value);
|
|
769
814
|
}
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
815
|
+
setValue(value) {
|
|
816
|
+
if (typeof value === "object") {
|
|
817
|
+
return this.setDateValue(value);
|
|
818
|
+
}
|
|
819
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
773
820
|
}
|
|
774
821
|
};
|
|
775
822
|
}
|
|
776
823
|
});
|
|
777
824
|
|
|
778
|
-
// src/pageObjects/elements/
|
|
779
|
-
var
|
|
780
|
-
var
|
|
781
|
-
"src/pageObjects/elements/
|
|
825
|
+
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
826
|
+
var import_selenium_webdriver14, DateRangeEditor;
|
|
827
|
+
var init_DateRangeEditor = __esm({
|
|
828
|
+
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
782
829
|
"use strict";
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
_name;
|
|
791
|
-
headerCssSelector;
|
|
792
|
-
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
793
|
-
super(parentCssSelector, "", driver);
|
|
794
|
-
this._name = name;
|
|
795
|
-
this.index = index;
|
|
796
|
-
this._caption = caption;
|
|
797
|
-
this.headerCssSelector = headerCssSelector;
|
|
830
|
+
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
831
|
+
init_InputClearStrategy();
|
|
832
|
+
init_BaseDateEditor();
|
|
833
|
+
DateRangeEditor = class extends BaseDateEditor {
|
|
834
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
835
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
836
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
798
837
|
}
|
|
799
|
-
|
|
800
|
-
this.
|
|
801
|
-
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
838
|
+
async getDateElement() {
|
|
839
|
+
return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
802
840
|
}
|
|
803
|
-
|
|
804
|
-
|
|
841
|
+
async getDateValue() {
|
|
842
|
+
const inputEl = await this.getDateElement();
|
|
843
|
+
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
844
|
+
const dateToStr = await inputEl.getAttribute("dateto");
|
|
845
|
+
const dateFrom = new Date(dateFromStr);
|
|
846
|
+
const dateTo = new Date(dateToStr);
|
|
847
|
+
return [dateFrom, dateTo];
|
|
805
848
|
}
|
|
806
|
-
async
|
|
807
|
-
await this.
|
|
808
|
-
return
|
|
849
|
+
async getValue() {
|
|
850
|
+
const values = await this.getDateValue();
|
|
851
|
+
return !values.length ? null : values;
|
|
809
852
|
}
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
853
|
+
setValue(value) {
|
|
854
|
+
if (typeof value === "object") {
|
|
855
|
+
return this.setDateValue(value);
|
|
856
|
+
}
|
|
857
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
813
858
|
}
|
|
814
|
-
|
|
815
|
-
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
});
|
|
862
|
+
|
|
863
|
+
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
864
|
+
var DateEditor;
|
|
865
|
+
var init_DateEditor = __esm({
|
|
866
|
+
"src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
|
|
867
|
+
"use strict";
|
|
868
|
+
init_SingleDateEditor();
|
|
869
|
+
init_DateRangeEditor();
|
|
870
|
+
init_AbstractFormElement();
|
|
871
|
+
init_AbstractEditor();
|
|
872
|
+
init_types();
|
|
873
|
+
DateEditor = class extends AbstractDXEditorWithInput {
|
|
874
|
+
editorInstance = null;
|
|
875
|
+
initPromise;
|
|
876
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
877
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
878
|
+
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
816
879
|
}
|
|
817
|
-
async
|
|
818
|
-
|
|
880
|
+
async init(parentCssSelector, elementCssSelector, driver) {
|
|
881
|
+
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
819
882
|
}
|
|
820
|
-
async
|
|
821
|
-
const
|
|
822
|
-
|
|
883
|
+
async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
|
|
884
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
885
|
+
const classString = await elementInstance.getClasses();
|
|
886
|
+
switch (true) {
|
|
887
|
+
case classString.includes("date-control" /* Date */):
|
|
888
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
889
|
+
break;
|
|
890
|
+
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
891
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
892
|
+
break;
|
|
893
|
+
default:
|
|
894
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
895
|
+
}
|
|
823
896
|
}
|
|
824
|
-
async
|
|
825
|
-
if (this.
|
|
826
|
-
|
|
897
|
+
async ensureInitialized() {
|
|
898
|
+
if (!this.editorInstance) {
|
|
899
|
+
await this.initPromise;
|
|
827
900
|
}
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
901
|
+
}
|
|
902
|
+
async setValue(value) {
|
|
903
|
+
await this.ensureInitialized();
|
|
904
|
+
if (this.editorInstance) {
|
|
905
|
+
await this.editorInstance.setValue(value);
|
|
906
|
+
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
831
907
|
}
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
908
|
+
throw new Error("Editor instance is not initialized.");
|
|
909
|
+
}
|
|
910
|
+
async getValue() {
|
|
911
|
+
await this.ensureInitialized();
|
|
912
|
+
if (this.editorInstance) {
|
|
913
|
+
return this.editorInstance.getValue();
|
|
835
914
|
}
|
|
836
|
-
throw new Error("
|
|
915
|
+
throw new Error("Editor instance is not initialized.");
|
|
837
916
|
}
|
|
838
917
|
};
|
|
839
918
|
}
|
|
840
919
|
});
|
|
841
920
|
|
|
842
|
-
// src/pageObjects/elements/Editors/
|
|
843
|
-
var
|
|
844
|
-
var
|
|
845
|
-
"src/pageObjects/elements/Editors/
|
|
921
|
+
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
922
|
+
var editorFactory;
|
|
923
|
+
var init_editorFactory = __esm({
|
|
924
|
+
"src/pageObjects/elements/Editors/editorFactory.ts"() {
|
|
925
|
+
"use strict";
|
|
926
|
+
init_types();
|
|
927
|
+
init_AbstractFormElement();
|
|
928
|
+
init_TextEditor();
|
|
929
|
+
init_NumberEditor();
|
|
930
|
+
init_CheckBox();
|
|
931
|
+
init_SelectBoxEditor();
|
|
932
|
+
init_SwitchEditor();
|
|
933
|
+
init_TagBox();
|
|
934
|
+
init_BooleanSelector();
|
|
935
|
+
init_ButtonGroup();
|
|
936
|
+
init_DateEditor();
|
|
937
|
+
editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
938
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
939
|
+
const classSting = await elementInstance.getClasses();
|
|
940
|
+
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
941
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
942
|
+
if (classSting.includes("number-control" /* Number */))
|
|
943
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
944
|
+
if (classSting.includes("check-box" /* CheckBox */))
|
|
945
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
946
|
+
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
947
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
948
|
+
if (classSting.includes("select-control" /* Select */))
|
|
949
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
950
|
+
if (classSting.includes("switch-control" /* Switch */))
|
|
951
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
952
|
+
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
953
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
954
|
+
}
|
|
955
|
+
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
956
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
957
|
+
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
958
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
959
|
+
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
960
|
+
};
|
|
961
|
+
}
|
|
962
|
+
});
|
|
963
|
+
|
|
964
|
+
// src/pageObjects/elements/Editors/index.ts
|
|
965
|
+
var init_Editors = __esm({
|
|
966
|
+
"src/pageObjects/elements/Editors/index.ts"() {
|
|
967
|
+
"use strict";
|
|
968
|
+
init_TextEditor();
|
|
969
|
+
init_NumberEditor();
|
|
970
|
+
init_editorFactory();
|
|
971
|
+
init_types();
|
|
972
|
+
}
|
|
973
|
+
});
|
|
974
|
+
|
|
975
|
+
// src/utils/createDataTestId.ts
|
|
976
|
+
function createDataTestId(formName, itemType, itemName) {
|
|
977
|
+
return `${formName}-${itemType}-${itemName}`;
|
|
978
|
+
}
|
|
979
|
+
function createFieldTestId(formName, itemName) {
|
|
980
|
+
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
981
|
+
}
|
|
982
|
+
function createGroupTestId(formName, itemName) {
|
|
983
|
+
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
984
|
+
}
|
|
985
|
+
function createFilterTestId(formName, itemName, layout) {
|
|
986
|
+
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
987
|
+
}
|
|
988
|
+
function createDocFilterTestId(formName, itemName) {
|
|
989
|
+
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
990
|
+
}
|
|
991
|
+
function createHeaderFilterTestId(formName, itemName) {
|
|
992
|
+
return createFilterTestId(formName, itemName, "header-filter" /* HEADER_FILTER */);
|
|
993
|
+
}
|
|
994
|
+
function createLayoutFilterTestId(formName, itemName) {
|
|
995
|
+
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
996
|
+
}
|
|
997
|
+
function createTableId(formName) {
|
|
998
|
+
return `${"table" /* TABLE */}-${formName}`;
|
|
999
|
+
}
|
|
1000
|
+
function createFormButtonTestId(formName, itemName) {
|
|
1001
|
+
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
1002
|
+
}
|
|
1003
|
+
function createSubSystemTestId(itemName) {
|
|
1004
|
+
return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
|
|
1005
|
+
}
|
|
1006
|
+
var init_createDataTestId = __esm({
|
|
1007
|
+
"src/utils/createDataTestId.ts"() {
|
|
846
1008
|
"use strict";
|
|
847
|
-
InputClearStrategy = class {
|
|
848
|
-
async clear(editor) {
|
|
849
|
-
const inputEl = await editor.getInputElement();
|
|
850
|
-
await inputEl.clear();
|
|
851
|
-
}
|
|
852
|
-
};
|
|
853
1009
|
}
|
|
854
1010
|
});
|
|
855
1011
|
|
|
856
|
-
// src/
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
1012
|
+
// src/utils/waitElementIsClickable.ts
|
|
1013
|
+
async function waitElementIsClickable({
|
|
1014
|
+
element,
|
|
1015
|
+
timeout,
|
|
1016
|
+
errorMessage,
|
|
1017
|
+
driver
|
|
1018
|
+
}) {
|
|
1019
|
+
driver = driver ?? config().driver;
|
|
1020
|
+
await wait(async () => {
|
|
1021
|
+
const isDisabled = await element.getCssValue("pointer-events") === "none";
|
|
1022
|
+
return await element.isDisplayed() && !isDisabled;
|
|
1023
|
+
}, driver, errorMessage, timeout ?? config().timeout);
|
|
1024
|
+
}
|
|
1025
|
+
var init_waitElementIsClickable = __esm({
|
|
1026
|
+
"src/utils/waitElementIsClickable.ts"() {
|
|
860
1027
|
"use strict";
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
init_InputClearStrategy();
|
|
864
|
-
init_AbstractElementWithParent();
|
|
865
|
-
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
866
|
-
clearStrategy = new InputClearStrategy();
|
|
867
|
-
setClearStrategy(strategy) {
|
|
868
|
-
this.clearStrategy = strategy;
|
|
869
|
-
}
|
|
870
|
-
getInputCssSelector() {
|
|
871
|
-
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
872
|
-
}
|
|
873
|
-
async getInputElement() {
|
|
874
|
-
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
|
|
875
|
-
}
|
|
876
|
-
async getInputValue() {
|
|
877
|
-
const inputEl = await this.getInputElement();
|
|
878
|
-
return inputEl.getAttribute("value");
|
|
879
|
-
}
|
|
880
|
-
async setInputValue(value) {
|
|
881
|
-
const inputEl = await this.getInputElement();
|
|
882
|
-
await click(inputEl, this.driver);
|
|
883
|
-
await inputEl.sendKeys(value, import_selenium_webdriver13.Key.ENTER);
|
|
884
|
-
}
|
|
885
|
-
async clear() {
|
|
886
|
-
await this.clearStrategy.clear(this);
|
|
887
|
-
}
|
|
888
|
-
};
|
|
1028
|
+
init_config();
|
|
1029
|
+
init_wait();
|
|
889
1030
|
}
|
|
890
1031
|
});
|
|
891
1032
|
|
|
892
|
-
// src/pageObjects/elements/
|
|
893
|
-
var
|
|
894
|
-
var
|
|
895
|
-
"src/pageObjects/elements/
|
|
1033
|
+
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1034
|
+
var AbstractButton;
|
|
1035
|
+
var init_AbstractButton = __esm({
|
|
1036
|
+
"src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
|
|
896
1037
|
"use strict";
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
1038
|
+
init_AbstractElementWithParent();
|
|
1039
|
+
init_actions();
|
|
1040
|
+
init_waitElementIsClickable();
|
|
1041
|
+
AbstractButton = class extends AbstractElementWithParent {
|
|
900
1042
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
901
1043
|
super(parentCssSelector, elementCssSelector, driver);
|
|
902
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
903
1044
|
}
|
|
904
|
-
|
|
905
|
-
|
|
1045
|
+
async click() {
|
|
1046
|
+
const button = await this.getElement();
|
|
1047
|
+
await waitElementIsClickable({
|
|
1048
|
+
element: button,
|
|
1049
|
+
errorMessage: this.buttonNotDisplayedError(),
|
|
1050
|
+
driver: this.driver
|
|
1051
|
+
});
|
|
1052
|
+
await click(button, this.driver);
|
|
906
1053
|
}
|
|
907
|
-
|
|
908
|
-
|
|
1054
|
+
async isDisabled() {
|
|
1055
|
+
const button = await this.getElement();
|
|
1056
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
909
1057
|
}
|
|
910
1058
|
};
|
|
911
1059
|
}
|
|
912
1060
|
});
|
|
913
1061
|
|
|
914
|
-
// src/pageObjects/elements/
|
|
915
|
-
var
|
|
916
|
-
var
|
|
917
|
-
"src/pageObjects/elements/
|
|
1062
|
+
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
1063
|
+
var import_selenium_webdriver16, DXButton;
|
|
1064
|
+
var init_DXButton = __esm({
|
|
1065
|
+
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
918
1066
|
"use strict";
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
const
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
setValue(value) {
|
|
931
|
-
return this.setInputValue(value);
|
|
1067
|
+
init_AbstractButton();
|
|
1068
|
+
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1069
|
+
DXButton = class extends AbstractButton {
|
|
1070
|
+
async getText() {
|
|
1071
|
+
const classes = await this.getClasses();
|
|
1072
|
+
if (!classes.includes("dx-button-has-text")) {
|
|
1073
|
+
return null;
|
|
1074
|
+
}
|
|
1075
|
+
const el = await this.getElement();
|
|
1076
|
+
const textEl = el.findElement(import_selenium_webdriver16.By.className("dx-button-text"));
|
|
1077
|
+
return await textEl.getText();
|
|
932
1078
|
}
|
|
933
1079
|
};
|
|
934
1080
|
}
|
|
935
1081
|
});
|
|
936
1082
|
|
|
937
|
-
// src/pageObjects/elements/
|
|
938
|
-
var
|
|
939
|
-
var
|
|
940
|
-
"src/pageObjects/elements/
|
|
941
|
-
"use strict";
|
|
942
|
-
ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
943
|
-
ControlClass2["Text"] = "text-control";
|
|
944
|
-
ControlClass2["TextArea"] = "text-area-control";
|
|
945
|
-
ControlClass2["Number"] = "number-control";
|
|
946
|
-
ControlClass2["CheckBox"] = "check-box";
|
|
947
|
-
ControlClass2["Multiselect"] = "multi-select-control";
|
|
948
|
-
ControlClass2["Select"] = "select-control";
|
|
949
|
-
ControlClass2["Switch"] = "switch-control";
|
|
950
|
-
ControlClass2["Date"] = "date-control";
|
|
951
|
-
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
952
|
-
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
953
|
-
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
954
|
-
return ControlClass2;
|
|
955
|
-
})(ControlClass || {});
|
|
956
|
-
}
|
|
957
|
-
});
|
|
958
|
-
|
|
959
|
-
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
960
|
-
var CheckBox;
|
|
961
|
-
var init_CheckBox = __esm({
|
|
962
|
-
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
1083
|
+
// src/pageObjects/elements/FormButton.ts
|
|
1084
|
+
var FormButton;
|
|
1085
|
+
var init_FormButton = __esm({
|
|
1086
|
+
"src/pageObjects/elements/FormButton.ts"() {
|
|
963
1087
|
"use strict";
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
return 0;
|
|
973
|
-
return null;
|
|
1088
|
+
init_locators();
|
|
1089
|
+
init_createDataTestId();
|
|
1090
|
+
init_DXButton();
|
|
1091
|
+
FormButton = class extends DXButton {
|
|
1092
|
+
name;
|
|
1093
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1094
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
|
|
1095
|
+
this.name = name;
|
|
974
1096
|
}
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
const currentValue = await this.getValue();
|
|
978
|
-
if (currentValue !== value) {
|
|
979
|
-
await click(inputEl, this.driver);
|
|
980
|
-
}
|
|
1097
|
+
buttonNotDisplayedError() {
|
|
1098
|
+
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
981
1099
|
}
|
|
982
1100
|
};
|
|
983
1101
|
}
|
|
984
1102
|
});
|
|
985
1103
|
|
|
986
|
-
// src/
|
|
987
|
-
var
|
|
988
|
-
var
|
|
989
|
-
"src/
|
|
1104
|
+
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
1105
|
+
var AbstractGroup;
|
|
1106
|
+
var init_AbstractGroup = __esm({
|
|
1107
|
+
"src/pageObjects/elements/Groups/AbstractGroup.ts"() {
|
|
990
1108
|
"use strict";
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
1109
|
+
init_AbstractElementWithParent();
|
|
1110
|
+
AbstractGroup = class extends AbstractElementWithParent {
|
|
1111
|
+
async isDisplayed() {
|
|
1112
|
+
const groupElement = await this.getElement();
|
|
1113
|
+
return await groupElement.isDisplayed();
|
|
994
1114
|
}
|
|
995
1115
|
};
|
|
996
1116
|
}
|
|
997
1117
|
});
|
|
998
1118
|
|
|
999
|
-
// src/pageObjects/elements/
|
|
1000
|
-
var
|
|
1001
|
-
var
|
|
1002
|
-
"src/pageObjects/elements/
|
|
1119
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
1120
|
+
var Panel;
|
|
1121
|
+
var init_Panel = __esm({
|
|
1122
|
+
"src/pageObjects/elements/Groups/Panel.ts"() {
|
|
1003
1123
|
"use strict";
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
1007
|
-
DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
1008
|
-
ClearButtonStrategy = class {
|
|
1009
|
-
editorContainerClass;
|
|
1010
|
-
_driver;
|
|
1011
|
-
constructor(editorContainerClass, driver) {
|
|
1012
|
-
this.editorContainerClass = editorContainerClass;
|
|
1013
|
-
this._driver = driver;
|
|
1014
|
-
}
|
|
1015
|
-
async isEmptyEditorField() {
|
|
1016
|
-
const editorContainer = await this._driver.findElement(import_selenium_webdriver14.By.css(this.editorContainerClass));
|
|
1017
|
-
const classAttribute = await editorContainer.getAttribute("class");
|
|
1018
|
-
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
1019
|
-
}
|
|
1020
|
-
async clear() {
|
|
1021
|
-
if (await this.isEmptyEditorField()) {
|
|
1022
|
-
throw new Error("This field is already empty");
|
|
1023
|
-
}
|
|
1024
|
-
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
1025
|
-
const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
|
|
1026
|
-
await click(clearBtn, this._driver);
|
|
1027
|
-
}
|
|
1124
|
+
init_AbstractGroup();
|
|
1125
|
+
Panel = class extends AbstractGroup {
|
|
1028
1126
|
};
|
|
1029
1127
|
}
|
|
1030
1128
|
});
|
|
1031
1129
|
|
|
1032
|
-
// src/pageObjects/elements/
|
|
1033
|
-
var
|
|
1034
|
-
var
|
|
1035
|
-
"src/pageObjects/elements/
|
|
1130
|
+
// src/pageObjects/elements/Groups/TabPanel.ts
|
|
1131
|
+
var import_selenium_webdriver17, TabPanelItem, TabPanel;
|
|
1132
|
+
var init_TabPanel = __esm({
|
|
1133
|
+
"src/pageObjects/elements/Groups/TabPanel.ts"() {
|
|
1036
1134
|
"use strict";
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
init_xpathHelper();
|
|
1135
|
+
init_AbstractGroup();
|
|
1136
|
+
import_selenium_webdriver17 = require("selenium-webdriver");
|
|
1040
1137
|
init_actions();
|
|
1041
|
-
|
|
1042
|
-
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
1043
|
-
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
1044
|
-
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
1045
|
-
const { implicit } = await driver.manage().getTimeouts();
|
|
1046
|
-
let optElement = null;
|
|
1047
|
-
const timeout = delay ? implicit : 200;
|
|
1048
|
-
let err = null;
|
|
1049
|
-
try {
|
|
1050
|
-
await driver.manage().setTimeouts({ implicit: timeout });
|
|
1051
|
-
optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
|
|
1052
|
-
await click(optElement, driver);
|
|
1053
|
-
} catch (e) {
|
|
1054
|
-
err = new Error(`Item not found: "${optionValue}"`);
|
|
1055
|
-
} finally {
|
|
1056
|
-
await driver.manage().setTimeouts({ implicit });
|
|
1057
|
-
}
|
|
1058
|
-
if (err)
|
|
1059
|
-
throw err;
|
|
1060
|
-
};
|
|
1061
|
-
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
1138
|
+
TabPanelItem = class extends AbstractGroup {
|
|
1062
1139
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1063
1140
|
super(parentCssSelector, elementCssSelector, driver);
|
|
1064
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1065
1141
|
}
|
|
1066
|
-
async
|
|
1067
|
-
|
|
1068
|
-
await click(inputEl, this.driver);
|
|
1069
|
-
try {
|
|
1070
|
-
await dropDownOptionClick(value, this.driver, false);
|
|
1071
|
-
} catch {
|
|
1072
|
-
await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
|
|
1073
|
-
await dropDownOptionClick(value, this.driver);
|
|
1074
|
-
}
|
|
1142
|
+
async click() {
|
|
1143
|
+
await click(await this.getElement(), this.driver);
|
|
1075
1144
|
}
|
|
1076
|
-
async
|
|
1077
|
-
const
|
|
1078
|
-
|
|
1145
|
+
async isActive() {
|
|
1146
|
+
const tabPanelItemElement = await this.getElement();
|
|
1147
|
+
const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver17.By.xpath('ancestor::div[@role="tab"][1]'));
|
|
1148
|
+
return await grandparentTab.getAttribute("aria-selected") === "true";
|
|
1079
1149
|
}
|
|
1080
|
-
|
|
1081
|
-
return
|
|
1150
|
+
async getTitle() {
|
|
1151
|
+
return "";
|
|
1152
|
+
}
|
|
1153
|
+
};
|
|
1154
|
+
TabPanel = class extends AbstractGroup {
|
|
1155
|
+
item(name) {
|
|
1156
|
+
return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
|
|
1157
|
+
}
|
|
1158
|
+
async getTitle() {
|
|
1159
|
+
return "";
|
|
1082
1160
|
}
|
|
1083
1161
|
};
|
|
1084
1162
|
}
|
|
1085
1163
|
});
|
|
1086
1164
|
|
|
1087
|
-
// src/pageObjects/elements/
|
|
1088
|
-
var
|
|
1089
|
-
var
|
|
1090
|
-
"src/pageObjects/elements/
|
|
1165
|
+
// src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
|
|
1166
|
+
var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
|
|
1167
|
+
var init_AccordionItem = __esm({
|
|
1168
|
+
"src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
|
|
1091
1169
|
"use strict";
|
|
1170
|
+
init_AbstractGroup();
|
|
1171
|
+
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1092
1172
|
init_actions();
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
const result = await this.getAttribute("aria-label");
|
|
1098
|
-
if (result === "ON")
|
|
1099
|
-
return 1;
|
|
1100
|
-
if (result === "OFF")
|
|
1101
|
-
return 0;
|
|
1102
|
-
return null;
|
|
1173
|
+
ACCORDION_TITLE_CONTAINER = "accordion-title-container";
|
|
1174
|
+
AccordionItem = class extends AbstractGroup {
|
|
1175
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1176
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1103
1177
|
}
|
|
1104
|
-
async
|
|
1105
|
-
|
|
1106
|
-
|
|
1178
|
+
async getDataOpenedAccordItemAttr() {
|
|
1179
|
+
const accordionElement = await this.getElement();
|
|
1180
|
+
return await accordionElement.getAttribute("data-opened");
|
|
1181
|
+
}
|
|
1182
|
+
async clickAccordionItemTitle() {
|
|
1183
|
+
const accordionElement = await this.getElement();
|
|
1184
|
+
const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver18.By.className(ACCORDION_TITLE_CONTAINER));
|
|
1185
|
+
await accordTitleElement.click();
|
|
1186
|
+
}
|
|
1187
|
+
async click() {
|
|
1188
|
+
await click(await this.getElement(), this.driver);
|
|
1189
|
+
}
|
|
1190
|
+
async isExpanded() {
|
|
1191
|
+
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
1192
|
+
return dataOpened === "true";
|
|
1193
|
+
}
|
|
1194
|
+
async isCollapsed() {
|
|
1195
|
+
const dataOpened = await this.getDataOpenedAccordItemAttr();
|
|
1196
|
+
return dataOpened === "false" || !dataOpened;
|
|
1197
|
+
}
|
|
1198
|
+
async expand() {
|
|
1199
|
+
if (!await this.isExpanded()) {
|
|
1200
|
+
await this.clickAccordionItemTitle();
|
|
1107
1201
|
}
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
if (
|
|
1111
|
-
|
|
1202
|
+
}
|
|
1203
|
+
async collapse() {
|
|
1204
|
+
if (await this.isExpanded()) {
|
|
1205
|
+
await this.clickAccordionItemTitle();
|
|
1112
1206
|
}
|
|
1113
|
-
await click(inputEl, this.driver);
|
|
1114
|
-
await wait(async () => {
|
|
1115
|
-
const updatedValue = await this.getValue();
|
|
1116
|
-
return updatedValue !== currentValue;
|
|
1117
|
-
}, this.driver);
|
|
1118
1207
|
}
|
|
1119
1208
|
};
|
|
1120
1209
|
}
|
|
1121
1210
|
});
|
|
1122
1211
|
|
|
1123
|
-
// src/pageObjects/elements/
|
|
1124
|
-
var
|
|
1125
|
-
var
|
|
1126
|
-
"src/pageObjects/elements/
|
|
1212
|
+
// src/pageObjects/elements/Groups/Accordion/Accordion.ts
|
|
1213
|
+
var Accordion;
|
|
1214
|
+
var init_Accordion = __esm({
|
|
1215
|
+
"src/pageObjects/elements/Groups/Accordion/Accordion.ts"() {
|
|
1127
1216
|
"use strict";
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
init_locators();
|
|
1132
|
-
init_SelectBoxEditor();
|
|
1133
|
-
init_ClearButtonStrategy();
|
|
1134
|
-
init_wait();
|
|
1135
|
-
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
1136
|
-
DX_TAG_CONTAINER = "dx-tag-container";
|
|
1137
|
-
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
1138
|
-
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
1139
|
-
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
1140
|
-
TagBox = class extends AbstractDXEditorWithInput {
|
|
1217
|
+
init_AbstractGroup();
|
|
1218
|
+
init_AccordionItem();
|
|
1219
|
+
Accordion = class extends AbstractGroup {
|
|
1141
1220
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1142
1221
|
super(parentCssSelector, elementCssSelector, driver);
|
|
1143
|
-
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1144
1222
|
}
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
const inputEl = await this.getInputElement();
|
|
1148
|
-
await inputEl.click();
|
|
1149
|
-
for (const value of values) {
|
|
1150
|
-
await this.selectOption(inputEl, value, lastElement);
|
|
1151
|
-
}
|
|
1152
|
-
await this.confirmSelection();
|
|
1223
|
+
item(name) {
|
|
1224
|
+
return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
|
|
1153
1225
|
}
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1226
|
+
};
|
|
1227
|
+
}
|
|
1228
|
+
});
|
|
1229
|
+
|
|
1230
|
+
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
1231
|
+
var groupFactory;
|
|
1232
|
+
var init_groupFactory = __esm({
|
|
1233
|
+
"src/pageObjects/elements/Groups/groupFactory.ts"() {
|
|
1234
|
+
"use strict";
|
|
1235
|
+
init_AbstractFormElement();
|
|
1236
|
+
init_Panel();
|
|
1237
|
+
init_TabPanel();
|
|
1238
|
+
init_Accordion();
|
|
1239
|
+
init_AccordionItem();
|
|
1240
|
+
groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1241
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1242
|
+
const classSting = await elementInstance.getClasses();
|
|
1243
|
+
if (classSting.includes("tab-panel-group"))
|
|
1244
|
+
return new TabPanel(parentCssSelector, elementCssSelector, driver);
|
|
1245
|
+
if (classSting.includes("tab-panel-item"))
|
|
1246
|
+
return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
|
|
1247
|
+
if (classSting.includes("panel-group"))
|
|
1248
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1249
|
+
if (classSting.includes("accordion-group"))
|
|
1250
|
+
return new Accordion(parentCssSelector, elementCssSelector, driver);
|
|
1251
|
+
if (classSting.includes("d5-accordion-item"))
|
|
1252
|
+
return new AccordionItem(parentCssSelector, elementCssSelector, driver);
|
|
1253
|
+
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1254
|
+
};
|
|
1255
|
+
}
|
|
1256
|
+
});
|
|
1257
|
+
|
|
1258
|
+
// src/pageObjects/elements/FormGroup.ts
|
|
1259
|
+
var FormGroup;
|
|
1260
|
+
var init_FormGroup = __esm({
|
|
1261
|
+
"src/pageObjects/elements/FormGroup.ts"() {
|
|
1262
|
+
"use strict";
|
|
1263
|
+
init_AbstractElementWithParent();
|
|
1264
|
+
init_locators();
|
|
1265
|
+
init_createDataTestId();
|
|
1266
|
+
init_groupFactory();
|
|
1267
|
+
init_AccordionItem();
|
|
1268
|
+
init_TabPanel();
|
|
1269
|
+
FormGroup = class extends AbstractElementWithParent {
|
|
1270
|
+
groupInstance;
|
|
1271
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1272
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
1157
1273
|
}
|
|
1158
|
-
async
|
|
1274
|
+
async initInstance() {
|
|
1275
|
+
if (!this.groupInstance) {
|
|
1276
|
+
this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Возвращает булевое значение доступна ли группа
|
|
1281
|
+
* @example
|
|
1282
|
+
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
1283
|
+
*/
|
|
1284
|
+
async isDisplayed() {
|
|
1159
1285
|
try {
|
|
1160
|
-
await
|
|
1286
|
+
await this.initInstance();
|
|
1287
|
+
return this.groupInstance.isDisplayed();
|
|
1161
1288
|
} catch {
|
|
1162
|
-
|
|
1163
|
-
await dropDownOptionClick(value, this.driver);
|
|
1164
|
-
}
|
|
1165
|
-
await this.waitOptionSelection();
|
|
1166
|
-
if (value !== lastElement) {
|
|
1167
|
-
await inputEl.clear();
|
|
1289
|
+
return false;
|
|
1168
1290
|
}
|
|
1169
1291
|
}
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1292
|
+
/**
|
|
1293
|
+
* Клик по элементам группы.
|
|
1294
|
+
* Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
|
|
1295
|
+
* @example
|
|
1296
|
+
* expect(await tableList.group('TabPanel').itemClick('Tab');
|
|
1297
|
+
* expect(await tableList.group('Accordion').itemClick('AccordionItem');
|
|
1298
|
+
*/
|
|
1299
|
+
async itemClick(name) {
|
|
1300
|
+
await this.initInstance();
|
|
1301
|
+
const item = this.groupInstance.item?.(name);
|
|
1302
|
+
await item?.click();
|
|
1173
1303
|
}
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1304
|
+
/**
|
|
1305
|
+
* Метод работает если группа - это элемент аккордеона или вкладка таб панели
|
|
1306
|
+
* @example
|
|
1307
|
+
* expect(await tableList.group('Tab').click();
|
|
1308
|
+
* expect(await tableList.group('AccordionItem').click();
|
|
1309
|
+
*/
|
|
1310
|
+
async click() {
|
|
1311
|
+
await this.initInstance();
|
|
1312
|
+
await this.groupInstance.click?.();
|
|
1313
|
+
}
|
|
1314
|
+
async collapse() {
|
|
1315
|
+
await this.initInstance();
|
|
1316
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1317
|
+
await this.groupInstance.collapse();
|
|
1184
1318
|
}
|
|
1185
|
-
return values;
|
|
1186
1319
|
}
|
|
1187
|
-
async
|
|
1188
|
-
|
|
1189
|
-
|
|
1320
|
+
async expand() {
|
|
1321
|
+
await this.initInstance();
|
|
1322
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1323
|
+
await this.groupInstance.expand();
|
|
1324
|
+
}
|
|
1190
1325
|
}
|
|
1191
|
-
async
|
|
1192
|
-
|
|
1193
|
-
|
|
1326
|
+
async isExpanded() {
|
|
1327
|
+
await this.initInstance();
|
|
1328
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1329
|
+
return await this.groupInstance.isExpanded();
|
|
1330
|
+
}
|
|
1331
|
+
return false;
|
|
1194
1332
|
}
|
|
1195
|
-
async
|
|
1196
|
-
|
|
1197
|
-
|
|
1333
|
+
async isCollapsed() {
|
|
1334
|
+
await this.initInstance();
|
|
1335
|
+
if (this.groupInstance instanceof AccordionItem) {
|
|
1336
|
+
return await this.groupInstance.isCollapsed();
|
|
1198
1337
|
}
|
|
1199
|
-
|
|
1338
|
+
return false;
|
|
1200
1339
|
}
|
|
1201
|
-
async
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
1340
|
+
async isActive() {
|
|
1341
|
+
await this.initInstance();
|
|
1342
|
+
if (this.groupInstance instanceof TabPanelItem) {
|
|
1343
|
+
return await this.groupInstance.isActive();
|
|
1206
1344
|
}
|
|
1207
|
-
|
|
1208
|
-
const clearBtn = await this.driver.findElement(
|
|
1209
|
-
import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
1210
|
-
);
|
|
1211
|
-
await click(clearBtn, this.driver);
|
|
1345
|
+
return false;
|
|
1212
1346
|
}
|
|
1213
1347
|
};
|
|
1214
1348
|
}
|
|
1215
1349
|
});
|
|
1216
1350
|
|
|
1217
|
-
// src/pageObjects/elements/
|
|
1218
|
-
var
|
|
1219
|
-
var
|
|
1220
|
-
"src/pageObjects/elements/
|
|
1351
|
+
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
1352
|
+
var AbstractForm;
|
|
1353
|
+
var init_AbstractForm = __esm({
|
|
1354
|
+
"src/pageObjects/elements/Forms/AbstractForm.ts"() {
|
|
1221
1355
|
"use strict";
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1356
|
+
init_AbstractPage();
|
|
1357
|
+
init_FormButton();
|
|
1358
|
+
init_FormGroup();
|
|
1359
|
+
AbstractForm = class extends AbstractPage {
|
|
1360
|
+
containerCssSelector = "";
|
|
1361
|
+
_formName = "";
|
|
1362
|
+
containerBy;
|
|
1363
|
+
getContainerElement = () => {
|
|
1364
|
+
return this.driver.findElement(this.containerBy);
|
|
1365
|
+
};
|
|
1366
|
+
set formName(name) {
|
|
1367
|
+
this._formName = name;
|
|
1233
1368
|
}
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
return this.getDataValue(selectedEl);
|
|
1369
|
+
get formName() {
|
|
1370
|
+
return this._formName;
|
|
1237
1371
|
}
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1372
|
+
/**
|
|
1373
|
+
* Возвращает true если форма есть в DOM
|
|
1374
|
+
* @example
|
|
1375
|
+
* class MyForm extends FormEdit {}
|
|
1376
|
+
* //...
|
|
1377
|
+
* const formEdit = new MyForm();
|
|
1378
|
+
* expect(await formEdit.exists()).toBe(true);
|
|
1379
|
+
*/
|
|
1380
|
+
async exists() {
|
|
1381
|
+
try {
|
|
1382
|
+
let elements = await this.driver.findElements(this.containerBy);
|
|
1383
|
+
return elements.length > 0;
|
|
1384
|
+
} catch (error) {
|
|
1385
|
+
return false;
|
|
1247
1386
|
}
|
|
1248
|
-
if (!buttonEl)
|
|
1249
|
-
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
1250
|
-
await click(buttonEl, this.driver);
|
|
1251
1387
|
}
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
});
|
|
1255
|
-
|
|
1256
|
-
// src/pageObjects/elements/Editors/BooleanSelector.ts
|
|
1257
|
-
var BooleanSelector;
|
|
1258
|
-
var init_BooleanSelector = __esm({
|
|
1259
|
-
"src/pageObjects/elements/Editors/BooleanSelector.ts"() {
|
|
1260
|
-
"use strict";
|
|
1261
|
-
init_ButtonGroup();
|
|
1262
|
-
BooleanSelector = class extends ButtonGroup {
|
|
1263
|
-
// @ts-ignore
|
|
1264
|
-
async getValue() {
|
|
1265
|
-
const value = await super.getValue();
|
|
1266
|
-
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
1388
|
+
button(name) {
|
|
1389
|
+
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
1267
1390
|
}
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1391
|
+
/**
|
|
1392
|
+
* Находит группу на форме по имени
|
|
1393
|
+
* @example
|
|
1394
|
+
* const formEdit = new MyForm();
|
|
1395
|
+
* //...
|
|
1396
|
+
* expect(await formEdit.group('Name');
|
|
1397
|
+
*/
|
|
1398
|
+
group(name) {
|
|
1399
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1272
1400
|
}
|
|
1273
1401
|
};
|
|
1274
1402
|
}
|
|
1275
1403
|
});
|
|
1276
1404
|
|
|
1277
|
-
// src/pageObjects/elements/
|
|
1278
|
-
var
|
|
1405
|
+
// src/pageObjects/elements/Forms/types.ts
|
|
1406
|
+
var init_types2 = __esm({
|
|
1407
|
+
"src/pageObjects/elements/Forms/types.ts"() {
|
|
1408
|
+
"use strict";
|
|
1409
|
+
}
|
|
1410
|
+
});
|
|
1411
|
+
|
|
1412
|
+
// src/pageObjects/elements/Table/utils.ts
|
|
1413
|
+
function getCssRowByIndexSelector(index) {
|
|
1414
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
1415
|
+
}
|
|
1416
|
+
function getCssCellByIndexSelector(index) {
|
|
1417
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1418
|
+
}
|
|
1419
|
+
var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
1279
1420
|
var init_utils2 = __esm({
|
|
1280
|
-
"src/pageObjects/elements/
|
|
1421
|
+
"src/pageObjects/elements/Table/utils.ts"() {
|
|
1281
1422
|
"use strict";
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
}
|
|
1423
|
+
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1424
|
+
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1425
|
+
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1426
|
+
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
1427
|
+
transformInputIndex = (index) => index + 1;
|
|
1428
|
+
transformOutputIndex = (index) => +index - 1;
|
|
1286
1429
|
}
|
|
1287
1430
|
});
|
|
1288
1431
|
|
|
1289
|
-
// src/pageObjects/elements/
|
|
1290
|
-
var
|
|
1291
|
-
|
|
1292
|
-
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
1432
|
+
// src/pageObjects/elements/Table/types.ts
|
|
1433
|
+
var init_types3 = __esm({
|
|
1434
|
+
"src/pageObjects/elements/Table/types.ts"() {
|
|
1293
1435
|
"use strict";
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1436
|
+
}
|
|
1437
|
+
});
|
|
1438
|
+
|
|
1439
|
+
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1440
|
+
var import_selenium_webdriver20, Cell;
|
|
1441
|
+
var init_Cell = __esm({
|
|
1442
|
+
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
1443
|
+
"use strict";
|
|
1444
|
+
import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1445
|
+
init_AbstractElementWithParent();
|
|
1299
1446
|
init_utils2();
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
this.
|
|
1447
|
+
init_types3();
|
|
1448
|
+
Cell = class extends AbstractElementWithParent {
|
|
1449
|
+
_index;
|
|
1450
|
+
getCellIndex;
|
|
1451
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
1452
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
1453
|
+
this.getCellIndex = getCellIndex;
|
|
1454
|
+
this._index = index;
|
|
1308
1455
|
}
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
const
|
|
1315
|
-
await
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
1330
|
-
await btnOk.click();
|
|
1331
|
-
} else {
|
|
1332
|
-
const formattedDate = formatDMYDate(value);
|
|
1333
|
-
await click(dateInputEl, this.driver);
|
|
1334
|
-
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
|
|
1335
|
-
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
|
|
1456
|
+
set index(index) {
|
|
1457
|
+
this._index = index;
|
|
1458
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
1459
|
+
}
|
|
1460
|
+
async getBooleanValue(cellEl) {
|
|
1461
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver20.By.className("boolean-widget"));
|
|
1462
|
+
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
1463
|
+
}
|
|
1464
|
+
async getTagsValue(cellEl) {
|
|
1465
|
+
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
1466
|
+
const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
|
|
1467
|
+
const values = [];
|
|
1468
|
+
for (const tag of tags) {
|
|
1469
|
+
values.push(await tag.getAttribute("textContent"));
|
|
1470
|
+
}
|
|
1471
|
+
return values;
|
|
1472
|
+
}
|
|
1473
|
+
async getElement() {
|
|
1474
|
+
if (this._index == null) {
|
|
1475
|
+
this.index = await this.getCellIndex();
|
|
1336
1476
|
}
|
|
1477
|
+
return super.getElement();
|
|
1478
|
+
}
|
|
1479
|
+
async getValue() {
|
|
1480
|
+
const cellEl = await this.getElement();
|
|
1481
|
+
const cellElClass = await cellEl.getAttribute("class");
|
|
1482
|
+
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
1483
|
+
return this.getBooleanValue(cellEl);
|
|
1484
|
+
if (cellElClass.includes("tags-column" /* Tags */))
|
|
1485
|
+
return this.getTagsValue(cellEl);
|
|
1486
|
+
return cellEl.getText();
|
|
1487
|
+
}
|
|
1488
|
+
getIndex() {
|
|
1489
|
+
return this._index;
|
|
1337
1490
|
}
|
|
1338
1491
|
};
|
|
1339
1492
|
}
|
|
1340
1493
|
});
|
|
1341
1494
|
|
|
1342
|
-
// src/pageObjects/elements/
|
|
1343
|
-
var
|
|
1344
|
-
var
|
|
1345
|
-
"src/pageObjects/elements/
|
|
1495
|
+
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1496
|
+
var import_selenium_webdriver21, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
|
|
1497
|
+
var init_Row = __esm({
|
|
1498
|
+
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
1346
1499
|
"use strict";
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1500
|
+
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1501
|
+
init_Cell();
|
|
1502
|
+
init_utils2();
|
|
1503
|
+
init_AbstractElementWithParent();
|
|
1504
|
+
init_actions();
|
|
1505
|
+
init_wait();
|
|
1506
|
+
DX_SELECTION_CLASS = "dx-selection";
|
|
1507
|
+
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
1508
|
+
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
1509
|
+
Row = class extends AbstractElementWithParent {
|
|
1510
|
+
index;
|
|
1511
|
+
getColumnBy;
|
|
1512
|
+
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
1513
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
1514
|
+
this.index = index;
|
|
1515
|
+
this.getColumnBy = getColumnBy;
|
|
1354
1516
|
}
|
|
1355
|
-
|
|
1356
|
-
return
|
|
1517
|
+
_getCell({ index, name, title }) {
|
|
1518
|
+
return new Cell(
|
|
1519
|
+
this.getFullCssSelector(),
|
|
1520
|
+
() => {
|
|
1521
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
1522
|
+
},
|
|
1523
|
+
index,
|
|
1524
|
+
this.driver
|
|
1525
|
+
);
|
|
1357
1526
|
}
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
return inputEl.getAttribute("value");
|
|
1527
|
+
getCellByIndex(index) {
|
|
1528
|
+
return this._getCell({ index });
|
|
1361
1529
|
}
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
return value == "" ? null : new Date(value);
|
|
1530
|
+
getCell(name) {
|
|
1531
|
+
return this._getCell({ name });
|
|
1365
1532
|
}
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1533
|
+
getCellByTitle(title) {
|
|
1534
|
+
return this._getCell({ title });
|
|
1535
|
+
}
|
|
1536
|
+
async select() {
|
|
1537
|
+
const rowEl = await this.getElement();
|
|
1538
|
+
await click(rowEl, this.driver);
|
|
1539
|
+
await wait(
|
|
1540
|
+
async () => {
|
|
1541
|
+
const classes = await this.getClasses();
|
|
1542
|
+
return classes.includes(DX_SELECTION_CLASS);
|
|
1543
|
+
},
|
|
1544
|
+
this.driver,
|
|
1545
|
+
"Cannot select row"
|
|
1546
|
+
);
|
|
1547
|
+
}
|
|
1548
|
+
async isSelected() {
|
|
1549
|
+
const result = await this.getAttribute("aria-selected");
|
|
1550
|
+
return result === "true";
|
|
1551
|
+
}
|
|
1552
|
+
getIndex() {
|
|
1553
|
+
return this.index;
|
|
1554
|
+
}
|
|
1555
|
+
async getCells() {
|
|
1556
|
+
const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
1557
|
+
const result = [];
|
|
1558
|
+
cells.forEach((_, index) => {
|
|
1559
|
+
const newCell = this.getCellByIndex(index);
|
|
1560
|
+
result.push(newCell);
|
|
1561
|
+
});
|
|
1562
|
+
return result;
|
|
1563
|
+
}
|
|
1564
|
+
async clickInlineButton(buttonClass) {
|
|
1565
|
+
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
1566
|
+
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1567
|
+
this.index
|
|
1568
|
+
)}"] .${buttonClass}`;
|
|
1569
|
+
const button = await this.driver.findElement(
|
|
1570
|
+
import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
1571
|
+
);
|
|
1572
|
+
return click(button, this.driver);
|
|
1573
|
+
}
|
|
1574
|
+
async checkEditingMode(isEditing, msg) {
|
|
1575
|
+
await wait(
|
|
1576
|
+
async () => {
|
|
1577
|
+
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1578
|
+
},
|
|
1579
|
+
this.driver,
|
|
1580
|
+
msg
|
|
1581
|
+
);
|
|
1582
|
+
}
|
|
1583
|
+
async edit() {
|
|
1584
|
+
await this.clickInlineButton("edit");
|
|
1585
|
+
await this.checkEditingMode(true, "Row did not switch to edit mode");
|
|
1586
|
+
}
|
|
1587
|
+
async save() {
|
|
1588
|
+
await this.clickInlineButton("save");
|
|
1589
|
+
await this.checkEditingMode(false, "Row did not saved");
|
|
1590
|
+
}
|
|
1591
|
+
async cancel() {
|
|
1592
|
+
await this.clickInlineButton("cancel");
|
|
1593
|
+
await this.checkEditingMode(false, "Row did not switch to normal mode");
|
|
1371
1594
|
}
|
|
1372
1595
|
};
|
|
1373
1596
|
}
|
|
1374
1597
|
});
|
|
1375
1598
|
|
|
1376
|
-
// src/pageObjects/elements/
|
|
1377
|
-
var
|
|
1378
|
-
var
|
|
1379
|
-
"src/pageObjects/elements/
|
|
1599
|
+
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1600
|
+
var import_selenium_webdriver22, Column;
|
|
1601
|
+
var init_Column = __esm({
|
|
1602
|
+
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
1380
1603
|
"use strict";
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1604
|
+
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1605
|
+
init_utils2();
|
|
1606
|
+
init_AbstractElementWithParent();
|
|
1607
|
+
init_fixElementStaleError();
|
|
1608
|
+
Column = class extends AbstractElementWithParent {
|
|
1609
|
+
_index;
|
|
1610
|
+
_caption;
|
|
1611
|
+
_name;
|
|
1612
|
+
headerCssSelector;
|
|
1613
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
1614
|
+
super(parentCssSelector, "", driver);
|
|
1615
|
+
this._name = name;
|
|
1616
|
+
this.index = index;
|
|
1617
|
+
this._caption = caption;
|
|
1618
|
+
this.headerCssSelector = headerCssSelector;
|
|
1388
1619
|
}
|
|
1389
|
-
|
|
1390
|
-
|
|
1620
|
+
set index(index) {
|
|
1621
|
+
this._index = index;
|
|
1622
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
1391
1623
|
}
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
1395
|
-
const dateToStr = await inputEl.getAttribute("dateto");
|
|
1396
|
-
const dateFrom = new Date(dateFromStr);
|
|
1397
|
-
const dateTo = new Date(dateToStr);
|
|
1398
|
-
return [dateFrom, dateTo];
|
|
1624
|
+
get index() {
|
|
1625
|
+
return this._index;
|
|
1399
1626
|
}
|
|
1400
|
-
async
|
|
1401
|
-
|
|
1402
|
-
return
|
|
1627
|
+
async getElement() {
|
|
1628
|
+
await this.getIndex();
|
|
1629
|
+
return super.getElement();
|
|
1403
1630
|
}
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
}
|
|
1408
|
-
throw new Error(`Value is incorrect. It should be Object`);
|
|
1631
|
+
async getColumnHeaderIndexBy(cssSelector) {
|
|
1632
|
+
const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
|
|
1633
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1409
1634
|
}
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
});
|
|
1413
|
-
|
|
1414
|
-
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
1415
|
-
var DateEditor;
|
|
1416
|
-
var init_DateEditor = __esm({
|
|
1417
|
-
"src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
|
|
1418
|
-
"use strict";
|
|
1419
|
-
init_SingleDateEditor();
|
|
1420
|
-
init_DateRangeEditor();
|
|
1421
|
-
init_AbstractFormElement();
|
|
1422
|
-
init_AbstractEditor();
|
|
1423
|
-
init_types3();
|
|
1424
|
-
DateEditor = class extends AbstractDXEditorWithInput {
|
|
1425
|
-
editorInstance = null;
|
|
1426
|
-
initPromise;
|
|
1427
|
-
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1428
|
-
super(parentCssSelector, elementCssSelector, driver);
|
|
1429
|
-
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
1635
|
+
async getIndexByCaption() {
|
|
1636
|
+
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
1430
1637
|
}
|
|
1431
|
-
async
|
|
1432
|
-
|
|
1638
|
+
async getIndexByName() {
|
|
1639
|
+
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
1433
1640
|
}
|
|
1434
|
-
async
|
|
1435
|
-
const
|
|
1436
|
-
|
|
1437
|
-
switch (true) {
|
|
1438
|
-
case classString.includes("date-control" /* Date */):
|
|
1439
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1440
|
-
break;
|
|
1441
|
-
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
1442
|
-
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
1443
|
-
break;
|
|
1444
|
-
default:
|
|
1445
|
-
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1446
|
-
}
|
|
1641
|
+
async caption() {
|
|
1642
|
+
const el = await this.getElement();
|
|
1643
|
+
return el.getText();
|
|
1447
1644
|
}
|
|
1448
|
-
async
|
|
1449
|
-
if (
|
|
1450
|
-
|
|
1645
|
+
async getIndex() {
|
|
1646
|
+
if (this.index != null) {
|
|
1647
|
+
return this.index;
|
|
1451
1648
|
}
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
if (this.editorInstance) {
|
|
1456
|
-
await this.editorInstance.setValue(value);
|
|
1457
|
-
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1649
|
+
if (this._caption != null) {
|
|
1650
|
+
this.index = await this.getIndexByCaption();
|
|
1651
|
+
return this.index;
|
|
1458
1652
|
}
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
await this.ensureInitialized();
|
|
1463
|
-
if (this.editorInstance) {
|
|
1464
|
-
return this.editorInstance.getValue();
|
|
1653
|
+
if (this._name != null) {
|
|
1654
|
+
this.index = await this.getIndexByName();
|
|
1655
|
+
return this.index;
|
|
1465
1656
|
}
|
|
1466
|
-
throw new Error("
|
|
1467
|
-
}
|
|
1468
|
-
};
|
|
1469
|
-
}
|
|
1470
|
-
});
|
|
1471
|
-
|
|
1472
|
-
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
1473
|
-
var editorFactory;
|
|
1474
|
-
var init_editorFactory = __esm({
|
|
1475
|
-
"src/pageObjects/elements/Editors/editorFactory.ts"() {
|
|
1476
|
-
"use strict";
|
|
1477
|
-
init_types3();
|
|
1478
|
-
init_AbstractFormElement();
|
|
1479
|
-
init_TextEditor();
|
|
1480
|
-
init_NumberEditor();
|
|
1481
|
-
init_CheckBox();
|
|
1482
|
-
init_SelectBoxEditor();
|
|
1483
|
-
init_SwitchEditor();
|
|
1484
|
-
init_TagBox();
|
|
1485
|
-
init_BooleanSelector();
|
|
1486
|
-
init_ButtonGroup();
|
|
1487
|
-
init_DateEditor();
|
|
1488
|
-
editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1489
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1490
|
-
const classSting = await elementInstance.getClasses();
|
|
1491
|
-
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
1492
|
-
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
1493
|
-
if (classSting.includes("number-control" /* Number */))
|
|
1494
|
-
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
1495
|
-
if (classSting.includes("check-box" /* CheckBox */))
|
|
1496
|
-
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
1497
|
-
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
1498
|
-
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
1499
|
-
if (classSting.includes("select-control" /* Select */))
|
|
1500
|
-
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
1501
|
-
if (classSting.includes("switch-control" /* Switch */))
|
|
1502
|
-
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
1503
|
-
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
1504
|
-
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1657
|
+
throw new Error("Cant get the index in the column");
|
|
1505
1658
|
}
|
|
1506
|
-
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
1507
|
-
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
1508
|
-
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
1509
|
-
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
1510
|
-
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
1511
1659
|
};
|
|
1512
1660
|
}
|
|
1513
1661
|
});
|
|
1514
1662
|
|
|
1515
|
-
// src/pageObjects/elements/Editors/index.ts
|
|
1516
|
-
var init_Editors = __esm({
|
|
1517
|
-
"src/pageObjects/elements/Editors/index.ts"() {
|
|
1518
|
-
"use strict";
|
|
1519
|
-
init_TextEditor();
|
|
1520
|
-
init_NumberEditor();
|
|
1521
|
-
init_editorFactory();
|
|
1522
|
-
init_types3();
|
|
1523
|
-
}
|
|
1524
|
-
});
|
|
1525
|
-
|
|
1526
1663
|
// src/pageObjects/elements/AbstractEditor.ts
|
|
1527
1664
|
var AbstractEditor;
|
|
1528
1665
|
var init_AbstractEditor2 = __esm({
|
|
@@ -1615,11 +1752,11 @@ var init_FormField = __esm({
|
|
|
1615
1752
|
});
|
|
1616
1753
|
|
|
1617
1754
|
// src/pageObjects/elements/Table/Table.ts
|
|
1618
|
-
var
|
|
1755
|
+
var import_selenium_webdriver23, Table;
|
|
1619
1756
|
var init_Table = __esm({
|
|
1620
1757
|
"src/pageObjects/elements/Table/Table.ts"() {
|
|
1621
1758
|
"use strict";
|
|
1622
|
-
|
|
1759
|
+
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
1623
1760
|
init_createDataTestId();
|
|
1624
1761
|
init_AbstractElementWithParent();
|
|
1625
1762
|
init_Row();
|
|
@@ -1669,7 +1806,7 @@ var init_Table = __esm({
|
|
|
1669
1806
|
return this.getRowByIndex(index).select();
|
|
1670
1807
|
}
|
|
1671
1808
|
async getRows() {
|
|
1672
|
-
const rows = await this.driver.findElements(
|
|
1809
|
+
const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1673
1810
|
const result = [];
|
|
1674
1811
|
rows.forEach((_, index) => {
|
|
1675
1812
|
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
@@ -1679,7 +1816,7 @@ var init_Table = __esm({
|
|
|
1679
1816
|
}
|
|
1680
1817
|
async getColumns() {
|
|
1681
1818
|
const columns = await this.driver.findElements(
|
|
1682
|
-
|
|
1819
|
+
import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
|
|
1683
1820
|
);
|
|
1684
1821
|
const result = [];
|
|
1685
1822
|
columns.forEach((_, index) => {
|
|
@@ -1774,11 +1911,11 @@ var init_typesUtil = __esm({
|
|
|
1774
1911
|
});
|
|
1775
1912
|
|
|
1776
1913
|
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1777
|
-
var
|
|
1914
|
+
var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
|
|
1778
1915
|
var init_ToolbarMenu = __esm({
|
|
1779
1916
|
"src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
|
|
1780
1917
|
"use strict";
|
|
1781
|
-
|
|
1918
|
+
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
1782
1919
|
init_typesUtil();
|
|
1783
1920
|
init_AbstractElementWithParent();
|
|
1784
1921
|
init_locators();
|
|
@@ -1829,7 +1966,7 @@ var init_ToolbarMenu = __esm({
|
|
|
1829
1966
|
throw new Error(`"title" must be a string or array of string`);
|
|
1830
1967
|
let lTitle = isString(title) ? [title] : title;
|
|
1831
1968
|
for (let t of lTitle) {
|
|
1832
|
-
await this.goToButton(t,
|
|
1969
|
+
await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
|
|
1833
1970
|
}
|
|
1834
1971
|
}
|
|
1835
1972
|
};
|
|
@@ -2004,11 +2141,11 @@ var init_PanelFilterField = __esm({
|
|
|
2004
2141
|
});
|
|
2005
2142
|
|
|
2006
2143
|
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
2007
|
-
var
|
|
2144
|
+
var import_selenium_webdriver25, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
2008
2145
|
var init_FilterPanel = __esm({
|
|
2009
2146
|
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
2010
2147
|
"use strict";
|
|
2011
|
-
|
|
2148
|
+
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2012
2149
|
init_AbstractElement();
|
|
2013
2150
|
init_PanelFilterField();
|
|
2014
2151
|
init_actions();
|
|
@@ -2023,7 +2160,7 @@ var init_FilterPanel = __esm({
|
|
|
2023
2160
|
async filterPanelButtons() {
|
|
2024
2161
|
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
2025
2162
|
const el = await this.getElement();
|
|
2026
|
-
return el.findElements(
|
|
2163
|
+
return el.findElements(import_selenium_webdriver25.By.css(selector));
|
|
2027
2164
|
}
|
|
2028
2165
|
constructor(formName, driver) {
|
|
2029
2166
|
super(driver, drawerSelector(formName));
|
|
@@ -2056,9 +2193,142 @@ var init_FilterPanel = __esm({
|
|
|
2056
2193
|
await this.driver.sleep(300);
|
|
2057
2194
|
}
|
|
2058
2195
|
async close() {
|
|
2059
|
-
const btn = await this.driver.findElement(
|
|
2196
|
+
const btn = await this.driver.findElement(import_selenium_webdriver25.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
2197
|
+
await click(btn, this.driver);
|
|
2198
|
+
}
|
|
2199
|
+
};
|
|
2200
|
+
}
|
|
2201
|
+
});
|
|
2202
|
+
|
|
2203
|
+
// src/pageObjects/elements/Filters/HeaderFilterField.ts
|
|
2204
|
+
var HeaderFilterField;
|
|
2205
|
+
var init_HeaderFilterField = __esm({
|
|
2206
|
+
"src/pageObjects/elements/Filters/HeaderFilterField.ts"() {
|
|
2207
|
+
"use strict";
|
|
2208
|
+
init_locators();
|
|
2209
|
+
init_createDataTestId();
|
|
2210
|
+
init_AbstractEditor2();
|
|
2211
|
+
HeaderFilterField = class extends AbstractEditor {
|
|
2212
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
2213
|
+
super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
|
|
2214
|
+
}
|
|
2215
|
+
async getValue() {
|
|
2216
|
+
return super.getValue();
|
|
2217
|
+
}
|
|
2218
|
+
async setValue(value) {
|
|
2219
|
+
return super.setValue(value);
|
|
2220
|
+
}
|
|
2221
|
+
async clear() {
|
|
2222
|
+
return super.clear();
|
|
2223
|
+
}
|
|
2224
|
+
async remove(itemText) {
|
|
2225
|
+
return super.remove(itemText);
|
|
2226
|
+
}
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
});
|
|
2230
|
+
|
|
2231
|
+
// src/pageObjects/elements/Filters/ColumnFilter.ts
|
|
2232
|
+
var import_selenium_webdriver26, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
|
|
2233
|
+
var init_ColumnFilter = __esm({
|
|
2234
|
+
"src/pageObjects/elements/Filters/ColumnFilter.ts"() {
|
|
2235
|
+
"use strict";
|
|
2236
|
+
init_actions();
|
|
2237
|
+
import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2238
|
+
init_HeaderFilterField();
|
|
2239
|
+
init_waitElementIsVisible();
|
|
2240
|
+
init_AbstractElement();
|
|
2241
|
+
APPLY_SELECTOR = ".apply-button";
|
|
2242
|
+
CANCEL_SELECTOR = ".cancel-button";
|
|
2243
|
+
HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
|
|
2244
|
+
HEADER_FILTER_CONTAINER = ".header-filter";
|
|
2245
|
+
HEADER_FILTER_BUTTONS = ".header-filter-buttons";
|
|
2246
|
+
ColumnFilter = class extends AbstractElement {
|
|
2247
|
+
_formName;
|
|
2248
|
+
_name;
|
|
2249
|
+
_column;
|
|
2250
|
+
constructor(formName, name, column, driver) {
|
|
2251
|
+
super(driver, HEADER_FILTER_CONTAINER);
|
|
2252
|
+
this._formName = formName;
|
|
2253
|
+
this._name = name;
|
|
2254
|
+
this._column = column;
|
|
2255
|
+
this.driver = driver;
|
|
2256
|
+
}
|
|
2257
|
+
async getApplyButton() {
|
|
2258
|
+
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
|
|
2259
|
+
return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
|
|
2260
|
+
}
|
|
2261
|
+
async getCancelButton() {
|
|
2262
|
+
const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
|
|
2263
|
+
return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
|
|
2264
|
+
}
|
|
2265
|
+
async apply() {
|
|
2266
|
+
const btn = await this.getApplyButton();
|
|
2267
|
+
await click(btn, this.driver);
|
|
2268
|
+
}
|
|
2269
|
+
async cancel() {
|
|
2270
|
+
const btn = await this.getCancelButton();
|
|
2060
2271
|
await click(btn, this.driver);
|
|
2061
2272
|
}
|
|
2273
|
+
async initFilter() {
|
|
2274
|
+
const columnEl = await this._column.getElement();
|
|
2275
|
+
const actions = this.driver.actions({ async: true });
|
|
2276
|
+
await actions.move({ origin: columnEl }).perform();
|
|
2277
|
+
const elements = await columnEl.findElements(import_selenium_webdriver26.By.css(HEADER_FILTER_ICON));
|
|
2278
|
+
const headerFilterIcon = elements[1];
|
|
2279
|
+
await waitElementIsVisible({
|
|
2280
|
+
element: headerFilterIcon,
|
|
2281
|
+
driver: this.driver,
|
|
2282
|
+
errorMessage: `HeaderFilter "${this._name}" is not visible`
|
|
2283
|
+
});
|
|
2284
|
+
if (!headerFilterIcon)
|
|
2285
|
+
throw new Error(`HeaderFilter "${this._name}" is not visible`);
|
|
2286
|
+
await headerFilterIcon.click();
|
|
2287
|
+
return new HeaderFilterField("", this._formName, this._name, this.driver);
|
|
2288
|
+
}
|
|
2289
|
+
/**
|
|
2290
|
+
* Возвращает значение в поле
|
|
2291
|
+
* @example
|
|
2292
|
+
* expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
|
|
2293
|
+
* expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
|
|
2294
|
+
*/
|
|
2295
|
+
async getValue() {
|
|
2296
|
+
const filter = await this.initFilter();
|
|
2297
|
+
const result = await filter.getValue();
|
|
2298
|
+
await this.cancel();
|
|
2299
|
+
return result;
|
|
2300
|
+
}
|
|
2301
|
+
/**
|
|
2302
|
+
* Устанавливает значение в поле
|
|
2303
|
+
* @example
|
|
2304
|
+
* await form.columnFilter('NumberFld').setValue(123);
|
|
2305
|
+
* await form.columnFilter('TextFld').setValue('TestValue');
|
|
2306
|
+
*/
|
|
2307
|
+
async setValue(value) {
|
|
2308
|
+
const filter = await this.initFilter();
|
|
2309
|
+
await filter.setValue(value);
|
|
2310
|
+
return this.apply();
|
|
2311
|
+
}
|
|
2312
|
+
/**
|
|
2313
|
+
* Очищает значение в поле
|
|
2314
|
+
* @example
|
|
2315
|
+
* await form.columnFilter('NumberFld').clear();
|
|
2316
|
+
*/
|
|
2317
|
+
async clear() {
|
|
2318
|
+
const filter = await this.initFilter();
|
|
2319
|
+
await filter.clear();
|
|
2320
|
+
return this.apply();
|
|
2321
|
+
}
|
|
2322
|
+
/**
|
|
2323
|
+
* Удаляет тег по переданному тексту
|
|
2324
|
+
* @example
|
|
2325
|
+
* await form.columnFilter('TagBox').remove('test');
|
|
2326
|
+
*/
|
|
2327
|
+
async remove(itemText) {
|
|
2328
|
+
const filter = await this.initFilter();
|
|
2329
|
+
await filter.remove(itemText);
|
|
2330
|
+
return this.apply();
|
|
2331
|
+
}
|
|
2062
2332
|
};
|
|
2063
2333
|
}
|
|
2064
2334
|
});
|
|
@@ -2077,6 +2347,7 @@ var init_ListForm = __esm({
|
|
|
2077
2347
|
init_FormToolbar();
|
|
2078
2348
|
init_FormFilterField();
|
|
2079
2349
|
init_FilterPanel();
|
|
2350
|
+
init_ColumnFilter();
|
|
2080
2351
|
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
2081
2352
|
ListForm = class extends Form {
|
|
2082
2353
|
headerCssSelector;
|
|
@@ -2116,6 +2387,10 @@ var init_ListForm = __esm({
|
|
|
2116
2387
|
formFilter(name) {
|
|
2117
2388
|
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
2118
2389
|
}
|
|
2390
|
+
columnFilter(name) {
|
|
2391
|
+
const column = this.table().getColumnByName(name);
|
|
2392
|
+
return new ColumnFilter(this.formName, name, column, this.driver);
|
|
2393
|
+
}
|
|
2119
2394
|
/**
|
|
2120
2395
|
* Модель панели фильтрации
|
|
2121
2396
|
* @returns {FilterPanel}
|
|
@@ -2180,18 +2455,18 @@ var init_createSubFormInstance = __esm({
|
|
|
2180
2455
|
"src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
|
|
2181
2456
|
"use strict";
|
|
2182
2457
|
init_locators();
|
|
2183
|
-
|
|
2458
|
+
init_types2();
|
|
2184
2459
|
subFormTestId = (name) => `subform-${name}`;
|
|
2185
2460
|
}
|
|
2186
2461
|
});
|
|
2187
2462
|
|
|
2188
2463
|
// src/pageObjects/elements/Forms/Form.ts
|
|
2189
|
-
var
|
|
2464
|
+
var import_selenium_webdriver27, formTestId, Form;
|
|
2190
2465
|
var init_Form = __esm({
|
|
2191
2466
|
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
2192
2467
|
"use strict";
|
|
2193
2468
|
init_locators();
|
|
2194
|
-
|
|
2469
|
+
import_selenium_webdriver27 = require("selenium-webdriver");
|
|
2195
2470
|
init_AbstractForm();
|
|
2196
2471
|
init_waitElementIsVisible();
|
|
2197
2472
|
init_createSubFormInstance();
|
|
@@ -2216,10 +2491,10 @@ var init_Form = __esm({
|
|
|
2216
2491
|
*/
|
|
2217
2492
|
async getTitleText() {
|
|
2218
2493
|
if (await this.isModal()) {
|
|
2219
|
-
const titleEl2 = await this.driver.findElement(
|
|
2494
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
2220
2495
|
return titleEl2.getText();
|
|
2221
2496
|
}
|
|
2222
|
-
let titleEl = await this.driver.findElement(
|
|
2497
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver27.By.className("main-toolbar-form-title"));
|
|
2223
2498
|
return titleEl.getText();
|
|
2224
2499
|
}
|
|
2225
2500
|
setSubFormMode() {
|
|
@@ -2237,7 +2512,7 @@ var init_Form = __esm({
|
|
|
2237
2512
|
*/
|
|
2238
2513
|
async subForm(name) {
|
|
2239
2514
|
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
|
|
2240
|
-
const byCssSelector =
|
|
2515
|
+
const byCssSelector = import_selenium_webdriver27.By.css(cssSelector);
|
|
2241
2516
|
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
2242
2517
|
await waitElementIsVisible({
|
|
2243
2518
|
element: subFormEl,
|
|
@@ -2267,18 +2542,18 @@ var FormEdit_exports = {};
|
|
|
2267
2542
|
__export(FormEdit_exports, {
|
|
2268
2543
|
default: () => FormEdit
|
|
2269
2544
|
});
|
|
2270
|
-
var
|
|
2545
|
+
var import_selenium_webdriver28, FormEdit;
|
|
2271
2546
|
var init_FormEdit = __esm({
|
|
2272
2547
|
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
2273
2548
|
"use strict";
|
|
2274
2549
|
init_Form();
|
|
2275
|
-
|
|
2550
|
+
import_selenium_webdriver28 = require("selenium-webdriver");
|
|
2276
2551
|
init_FormField();
|
|
2277
2552
|
init_actions();
|
|
2278
2553
|
init_wait();
|
|
2279
2554
|
FormEdit = class extends Form {
|
|
2280
|
-
saveButtonBy =
|
|
2281
|
-
closeButtonBy =
|
|
2555
|
+
saveButtonBy = import_selenium_webdriver28.By.id("button-save");
|
|
2556
|
+
closeButtonBy = import_selenium_webdriver28.By.id("button-cancel");
|
|
2282
2557
|
constructor(driver) {
|
|
2283
2558
|
super(driver);
|
|
2284
2559
|
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
@@ -2346,6 +2621,7 @@ __export(src_exports, {
|
|
|
2346
2621
|
LoginPage: () => LoginPage,
|
|
2347
2622
|
NumberEditor: () => NumberEditor,
|
|
2348
2623
|
PanelFilterField: () => PanelFilterField,
|
|
2624
|
+
ReportForm: () => ReportForm,
|
|
2349
2625
|
SubsystemsPanel: () => SubsystemsPanel,
|
|
2350
2626
|
TextEditor: () => TextEditor,
|
|
2351
2627
|
TreeView: () => TreeView,
|
|
@@ -2460,8 +2736,45 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
|
2460
2736
|
};
|
|
2461
2737
|
|
|
2462
2738
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2739
|
+
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
2463
2740
|
init_wait();
|
|
2464
2741
|
init_locators();
|
|
2742
|
+
init_Editors();
|
|
2743
|
+
|
|
2744
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
2745
|
+
init_actions();
|
|
2746
|
+
init_fixElementStaleError();
|
|
2747
|
+
var SubsystemItem = class {
|
|
2748
|
+
bySelector;
|
|
2749
|
+
driver;
|
|
2750
|
+
constructor({ driver, bySelector }) {
|
|
2751
|
+
this.bySelector = bySelector;
|
|
2752
|
+
this.driver = driver;
|
|
2753
|
+
}
|
|
2754
|
+
async getElement() {
|
|
2755
|
+
return fixElementStaleError(this.bySelector, this.driver);
|
|
2756
|
+
}
|
|
2757
|
+
async getTitle() {
|
|
2758
|
+
const el = await this.getElement();
|
|
2759
|
+
return await el.getAttribute("data-title");
|
|
2760
|
+
}
|
|
2761
|
+
async click() {
|
|
2762
|
+
const el = await this.getElement();
|
|
2763
|
+
await click(el, this.driver);
|
|
2764
|
+
}
|
|
2765
|
+
};
|
|
2766
|
+
|
|
2767
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2768
|
+
init_createDataTestId();
|
|
2769
|
+
init_actions();
|
|
2770
|
+
init_ClearButtonStrategy();
|
|
2771
|
+
init_waitElementIsVisible();
|
|
2772
|
+
var SEARCH_ITEM_SELECTOR = "search-item";
|
|
2773
|
+
var BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
2774
|
+
var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
2775
|
+
var byTitleCssSelector = (title) => {
|
|
2776
|
+
return `span[data-title="${title}"]`;
|
|
2777
|
+
};
|
|
2465
2778
|
var SubsystemsPanel = class extends AbstractElement {
|
|
2466
2779
|
header;
|
|
2467
2780
|
constructor(driver) {
|
|
@@ -2473,12 +2786,110 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
2473
2786
|
await wait(async () => await title.getText() != "", this.driver);
|
|
2474
2787
|
return title.getText();
|
|
2475
2788
|
}
|
|
2789
|
+
getSearchComponent() {
|
|
2790
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
|
|
2791
|
+
}
|
|
2792
|
+
/**
|
|
2793
|
+
* Находит сабсистему по заголовку
|
|
2794
|
+
* @example
|
|
2795
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2796
|
+
* //...
|
|
2797
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
2798
|
+
*/
|
|
2799
|
+
async search(title) {
|
|
2800
|
+
const searchComponent = this.getSearchComponent();
|
|
2801
|
+
await searchComponent.setValue(title);
|
|
2802
|
+
await wait(
|
|
2803
|
+
async () => {
|
|
2804
|
+
const findElement = await this.itemByTitle(title).getElement();
|
|
2805
|
+
const classes = await findElement.getAttribute("class");
|
|
2806
|
+
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
2807
|
+
},
|
|
2808
|
+
this.driver,
|
|
2809
|
+
`Cannot find element: ${title}`
|
|
2810
|
+
);
|
|
2811
|
+
}
|
|
2812
|
+
/**
|
|
2813
|
+
* Очищает поиск сабсистем
|
|
2814
|
+
* @example
|
|
2815
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2816
|
+
* //...
|
|
2817
|
+
* await subsystemsPanel.searchClear();
|
|
2818
|
+
*/
|
|
2819
|
+
async searchClear() {
|
|
2820
|
+
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
2821
|
+
const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
|
|
2822
|
+
if (await clearBtn.isDisplayed()) {
|
|
2823
|
+
await click(clearBtn, this.driver);
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
/**
|
|
2827
|
+
* Возвращает сабсистему по имени
|
|
2828
|
+
* @example
|
|
2829
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2830
|
+
* //...
|
|
2831
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
2832
|
+
*/
|
|
2833
|
+
item(name) {
|
|
2834
|
+
const elementCSS = createSubSystemTestId(name);
|
|
2835
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
|
|
2836
|
+
}
|
|
2837
|
+
/**
|
|
2838
|
+
* Возвращает сабсистему по заголовку
|
|
2839
|
+
* @example
|
|
2840
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2841
|
+
* //...
|
|
2842
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
2843
|
+
*/
|
|
2844
|
+
itemByTitle(title) {
|
|
2845
|
+
return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
|
|
2846
|
+
}
|
|
2847
|
+
/**
|
|
2848
|
+
* Возвращается на уровень выше по сабсистемам
|
|
2849
|
+
* @example
|
|
2850
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
2851
|
+
* //...
|
|
2852
|
+
* wait subsystemsPanel.back();
|
|
2853
|
+
*/
|
|
2854
|
+
async back() {
|
|
2855
|
+
const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
|
|
2856
|
+
await waitElementIsVisible(
|
|
2857
|
+
{
|
|
2858
|
+
element: backButton,
|
|
2859
|
+
driver: this.driver
|
|
2860
|
+
}
|
|
2861
|
+
);
|
|
2862
|
+
await click(backButton, this.driver);
|
|
2863
|
+
}
|
|
2476
2864
|
};
|
|
2477
2865
|
|
|
2478
2866
|
// src/index.ts
|
|
2479
2867
|
init_FormEdit();
|
|
2480
2868
|
init_ListForm();
|
|
2481
2869
|
init_TreeView();
|
|
2870
|
+
|
|
2871
|
+
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
2872
|
+
var import_selenium_webdriver29 = require("selenium-webdriver");
|
|
2873
|
+
init_FormEdit();
|
|
2874
|
+
var ReportForm = class extends FormEdit {
|
|
2875
|
+
constructor(driver) {
|
|
2876
|
+
super(driver);
|
|
2877
|
+
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
2878
|
+
this.saveButtonBy = import_selenium_webdriver29.By.id("button-apply");
|
|
2879
|
+
}
|
|
2880
|
+
/**
|
|
2881
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
2882
|
+
* @example
|
|
2883
|
+
* const formReport = new MyForm();
|
|
2884
|
+
* //...
|
|
2885
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
2886
|
+
*/
|
|
2887
|
+
filterField(name) {
|
|
2888
|
+
return super.field(name);
|
|
2889
|
+
}
|
|
2890
|
+
};
|
|
2891
|
+
|
|
2892
|
+
// src/index.ts
|
|
2482
2893
|
init_Editors();
|
|
2483
2894
|
init_FormField();
|
|
2484
2895
|
init_FormFilterField();
|
|
@@ -2487,7 +2898,7 @@ init_FilterPanel();
|
|
|
2487
2898
|
|
|
2488
2899
|
// src/pageObjects/elements/Dialog.ts
|
|
2489
2900
|
init_AbstractElement();
|
|
2490
|
-
var
|
|
2901
|
+
var import_selenium_webdriver30 = require("selenium-webdriver");
|
|
2491
2902
|
init_AbstractButton();
|
|
2492
2903
|
var DIALOG_CLASS = ".d5-dialog";
|
|
2493
2904
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
@@ -2502,7 +2913,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
2502
2913
|
}
|
|
2503
2914
|
async getElement() {
|
|
2504
2915
|
const panel = await super.getElement();
|
|
2505
|
-
return panel.findElement(
|
|
2916
|
+
return panel.findElement(import_selenium_webdriver30.By.xpath(buttonByTextXpath2(this.text)));
|
|
2506
2917
|
}
|
|
2507
2918
|
buttonNotDisplayedError() {
|
|
2508
2919
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -2522,11 +2933,11 @@ var Dialog = class extends AbstractElement {
|
|
|
2522
2933
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
2523
2934
|
}
|
|
2524
2935
|
async title() {
|
|
2525
|
-
const el = await this.driver.findElement(
|
|
2936
|
+
const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.titleSelector));
|
|
2526
2937
|
return await el.getText();
|
|
2527
2938
|
}
|
|
2528
2939
|
async text() {
|
|
2529
|
-
const el = await this.driver.findElement(
|
|
2940
|
+
const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.textSelector));
|
|
2530
2941
|
return await el.getText();
|
|
2531
2942
|
}
|
|
2532
2943
|
button(text) {
|
|
@@ -2546,6 +2957,7 @@ var Dialog = class extends AbstractElement {
|
|
|
2546
2957
|
LoginPage,
|
|
2547
2958
|
NumberEditor,
|
|
2548
2959
|
PanelFilterField,
|
|
2960
|
+
ReportForm,
|
|
2549
2961
|
SubsystemsPanel,
|
|
2550
2962
|
TextEditor,
|
|
2551
2963
|
TreeView,
|