d5-testing-library 1.1.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 +669 -402
- package/dist/d5-testing-library.d.ts +197 -48
- package/dist/d5-testing-library.legacy-esm.js +656 -394
- package/dist/d5-testing-library.mjs +656 -394
- package/package.json +1 -1
|
@@ -31,20 +31,25 @@ 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,
|
|
45
|
+
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
42
46
|
click: () => click,
|
|
43
47
|
config: () => config,
|
|
44
48
|
createDriver: () => createDriver,
|
|
45
49
|
editorFactory: () => editorFactory,
|
|
46
50
|
elementIsNotPresent: () => elementIsNotPresent,
|
|
47
51
|
signIn: () => signIn,
|
|
52
|
+
wait: () => wait,
|
|
48
53
|
waitElementIsVisible: () => waitElementIsVisible
|
|
49
54
|
});
|
|
50
55
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -89,11 +94,58 @@ function config(cfg) {
|
|
|
89
94
|
return configInstance.config(cfg);
|
|
90
95
|
}
|
|
91
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
|
+
|
|
92
121
|
// src/pageObjects/AbstractElement.ts
|
|
93
122
|
var AbstractElement = class {
|
|
94
123
|
driver;
|
|
95
|
-
|
|
124
|
+
elementCssSelector;
|
|
125
|
+
constructor(driver, elementCssSelector) {
|
|
96
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");
|
|
97
149
|
}
|
|
98
150
|
};
|
|
99
151
|
|
|
@@ -126,16 +178,62 @@ var AbstractPage = class extends AbstractElement {
|
|
|
126
178
|
}
|
|
127
179
|
};
|
|
128
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
|
+
|
|
129
188
|
// src/utils/locators.ts
|
|
130
|
-
var
|
|
189
|
+
var import_selenium_webdriver3 = require("selenium-webdriver");
|
|
190
|
+
var byTestIdCssSelector = (testId, element = "div") => {
|
|
191
|
+
return `${element}[data-testid="${testId}"]`;
|
|
192
|
+
};
|
|
131
193
|
var byTestId = (testId, element = "div") => {
|
|
132
|
-
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
|
+
}
|
|
133
231
|
};
|
|
134
232
|
|
|
135
233
|
// src/utils/createDriver.ts
|
|
136
|
-
var
|
|
234
|
+
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
137
235
|
var createDriver = async (browser) => {
|
|
138
|
-
const driver = await new
|
|
236
|
+
const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
|
|
139
237
|
const manage = driver.manage();
|
|
140
238
|
await manage.setTimeouts({ implicit: config().timeout });
|
|
141
239
|
await manage.window().maximize();
|
|
@@ -143,86 +241,75 @@ var createDriver = async (browser) => {
|
|
|
143
241
|
};
|
|
144
242
|
|
|
145
243
|
// src/utils/elementIsNotPresent.ts
|
|
146
|
-
var
|
|
244
|
+
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
147
245
|
var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
148
|
-
return new
|
|
246
|
+
return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
|
|
149
247
|
const elements = await driver.findElements(locator);
|
|
150
248
|
return elements.length == 0;
|
|
151
249
|
});
|
|
152
250
|
};
|
|
153
251
|
|
|
154
|
-
// src/utils/
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
await
|
|
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;
|
|
160
260
|
}
|
|
161
261
|
|
|
162
262
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
163
263
|
var AbstractElementWithParent = class extends AbstractElement {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
await waitElementIsVisible({
|
|
178
|
-
element: el,
|
|
179
|
-
driver: this.driver
|
|
180
|
-
});
|
|
181
|
-
return el;
|
|
182
|
-
}
|
|
183
|
-
async getAttribute(attr) {
|
|
184
|
-
const el = await this.getElement();
|
|
185
|
-
return await el.getAttribute(attr);
|
|
186
|
-
}
|
|
187
|
-
async getClasses() {
|
|
188
|
-
return await this.getAttribute("class");
|
|
264
|
+
parentCssSelector;
|
|
265
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
266
|
+
super(driver, elementCssSelector);
|
|
267
|
+
this.parentCssSelector = parentCssSelector;
|
|
268
|
+
}
|
|
269
|
+
getFullCssSelector() {
|
|
270
|
+
if (!this.elementCssSelector) {
|
|
271
|
+
return this.parentCssSelector;
|
|
272
|
+
}
|
|
273
|
+
if (!this.parentCssSelector) {
|
|
274
|
+
return this.elementCssSelector;
|
|
275
|
+
}
|
|
276
|
+
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
189
277
|
}
|
|
190
278
|
};
|
|
191
279
|
|
|
192
280
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
281
|
+
var import_selenium_webdriver6 = require("selenium-webdriver");
|
|
193
282
|
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
194
|
-
titleBy = byTestId("subsystems-panel-title", "span");
|
|
195
283
|
async title() {
|
|
196
|
-
|
|
197
|
-
return panel.findElement(this.titleBy);
|
|
284
|
+
return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
|
|
198
285
|
}
|
|
199
286
|
};
|
|
200
287
|
|
|
201
288
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
202
|
-
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
203
289
|
var SubsystemsPanel = class extends AbstractElement {
|
|
204
|
-
panelBy = import_selenium_webdriver5.By.id("aside");
|
|
205
290
|
header;
|
|
206
291
|
constructor(driver) {
|
|
207
292
|
super(driver);
|
|
208
|
-
this.header = new SubsystemsPanelHeader(
|
|
293
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
209
294
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return this.header.title().then((el) => el.getText());
|
|
295
|
+
async headerTitle() {
|
|
296
|
+
const title = await this.header.title();
|
|
297
|
+
await wait(async () => await title.getText() != "", this.driver);
|
|
298
|
+
return title.getText();
|
|
215
299
|
}
|
|
216
300
|
};
|
|
217
301
|
|
|
218
302
|
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
219
|
-
var
|
|
303
|
+
var import_selenium_webdriver7 = require("selenium-webdriver");
|
|
220
304
|
var AbstractForm = class extends AbstractPage {
|
|
305
|
+
containerCssSelector = "";
|
|
221
306
|
containerBy;
|
|
222
|
-
|
|
307
|
+
popupContainerCssSelector;
|
|
223
308
|
constructor(driver) {
|
|
224
309
|
super(driver);
|
|
225
|
-
|
|
310
|
+
const testId = `form-content-wrapper-${this.formName}`;
|
|
311
|
+
this.containerBy = byTestId(testId);
|
|
312
|
+
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
226
313
|
}
|
|
227
314
|
async isModal() {
|
|
228
315
|
const el = await this.getContainerElement();
|
|
@@ -245,10 +332,10 @@ var AbstractForm = class extends AbstractPage {
|
|
|
245
332
|
*/
|
|
246
333
|
async exists() {
|
|
247
334
|
try {
|
|
248
|
-
await this.driver.
|
|
335
|
+
let elements = await this.driver.findElements(this.containerBy);
|
|
336
|
+
return elements.length > 0;
|
|
337
|
+
} catch (error) {
|
|
249
338
|
return false;
|
|
250
|
-
} catch {
|
|
251
|
-
return true;
|
|
252
339
|
}
|
|
253
340
|
}
|
|
254
341
|
/**
|
|
@@ -260,29 +347,42 @@ var AbstractForm = class extends AbstractPage {
|
|
|
260
347
|
*/
|
|
261
348
|
async getTitleText() {
|
|
262
349
|
if (await this.isModal()) {
|
|
263
|
-
const
|
|
264
|
-
const titleEl2 = await popupEl.findElement(import_selenium_webdriver6.By.className("popup-title"));
|
|
350
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
265
351
|
return titleEl2.getText();
|
|
266
352
|
}
|
|
267
|
-
let
|
|
268
|
-
let titleEl = await container.findElement(import_selenium_webdriver6.By.className("form-toolbar-name-container"));
|
|
353
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.className("main-toolbar-form-title"));
|
|
269
354
|
return titleEl.getText();
|
|
270
355
|
}
|
|
271
356
|
};
|
|
272
357
|
|
|
273
358
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
274
|
-
var
|
|
359
|
+
var import_selenium_webdriver14 = require("selenium-webdriver");
|
|
275
360
|
|
|
276
|
-
// src/
|
|
277
|
-
|
|
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
|
+
}
|
|
278
383
|
|
|
279
|
-
// src/pageObjects/
|
|
280
|
-
var
|
|
281
|
-
constructor(getParentElement, elementBy, driver) {
|
|
282
|
-
super(getParentElement, driver);
|
|
283
|
-
this.elementBy = elementBy;
|
|
284
|
-
}
|
|
285
|
-
};
|
|
384
|
+
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
385
|
+
var import_selenium_webdriver8 = require("selenium-webdriver");
|
|
286
386
|
|
|
287
387
|
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
288
388
|
var InputClearStrategy = class {
|
|
@@ -293,14 +393,16 @@ var InputClearStrategy = class {
|
|
|
293
393
|
};
|
|
294
394
|
|
|
295
395
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
296
|
-
var AbstractDXEditorWithInput = class extends
|
|
396
|
+
var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
297
397
|
clearStrategy = new InputClearStrategy();
|
|
298
398
|
setClearStrategy(strategy) {
|
|
299
399
|
this.clearStrategy = strategy;
|
|
300
400
|
}
|
|
401
|
+
getInputCssSelector() {
|
|
402
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
403
|
+
}
|
|
301
404
|
async getInputElement() {
|
|
302
|
-
|
|
303
|
-
return controlEl.findElement(import_selenium_webdriver7.By.className("dx-texteditor-input"));
|
|
405
|
+
return this.driver.findElement(import_selenium_webdriver8.By.css(this.getInputCssSelector()));
|
|
304
406
|
}
|
|
305
407
|
async getInputValue() {
|
|
306
408
|
const inputEl = await this.getInputElement();
|
|
@@ -309,7 +411,7 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
|
|
|
309
411
|
async setInputValue(value) {
|
|
310
412
|
const inputEl = await this.getInputElement();
|
|
311
413
|
await click(inputEl, this.driver);
|
|
312
|
-
await inputEl.sendKeys(value,
|
|
414
|
+
await inputEl.sendKeys(value, import_selenium_webdriver8.Key.ENTER);
|
|
313
415
|
}
|
|
314
416
|
async clear() {
|
|
315
417
|
await this.clearStrategy.clear(this);
|
|
@@ -318,8 +420,8 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
|
|
|
318
420
|
|
|
319
421
|
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
320
422
|
var TextEditor = class extends AbstractDXEditorWithInput {
|
|
321
|
-
constructor(
|
|
322
|
-
super(
|
|
423
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
424
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
323
425
|
this.setClearStrategy(new InputClearStrategy());
|
|
324
426
|
}
|
|
325
427
|
getValue() {
|
|
@@ -332,8 +434,8 @@ var TextEditor = class extends AbstractDXEditorWithInput {
|
|
|
332
434
|
|
|
333
435
|
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
334
436
|
var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
335
|
-
constructor(
|
|
336
|
-
super(
|
|
437
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
438
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
337
439
|
this.setClearStrategy(new InputClearStrategy());
|
|
338
440
|
}
|
|
339
441
|
async getValue() {
|
|
@@ -345,11 +447,17 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
|
345
447
|
}
|
|
346
448
|
};
|
|
347
449
|
|
|
450
|
+
// src/pageObjects/AbstractFormElement.ts
|
|
451
|
+
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
452
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
453
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
348
457
|
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
349
|
-
var CheckBox = class extends
|
|
458
|
+
var CheckBox = class extends AbstractElementWithParent {
|
|
350
459
|
async getValue() {
|
|
351
|
-
const
|
|
352
|
-
const result = await inputEl.getAttribute("aria-checked");
|
|
460
|
+
const result = await this.getAttribute("aria-checked");
|
|
353
461
|
if (result === "true")
|
|
354
462
|
return 1;
|
|
355
463
|
if (result === "false")
|
|
@@ -366,7 +474,7 @@ var CheckBox = class extends AbstractFormElement {
|
|
|
366
474
|
};
|
|
367
475
|
|
|
368
476
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
369
|
-
var
|
|
477
|
+
var import_selenium_webdriver10 = require("selenium-webdriver");
|
|
370
478
|
|
|
371
479
|
// src/utils/xpathHelper.ts
|
|
372
480
|
var XPathHelper = class {
|
|
@@ -379,28 +487,28 @@ var XPathHelper = class {
|
|
|
379
487
|
};
|
|
380
488
|
|
|
381
489
|
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
382
|
-
var
|
|
490
|
+
var import_selenium_webdriver9 = require("selenium-webdriver");
|
|
383
491
|
var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
384
492
|
var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
385
493
|
var ClearButtonStrategy = class {
|
|
386
494
|
editorContainerClass;
|
|
387
|
-
|
|
495
|
+
_driver;
|
|
496
|
+
constructor(editorContainerClass, driver) {
|
|
388
497
|
this.editorContainerClass = editorContainerClass;
|
|
498
|
+
this._driver = driver;
|
|
389
499
|
}
|
|
390
|
-
async isEmptyEditorField(
|
|
391
|
-
const
|
|
392
|
-
const editorContainer = await parentEl.findElement(import_selenium_webdriver8.By.className(this.editorContainerClass));
|
|
500
|
+
async isEmptyEditorField() {
|
|
501
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver9.By.css(this.editorContainerClass));
|
|
393
502
|
const classAttribute = await editorContainer.getAttribute("class");
|
|
394
503
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
395
504
|
}
|
|
396
|
-
async clear(
|
|
397
|
-
if (await this.isEmptyEditorField(
|
|
505
|
+
async clear() {
|
|
506
|
+
if (await this.isEmptyEditorField()) {
|
|
398
507
|
throw new Error("This field is already empty");
|
|
399
508
|
}
|
|
400
|
-
const clearBtnSelector =
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
await click(clearBtn, editor.driver);
|
|
509
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
510
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver9.By.css(clearBtnSelector));
|
|
511
|
+
await click(clearBtn, this._driver);
|
|
404
512
|
}
|
|
405
513
|
};
|
|
406
514
|
|
|
@@ -411,25 +519,17 @@ var combinedValueXpath = (value) => `${XPathHelper.getRoleXpath(SELECT_BOX_ELEME
|
|
|
411
519
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS,
|
|
412
520
|
value
|
|
413
521
|
)}`;
|
|
414
|
-
var DX_SELECTBOX = "dx-selectbox";
|
|
415
522
|
var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
416
|
-
constructor(
|
|
417
|
-
super(
|
|
418
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
523
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
524
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
525
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
419
526
|
}
|
|
420
527
|
async setSelectInputValue(value) {
|
|
421
528
|
const inputEl = await this.getInputElement();
|
|
422
529
|
await click(inputEl, this.driver);
|
|
423
|
-
await inputEl.sendKeys(value,
|
|
424
|
-
await
|
|
425
|
-
|
|
426
|
-
const optElement = await inputEl.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(value)));
|
|
427
|
-
await click(optElement, this.driver);
|
|
428
|
-
return true;
|
|
429
|
-
} catch (e) {
|
|
430
|
-
return false;
|
|
431
|
-
}
|
|
432
|
-
}, 2e3);
|
|
530
|
+
await inputEl.sendKeys(value, import_selenium_webdriver10.Key.ENTER);
|
|
531
|
+
const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
|
|
532
|
+
await click(optElement, this.driver);
|
|
433
533
|
}
|
|
434
534
|
async getValue() {
|
|
435
535
|
const value = await super.getInputValue();
|
|
@@ -441,10 +541,9 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
|
441
541
|
};
|
|
442
542
|
|
|
443
543
|
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
444
|
-
var SwitchEditor = class extends
|
|
544
|
+
var SwitchEditor = class extends AbstractElementWithParent {
|
|
445
545
|
async getValue() {
|
|
446
|
-
const
|
|
447
|
-
const result = await inputEl.getAttribute("aria-label");
|
|
546
|
+
const result = await this.getAttribute("aria-label");
|
|
448
547
|
if (result === "ON")
|
|
449
548
|
return 1;
|
|
450
549
|
if (result === "OFF")
|
|
@@ -457,27 +556,28 @@ var SwitchEditor = class extends AbstractFormElement {
|
|
|
457
556
|
}
|
|
458
557
|
const inputEl = await this.getElement();
|
|
459
558
|
const currentValue = await this.getValue();
|
|
460
|
-
if (currentValue
|
|
461
|
-
|
|
462
|
-
await this.driver.wait(async () => {
|
|
463
|
-
const updatedValue = await this.getValue();
|
|
464
|
-
return updatedValue !== currentValue;
|
|
465
|
-
});
|
|
559
|
+
if (currentValue === value) {
|
|
560
|
+
return;
|
|
466
561
|
}
|
|
562
|
+
await click(inputEl, this.driver);
|
|
563
|
+
await wait(async () => {
|
|
564
|
+
const updatedValue = await this.getValue();
|
|
565
|
+
return updatedValue !== currentValue;
|
|
566
|
+
}, this.driver);
|
|
467
567
|
}
|
|
468
568
|
};
|
|
469
569
|
|
|
470
570
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
471
|
-
var
|
|
571
|
+
var import_selenium_webdriver11 = require("selenium-webdriver");
|
|
472
572
|
var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
473
573
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
474
|
-
var DX_TAGBOX = "dx-tagbox";
|
|
475
574
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
476
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"]';
|
|
477
577
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
478
|
-
constructor(
|
|
479
|
-
super(
|
|
480
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
578
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
579
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
580
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
481
581
|
}
|
|
482
582
|
async setTagBoxInputValue(values) {
|
|
483
583
|
const lastElement = values[values.length - 1];
|
|
@@ -488,37 +588,28 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
488
588
|
}
|
|
489
589
|
await this.confirmSelection();
|
|
490
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
|
+
}
|
|
491
595
|
async selectOption(inputEl, value, lastElement) {
|
|
492
596
|
await inputEl.sendKeys(value);
|
|
493
|
-
await
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
await click(optElement, this.driver);
|
|
497
|
-
return true;
|
|
498
|
-
} catch (e) {
|
|
499
|
-
return false;
|
|
500
|
-
}
|
|
501
|
-
});
|
|
597
|
+
const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
|
|
598
|
+
await click(optElement, this.driver);
|
|
599
|
+
await this.waitOptionSelection();
|
|
502
600
|
if (value !== lastElement) {
|
|
503
601
|
await inputEl.clear();
|
|
504
602
|
}
|
|
505
603
|
}
|
|
506
604
|
async confirmSelection() {
|
|
507
|
-
const
|
|
508
|
-
const option = await inputEl.findElement(import_selenium_webdriver10.By.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
|
|
509
|
-
const btnOk = await this.driver.findElement(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR));
|
|
510
|
-
await this.driver.wait(async () => {
|
|
511
|
-
return await option.getAttribute("aria-selected") === "true";
|
|
512
|
-
});
|
|
605
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
|
|
513
606
|
await click(btnOk, this.driver);
|
|
514
607
|
}
|
|
515
608
|
async getTagBoxInputValue() {
|
|
516
609
|
if (await this.isTagBoxEmpty()) {
|
|
517
610
|
return [];
|
|
518
611
|
}
|
|
519
|
-
const
|
|
520
|
-
const inputEl = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAG_CONTAINER));
|
|
521
|
-
const tags = await inputEl.findElements(import_selenium_webdriver10.By.css(TAGS_SELECTOR));
|
|
612
|
+
const tags = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`));
|
|
522
613
|
const values = [];
|
|
523
614
|
for (const tag of tags) {
|
|
524
615
|
const text = await tag.getText();
|
|
@@ -527,9 +618,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
527
618
|
return values;
|
|
528
619
|
}
|
|
529
620
|
async isTagBoxEmpty() {
|
|
530
|
-
const
|
|
531
|
-
const tagboxContainer = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAGBOX));
|
|
532
|
-
const classAttribute = await tagboxContainer.getAttribute("class");
|
|
621
|
+
const classAttribute = await this.getClasses();
|
|
533
622
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
534
623
|
}
|
|
535
624
|
async getValue() {
|
|
@@ -548,28 +637,25 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
548
637
|
if (!tagExists) {
|
|
549
638
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
550
639
|
}
|
|
551
|
-
const
|
|
552
|
-
const
|
|
553
|
-
const clearBtnTestId = byTestId(`clear-button-${itemText}`);
|
|
554
|
-
const clearBtn = await inputEl.findElement(clearBtnTestId);
|
|
640
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
641
|
+
const clearBtn = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`));
|
|
555
642
|
await click(clearBtn, this.driver);
|
|
556
643
|
}
|
|
557
644
|
};
|
|
558
645
|
|
|
559
646
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
560
|
-
var
|
|
647
|
+
var import_selenium_webdriver12 = require("selenium-webdriver");
|
|
561
648
|
var ITEM_CLASS = "dx-buttongroup-item";
|
|
562
649
|
var SELECTED_CLASS = "dx-state-selected";
|
|
563
|
-
var ButtonGroup = class extends
|
|
564
|
-
|
|
565
|
-
return
|
|
650
|
+
var ButtonGroup = class extends AbstractElementWithParent {
|
|
651
|
+
getItems() {
|
|
652
|
+
return this.driver.findElements(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
566
653
|
}
|
|
567
654
|
getDataValue(el) {
|
|
568
655
|
return el.getAttribute("data-value");
|
|
569
656
|
}
|
|
570
657
|
async getValue() {
|
|
571
|
-
const
|
|
572
|
-
const selectedEl = await inputEl.findElement(import_selenium_webdriver11.By.className(`${ITEM_CLASS} ${SELECTED_CLASS}`));
|
|
658
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
573
659
|
return this.getDataValue(selectedEl);
|
|
574
660
|
}
|
|
575
661
|
async setValue(value) {
|
|
@@ -603,19 +689,14 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
603
689
|
};
|
|
604
690
|
|
|
605
691
|
// src/pageObjects/elements/Editors/DateEditor.ts
|
|
606
|
-
var
|
|
692
|
+
var import_selenium_webdriver13 = require("selenium-webdriver");
|
|
607
693
|
var DateEditor = class extends AbstractDXEditorWithInput {
|
|
608
|
-
constructor(
|
|
609
|
-
super(
|
|
694
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
695
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
610
696
|
this.setClearStrategy(new InputClearStrategy());
|
|
611
697
|
}
|
|
612
|
-
async getControlElement() {
|
|
613
|
-
const controlEl = await this.getElement();
|
|
614
|
-
return controlEl.findElement(import_selenium_webdriver12.By.className("dx-dropdowneditor-input-wrapper"));
|
|
615
|
-
}
|
|
616
698
|
async getDateElement() {
|
|
617
|
-
|
|
618
|
-
return controlEl.findElement(import_selenium_webdriver12.By.css("input[type=hidden]"));
|
|
699
|
+
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
619
700
|
}
|
|
620
701
|
async setDateValue(value) {
|
|
621
702
|
const dateEl = await this.getInputElement();
|
|
@@ -625,8 +706,8 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
625
706
|
const keys = day + month + year;
|
|
626
707
|
await click(dateEl, this.driver);
|
|
627
708
|
const actions = this.driver.actions({ async: true });
|
|
628
|
-
await actions.move({ origin: dateEl }).sendKeys(
|
|
629
|
-
await actions.move({ origin: dateEl }).sendKeys(keys,
|
|
709
|
+
await actions.move({ origin: dateEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
|
|
710
|
+
await actions.move({ origin: dateEl }).sendKeys(keys, import_selenium_webdriver13.Key.ENTER).perform();
|
|
630
711
|
}
|
|
631
712
|
async getDateValue() {
|
|
632
713
|
const inputEl = await this.getDateElement();
|
|
@@ -645,54 +726,39 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
645
726
|
};
|
|
646
727
|
|
|
647
728
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
648
|
-
var editorFactory = async (
|
|
649
|
-
const elementInstance = new AbstractFormElement(
|
|
729
|
+
var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
730
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
650
731
|
const classSting = await elementInstance.getClasses();
|
|
651
732
|
if (classSting.includes("text-control"))
|
|
652
|
-
return new TextEditor(
|
|
733
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
653
734
|
if (classSting.includes("number-control"))
|
|
654
|
-
return new NumberEditor(
|
|
735
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
655
736
|
if (classSting.includes("check-box"))
|
|
656
|
-
return new CheckBox(
|
|
737
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
657
738
|
if (classSting.includes("multi-select-control"))
|
|
658
|
-
return new TagBox(
|
|
739
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
659
740
|
if (classSting.includes("select-control"))
|
|
660
|
-
return new SelectBoxEditor(
|
|
741
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
661
742
|
if (classSting.includes("switch-control"))
|
|
662
|
-
return new SwitchEditor(
|
|
743
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
663
744
|
if (classSting.includes("date-control"))
|
|
664
|
-
return new DateEditor(
|
|
745
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
665
746
|
if (classSting.includes("buttons-group"))
|
|
666
|
-
return new BooleanSelector(
|
|
747
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
667
748
|
if (classSting.includes("button-group-field"))
|
|
668
|
-
return new ButtonGroup(
|
|
749
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
669
750
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
670
751
|
};
|
|
671
752
|
|
|
672
|
-
// src/
|
|
673
|
-
|
|
674
|
-
return `${formName}-${itemType}-${itemName}`;
|
|
675
|
-
}
|
|
676
|
-
function createFieldTestId(formName, itemName) {
|
|
677
|
-
return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
|
|
678
|
-
}
|
|
679
|
-
function createGroupTestId(formName, itemName) {
|
|
680
|
-
return createDataTestId(formName, "group" /* GROUP */, itemName);
|
|
681
|
-
}
|
|
682
|
-
function createTableId(formName) {
|
|
683
|
-
return `${"table" /* TABLE */}-${formName}`;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
// src/pageObjects/elements/FormField.ts
|
|
687
|
-
var FormField = class extends AbstractElementWithParent {
|
|
753
|
+
// src/pageObjects/elements/AbstractEditor.ts
|
|
754
|
+
var AbstractEditor = class extends AbstractElementWithParent {
|
|
688
755
|
editor;
|
|
689
|
-
constructor(
|
|
690
|
-
super(
|
|
691
|
-
this.elementBy = byTestId(createFieldTestId(formName, name));
|
|
756
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
757
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
692
758
|
}
|
|
693
759
|
async initEditor() {
|
|
694
760
|
if (!this.editor) {
|
|
695
|
-
this.editor = await editorFactory(this.
|
|
761
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
696
762
|
}
|
|
697
763
|
}
|
|
698
764
|
/**
|
|
@@ -741,37 +807,43 @@ var FormField = class extends AbstractElementWithParent {
|
|
|
741
807
|
}
|
|
742
808
|
};
|
|
743
809
|
|
|
744
|
-
// src/pageObjects/elements/
|
|
745
|
-
var
|
|
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
|
+
}
|
|
746
815
|
};
|
|
747
816
|
|
|
748
|
-
// src/pageObjects/elements/Groups/
|
|
749
|
-
var
|
|
817
|
+
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
818
|
+
var AbstractGroup = class extends AbstractElementWithParent {
|
|
750
819
|
async isDisplayed() {
|
|
751
820
|
const groupElement = await this.getElement();
|
|
752
821
|
return await groupElement.isDisplayed();
|
|
753
822
|
}
|
|
754
823
|
};
|
|
755
824
|
|
|
825
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
826
|
+
var Panel = class extends AbstractGroup {
|
|
827
|
+
};
|
|
828
|
+
|
|
756
829
|
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
757
|
-
var groupFactory = async (
|
|
758
|
-
const elementInstance = new AbstractFormElement(
|
|
830
|
+
var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
831
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
759
832
|
const classSting = await elementInstance.getClasses();
|
|
760
833
|
if (classSting.includes("panel-group"))
|
|
761
|
-
return new Panel(
|
|
834
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
762
835
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
763
836
|
};
|
|
764
837
|
|
|
765
838
|
// src/pageObjects/elements/FormGroup.ts
|
|
766
839
|
var FormGroup = class extends AbstractElementWithParent {
|
|
767
840
|
editor;
|
|
768
|
-
constructor(
|
|
769
|
-
super(
|
|
770
|
-
this.elementBy = byTestId(createGroupTestId(formName, name));
|
|
841
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
842
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
771
843
|
}
|
|
772
844
|
async initEditor() {
|
|
773
845
|
if (!this.editor) {
|
|
774
|
-
this.editor = await groupFactory(this.
|
|
846
|
+
this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
775
847
|
}
|
|
776
848
|
}
|
|
777
849
|
/**
|
|
@@ -780,17 +852,21 @@ var FormGroup = class extends AbstractElementWithParent {
|
|
|
780
852
|
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
781
853
|
*/
|
|
782
854
|
async isDisplayed() {
|
|
783
|
-
|
|
784
|
-
|
|
855
|
+
try {
|
|
856
|
+
await this.initEditor();
|
|
857
|
+
return this.editor.isDisplayed();
|
|
858
|
+
} catch {
|
|
859
|
+
return false;
|
|
860
|
+
}
|
|
785
861
|
}
|
|
786
862
|
};
|
|
787
863
|
|
|
788
864
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
789
865
|
var FormEdit = class extends AbstractForm {
|
|
790
|
-
saveButtonBy =
|
|
866
|
+
saveButtonBy = import_selenium_webdriver14.By.id("button-save");
|
|
791
867
|
constructor(driver) {
|
|
792
868
|
super(driver);
|
|
793
|
-
this.
|
|
869
|
+
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
794
870
|
}
|
|
795
871
|
/**
|
|
796
872
|
* Находит поле формы редактирования по имени
|
|
@@ -800,7 +876,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
800
876
|
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
801
877
|
*/
|
|
802
878
|
field(name) {
|
|
803
|
-
return new FormField(this.
|
|
879
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.driver);
|
|
804
880
|
}
|
|
805
881
|
/**
|
|
806
882
|
* Проверяет не отключена ли кнопка Сохранить
|
|
@@ -822,7 +898,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
822
898
|
* expect(await formEdit.group('Name');
|
|
823
899
|
*/
|
|
824
900
|
group(name) {
|
|
825
|
-
return new FormGroup(this.
|
|
901
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
826
902
|
}
|
|
827
903
|
/**
|
|
828
904
|
* Нажатие на кнопку Сохранить
|
|
@@ -833,50 +909,67 @@ var FormEdit = class extends AbstractForm {
|
|
|
833
909
|
*/
|
|
834
910
|
async saveButtonClick() {
|
|
835
911
|
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
836
|
-
await
|
|
912
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
837
913
|
await click(saveButton, this.driver);
|
|
838
914
|
}
|
|
839
915
|
};
|
|
840
916
|
|
|
841
|
-
// src/pageObjects/elements/
|
|
917
|
+
// src/pageObjects/elements/Table/Table.ts
|
|
842
918
|
var import_selenium_webdriver19 = require("selenium-webdriver");
|
|
843
919
|
|
|
844
|
-
// src/pageObjects/elements/Table/
|
|
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
|
|
845
924
|
var import_selenium_webdriver16 = require("selenium-webdriver");
|
|
846
925
|
|
|
847
926
|
// src/pageObjects/elements/Table/utils.ts
|
|
848
|
-
var
|
|
849
|
-
|
|
850
|
-
return
|
|
851
|
-
}
|
|
927
|
+
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
928
|
+
function getCssRowByIndexSelector(index) {
|
|
929
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
930
|
+
}
|
|
852
931
|
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
853
|
-
var getColumnPathByIndex = (index) => {
|
|
854
|
-
return import_selenium_webdriver14.By.css(getColumnByIndexCssSelector(index));
|
|
855
|
-
};
|
|
856
932
|
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
857
|
-
var
|
|
858
|
-
|
|
859
|
-
}
|
|
933
|
+
var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
934
|
+
function getCssCellByIndexSelector(index) {
|
|
935
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
936
|
+
}
|
|
860
937
|
var transformInputIndex = (index) => index + 1;
|
|
861
938
|
var transformOutputIndex = (index) => +index - 1;
|
|
862
939
|
|
|
863
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
864
|
-
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
865
|
-
|
|
866
940
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
867
941
|
var Cell = class extends AbstractElementWithParent {
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
this.
|
|
942
|
+
_index;
|
|
943
|
+
getCellIndex;
|
|
944
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
945
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
946
|
+
this.getCellIndex = getCellIndex;
|
|
947
|
+
this._index = index;
|
|
948
|
+
}
|
|
949
|
+
set index(index) {
|
|
950
|
+
this._index = index;
|
|
951
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
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
|
+
}
|
|
957
|
+
async getElement() {
|
|
958
|
+
if (this._index == null) {
|
|
959
|
+
this.index = await this.getCellIndex();
|
|
960
|
+
}
|
|
961
|
+
return super.getElement();
|
|
873
962
|
}
|
|
874
963
|
async getValue() {
|
|
875
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
|
+
}
|
|
876
969
|
return cellEl.getText();
|
|
877
970
|
}
|
|
878
971
|
getIndex() {
|
|
879
|
-
return this.
|
|
972
|
+
return this._index;
|
|
880
973
|
}
|
|
881
974
|
};
|
|
882
975
|
|
|
@@ -886,51 +979,46 @@ var DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
|
886
979
|
var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
887
980
|
var Row = class extends AbstractElementWithParent {
|
|
888
981
|
index;
|
|
889
|
-
|
|
890
|
-
constructor(
|
|
891
|
-
super(
|
|
982
|
+
getColumnBy;
|
|
983
|
+
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
984
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
892
985
|
this.index = index;
|
|
893
|
-
this.
|
|
894
|
-
this.getColumnByCaption = getColumnByCaption;
|
|
986
|
+
this.getColumnBy = getColumnBy;
|
|
895
987
|
}
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
return new Cell(rowEl, index, this.driver);
|
|
901
|
-
}
|
|
902
|
-
throw new Error(`Cannot find cell by index: ${index}`);
|
|
988
|
+
_getCell({ index, name, title }) {
|
|
989
|
+
return new Cell(this.getFullCssSelector(), () => {
|
|
990
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
991
|
+
}, index, this.driver);
|
|
903
992
|
}
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
993
|
+
getCellByIndex(index) {
|
|
994
|
+
return this._getCell({ index });
|
|
995
|
+
}
|
|
996
|
+
getCell(name) {
|
|
997
|
+
return this._getCell({ name });
|
|
998
|
+
}
|
|
999
|
+
getCellByTitle(title) {
|
|
1000
|
+
return this._getCell({ title });
|
|
911
1001
|
}
|
|
912
1002
|
async select() {
|
|
913
1003
|
const rowEl = await this.getElement();
|
|
914
1004
|
await click(rowEl, this.driver);
|
|
915
|
-
await
|
|
916
|
-
const classes = await
|
|
1005
|
+
await wait(async () => {
|
|
1006
|
+
const classes = await this.getClasses();
|
|
917
1007
|
return classes.includes(DX_SELECTION_CLASS);
|
|
918
|
-
},
|
|
1008
|
+
}, this.driver, "Cannot select row");
|
|
919
1009
|
}
|
|
920
1010
|
async isSelected() {
|
|
921
|
-
const
|
|
922
|
-
const result = await rowEl.getAttribute("aria-selected");
|
|
1011
|
+
const result = await this.getAttribute("aria-selected");
|
|
923
1012
|
return result === "true";
|
|
924
1013
|
}
|
|
925
1014
|
getIndex() {
|
|
926
1015
|
return this.index;
|
|
927
1016
|
}
|
|
928
1017
|
async getCells() {
|
|
929
|
-
const
|
|
930
|
-
const cells = await rowEl.findElements(import_selenium_webdriver15.By.css(`td[role="gridcell"]`));
|
|
1018
|
+
const cells = await this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
931
1019
|
const result = [];
|
|
932
1020
|
cells.forEach((_, index) => {
|
|
933
|
-
const newCell =
|
|
1021
|
+
const newCell = this.getCellByIndex(index);
|
|
934
1022
|
result.push(newCell);
|
|
935
1023
|
});
|
|
936
1024
|
return result;
|
|
@@ -938,15 +1026,13 @@ var Row = class extends AbstractElementWithParent {
|
|
|
938
1026
|
async clickInlineButton(buttonClass) {
|
|
939
1027
|
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
940
1028
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
|
|
941
|
-
const button =
|
|
942
|
-
import_selenium_webdriver15.By.css(`${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
943
|
-
);
|
|
1029
|
+
const button = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
|
|
944
1030
|
return click(button, this.driver);
|
|
945
1031
|
}
|
|
946
1032
|
async checkEditingMode(isEditing, msg) {
|
|
947
|
-
await
|
|
1033
|
+
await wait(async () => {
|
|
948
1034
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
949
|
-
},
|
|
1035
|
+
}, this.driver, msg);
|
|
950
1036
|
}
|
|
951
1037
|
async edit() {
|
|
952
1038
|
await this.clickInlineButton("edit");
|
|
@@ -963,86 +1049,119 @@ var Row = class extends AbstractElementWithParent {
|
|
|
963
1049
|
};
|
|
964
1050
|
|
|
965
1051
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
1052
|
+
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1053
|
+
var getHeaderCssSelector = () => {
|
|
1054
|
+
return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
1055
|
+
};
|
|
966
1056
|
var Column = class extends AbstractElementWithParent {
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
1057
|
+
_index;
|
|
1058
|
+
_caption;
|
|
1059
|
+
_name;
|
|
1060
|
+
constructor({ parentCssSelector, name, caption, index, driver }) {
|
|
1061
|
+
super(parentCssSelector, "", driver);
|
|
1062
|
+
this._name = name;
|
|
970
1063
|
this.index = index;
|
|
971
|
-
this.
|
|
1064
|
+
this._caption = caption;
|
|
1065
|
+
}
|
|
1066
|
+
set index(index) {
|
|
1067
|
+
this._index = index;
|
|
1068
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
1069
|
+
}
|
|
1070
|
+
get index() {
|
|
1071
|
+
return this._index;
|
|
1072
|
+
}
|
|
1073
|
+
async getElement() {
|
|
1074
|
+
await this.getIndex();
|
|
1075
|
+
return super.getElement();
|
|
1076
|
+
}
|
|
1077
|
+
async getColumnHeaderIndexBy(cssSelector) {
|
|
1078
|
+
const column = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${cssSelector}`));
|
|
1079
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
1080
|
+
}
|
|
1081
|
+
async getIndexByCaption() {
|
|
1082
|
+
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
1083
|
+
}
|
|
1084
|
+
async getIndexByName() {
|
|
1085
|
+
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
972
1086
|
}
|
|
973
1087
|
async caption() {
|
|
974
1088
|
const el = await this.getElement();
|
|
975
1089
|
return el.getText();
|
|
976
1090
|
}
|
|
977
|
-
getIndex() {
|
|
978
|
-
|
|
1091
|
+
async getIndex() {
|
|
1092
|
+
if (this.index != null) {
|
|
1093
|
+
return this.index;
|
|
1094
|
+
}
|
|
1095
|
+
if (this._caption != null) {
|
|
1096
|
+
this.index = await this.getIndexByCaption();
|
|
1097
|
+
return this.index;
|
|
1098
|
+
}
|
|
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");
|
|
979
1104
|
}
|
|
980
1105
|
};
|
|
981
1106
|
|
|
982
1107
|
// src/pageObjects/elements/Table/Table.ts
|
|
983
1108
|
var Table = class extends AbstractElementWithParent {
|
|
984
1109
|
formName;
|
|
985
|
-
constructor(
|
|
986
|
-
super(
|
|
987
|
-
this.elementBy = import_selenium_webdriver16.By.id(createTableId(formName));
|
|
1110
|
+
constructor(parentCssSelector, formName, driver) {
|
|
1111
|
+
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
988
1112
|
this.formName = formName;
|
|
989
1113
|
}
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
async getDataGrid() {
|
|
994
|
-
const parentEl = await this.getElement();
|
|
995
|
-
return parentEl.findElement(import_selenium_webdriver16.By.css(`div[role="grid"]`));
|
|
996
|
-
}
|
|
997
|
-
getTableElement = () => {
|
|
998
|
-
return this.getElement();
|
|
999
|
-
};
|
|
1000
|
-
async getRowByIndex(index) {
|
|
1001
|
-
const gridContainer = await this.getDataGrid();
|
|
1002
|
-
const row = await gridContainer.findElement(getRowPathByIndex(index));
|
|
1003
|
-
if (row) {
|
|
1004
|
-
return new Row(this.getTableElement, index, this.driver, this.getColumnByCaption.bind(this));
|
|
1005
|
-
}
|
|
1006
|
-
throw new Error(`Cannot find row by index: ${index}`);
|
|
1007
|
-
}
|
|
1008
|
-
async getColumnByIndex(index) {
|
|
1009
|
-
const column = await (await this.getElement()).findElement(import_selenium_webdriver16.By.css(`${this.getHeaderCssSelector()} ${getColumnByIndexCssSelector(index)}`));
|
|
1010
|
-
if (column) {
|
|
1011
|
-
return new Column(this.getTableElement, index, this.driver);
|
|
1114
|
+
getColumnBy = (args) => {
|
|
1115
|
+
if (args.title) {
|
|
1116
|
+
return this.getColumnByTitle(args.title);
|
|
1012
1117
|
}
|
|
1013
|
-
|
|
1118
|
+
return this.getColumnByName(args.name);
|
|
1119
|
+
};
|
|
1120
|
+
getRowByIndex(index) {
|
|
1121
|
+
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1122
|
+
}
|
|
1123
|
+
getColumnByIndex(index) {
|
|
1124
|
+
return new Column({
|
|
1125
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1126
|
+
driver: this.driver,
|
|
1127
|
+
index
|
|
1128
|
+
});
|
|
1014
1129
|
}
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
|
|
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
|
+
});
|
|
1143
|
+
};
|
|
1144
|
+
selectRowByIndex(index) {
|
|
1145
|
+
return this.getRowByIndex(index).select();
|
|
1030
1146
|
}
|
|
1031
1147
|
async getRows() {
|
|
1032
|
-
const
|
|
1033
|
-
const rows = await gridContainer.findElements(import_selenium_webdriver16.By.className("dx-row dx-data-row"));
|
|
1148
|
+
const rows = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1034
1149
|
const result = [];
|
|
1035
1150
|
rows.forEach((_, index) => {
|
|
1036
|
-
const newRow = new Row(this.
|
|
1151
|
+
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1037
1152
|
result.push(newRow);
|
|
1038
1153
|
});
|
|
1039
1154
|
return result;
|
|
1040
1155
|
}
|
|
1041
1156
|
async getColumns() {
|
|
1042
|
-
const columns = await
|
|
1157
|
+
const columns = await this.driver.findElements(import_selenium_webdriver19.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
|
|
1043
1158
|
const result = [];
|
|
1044
1159
|
columns.forEach((_, index) => {
|
|
1045
|
-
const newCol = new Column(
|
|
1160
|
+
const newCol = new Column({
|
|
1161
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1162
|
+
index,
|
|
1163
|
+
driver: this.driver
|
|
1164
|
+
});
|
|
1046
1165
|
result.push(newCol);
|
|
1047
1166
|
});
|
|
1048
1167
|
return result;
|
|
@@ -1058,54 +1177,229 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1058
1177
|
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
1059
1178
|
*/
|
|
1060
1179
|
field(name) {
|
|
1061
|
-
return new FormField(this.
|
|
1180
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1062
1181
|
}
|
|
1063
1182
|
};
|
|
1064
1183
|
|
|
1065
|
-
// src/pageObjects/elements/TableToolbar/
|
|
1066
|
-
var
|
|
1184
|
+
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
1185
|
+
var AbstractButton = class extends AbstractElementWithParent {
|
|
1186
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1187
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1188
|
+
}
|
|
1189
|
+
async click() {
|
|
1190
|
+
const button = await this.getElement();
|
|
1191
|
+
await wait(async () => {
|
|
1192
|
+
return await button.isDisplayed() && !await this.isDisabled();
|
|
1193
|
+
}, this.driver, this.buttonNotDisplayedError());
|
|
1194
|
+
await click(button, this.driver);
|
|
1195
|
+
}
|
|
1196
|
+
async isDisabled() {
|
|
1197
|
+
const button = await this.getElement();
|
|
1198
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1067
1201
|
|
|
1068
|
-
// src/pageObjects/elements/TableToolbar/
|
|
1069
|
-
var
|
|
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
|
|
1070
1215
|
var TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1071
|
-
var
|
|
1216
|
+
var ToolbarButton = class extends AbstractButton {
|
|
1072
1217
|
name;
|
|
1073
|
-
constructor(
|
|
1074
|
-
super(
|
|
1218
|
+
constructor(parentCssSelector, name, driver) {
|
|
1219
|
+
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1075
1220
|
this.name = name;
|
|
1076
|
-
|
|
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);
|
|
1077
1247
|
}
|
|
1078
1248
|
async click() {
|
|
1079
|
-
|
|
1080
|
-
await this.
|
|
1081
|
-
return await button.isDisplayed() && !await this.isDisabled();
|
|
1082
|
-
}, 1e3, `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`);
|
|
1083
|
-
return click(button, this.driver);
|
|
1249
|
+
await this.init();
|
|
1250
|
+
await this._button.click();
|
|
1084
1251
|
}
|
|
1085
1252
|
async isDisabled() {
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
return result === "true";
|
|
1253
|
+
await this.init();
|
|
1254
|
+
return await this._button.isDisabled();
|
|
1089
1255
|
}
|
|
1090
1256
|
};
|
|
1091
1257
|
|
|
1092
|
-
// src/pageObjects/elements/TableToolbar/
|
|
1258
|
+
// src/pageObjects/elements/TableToolbar/FormToolbar.ts
|
|
1093
1259
|
var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1094
|
-
var
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1260
|
+
var FormToolbar = class extends AbstractElementWithParent {
|
|
1261
|
+
formName;
|
|
1262
|
+
constructor(parentCssSelector, formName, driver) {
|
|
1263
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1264
|
+
this.formName = formName;
|
|
1098
1265
|
}
|
|
1099
|
-
|
|
1100
|
-
return this.
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1266
|
+
button(name) {
|
|
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
|
+
}
|
|
1107
1393
|
}
|
|
1108
|
-
|
|
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);
|
|
1109
1403
|
}
|
|
1110
1404
|
};
|
|
1111
1405
|
|
|
@@ -1113,7 +1407,7 @@ var TableToolbar = class extends AbstractElementWithParent {
|
|
|
1113
1407
|
var ListForm = class extends AbstractForm {
|
|
1114
1408
|
constructor(driver) {
|
|
1115
1409
|
super(driver);
|
|
1116
|
-
this.
|
|
1410
|
+
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
1117
1411
|
}
|
|
1118
1412
|
/**
|
|
1119
1413
|
* Находит таблицу
|
|
@@ -1123,7 +1417,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1123
1417
|
* expect(listForm.table());
|
|
1124
1418
|
*/
|
|
1125
1419
|
table() {
|
|
1126
|
-
return new Table(this.
|
|
1420
|
+
return new Table(this.containerCssSelector, this.formName, this.driver);
|
|
1127
1421
|
}
|
|
1128
1422
|
/**
|
|
1129
1423
|
* Находит группу на лист форме по имени
|
|
@@ -1133,7 +1427,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1133
1427
|
* expect(await formEdit.group('Name');
|
|
1134
1428
|
*/
|
|
1135
1429
|
group(name) {
|
|
1136
|
-
return new FormGroup(this.
|
|
1430
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1137
1431
|
}
|
|
1138
1432
|
/**
|
|
1139
1433
|
* Находит таблицу
|
|
@@ -1143,79 +1437,52 @@ var ListForm = class extends AbstractForm {
|
|
|
1143
1437
|
* expect(listForm.toolbarButton());
|
|
1144
1438
|
*/
|
|
1145
1439
|
toolbarButton(name) {
|
|
1146
|
-
const toolbar = new
|
|
1440
|
+
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1147
1441
|
return toolbar.button(name);
|
|
1148
1442
|
}
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
return webDriver;
|
|
1159
|
-
}
|
|
1160
|
-
|
|
1161
|
-
// src/utils/actions.ts
|
|
1162
|
-
var click = async (webElement, driver) => {
|
|
1163
|
-
driver = driver ?? config().driver;
|
|
1164
|
-
const actions = driver.actions({ async: true });
|
|
1165
|
-
await actions.move({ origin: webElement }).click().perform();
|
|
1166
|
-
};
|
|
1167
|
-
|
|
1168
|
-
// src/pageObjects/pages/LoginPage.ts
|
|
1169
|
-
var LOGIN_PATH = "/login";
|
|
1170
|
-
var LoginPage = class extends AbstractPage {
|
|
1171
|
-
usernameField = byTestId("loginField", "input");
|
|
1172
|
-
passwordField = byTestId("passwordField", "input");
|
|
1173
|
-
loginButton = byTestId("loginButton");
|
|
1174
|
-
async locate() {
|
|
1175
|
-
await super.locate();
|
|
1176
|
-
const login = await this.driver.findElement(this.usernameField);
|
|
1177
|
-
await waitElementIsVisible({
|
|
1178
|
-
element: login,
|
|
1179
|
-
driver: this.driver
|
|
1180
|
-
});
|
|
1181
|
-
}
|
|
1182
|
-
get path() {
|
|
1183
|
-
return LOGIN_PATH;
|
|
1184
|
-
}
|
|
1185
|
-
async enterUsername(username) {
|
|
1186
|
-
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
1187
|
-
}
|
|
1188
|
-
async enterPassword(password) {
|
|
1189
|
-
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
1190
|
-
}
|
|
1191
|
-
async clickLoginButton() {
|
|
1192
|
-
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
1193
|
-
}
|
|
1194
|
-
async loginWith(username, password) {
|
|
1195
|
-
await this.enterUsername(username);
|
|
1196
|
-
await this.enterPassword(password);
|
|
1197
|
-
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);
|
|
1198
1452
|
}
|
|
1199
|
-
|
|
1200
|
-
|
|
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);
|
|
1201
1463
|
}
|
|
1202
1464
|
};
|
|
1203
1465
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1204
1466
|
0 && (module.exports = {
|
|
1205
1467
|
AbstractPage,
|
|
1468
|
+
FilterPanel,
|
|
1206
1469
|
FormEdit,
|
|
1207
1470
|
FormField,
|
|
1471
|
+
FormFilterField,
|
|
1208
1472
|
ListForm,
|
|
1209
1473
|
LoginPage,
|
|
1210
1474
|
NumberEditor,
|
|
1475
|
+
PanelFilterField,
|
|
1211
1476
|
SubsystemsPanel,
|
|
1212
1477
|
TextEditor,
|
|
1213
1478
|
byTestId,
|
|
1479
|
+
byTestIdCssSelector,
|
|
1214
1480
|
click,
|
|
1215
1481
|
config,
|
|
1216
1482
|
createDriver,
|
|
1217
1483
|
editorFactory,
|
|
1218
1484
|
elementIsNotPresent,
|
|
1219
1485
|
signIn,
|
|
1486
|
+
wait,
|
|
1220
1487
|
waitElementIsVisible
|
|
1221
1488
|
});
|