d5-testing-library 1.2.0 → 1.3.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/cjs/d5-testing-library.cjs +462 -162
- package/dist/d5-testing-library.d.ts +150 -22
- package/dist/d5-testing-library.legacy-esm.js +455 -158
- package/dist/d5-testing-library.mjs +455 -158
- package/package.json +1 -1
|
@@ -31,11 +31,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
AbstractPage: () => AbstractPage,
|
|
34
|
+
FilterPanel: () => FilterPanel,
|
|
34
35
|
FormEdit: () => FormEdit,
|
|
35
36
|
FormField: () => FormField,
|
|
37
|
+
FormFilterField: () => FormFilterField,
|
|
36
38
|
ListForm: () => ListForm,
|
|
37
39
|
LoginPage: () => LoginPage,
|
|
38
40
|
NumberEditor: () => NumberEditor,
|
|
41
|
+
PanelFilterField: () => PanelFilterField,
|
|
39
42
|
SubsystemsPanel: () => SubsystemsPanel,
|
|
40
43
|
TextEditor: () => TextEditor,
|
|
41
44
|
byTestId: () => byTestId,
|
|
@@ -91,11 +94,58 @@ function config(cfg) {
|
|
|
91
94
|
return configInstance.config(cfg);
|
|
92
95
|
}
|
|
93
96
|
|
|
97
|
+
// src/pageObjects/AbstractElement.ts
|
|
98
|
+
var import_selenium_webdriver2 = require("selenium-webdriver");
|
|
99
|
+
|
|
100
|
+
// src/utils/waitElementIsVisible.ts
|
|
101
|
+
var import_selenium_webdriver = require("selenium-webdriver");
|
|
102
|
+
|
|
103
|
+
// src/utils/wait.ts
|
|
104
|
+
async function wait(condition, driver, errorMessage, timeout) {
|
|
105
|
+
driver = driver ?? config().driver;
|
|
106
|
+
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/utils/waitElementIsVisible.ts
|
|
110
|
+
async function waitElementIsVisible({
|
|
111
|
+
element,
|
|
112
|
+
timeout,
|
|
113
|
+
errorMessage,
|
|
114
|
+
driver
|
|
115
|
+
}) {
|
|
116
|
+
driver = driver ?? config().driver;
|
|
117
|
+
const condition = import_selenium_webdriver.until.elementIsVisible(element);
|
|
118
|
+
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
119
|
+
}
|
|
120
|
+
|
|
94
121
|
// src/pageObjects/AbstractElement.ts
|
|
95
122
|
var AbstractElement = class {
|
|
96
123
|
driver;
|
|
97
|
-
|
|
124
|
+
elementCssSelector;
|
|
125
|
+
constructor(driver, elementCssSelector) {
|
|
98
126
|
this.driver = driver || config().driver;
|
|
127
|
+
this.elementCssSelector = elementCssSelector;
|
|
128
|
+
}
|
|
129
|
+
getFullCssSelector() {
|
|
130
|
+
return this.elementCssSelector;
|
|
131
|
+
}
|
|
132
|
+
async getElement() {
|
|
133
|
+
return this.driver.findElement(import_selenium_webdriver2.By.css(this.getFullCssSelector()));
|
|
134
|
+
}
|
|
135
|
+
async getAttribute(attr) {
|
|
136
|
+
const element = await this.getElement();
|
|
137
|
+
await waitElementIsVisible({
|
|
138
|
+
element,
|
|
139
|
+
driver: this.driver,
|
|
140
|
+
errorMessage: `Element not found: ${this.getFullCssSelector()}`
|
|
141
|
+
});
|
|
142
|
+
return await element.getAttribute(attr);
|
|
143
|
+
}
|
|
144
|
+
async getClasses() {
|
|
145
|
+
return await this.getAttribute("class");
|
|
146
|
+
}
|
|
147
|
+
async getDataTestId() {
|
|
148
|
+
return await this.getAttribute("data-testid");
|
|
99
149
|
}
|
|
100
150
|
};
|
|
101
151
|
|
|
@@ -128,19 +178,62 @@ var AbstractPage = class extends AbstractElement {
|
|
|
128
178
|
}
|
|
129
179
|
};
|
|
130
180
|
|
|
181
|
+
// src/utils/actions.ts
|
|
182
|
+
var click = async (webElement, driver) => {
|
|
183
|
+
driver = driver ?? config().driver;
|
|
184
|
+
const actions = driver.actions({ async: true });
|
|
185
|
+
await actions.move({ origin: webElement }).click().perform();
|
|
186
|
+
};
|
|
187
|
+
|
|
131
188
|
// src/utils/locators.ts
|
|
132
|
-
var
|
|
189
|
+
var import_selenium_webdriver3 = require("selenium-webdriver");
|
|
133
190
|
var byTestIdCssSelector = (testId, element = "div") => {
|
|
134
191
|
return `${element}[data-testid="${testId}"]`;
|
|
135
192
|
};
|
|
136
193
|
var byTestId = (testId, element = "div") => {
|
|
137
|
-
return
|
|
194
|
+
return import_selenium_webdriver3.By.css(byTestIdCssSelector(testId, element));
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
// src/pageObjects/pages/LoginPage.ts
|
|
198
|
+
var LOGIN_PATH = "/login";
|
|
199
|
+
var LoginPage = class extends AbstractPage {
|
|
200
|
+
usernameField = byTestId("loginField", "input");
|
|
201
|
+
passwordField = byTestId("passwordField", "input");
|
|
202
|
+
loginButton = byTestId("loginButton");
|
|
203
|
+
async locate() {
|
|
204
|
+
await super.locate();
|
|
205
|
+
const login = await this.driver.findElement(this.usernameField);
|
|
206
|
+
await waitElementIsVisible({
|
|
207
|
+
element: login,
|
|
208
|
+
driver: this.driver
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
get path() {
|
|
212
|
+
return LOGIN_PATH;
|
|
213
|
+
}
|
|
214
|
+
async enterUsername(username) {
|
|
215
|
+
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
216
|
+
}
|
|
217
|
+
async enterPassword(password) {
|
|
218
|
+
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
219
|
+
}
|
|
220
|
+
async clickLoginButton() {
|
|
221
|
+
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
222
|
+
}
|
|
223
|
+
async loginWith(username, password) {
|
|
224
|
+
await this.enterUsername(username);
|
|
225
|
+
await this.enterPassword(password);
|
|
226
|
+
await this.clickLoginButton();
|
|
227
|
+
}
|
|
228
|
+
async authorize() {
|
|
229
|
+
await this.loginWith(config().auth.login, config().auth.password);
|
|
230
|
+
}
|
|
138
231
|
};
|
|
139
232
|
|
|
140
233
|
// src/utils/createDriver.ts
|
|
141
|
-
var
|
|
234
|
+
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
142
235
|
var createDriver = async (browser) => {
|
|
143
|
-
const driver = await new
|
|
236
|
+
const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
|
|
144
237
|
const manage = driver.manage();
|
|
145
238
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
146
239
|
await manage.window().maximize();
|
|
@@ -148,44 +241,30 @@ var createDriver = async (browser) => {
|
|
|
148
241
|
};
|
|
149
242
|
|
|
150
243
|
// src/utils/elementIsNotPresent.ts
|
|
151
|
-
var
|
|
244
|
+
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
152
245
|
var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
153
|
-
return new
|
|
246
|
+
return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
|
|
154
247
|
const elements = await driver.findElements(locator);
|
|
155
248
|
return elements.length == 0;
|
|
156
249
|
});
|
|
157
250
|
};
|
|
158
251
|
|
|
159
|
-
// src/utils/
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
await
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
// src/utils/waitElementIsVisible.ts
|
|
169
|
-
async function waitElementIsVisible({
|
|
170
|
-
element,
|
|
171
|
-
timeout,
|
|
172
|
-
errorMessage,
|
|
173
|
-
driver
|
|
174
|
-
}) {
|
|
175
|
-
driver = driver ?? config().driver;
|
|
176
|
-
const condition = import_selenium_webdriver4.until.elementIsVisible(element);
|
|
177
|
-
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
252
|
+
// src/utils/signIn.ts
|
|
253
|
+
async function signIn(driver) {
|
|
254
|
+
const webDriver = driver ?? await createDriver();
|
|
255
|
+
config().driver = webDriver;
|
|
256
|
+
const loginPage = new LoginPage(webDriver);
|
|
257
|
+
await loginPage.locate();
|
|
258
|
+
await loginPage.authorize();
|
|
259
|
+
return webDriver;
|
|
178
260
|
}
|
|
179
261
|
|
|
180
262
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
181
|
-
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
182
263
|
var AbstractElementWithParent = class extends AbstractElement {
|
|
183
|
-
elementCssSelector;
|
|
184
264
|
parentCssSelector;
|
|
185
265
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
186
|
-
super(driver);
|
|
266
|
+
super(driver, elementCssSelector);
|
|
187
267
|
this.parentCssSelector = parentCssSelector;
|
|
188
|
-
this.elementCssSelector = elementCssSelector;
|
|
189
268
|
}
|
|
190
269
|
getFullCssSelector() {
|
|
191
270
|
if (!this.elementCssSelector) {
|
|
@@ -196,21 +275,6 @@ var AbstractElementWithParent = class extends AbstractElement {
|
|
|
196
275
|
}
|
|
197
276
|
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
198
277
|
}
|
|
199
|
-
async getElement() {
|
|
200
|
-
return this.driver.findElement(import_selenium_webdriver5.By.css(this.getFullCssSelector()));
|
|
201
|
-
}
|
|
202
|
-
async getAttribute(attr) {
|
|
203
|
-
const element = await this.getElement();
|
|
204
|
-
await waitElementIsVisible({
|
|
205
|
-
element,
|
|
206
|
-
driver: this.driver,
|
|
207
|
-
errorMessage: `Element not found: ${this.getFullCssSelector()}`
|
|
208
|
-
});
|
|
209
|
-
return await element.getAttribute(attr);
|
|
210
|
-
}
|
|
211
|
-
async getClasses() {
|
|
212
|
-
return await this.getAttribute("class");
|
|
213
|
-
}
|
|
214
278
|
};
|
|
215
279
|
|
|
216
280
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
@@ -228,8 +292,10 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
228
292
|
super(driver);
|
|
229
293
|
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
230
294
|
}
|
|
231
|
-
headerTitle() {
|
|
232
|
-
|
|
295
|
+
async headerTitle() {
|
|
296
|
+
const title = await this.header.title();
|
|
297
|
+
await wait(async () => await title.getText() != "", this.driver);
|
|
298
|
+
return title.getText();
|
|
233
299
|
}
|
|
234
300
|
};
|
|
235
301
|
|
|
@@ -266,10 +332,10 @@ var AbstractForm = class extends AbstractPage {
|
|
|
266
332
|
*/
|
|
267
333
|
async exists() {
|
|
268
334
|
try {
|
|
269
|
-
await
|
|
335
|
+
let elements = await this.driver.findElements(this.containerBy);
|
|
336
|
+
return elements.length > 0;
|
|
337
|
+
} catch (error) {
|
|
270
338
|
return false;
|
|
271
|
-
} catch {
|
|
272
|
-
return true;
|
|
273
339
|
}
|
|
274
340
|
}
|
|
275
341
|
/**
|
|
@@ -284,7 +350,7 @@ var AbstractForm = class extends AbstractPage {
|
|
|
284
350
|
const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
285
351
|
return titleEl2.getText();
|
|
286
352
|
}
|
|
287
|
-
let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.
|
|
353
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.className("main-toolbar-form-title"));
|
|
288
354
|
return titleEl.getText();
|
|
289
355
|
}
|
|
290
356
|
};
|
|
@@ -292,6 +358,29 @@ var AbstractForm = class extends AbstractPage {
|
|
|
292
358
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
293
359
|
var import_selenium_webdriver14 = require("selenium-webdriver");
|
|
294
360
|
|
|
361
|
+
// src/utils/createDataTestId.ts
|
|
362
|
+
function createDataTestId(formName, itemType, itemName) {
|
|
363
|
+
return `${formName}-${itemType}-${itemName}`;
|
|
364
|
+
}
|
|
365
|
+
function createFieldTestId(formName, itemName) {
|
|
366
|
+
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
367
|
+
}
|
|
368
|
+
function createGroupTestId(formName, itemName) {
|
|
369
|
+
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
370
|
+
}
|
|
371
|
+
function createFilterTestId(formName, itemName, layout) {
|
|
372
|
+
return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
|
|
373
|
+
}
|
|
374
|
+
function createDocFilterTestId(formName, itemName) {
|
|
375
|
+
return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
|
|
376
|
+
}
|
|
377
|
+
function createLayoutFilterTestId(formName, itemName) {
|
|
378
|
+
return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
|
|
379
|
+
}
|
|
380
|
+
function createTableId(formName) {
|
|
381
|
+
return `${"table" /* TABLE */}-${formName}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
295
384
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
296
385
|
var import_selenium_webdriver8 = require("selenium-webdriver");
|
|
297
386
|
|
|
@@ -484,6 +573,7 @@ var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
|
484
573
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
485
574
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
486
575
|
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
576
|
+
var TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
487
577
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
488
578
|
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
489
579
|
super(parentCssSelector, elementCssSelector, driver);
|
|
@@ -498,21 +588,21 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
498
588
|
}
|
|
499
589
|
await this.confirmSelection();
|
|
500
590
|
}
|
|
591
|
+
async waitOptionSelection() {
|
|
592
|
+
const option = await this.driver.findElement(import_selenium_webdriver11.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
|
|
593
|
+
await wait(() => option.isDisplayed(), this.driver);
|
|
594
|
+
}
|
|
501
595
|
async selectOption(inputEl, value, lastElement) {
|
|
502
596
|
await inputEl.sendKeys(value);
|
|
503
597
|
const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
|
|
504
598
|
await click(optElement, this.driver);
|
|
599
|
+
await this.waitOptionSelection();
|
|
505
600
|
if (value !== lastElement) {
|
|
506
601
|
await inputEl.clear();
|
|
507
602
|
}
|
|
508
603
|
}
|
|
509
604
|
async confirmSelection() {
|
|
510
|
-
const inputEl = await this.getInputElement();
|
|
511
|
-
const option = await inputEl.findElement(import_selenium_webdriver11.By.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
|
|
512
605
|
const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
|
|
513
|
-
await wait(async () => {
|
|
514
|
-
return await option.getAttribute("aria-selected") === "true";
|
|
515
|
-
}, this.driver);
|
|
516
606
|
await click(btnOk, this.driver);
|
|
517
607
|
}
|
|
518
608
|
async getTagBoxInputValue() {
|
|
@@ -660,25 +750,11 @@ var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
|
660
750
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
661
751
|
};
|
|
662
752
|
|
|
663
|
-
// src/
|
|
664
|
-
|
|
665
|
-
return `${formName}-${itemType}-${itemName}`;
|
|
666
|
-
}
|
|
667
|
-
function createFieldTestId(formName, itemName) {
|
|
668
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
669
|
-
}
|
|
670
|
-
function createGroupTestId(formName, itemName) {
|
|
671
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
672
|
-
}
|
|
673
|
-
function createTableId(formName) {
|
|
674
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// src/pageObjects/elements/FormField.ts
|
|
678
|
-
var FormField = class extends AbstractElementWithParent {
|
|
753
|
+
// src/pageObjects/elements/AbstractEditor.ts
|
|
754
|
+
var AbstractEditor = class extends AbstractElementWithParent {
|
|
679
755
|
editor;
|
|
680
|
-
constructor(parentCssSelector,
|
|
681
|
-
super(parentCssSelector,
|
|
756
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
757
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
682
758
|
}
|
|
683
759
|
async initEditor() {
|
|
684
760
|
if (!this.editor) {
|
|
@@ -731,6 +807,13 @@ var FormField = class extends AbstractElementWithParent {
|
|
|
731
807
|
}
|
|
732
808
|
};
|
|
733
809
|
|
|
810
|
+
// src/pageObjects/elements/FormField.ts
|
|
811
|
+
var FormField = class extends AbstractEditor {
|
|
812
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
813
|
+
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
|
|
734
817
|
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
735
818
|
var AbstractGroup = class extends AbstractElementWithParent {
|
|
736
819
|
async isDisplayed() {
|
|
@@ -832,9 +915,12 @@ var FormEdit = class extends AbstractForm {
|
|
|
832
915
|
};
|
|
833
916
|
|
|
834
917
|
// src/pageObjects/elements/Table/Table.ts
|
|
835
|
-
var
|
|
918
|
+
var import_selenium_webdriver19 = require("selenium-webdriver");
|
|
836
919
|
|
|
837
920
|
// src/pageObjects/elements/Table/elements/Row.ts
|
|
921
|
+
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
922
|
+
|
|
923
|
+
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
838
924
|
var import_selenium_webdriver16 = require("selenium-webdriver");
|
|
839
925
|
|
|
840
926
|
// src/pageObjects/elements/Table/utils.ts
|
|
@@ -844,6 +930,7 @@ function getCssRowByIndexSelector(index) {
|
|
|
844
930
|
}
|
|
845
931
|
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
846
932
|
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
933
|
+
var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
847
934
|
function getCssCellByIndexSelector(index) {
|
|
848
935
|
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
849
936
|
}
|
|
@@ -863,6 +950,10 @@ var Cell = class extends AbstractElementWithParent {
|
|
|
863
950
|
this._index = index;
|
|
864
951
|
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
865
952
|
}
|
|
953
|
+
async getBooleanValue(cellEl) {
|
|
954
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver16.By.className("boolean-widget"));
|
|
955
|
+
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
956
|
+
}
|
|
866
957
|
async getElement() {
|
|
867
958
|
if (this._index == null) {
|
|
868
959
|
this.index = await this.getCellIndex();
|
|
@@ -871,6 +962,10 @@ var Cell = class extends AbstractElementWithParent {
|
|
|
871
962
|
}
|
|
872
963
|
async getValue() {
|
|
873
964
|
const cellEl = await this.getElement();
|
|
965
|
+
const cellElClass = await cellEl.getAttribute("class");
|
|
966
|
+
if (cellElClass.includes("boolean-column")) {
|
|
967
|
+
return this.getBooleanValue(cellEl);
|
|
968
|
+
}
|
|
874
969
|
return cellEl.getText();
|
|
875
970
|
}
|
|
876
971
|
getIndex() {
|
|
@@ -884,22 +979,25 @@ var DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
|
884
979
|
var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
885
980
|
var Row = class extends AbstractElementWithParent {
|
|
886
981
|
index;
|
|
887
|
-
|
|
888
|
-
constructor(parentCssSelector, index, driver,
|
|
982
|
+
getColumnBy;
|
|
983
|
+
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
889
984
|
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
890
985
|
this.index = index;
|
|
891
|
-
this.
|
|
986
|
+
this.getColumnBy = getColumnBy;
|
|
892
987
|
}
|
|
893
|
-
_getCell(index,
|
|
988
|
+
_getCell({ index, name, title }) {
|
|
894
989
|
return new Cell(this.getFullCssSelector(), () => {
|
|
895
|
-
return this.
|
|
990
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
896
991
|
}, index, this.driver);
|
|
897
992
|
}
|
|
898
993
|
getCellByIndex(index) {
|
|
899
|
-
return this._getCell(index);
|
|
994
|
+
return this._getCell({ index });
|
|
995
|
+
}
|
|
996
|
+
getCell(name) {
|
|
997
|
+
return this._getCell({ name });
|
|
900
998
|
}
|
|
901
|
-
|
|
902
|
-
return this._getCell(
|
|
999
|
+
getCellByTitle(title) {
|
|
1000
|
+
return this._getCell({ title });
|
|
903
1001
|
}
|
|
904
1002
|
async select() {
|
|
905
1003
|
const rowEl = await this.getElement();
|
|
@@ -917,7 +1015,7 @@ var Row = class extends AbstractElementWithParent {
|
|
|
917
1015
|
return this.index;
|
|
918
1016
|
}
|
|
919
1017
|
async getCells() {
|
|
920
|
-
const cells = await this.driver.findElements(
|
|
1018
|
+
const cells = await this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
921
1019
|
const result = [];
|
|
922
1020
|
cells.forEach((_, index) => {
|
|
923
1021
|
const newCell = this.getCellByIndex(index);
|
|
@@ -928,7 +1026,7 @@ var Row = class extends AbstractElementWithParent {
|
|
|
928
1026
|
async clickInlineButton(buttonClass) {
|
|
929
1027
|
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
930
1028
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
|
|
931
|
-
const button = await this.driver.findElement(
|
|
1029
|
+
const button = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
|
|
932
1030
|
return click(button, this.driver);
|
|
933
1031
|
}
|
|
934
1032
|
async checkEditingMode(isEditing, msg) {
|
|
@@ -951,15 +1049,17 @@ var Row = class extends AbstractElementWithParent {
|
|
|
951
1049
|
};
|
|
952
1050
|
|
|
953
1051
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
954
|
-
var
|
|
1052
|
+
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
955
1053
|
var getHeaderCssSelector = () => {
|
|
956
1054
|
return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
957
1055
|
};
|
|
958
1056
|
var Column = class extends AbstractElementWithParent {
|
|
959
1057
|
_index;
|
|
960
1058
|
_caption;
|
|
961
|
-
|
|
1059
|
+
_name;
|
|
1060
|
+
constructor({ parentCssSelector, name, caption, index, driver }) {
|
|
962
1061
|
super(parentCssSelector, "", driver);
|
|
1062
|
+
this._name = name;
|
|
963
1063
|
this.index = index;
|
|
964
1064
|
this._caption = caption;
|
|
965
1065
|
}
|
|
@@ -974,19 +1074,33 @@ var Column = class extends AbstractElementWithParent {
|
|
|
974
1074
|
await this.getIndex();
|
|
975
1075
|
return super.getElement();
|
|
976
1076
|
}
|
|
977
|
-
async
|
|
978
|
-
const column = await this.driver.findElement(
|
|
1077
|
+
async getColumnHeaderIndexBy(cssSelector) {
|
|
1078
|
+
const column = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${cssSelector}`));
|
|
979
1079
|
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
980
1080
|
}
|
|
1081
|
+
async getIndexByCaption() {
|
|
1082
|
+
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
1083
|
+
}
|
|
1084
|
+
async getIndexByName() {
|
|
1085
|
+
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
1086
|
+
}
|
|
981
1087
|
async caption() {
|
|
982
1088
|
const el = await this.getElement();
|
|
983
1089
|
return el.getText();
|
|
984
1090
|
}
|
|
985
1091
|
async getIndex() {
|
|
986
|
-
if (this.index
|
|
1092
|
+
if (this.index != null) {
|
|
1093
|
+
return this.index;
|
|
1094
|
+
}
|
|
1095
|
+
if (this._caption != null) {
|
|
987
1096
|
this.index = await this.getIndexByCaption();
|
|
1097
|
+
return this.index;
|
|
988
1098
|
}
|
|
989
|
-
|
|
1099
|
+
if (this._name != null) {
|
|
1100
|
+
this.index = await this.getIndexByName();
|
|
1101
|
+
return this.index;
|
|
1102
|
+
}
|
|
1103
|
+
throw new Error("Cant get the index in the column");
|
|
990
1104
|
}
|
|
991
1105
|
};
|
|
992
1106
|
|
|
@@ -997,32 +1111,57 @@ var Table = class extends AbstractElementWithParent {
|
|
|
997
1111
|
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
998
1112
|
this.formName = formName;
|
|
999
1113
|
}
|
|
1114
|
+
getColumnBy = (args) => {
|
|
1115
|
+
if (args.title) {
|
|
1116
|
+
return this.getColumnByTitle(args.title);
|
|
1117
|
+
}
|
|
1118
|
+
return this.getColumnByName(args.name);
|
|
1119
|
+
};
|
|
1000
1120
|
getRowByIndex(index) {
|
|
1001
|
-
return new Row(this.getFullCssSelector(), index, this.driver, this.
|
|
1121
|
+
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1002
1122
|
}
|
|
1003
1123
|
getColumnByIndex(index) {
|
|
1004
|
-
return new Column(
|
|
1124
|
+
return new Column({
|
|
1125
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1126
|
+
driver: this.driver,
|
|
1127
|
+
index
|
|
1128
|
+
});
|
|
1005
1129
|
}
|
|
1006
|
-
|
|
1007
|
-
return new Column(
|
|
1130
|
+
getColumnByTitle = (title) => {
|
|
1131
|
+
return new Column({
|
|
1132
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1133
|
+
caption: title,
|
|
1134
|
+
driver: this.driver
|
|
1135
|
+
});
|
|
1136
|
+
};
|
|
1137
|
+
getColumnByName = (name) => {
|
|
1138
|
+
return new Column({
|
|
1139
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1140
|
+
name,
|
|
1141
|
+
driver: this.driver
|
|
1142
|
+
});
|
|
1008
1143
|
};
|
|
1009
1144
|
selectRowByIndex(index) {
|
|
1010
1145
|
return this.getRowByIndex(index).select();
|
|
1011
1146
|
}
|
|
1012
1147
|
async getRows() {
|
|
1013
|
-
const rows = await this.driver.findElements(
|
|
1148
|
+
const rows = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1014
1149
|
const result = [];
|
|
1015
1150
|
rows.forEach((_, index) => {
|
|
1016
|
-
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.
|
|
1151
|
+
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1017
1152
|
result.push(newRow);
|
|
1018
1153
|
});
|
|
1019
1154
|
return result;
|
|
1020
1155
|
}
|
|
1021
1156
|
async getColumns() {
|
|
1022
|
-
const columns = await this.driver.findElements(
|
|
1157
|
+
const columns = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
|
|
1023
1158
|
const result = [];
|
|
1024
1159
|
columns.forEach((_, index) => {
|
|
1025
|
-
const newCol = new Column(
|
|
1160
|
+
const newCol = new Column({
|
|
1161
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1162
|
+
index,
|
|
1163
|
+
driver: this.driver
|
|
1164
|
+
});
|
|
1026
1165
|
result.push(newCol);
|
|
1027
1166
|
});
|
|
1028
1167
|
return result;
|
|
@@ -1042,19 +1181,16 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1042
1181
|
}
|
|
1043
1182
|
};
|
|
1044
1183
|
|
|
1045
|
-
// src/pageObjects/elements/TableToolbar/
|
|
1046
|
-
var
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
constructor(parentCssSelector, name, driver) {
|
|
1050
|
-
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1051
|
-
this.name = name;
|
|
1184
|
+
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1185
|
+
var AbstractButton = class extends AbstractElementWithParent {
|
|
1186
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1187
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1052
1188
|
}
|
|
1053
1189
|
async click() {
|
|
1054
1190
|
const button = await this.getElement();
|
|
1055
1191
|
await wait(async () => {
|
|
1056
1192
|
return await button.isDisplayed() && !await this.isDisabled();
|
|
1057
|
-
}, this.driver,
|
|
1193
|
+
}, this.driver, this.buttonNotDisplayedError());
|
|
1058
1194
|
await click(button, this.driver);
|
|
1059
1195
|
}
|
|
1060
1196
|
async isDisabled() {
|
|
@@ -1063,14 +1199,207 @@ var TableToolbarButton = class extends AbstractElementWithParent {
|
|
|
1063
1199
|
}
|
|
1064
1200
|
};
|
|
1065
1201
|
|
|
1066
|
-
// src/pageObjects/elements/TableToolbar/
|
|
1202
|
+
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
1203
|
+
var ToolbarGroupButton = class extends AbstractButton {
|
|
1204
|
+
name;
|
|
1205
|
+
constructor(parentCssSelector, name, driver) {
|
|
1206
|
+
super(parentCssSelector, ``, driver);
|
|
1207
|
+
this.name = name;
|
|
1208
|
+
}
|
|
1209
|
+
buttonNotDisplayedError() {
|
|
1210
|
+
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
|
|
1214
|
+
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
1215
|
+
var TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1216
|
+
var ToolbarButton = class extends AbstractButton {
|
|
1217
|
+
name;
|
|
1218
|
+
constructor(parentCssSelector, name, driver) {
|
|
1219
|
+
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1220
|
+
this.name = name;
|
|
1221
|
+
}
|
|
1222
|
+
buttonNotDisplayedError() {
|
|
1223
|
+
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1224
|
+
}
|
|
1225
|
+
};
|
|
1226
|
+
|
|
1227
|
+
// src/pageObjects/elements/TableToolbar/ToolbarItem.ts
|
|
1228
|
+
var GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
1229
|
+
var toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
1230
|
+
var ToolbarItem = class extends AbstractElementWithParent {
|
|
1231
|
+
_button;
|
|
1232
|
+
// private _formName: string;
|
|
1233
|
+
_itemName;
|
|
1234
|
+
constructor(parentCssSelector, formName, itemName, driver) {
|
|
1235
|
+
super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
|
|
1236
|
+
this._itemName = itemName;
|
|
1237
|
+
}
|
|
1238
|
+
async init() {
|
|
1239
|
+
if (this._button)
|
|
1240
|
+
return this._button;
|
|
1241
|
+
const classNames = await this.getClasses();
|
|
1242
|
+
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
1243
|
+
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
|
|
1244
|
+
return;
|
|
1245
|
+
}
|
|
1246
|
+
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
|
|
1247
|
+
}
|
|
1248
|
+
async click() {
|
|
1249
|
+
await this.init();
|
|
1250
|
+
await this._button.click();
|
|
1251
|
+
}
|
|
1252
|
+
async isDisabled() {
|
|
1253
|
+
await this.init();
|
|
1254
|
+
return await this._button.isDisabled();
|
|
1255
|
+
}
|
|
1256
|
+
};
|
|
1257
|
+
|
|
1258
|
+
// src/pageObjects/elements/TableToolbar/FormToolbar.ts
|
|
1067
1259
|
var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1068
|
-
var
|
|
1260
|
+
var FormToolbar = class extends AbstractElementWithParent {
|
|
1261
|
+
formName;
|
|
1069
1262
|
constructor(parentCssSelector, formName, driver) {
|
|
1070
1263
|
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1264
|
+
this.formName = formName;
|
|
1071
1265
|
}
|
|
1072
1266
|
button(name) {
|
|
1073
|
-
return new
|
|
1267
|
+
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1268
|
+
}
|
|
1269
|
+
};
|
|
1270
|
+
|
|
1271
|
+
// src/pageObjects/elements/Filters/FormFilterField.ts
|
|
1272
|
+
var FormFilterField = class extends AbstractEditor {
|
|
1273
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1274
|
+
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
|
|
1275
|
+
}
|
|
1276
|
+
/**
|
|
1277
|
+
* Возвращает значение в поле
|
|
1278
|
+
* @example
|
|
1279
|
+
* expect(await form.formFilter('NumberFld').getValue()).toBe(10);
|
|
1280
|
+
* expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
|
|
1281
|
+
*/
|
|
1282
|
+
async getValue() {
|
|
1283
|
+
return super.getValue();
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* Устанавливает значение в поле
|
|
1287
|
+
* @example
|
|
1288
|
+
* await form.formFilter('NumberFld').setValue(123);
|
|
1289
|
+
* await form.formFilter('TextFld').setValue('TestValue');
|
|
1290
|
+
*/
|
|
1291
|
+
async setValue(value) {
|
|
1292
|
+
return super.setValue(value);
|
|
1293
|
+
}
|
|
1294
|
+
/**
|
|
1295
|
+
* Очищает значение в поле
|
|
1296
|
+
* @example
|
|
1297
|
+
* await form.formFilter('NumberFld').clear();
|
|
1298
|
+
*/
|
|
1299
|
+
async clear() {
|
|
1300
|
+
return super.clear();
|
|
1301
|
+
}
|
|
1302
|
+
/**
|
|
1303
|
+
* Удаляет тег по переданному тексту
|
|
1304
|
+
* @example
|
|
1305
|
+
* await form.formFilter('TagBox').remove('test');
|
|
1306
|
+
*/
|
|
1307
|
+
async remove(itemText) {
|
|
1308
|
+
return super.remove(itemText);
|
|
1309
|
+
}
|
|
1310
|
+
};
|
|
1311
|
+
|
|
1312
|
+
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
1313
|
+
var import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1314
|
+
|
|
1315
|
+
// src/pageObjects/elements/Filters/PanelFilterField.ts
|
|
1316
|
+
var PanelFilterField = class extends AbstractEditor {
|
|
1317
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1318
|
+
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* Возвращает значение в поле
|
|
1322
|
+
* @example
|
|
1323
|
+
* expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
|
|
1324
|
+
* expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
|
|
1325
|
+
*/
|
|
1326
|
+
async getValue() {
|
|
1327
|
+
return super.getValue();
|
|
1328
|
+
}
|
|
1329
|
+
/**
|
|
1330
|
+
* Устанавливает значение в поле
|
|
1331
|
+
* @example
|
|
1332
|
+
* await form.filterPanel.filterField('NumberFld').setValue(123);
|
|
1333
|
+
* await form.filterPanel.filterField('TextFld').setValue('TestValue');
|
|
1334
|
+
*/
|
|
1335
|
+
async setValue(value) {
|
|
1336
|
+
return super.setValue(value);
|
|
1337
|
+
}
|
|
1338
|
+
/**
|
|
1339
|
+
* Очищает значение в поле
|
|
1340
|
+
* @example
|
|
1341
|
+
* await form.filterPanel.filterField('NumberFld').clear();
|
|
1342
|
+
*/
|
|
1343
|
+
async clear() {
|
|
1344
|
+
return super.clear();
|
|
1345
|
+
}
|
|
1346
|
+
/**
|
|
1347
|
+
* Удаляет тег по переданному тексту
|
|
1348
|
+
* @example
|
|
1349
|
+
* await form.filterPanel.filterField('TagBox').remove('test');
|
|
1350
|
+
*/
|
|
1351
|
+
async remove(itemText) {
|
|
1352
|
+
return super.remove(itemText);
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
|
|
1356
|
+
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
1357
|
+
var drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
|
|
1358
|
+
var FILTER_PANEL_SELECTOR = ".filter-panel";
|
|
1359
|
+
var CLOSE_SELECTOR = ".button-close";
|
|
1360
|
+
var FilterPanel = class extends AbstractElement {
|
|
1361
|
+
_formName;
|
|
1362
|
+
get filterPanelSelector() {
|
|
1363
|
+
return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
|
|
1364
|
+
}
|
|
1365
|
+
async filterPanelButtons() {
|
|
1366
|
+
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
1367
|
+
const el = await this.getElement();
|
|
1368
|
+
return el.findElements(import_selenium_webdriver20.By.css(selector));
|
|
1369
|
+
}
|
|
1370
|
+
constructor(formName, driver) {
|
|
1371
|
+
super(driver, drawerSelector(formName));
|
|
1372
|
+
this._formName = formName;
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Возвращает фильтр на панели фильтрации
|
|
1376
|
+
* @returns {PanelFilterField}
|
|
1377
|
+
* @example
|
|
1378
|
+
* await form.filterPanel.filterField('NumberFld');
|
|
1379
|
+
*/
|
|
1380
|
+
filterField(name) {
|
|
1381
|
+
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
|
|
1382
|
+
}
|
|
1383
|
+
async apply() {
|
|
1384
|
+
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
1385
|
+
await click(btn, this.driver);
|
|
1386
|
+
}
|
|
1387
|
+
async findButtonByTitle(title) {
|
|
1388
|
+
const buttons = await this.filterPanelButtons();
|
|
1389
|
+
for (const btn of buttons) {
|
|
1390
|
+
if (await btn.getText() === title) {
|
|
1391
|
+
return btn;
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
}
|
|
1395
|
+
async clearAll() {
|
|
1396
|
+
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
1397
|
+
await click(btn, this.driver);
|
|
1398
|
+
await this.driver.sleep(300);
|
|
1399
|
+
}
|
|
1400
|
+
async close() {
|
|
1401
|
+
const btn = await this.driver.findElement(import_selenium_webdriver20.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
1402
|
+
await click(btn, this.driver);
|
|
1074
1403
|
}
|
|
1075
1404
|
};
|
|
1076
1405
|
|
|
@@ -1108,71 +1437,42 @@ var ListForm = class extends AbstractForm {
|
|
|
1108
1437
|
* expect(listForm.toolbarButton());
|
|
1109
1438
|
*/
|
|
1110
1439
|
toolbarButton(name) {
|
|
1111
|
-
const toolbar = new
|
|
1440
|
+
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1112
1441
|
return toolbar.button(name);
|
|
1113
1442
|
}
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
return webDriver;
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
// src/utils/actions.ts
|
|
1127
|
-
var click = async (webElement, driver) => {
|
|
1128
|
-
driver = driver ?? config().driver;
|
|
1129
|
-
const actions = driver.actions({ async: true });
|
|
1130
|
-
await actions.move({ origin: webElement }).click().perform();
|
|
1131
|
-
};
|
|
1132
|
-
|
|
1133
|
-
// src/pageObjects/pages/LoginPage.ts
|
|
1134
|
-
var LOGIN_PATH = "/login";
|
|
1135
|
-
var LoginPage = class extends AbstractPage {
|
|
1136
|
-
usernameField = byTestId("loginField", "input");
|
|
1137
|
-
passwordField = byTestId("passwordField", "input");
|
|
1138
|
-
loginButton = byTestId("loginButton");
|
|
1139
|
-
async locate() {
|
|
1140
|
-
await super.locate();
|
|
1141
|
-
const login = await this.driver.findElement(this.usernameField);
|
|
1142
|
-
await waitElementIsVisible({
|
|
1143
|
-
element: login,
|
|
1144
|
-
driver: this.driver
|
|
1145
|
-
});
|
|
1146
|
-
}
|
|
1147
|
-
get path() {
|
|
1148
|
-
return LOGIN_PATH;
|
|
1149
|
-
}
|
|
1150
|
-
async enterUsername(username) {
|
|
1151
|
-
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
1152
|
-
}
|
|
1153
|
-
async enterPassword(password) {
|
|
1154
|
-
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
1155
|
-
}
|
|
1156
|
-
async clickLoginButton() {
|
|
1157
|
-
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
1158
|
-
}
|
|
1159
|
-
async loginWith(username, password) {
|
|
1160
|
-
await this.enterUsername(username);
|
|
1161
|
-
await this.enterPassword(password);
|
|
1162
|
-
await this.clickLoginButton();
|
|
1443
|
+
/**
|
|
1444
|
+
* Фильтр который расположен на форме
|
|
1445
|
+
* @example
|
|
1446
|
+
* const listForm = new MyForm();
|
|
1447
|
+
* //...
|
|
1448
|
+
* expect(listForm.formFilter());
|
|
1449
|
+
*/
|
|
1450
|
+
formFilter(name) {
|
|
1451
|
+
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
1163
1452
|
}
|
|
1164
|
-
|
|
1165
|
-
|
|
1453
|
+
/**
|
|
1454
|
+
* Модель панели фильтрации
|
|
1455
|
+
* @returns {FilterPanel}
|
|
1456
|
+
* @example
|
|
1457
|
+
* const listForm = new MyForm();
|
|
1458
|
+
* //...
|
|
1459
|
+
* expect(listForm.filterPanel());
|
|
1460
|
+
*/
|
|
1461
|
+
get filterPanel() {
|
|
1462
|
+
return new FilterPanel(this.formName, this.driver);
|
|
1166
1463
|
}
|
|
1167
1464
|
};
|
|
1168
1465
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1169
1466
|
0 && (module.exports = {
|
|
1170
1467
|
AbstractPage,
|
|
1468
|
+
FilterPanel,
|
|
1171
1469
|
FormEdit,
|
|
1172
1470
|
FormField,
|
|
1471
|
+
FormFilterField,
|
|
1173
1472
|
ListForm,
|
|
1174
1473
|
LoginPage,
|
|
1175
1474
|
NumberEditor,
|
|
1475
|
+
PanelFilterField,
|
|
1176
1476
|
SubsystemsPanel,
|
|
1177
1477
|
TextEditor,
|
|
1178
1478
|
byTestId,
|