d5-testing-library 1.1.0 → 1.2.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 +271 -304
- package/dist/d5-testing-library.d.ts +58 -37
- package/dist/d5-testing-library.legacy-esm.js +265 -300
- package/dist/d5-testing-library.mjs +265 -300
- package/package.json +1 -1
|
@@ -39,12 +39,14 @@ __export(src_exports, {
|
|
|
39
39
|
SubsystemsPanel: () => SubsystemsPanel,
|
|
40
40
|
TextEditor: () => TextEditor,
|
|
41
41
|
byTestId: () => byTestId,
|
|
42
|
+
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
42
43
|
click: () => click,
|
|
43
44
|
config: () => config,
|
|
44
45
|
createDriver: () => createDriver,
|
|
45
46
|
editorFactory: () => editorFactory,
|
|
46
47
|
elementIsNotPresent: () => elementIsNotPresent,
|
|
47
48
|
signIn: () => signIn,
|
|
49
|
+
wait: () => wait,
|
|
48
50
|
waitElementIsVisible: () => waitElementIsVisible
|
|
49
51
|
});
|
|
50
52
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -128,8 +130,11 @@ var AbstractPage = class extends AbstractElement {
|
|
|
128
130
|
|
|
129
131
|
// src/utils/locators.ts
|
|
130
132
|
var import_selenium_webdriver = require("selenium-webdriver");
|
|
133
|
+
var byTestIdCssSelector = (testId, element = "div") => {
|
|
134
|
+
return `${element}[data-testid="${testId}"]`;
|
|
135
|
+
};
|
|
131
136
|
var byTestId = (testId, element = "div") => {
|
|
132
|
-
return import_selenium_webdriver.By.css(
|
|
137
|
+
return import_selenium_webdriver.By.css(byTestIdCssSelector(testId, element));
|
|
133
138
|
};
|
|
134
139
|
|
|
135
140
|
// src/utils/createDriver.ts
|
|
@@ -153,36 +158,55 @@ var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
|
153
158
|
|
|
154
159
|
// src/utils/waitElementIsVisible.ts
|
|
155
160
|
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
156
|
-
|
|
161
|
+
|
|
162
|
+
// src/utils/wait.ts
|
|
163
|
+
async function wait(condition, driver, errorMessage, timeout) {
|
|
164
|
+
driver = driver ?? config().driver;
|
|
165
|
+
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/utils/waitElementIsVisible.ts
|
|
169
|
+
async function waitElementIsVisible({
|
|
170
|
+
element,
|
|
171
|
+
timeout,
|
|
172
|
+
errorMessage,
|
|
173
|
+
driver
|
|
174
|
+
}) {
|
|
157
175
|
driver = driver ?? config().driver;
|
|
158
176
|
const condition = import_selenium_webdriver4.until.elementIsVisible(element);
|
|
159
|
-
await
|
|
177
|
+
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
160
178
|
}
|
|
161
179
|
|
|
162
180
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
181
|
+
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
163
182
|
var AbstractElementWithParent = class extends AbstractElement {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
constructor(
|
|
183
|
+
elementCssSelector;
|
|
184
|
+
parentCssSelector;
|
|
185
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
167
186
|
super(driver);
|
|
168
|
-
this.
|
|
187
|
+
this.parentCssSelector = parentCssSelector;
|
|
188
|
+
this.elementCssSelector = elementCssSelector;
|
|
189
|
+
}
|
|
190
|
+
getFullCssSelector() {
|
|
191
|
+
if (!this.elementCssSelector) {
|
|
192
|
+
return this.parentCssSelector;
|
|
193
|
+
}
|
|
194
|
+
if (!this.parentCssSelector) {
|
|
195
|
+
return this.elementCssSelector;
|
|
196
|
+
}
|
|
197
|
+
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
169
198
|
}
|
|
170
199
|
async getElement() {
|
|
171
|
-
|
|
172
|
-
await waitElementIsVisible({
|
|
173
|
-
element: parentEl,
|
|
174
|
-
driver: this.driver
|
|
175
|
-
});
|
|
176
|
-
const el = await parentEl.findElement(this.elementBy);
|
|
177
|
-
await waitElementIsVisible({
|
|
178
|
-
element: el,
|
|
179
|
-
driver: this.driver
|
|
180
|
-
});
|
|
181
|
-
return el;
|
|
200
|
+
return this.driver.findElement(import_selenium_webdriver5.By.css(this.getFullCssSelector()));
|
|
182
201
|
}
|
|
183
202
|
async getAttribute(attr) {
|
|
184
|
-
const
|
|
185
|
-
|
|
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);
|
|
186
210
|
}
|
|
187
211
|
async getClasses() {
|
|
188
212
|
return await this.getAttribute("class");
|
|
@@ -190,39 +214,36 @@ var AbstractElementWithParent = class extends AbstractElement {
|
|
|
190
214
|
};
|
|
191
215
|
|
|
192
216
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
217
|
+
var import_selenium_webdriver6 = require("selenium-webdriver");
|
|
193
218
|
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
194
|
-
titleBy = byTestId("subsystems-panel-title", "span");
|
|
195
219
|
async title() {
|
|
196
|
-
|
|
197
|
-
return panel.findElement(this.titleBy);
|
|
220
|
+
return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
|
|
198
221
|
}
|
|
199
222
|
};
|
|
200
223
|
|
|
201
224
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
202
|
-
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
203
225
|
var SubsystemsPanel = class extends AbstractElement {
|
|
204
|
-
panelBy = import_selenium_webdriver5.By.id("aside");
|
|
205
226
|
header;
|
|
206
227
|
constructor(driver) {
|
|
207
228
|
super(driver);
|
|
208
|
-
this.header = new SubsystemsPanelHeader(
|
|
229
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
209
230
|
}
|
|
210
|
-
panelElement = () => {
|
|
211
|
-
return this.driver.findElement(this.panelBy);
|
|
212
|
-
};
|
|
213
231
|
headerTitle() {
|
|
214
232
|
return this.header.title().then((el) => el.getText());
|
|
215
233
|
}
|
|
216
234
|
};
|
|
217
235
|
|
|
218
236
|
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
219
|
-
var
|
|
237
|
+
var import_selenium_webdriver7 = require("selenium-webdriver");
|
|
220
238
|
var AbstractForm = class extends AbstractPage {
|
|
239
|
+
containerCssSelector = "";
|
|
221
240
|
containerBy;
|
|
222
|
-
|
|
241
|
+
popupContainerCssSelector;
|
|
223
242
|
constructor(driver) {
|
|
224
243
|
super(driver);
|
|
225
|
-
|
|
244
|
+
const testId = `form-content-wrapper-${this.formName}`;
|
|
245
|
+
this.containerBy = byTestId(testId);
|
|
246
|
+
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
226
247
|
}
|
|
227
248
|
async isModal() {
|
|
228
249
|
const el = await this.getContainerElement();
|
|
@@ -245,7 +266,7 @@ var AbstractForm = class extends AbstractPage {
|
|
|
245
266
|
*/
|
|
246
267
|
async exists() {
|
|
247
268
|
try {
|
|
248
|
-
await
|
|
269
|
+
await wait(elementIsNotPresent(this.containerBy), this.driver);
|
|
249
270
|
return false;
|
|
250
271
|
} catch {
|
|
251
272
|
return true;
|
|
@@ -260,29 +281,19 @@ var AbstractForm = class extends AbstractPage {
|
|
|
260
281
|
*/
|
|
261
282
|
async getTitleText() {
|
|
262
283
|
if (await this.isModal()) {
|
|
263
|
-
const
|
|
264
|
-
const titleEl2 = await popupEl.findElement(import_selenium_webdriver6.By.className("popup-title"));
|
|
284
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
265
285
|
return titleEl2.getText();
|
|
266
286
|
}
|
|
267
|
-
let
|
|
268
|
-
let titleEl = await container.findElement(import_selenium_webdriver6.By.className("form-toolbar-name-container"));
|
|
287
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver7.By.css(`${this.containerCssSelector} .form-toolbar-name-container`));
|
|
269
288
|
return titleEl.getText();
|
|
270
289
|
}
|
|
271
290
|
};
|
|
272
291
|
|
|
273
292
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
274
|
-
var
|
|
293
|
+
var import_selenium_webdriver14 = require("selenium-webdriver");
|
|
275
294
|
|
|
276
295
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
277
|
-
var
|
|
278
|
-
|
|
279
|
-
// src/pageObjects/AbstractFormElement.ts
|
|
280
|
-
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
281
|
-
constructor(getParentElement, elementBy, driver) {
|
|
282
|
-
super(getParentElement, driver);
|
|
283
|
-
this.elementBy = elementBy;
|
|
284
|
-
}
|
|
285
|
-
};
|
|
296
|
+
var import_selenium_webdriver8 = require("selenium-webdriver");
|
|
286
297
|
|
|
287
298
|
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
288
299
|
var InputClearStrategy = class {
|
|
@@ -293,14 +304,16 @@ var InputClearStrategy = class {
|
|
|
293
304
|
};
|
|
294
305
|
|
|
295
306
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
296
|
-
var AbstractDXEditorWithInput = class extends
|
|
307
|
+
var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
297
308
|
clearStrategy = new InputClearStrategy();
|
|
298
309
|
setClearStrategy(strategy) {
|
|
299
310
|
this.clearStrategy = strategy;
|
|
300
311
|
}
|
|
312
|
+
getInputCssSelector() {
|
|
313
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
314
|
+
}
|
|
301
315
|
async getInputElement() {
|
|
302
|
-
|
|
303
|
-
return controlEl.findElement(import_selenium_webdriver7.By.className("dx-texteditor-input"));
|
|
316
|
+
return this.driver.findElement(import_selenium_webdriver8.By.css(this.getInputCssSelector()));
|
|
304
317
|
}
|
|
305
318
|
async getInputValue() {
|
|
306
319
|
const inputEl = await this.getInputElement();
|
|
@@ -309,7 +322,7 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
|
|
|
309
322
|
async setInputValue(value) {
|
|
310
323
|
const inputEl = await this.getInputElement();
|
|
311
324
|
await click(inputEl, this.driver);
|
|
312
|
-
await inputEl.sendKeys(value,
|
|
325
|
+
await inputEl.sendKeys(value, import_selenium_webdriver8.Key.ENTER);
|
|
313
326
|
}
|
|
314
327
|
async clear() {
|
|
315
328
|
await this.clearStrategy.clear(this);
|
|
@@ -318,8 +331,8 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
|
|
|
318
331
|
|
|
319
332
|
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
320
333
|
var TextEditor = class extends AbstractDXEditorWithInput {
|
|
321
|
-
constructor(
|
|
322
|
-
super(
|
|
334
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
335
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
323
336
|
this.setClearStrategy(new InputClearStrategy());
|
|
324
337
|
}
|
|
325
338
|
getValue() {
|
|
@@ -332,8 +345,8 @@ var TextEditor = class extends AbstractDXEditorWithInput {
|
|
|
332
345
|
|
|
333
346
|
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
334
347
|
var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
335
|
-
constructor(
|
|
336
|
-
super(
|
|
348
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
349
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
337
350
|
this.setClearStrategy(new InputClearStrategy());
|
|
338
351
|
}
|
|
339
352
|
async getValue() {
|
|
@@ -345,11 +358,17 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
|
345
358
|
}
|
|
346
359
|
};
|
|
347
360
|
|
|
361
|
+
// src/pageObjects/AbstractFormElement.ts
|
|
362
|
+
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
363
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
364
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
|
|
348
368
|
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
349
|
-
var CheckBox = class extends
|
|
369
|
+
var CheckBox = class extends AbstractElementWithParent {
|
|
350
370
|
async getValue() {
|
|
351
|
-
const
|
|
352
|
-
const result = await inputEl.getAttribute("aria-checked");
|
|
371
|
+
const result = await this.getAttribute("aria-checked");
|
|
353
372
|
if (result === "true")
|
|
354
373
|
return 1;
|
|
355
374
|
if (result === "false")
|
|
@@ -366,7 +385,7 @@ var CheckBox = class extends AbstractFormElement {
|
|
|
366
385
|
};
|
|
367
386
|
|
|
368
387
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
369
|
-
var
|
|
388
|
+
var import_selenium_webdriver10 = require("selenium-webdriver");
|
|
370
389
|
|
|
371
390
|
// src/utils/xpathHelper.ts
|
|
372
391
|
var XPathHelper = class {
|
|
@@ -379,28 +398,28 @@ var XPathHelper = class {
|
|
|
379
398
|
};
|
|
380
399
|
|
|
381
400
|
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
382
|
-
var
|
|
401
|
+
var import_selenium_webdriver9 = require("selenium-webdriver");
|
|
383
402
|
var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
384
403
|
var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
385
404
|
var ClearButtonStrategy = class {
|
|
386
405
|
editorContainerClass;
|
|
387
|
-
|
|
406
|
+
_driver;
|
|
407
|
+
constructor(editorContainerClass, driver) {
|
|
388
408
|
this.editorContainerClass = editorContainerClass;
|
|
409
|
+
this._driver = driver;
|
|
389
410
|
}
|
|
390
|
-
async isEmptyEditorField(
|
|
391
|
-
const
|
|
392
|
-
const editorContainer = await parentEl.findElement(import_selenium_webdriver8.By.className(this.editorContainerClass));
|
|
411
|
+
async isEmptyEditorField() {
|
|
412
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver9.By.css(this.editorContainerClass));
|
|
393
413
|
const classAttribute = await editorContainer.getAttribute("class");
|
|
394
414
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
395
415
|
}
|
|
396
|
-
async clear(
|
|
397
|
-
if (await this.isEmptyEditorField(
|
|
416
|
+
async clear() {
|
|
417
|
+
if (await this.isEmptyEditorField()) {
|
|
398
418
|
throw new Error("This field is already empty");
|
|
399
419
|
}
|
|
400
|
-
const clearBtnSelector =
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
await click(clearBtn, editor.driver);
|
|
420
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
421
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver9.By.css(clearBtnSelector));
|
|
422
|
+
await click(clearBtn, this._driver);
|
|
404
423
|
}
|
|
405
424
|
};
|
|
406
425
|
|
|
@@ -411,25 +430,17 @@ var combinedValueXpath = (value) => `${XPathHelper.getRoleXpath(SELECT_BOX_ELEME
|
|
|
411
430
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS,
|
|
412
431
|
value
|
|
413
432
|
)}`;
|
|
414
|
-
var DX_SELECTBOX = "dx-selectbox";
|
|
415
433
|
var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
416
|
-
constructor(
|
|
417
|
-
super(
|
|
418
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
434
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
435
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
436
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
419
437
|
}
|
|
420
438
|
async setSelectInputValue(value) {
|
|
421
439
|
const inputEl = await this.getInputElement();
|
|
422
440
|
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);
|
|
441
|
+
await inputEl.sendKeys(value, import_selenium_webdriver10.Key.ENTER);
|
|
442
|
+
const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
|
|
443
|
+
await click(optElement, this.driver);
|
|
433
444
|
}
|
|
434
445
|
async getValue() {
|
|
435
446
|
const value = await super.getInputValue();
|
|
@@ -441,10 +452,9 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
|
441
452
|
};
|
|
442
453
|
|
|
443
454
|
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
444
|
-
var SwitchEditor = class extends
|
|
455
|
+
var SwitchEditor = class extends AbstractElementWithParent {
|
|
445
456
|
async getValue() {
|
|
446
|
-
const
|
|
447
|
-
const result = await inputEl.getAttribute("aria-label");
|
|
457
|
+
const result = await this.getAttribute("aria-label");
|
|
448
458
|
if (result === "ON")
|
|
449
459
|
return 1;
|
|
450
460
|
if (result === "OFF")
|
|
@@ -457,27 +467,27 @@ var SwitchEditor = class extends AbstractFormElement {
|
|
|
457
467
|
}
|
|
458
468
|
const inputEl = await this.getElement();
|
|
459
469
|
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
|
-
});
|
|
470
|
+
if (currentValue === value) {
|
|
471
|
+
return;
|
|
466
472
|
}
|
|
473
|
+
await click(inputEl, this.driver);
|
|
474
|
+
await wait(async () => {
|
|
475
|
+
const updatedValue = await this.getValue();
|
|
476
|
+
return updatedValue !== currentValue;
|
|
477
|
+
}, this.driver);
|
|
467
478
|
}
|
|
468
479
|
};
|
|
469
480
|
|
|
470
481
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
471
|
-
var
|
|
482
|
+
var import_selenium_webdriver11 = require("selenium-webdriver");
|
|
472
483
|
var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
473
484
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
474
|
-
var DX_TAGBOX = "dx-tagbox";
|
|
475
485
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
476
486
|
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
477
487
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
478
|
-
constructor(
|
|
479
|
-
super(
|
|
480
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
488
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
489
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
490
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
481
491
|
}
|
|
482
492
|
async setTagBoxInputValue(values) {
|
|
483
493
|
const lastElement = values[values.length - 1];
|
|
@@ -490,35 +500,26 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
490
500
|
}
|
|
491
501
|
async selectOption(inputEl, value, lastElement) {
|
|
492
502
|
await inputEl.sendKeys(value);
|
|
493
|
-
await
|
|
494
|
-
|
|
495
|
-
const optElement = await inputEl.findElement(import_selenium_webdriver10.By.xpath(combinedValueXpath(value)));
|
|
496
|
-
await click(optElement, this.driver);
|
|
497
|
-
return true;
|
|
498
|
-
} catch (e) {
|
|
499
|
-
return false;
|
|
500
|
-
}
|
|
501
|
-
});
|
|
503
|
+
const optElement = await inputEl.findElement(import_selenium_webdriver11.By.xpath(combinedValueXpath(value)));
|
|
504
|
+
await click(optElement, this.driver);
|
|
502
505
|
if (value !== lastElement) {
|
|
503
506
|
await inputEl.clear();
|
|
504
507
|
}
|
|
505
508
|
}
|
|
506
509
|
async confirmSelection() {
|
|
507
510
|
const inputEl = await this.getInputElement();
|
|
508
|
-
const option = await inputEl.findElement(
|
|
509
|
-
const btnOk = await this.driver.findElement(
|
|
510
|
-
await
|
|
511
|
+
const option = await inputEl.findElement(import_selenium_webdriver11.By.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
|
|
512
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver11.By.css(BTN_OK_SELECTOR));
|
|
513
|
+
await wait(async () => {
|
|
511
514
|
return await option.getAttribute("aria-selected") === "true";
|
|
512
|
-
});
|
|
515
|
+
}, this.driver);
|
|
513
516
|
await click(btnOk, this.driver);
|
|
514
517
|
}
|
|
515
518
|
async getTagBoxInputValue() {
|
|
516
519
|
if (await this.isTagBoxEmpty()) {
|
|
517
520
|
return [];
|
|
518
521
|
}
|
|
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));
|
|
522
|
+
const tags = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`));
|
|
522
523
|
const values = [];
|
|
523
524
|
for (const tag of tags) {
|
|
524
525
|
const text = await tag.getText();
|
|
@@ -527,9 +528,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
527
528
|
return values;
|
|
528
529
|
}
|
|
529
530
|
async isTagBoxEmpty() {
|
|
530
|
-
const
|
|
531
|
-
const tagboxContainer = await parentEl.findElement(import_selenium_webdriver10.By.className(DX_TAGBOX));
|
|
532
|
-
const classAttribute = await tagboxContainer.getAttribute("class");
|
|
531
|
+
const classAttribute = await this.getClasses();
|
|
533
532
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
534
533
|
}
|
|
535
534
|
async getValue() {
|
|
@@ -548,28 +547,25 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
548
547
|
if (!tagExists) {
|
|
549
548
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
550
549
|
}
|
|
551
|
-
const
|
|
552
|
-
const
|
|
553
|
-
const clearBtnTestId = byTestId(`clear-button-${itemText}`);
|
|
554
|
-
const clearBtn = await inputEl.findElement(clearBtnTestId);
|
|
550
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
551
|
+
const clearBtn = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`));
|
|
555
552
|
await click(clearBtn, this.driver);
|
|
556
553
|
}
|
|
557
554
|
};
|
|
558
555
|
|
|
559
556
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
560
|
-
var
|
|
557
|
+
var import_selenium_webdriver12 = require("selenium-webdriver");
|
|
561
558
|
var ITEM_CLASS = "dx-buttongroup-item";
|
|
562
559
|
var SELECTED_CLASS = "dx-state-selected";
|
|
563
|
-
var ButtonGroup = class extends
|
|
564
|
-
|
|
565
|
-
return
|
|
560
|
+
var ButtonGroup = class extends AbstractElementWithParent {
|
|
561
|
+
getItems() {
|
|
562
|
+
return this.driver.findElements(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
566
563
|
}
|
|
567
564
|
getDataValue(el) {
|
|
568
565
|
return el.getAttribute("data-value");
|
|
569
566
|
}
|
|
570
567
|
async getValue() {
|
|
571
|
-
const
|
|
572
|
-
const selectedEl = await inputEl.findElement(import_selenium_webdriver11.By.className(`${ITEM_CLASS} ${SELECTED_CLASS}`));
|
|
568
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
573
569
|
return this.getDataValue(selectedEl);
|
|
574
570
|
}
|
|
575
571
|
async setValue(value) {
|
|
@@ -603,19 +599,14 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
603
599
|
};
|
|
604
600
|
|
|
605
601
|
// src/pageObjects/elements/Editors/DateEditor.ts
|
|
606
|
-
var
|
|
602
|
+
var import_selenium_webdriver13 = require("selenium-webdriver");
|
|
607
603
|
var DateEditor = class extends AbstractDXEditorWithInput {
|
|
608
|
-
constructor(
|
|
609
|
-
super(
|
|
604
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
605
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
610
606
|
this.setClearStrategy(new InputClearStrategy());
|
|
611
607
|
}
|
|
612
|
-
async getControlElement() {
|
|
613
|
-
const controlEl = await this.getElement();
|
|
614
|
-
return controlEl.findElement(import_selenium_webdriver12.By.className("dx-dropdowneditor-input-wrapper"));
|
|
615
|
-
}
|
|
616
608
|
async getDateElement() {
|
|
617
|
-
|
|
618
|
-
return controlEl.findElement(import_selenium_webdriver12.By.css("input[type=hidden]"));
|
|
609
|
+
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
619
610
|
}
|
|
620
611
|
async setDateValue(value) {
|
|
621
612
|
const dateEl = await this.getInputElement();
|
|
@@ -625,8 +616,8 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
625
616
|
const keys = day + month + year;
|
|
626
617
|
await click(dateEl, this.driver);
|
|
627
618
|
const actions = this.driver.actions({ async: true });
|
|
628
|
-
await actions.move({ origin: dateEl }).sendKeys(
|
|
629
|
-
await actions.move({ origin: dateEl }).sendKeys(keys,
|
|
619
|
+
await actions.move({ origin: dateEl }).sendKeys(import_selenium_webdriver13.Key.HOME).perform();
|
|
620
|
+
await actions.move({ origin: dateEl }).sendKeys(keys, import_selenium_webdriver13.Key.ENTER).perform();
|
|
630
621
|
}
|
|
631
622
|
async getDateValue() {
|
|
632
623
|
const inputEl = await this.getDateElement();
|
|
@@ -645,27 +636,27 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
645
636
|
};
|
|
646
637
|
|
|
647
638
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
648
|
-
var editorFactory = async (
|
|
649
|
-
const elementInstance = new AbstractFormElement(
|
|
639
|
+
var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
640
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
650
641
|
const classSting = await elementInstance.getClasses();
|
|
651
642
|
if (classSting.includes("text-control"))
|
|
652
|
-
return new TextEditor(
|
|
643
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
653
644
|
if (classSting.includes("number-control"))
|
|
654
|
-
return new NumberEditor(
|
|
645
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
655
646
|
if (classSting.includes("check-box"))
|
|
656
|
-
return new CheckBox(
|
|
647
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
657
648
|
if (classSting.includes("multi-select-control"))
|
|
658
|
-
return new TagBox(
|
|
649
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
659
650
|
if (classSting.includes("select-control"))
|
|
660
|
-
return new SelectBoxEditor(
|
|
651
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
661
652
|
if (classSting.includes("switch-control"))
|
|
662
|
-
return new SwitchEditor(
|
|
653
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
663
654
|
if (classSting.includes("date-control"))
|
|
664
|
-
return new DateEditor(
|
|
655
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
665
656
|
if (classSting.includes("buttons-group"))
|
|
666
|
-
return new BooleanSelector(
|
|
657
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
667
658
|
if (classSting.includes("button-group-field"))
|
|
668
|
-
return new ButtonGroup(
|
|
659
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
669
660
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
670
661
|
};
|
|
671
662
|
|
|
@@ -686,13 +677,12 @@ function createTableId(formName) {
|
|
|
686
677
|
// src/pageObjects/elements/FormField.ts
|
|
687
678
|
var FormField = class extends AbstractElementWithParent {
|
|
688
679
|
editor;
|
|
689
|
-
constructor(
|
|
690
|
-
super(
|
|
691
|
-
this.elementBy = byTestId(createFieldTestId(formName, name));
|
|
680
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
681
|
+
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
692
682
|
}
|
|
693
683
|
async initEditor() {
|
|
694
684
|
if (!this.editor) {
|
|
695
|
-
this.editor = await editorFactory(this.
|
|
685
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
696
686
|
}
|
|
697
687
|
}
|
|
698
688
|
/**
|
|
@@ -742,36 +732,35 @@ var FormField = class extends AbstractElementWithParent {
|
|
|
742
732
|
};
|
|
743
733
|
|
|
744
734
|
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
745
|
-
var
|
|
746
|
-
};
|
|
747
|
-
|
|
748
|
-
// src/pageObjects/elements/Groups/Panel.ts
|
|
749
|
-
var Panel = class extends AbstractDXGroup {
|
|
735
|
+
var AbstractGroup = class extends AbstractElementWithParent {
|
|
750
736
|
async isDisplayed() {
|
|
751
737
|
const groupElement = await this.getElement();
|
|
752
738
|
return await groupElement.isDisplayed();
|
|
753
739
|
}
|
|
754
740
|
};
|
|
755
741
|
|
|
742
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
743
|
+
var Panel = class extends AbstractGroup {
|
|
744
|
+
};
|
|
745
|
+
|
|
756
746
|
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
757
|
-
var groupFactory = async (
|
|
758
|
-
const elementInstance = new AbstractFormElement(
|
|
747
|
+
var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
748
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
759
749
|
const classSting = await elementInstance.getClasses();
|
|
760
750
|
if (classSting.includes("panel-group"))
|
|
761
|
-
return new Panel(
|
|
751
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
762
752
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
763
753
|
};
|
|
764
754
|
|
|
765
755
|
// src/pageObjects/elements/FormGroup.ts
|
|
766
756
|
var FormGroup = class extends AbstractElementWithParent {
|
|
767
757
|
editor;
|
|
768
|
-
constructor(
|
|
769
|
-
super(
|
|
770
|
-
this.elementBy = byTestId(createGroupTestId(formName, name));
|
|
758
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
759
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
771
760
|
}
|
|
772
761
|
async initEditor() {
|
|
773
762
|
if (!this.editor) {
|
|
774
|
-
this.editor = await groupFactory(this.
|
|
763
|
+
this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
775
764
|
}
|
|
776
765
|
}
|
|
777
766
|
/**
|
|
@@ -780,17 +769,21 @@ var FormGroup = class extends AbstractElementWithParent {
|
|
|
780
769
|
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
781
770
|
*/
|
|
782
771
|
async isDisplayed() {
|
|
783
|
-
|
|
784
|
-
|
|
772
|
+
try {
|
|
773
|
+
await this.initEditor();
|
|
774
|
+
return this.editor.isDisplayed();
|
|
775
|
+
} catch {
|
|
776
|
+
return false;
|
|
777
|
+
}
|
|
785
778
|
}
|
|
786
779
|
};
|
|
787
780
|
|
|
788
781
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
789
782
|
var FormEdit = class extends AbstractForm {
|
|
790
|
-
saveButtonBy =
|
|
783
|
+
saveButtonBy = import_selenium_webdriver14.By.id("button-save");
|
|
791
784
|
constructor(driver) {
|
|
792
785
|
super(driver);
|
|
793
|
-
this.
|
|
786
|
+
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
794
787
|
}
|
|
795
788
|
/**
|
|
796
789
|
* Находит поле формы редактирования по имени
|
|
@@ -800,7 +793,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
800
793
|
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
801
794
|
*/
|
|
802
795
|
field(name) {
|
|
803
|
-
return new FormField(this.
|
|
796
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.driver);
|
|
804
797
|
}
|
|
805
798
|
/**
|
|
806
799
|
* Проверяет не отключена ли кнопка Сохранить
|
|
@@ -822,7 +815,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
822
815
|
* expect(await formEdit.group('Name');
|
|
823
816
|
*/
|
|
824
817
|
group(name) {
|
|
825
|
-
return new FormGroup(this.
|
|
818
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
826
819
|
}
|
|
827
820
|
/**
|
|
828
821
|
* Нажатие на кнопку Сохранить
|
|
@@ -833,50 +826,55 @@ var FormEdit = class extends AbstractForm {
|
|
|
833
826
|
*/
|
|
834
827
|
async saveButtonClick() {
|
|
835
828
|
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
836
|
-
await
|
|
829
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
837
830
|
await click(saveButton, this.driver);
|
|
838
831
|
}
|
|
839
832
|
};
|
|
840
833
|
|
|
841
|
-
// src/pageObjects/elements/Forms/ListForm.ts
|
|
842
|
-
var import_selenium_webdriver19 = require("selenium-webdriver");
|
|
843
|
-
|
|
844
834
|
// src/pageObjects/elements/Table/Table.ts
|
|
835
|
+
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
836
|
+
|
|
837
|
+
// src/pageObjects/elements/Table/elements/Row.ts
|
|
845
838
|
var import_selenium_webdriver16 = require("selenium-webdriver");
|
|
846
839
|
|
|
847
840
|
// src/pageObjects/elements/Table/utils.ts
|
|
848
|
-
var
|
|
849
|
-
|
|
850
|
-
return
|
|
851
|
-
}
|
|
841
|
+
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
842
|
+
function getCssRowByIndexSelector(index) {
|
|
843
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
844
|
+
}
|
|
852
845
|
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
853
|
-
var getColumnPathByIndex = (index) => {
|
|
854
|
-
return import_selenium_webdriver14.By.css(getColumnByIndexCssSelector(index));
|
|
855
|
-
};
|
|
856
846
|
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
857
|
-
|
|
858
|
-
return
|
|
859
|
-
}
|
|
847
|
+
function getCssCellByIndexSelector(index) {
|
|
848
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
849
|
+
}
|
|
860
850
|
var transformInputIndex = (index) => index + 1;
|
|
861
851
|
var transformOutputIndex = (index) => +index - 1;
|
|
862
852
|
|
|
863
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
864
|
-
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
865
|
-
|
|
866
853
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
867
854
|
var Cell = class extends AbstractElementWithParent {
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
this.
|
|
855
|
+
_index;
|
|
856
|
+
getCellIndex;
|
|
857
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
858
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
859
|
+
this.getCellIndex = getCellIndex;
|
|
860
|
+
this._index = index;
|
|
861
|
+
}
|
|
862
|
+
set index(index) {
|
|
863
|
+
this._index = index;
|
|
864
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
865
|
+
}
|
|
866
|
+
async getElement() {
|
|
867
|
+
if (this._index == null) {
|
|
868
|
+
this.index = await this.getCellIndex();
|
|
869
|
+
}
|
|
870
|
+
return super.getElement();
|
|
873
871
|
}
|
|
874
872
|
async getValue() {
|
|
875
873
|
const cellEl = await this.getElement();
|
|
876
874
|
return cellEl.getText();
|
|
877
875
|
}
|
|
878
876
|
getIndex() {
|
|
879
|
-
return this.
|
|
877
|
+
return this._index;
|
|
880
878
|
}
|
|
881
879
|
};
|
|
882
880
|
|
|
@@ -887,50 +885,42 @@ var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
|
887
885
|
var Row = class extends AbstractElementWithParent {
|
|
888
886
|
index;
|
|
889
887
|
getColumnByCaption;
|
|
890
|
-
constructor(
|
|
891
|
-
super(
|
|
888
|
+
constructor(parentCssSelector, index, driver, getColumnByCaption) {
|
|
889
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
892
890
|
this.index = index;
|
|
893
|
-
this.elementBy = getRowPathByIndex(index);
|
|
894
891
|
this.getColumnByCaption = getColumnByCaption;
|
|
895
892
|
}
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
return new Cell(rowEl, index, this.driver);
|
|
901
|
-
}
|
|
902
|
-
throw new Error(`Cannot find cell by index: ${index}`);
|
|
893
|
+
_getCell(index, caption) {
|
|
894
|
+
return new Cell(this.getFullCssSelector(), () => {
|
|
895
|
+
return this.getColumnByCaption(caption).getIndex();
|
|
896
|
+
}, index, this.driver);
|
|
903
897
|
}
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
}
|
|
910
|
-
throw new Error("Unknown caption of cell");
|
|
898
|
+
getCellByIndex(index) {
|
|
899
|
+
return this._getCell(index);
|
|
900
|
+
}
|
|
901
|
+
getCell(caption) {
|
|
902
|
+
return this._getCell(void 0, caption);
|
|
911
903
|
}
|
|
912
904
|
async select() {
|
|
913
905
|
const rowEl = await this.getElement();
|
|
914
906
|
await click(rowEl, this.driver);
|
|
915
|
-
await
|
|
916
|
-
const classes = await
|
|
907
|
+
await wait(async () => {
|
|
908
|
+
const classes = await this.getClasses();
|
|
917
909
|
return classes.includes(DX_SELECTION_CLASS);
|
|
918
|
-
},
|
|
910
|
+
}, this.driver, "Cannot select row");
|
|
919
911
|
}
|
|
920
912
|
async isSelected() {
|
|
921
|
-
const
|
|
922
|
-
const result = await rowEl.getAttribute("aria-selected");
|
|
913
|
+
const result = await this.getAttribute("aria-selected");
|
|
923
914
|
return result === "true";
|
|
924
915
|
}
|
|
925
916
|
getIndex() {
|
|
926
917
|
return this.index;
|
|
927
918
|
}
|
|
928
919
|
async getCells() {
|
|
929
|
-
const
|
|
930
|
-
const cells = await rowEl.findElements(import_selenium_webdriver15.By.css(`td[role="gridcell"]`));
|
|
920
|
+
const cells = await this.driver.findElements(import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
931
921
|
const result = [];
|
|
932
922
|
cells.forEach((_, index) => {
|
|
933
|
-
const newCell =
|
|
923
|
+
const newCell = this.getCellByIndex(index);
|
|
934
924
|
result.push(newCell);
|
|
935
925
|
});
|
|
936
926
|
return result;
|
|
@@ -938,15 +928,13 @@ var Row = class extends AbstractElementWithParent {
|
|
|
938
928
|
async clickInlineButton(buttonClass) {
|
|
939
929
|
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
940
930
|
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
|
-
);
|
|
931
|
+
const button = await this.driver.findElement(import_selenium_webdriver16.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
|
|
944
932
|
return click(button, this.driver);
|
|
945
933
|
}
|
|
946
934
|
async checkEditingMode(isEditing, msg) {
|
|
947
|
-
await
|
|
935
|
+
await wait(async () => {
|
|
948
936
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
949
|
-
},
|
|
937
|
+
}, this.driver, msg);
|
|
950
938
|
}
|
|
951
939
|
async edit() {
|
|
952
940
|
await this.clickInlineButton("edit");
|
|
@@ -963,18 +951,41 @@ var Row = class extends AbstractElementWithParent {
|
|
|
963
951
|
};
|
|
964
952
|
|
|
965
953
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
954
|
+
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
955
|
+
var getHeaderCssSelector = () => {
|
|
956
|
+
return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
957
|
+
};
|
|
966
958
|
var Column = class extends AbstractElementWithParent {
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
959
|
+
_index;
|
|
960
|
+
_caption;
|
|
961
|
+
constructor(parentCssSelector, caption, index, driver) {
|
|
962
|
+
super(parentCssSelector, "", driver);
|
|
970
963
|
this.index = index;
|
|
971
|
-
this.
|
|
964
|
+
this._caption = caption;
|
|
965
|
+
}
|
|
966
|
+
set index(index) {
|
|
967
|
+
this._index = index;
|
|
968
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
969
|
+
}
|
|
970
|
+
get index() {
|
|
971
|
+
return this._index;
|
|
972
|
+
}
|
|
973
|
+
async getElement() {
|
|
974
|
+
await this.getIndex();
|
|
975
|
+
return super.getElement();
|
|
976
|
+
}
|
|
977
|
+
async getIndexByCaption() {
|
|
978
|
+
const column = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${getColumnByCaptionCssSelector(this._caption)}`));
|
|
979
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
972
980
|
}
|
|
973
981
|
async caption() {
|
|
974
982
|
const el = await this.getElement();
|
|
975
983
|
return el.getText();
|
|
976
984
|
}
|
|
977
|
-
getIndex() {
|
|
985
|
+
async getIndex() {
|
|
986
|
+
if (this.index == null) {
|
|
987
|
+
this.index = await this.getIndexByCaption();
|
|
988
|
+
}
|
|
978
989
|
return this.index;
|
|
979
990
|
}
|
|
980
991
|
};
|
|
@@ -982,67 +993,36 @@ var Column = class extends AbstractElementWithParent {
|
|
|
982
993
|
// src/pageObjects/elements/Table/Table.ts
|
|
983
994
|
var Table = class extends AbstractElementWithParent {
|
|
984
995
|
formName;
|
|
985
|
-
constructor(
|
|
986
|
-
super(
|
|
987
|
-
this.elementBy = import_selenium_webdriver16.By.id(createTableId(formName));
|
|
996
|
+
constructor(parentCssSelector, formName, driver) {
|
|
997
|
+
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
988
998
|
this.formName = formName;
|
|
989
999
|
}
|
|
990
|
-
|
|
991
|
-
return
|
|
1000
|
+
getRowByIndex(index) {
|
|
1001
|
+
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption.bind(this));
|
|
992
1002
|
}
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
return parentEl.findElement(import_selenium_webdriver16.By.css(`div[role="grid"]`));
|
|
1003
|
+
getColumnByIndex(index) {
|
|
1004
|
+
return new Column(this.getFullCssSelector(), void 0, index, this.driver);
|
|
996
1005
|
}
|
|
997
|
-
|
|
998
|
-
return this.
|
|
1006
|
+
getColumnByCaption = (caption) => {
|
|
1007
|
+
return new Column(this.getFullCssSelector(), caption, void 0, this.driver);
|
|
999
1008
|
};
|
|
1000
|
-
|
|
1001
|
-
|
|
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);
|
|
1012
|
-
}
|
|
1013
|
-
throw new Error(`Cannot find column by index: ${index}`);
|
|
1014
|
-
}
|
|
1015
|
-
async getColumnByCaption(caption) {
|
|
1016
|
-
const column = await (await this.getElement()).findElement(import_selenium_webdriver16.By.css(`${this.getHeaderCssSelector()} ${getColumnByCaptionCssSelector(caption)}`));
|
|
1017
|
-
if (column) {
|
|
1018
|
-
const index = await column.getAttribute("aria-colindex");
|
|
1019
|
-
return new Column(this.getTableElement, transformOutputIndex(index), this.driver);
|
|
1020
|
-
}
|
|
1021
|
-
throw new Error(`Cannot find column by caption: ${caption}`);
|
|
1022
|
-
}
|
|
1023
|
-
async selectRowByIndex(index) {
|
|
1024
|
-
const row = await this.getRowByIndex(index);
|
|
1025
|
-
if (row) {
|
|
1026
|
-
await row.select();
|
|
1027
|
-
} else {
|
|
1028
|
-
throw new Error(`Cannot find row by index: ${index}`);
|
|
1029
|
-
}
|
|
1009
|
+
selectRowByIndex(index) {
|
|
1010
|
+
return this.getRowByIndex(index).select();
|
|
1030
1011
|
}
|
|
1031
1012
|
async getRows() {
|
|
1032
|
-
const
|
|
1033
|
-
const rows = await gridContainer.findElements(import_selenium_webdriver16.By.className("dx-row dx-data-row"));
|
|
1013
|
+
const rows = await this.driver.findElements(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1034
1014
|
const result = [];
|
|
1035
1015
|
rows.forEach((_, index) => {
|
|
1036
|
-
const newRow = new Row(this.
|
|
1016
|
+
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption);
|
|
1037
1017
|
result.push(newRow);
|
|
1038
1018
|
});
|
|
1039
1019
|
return result;
|
|
1040
1020
|
}
|
|
1041
1021
|
async getColumns() {
|
|
1042
|
-
const columns = await
|
|
1022
|
+
const columns = await this.driver.findElements(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
|
|
1043
1023
|
const result = [];
|
|
1044
1024
|
columns.forEach((_, index) => {
|
|
1045
|
-
const newCol = new Column(this.
|
|
1025
|
+
const newCol = new Column(this.getFullCssSelector(), void 0, index, this.driver);
|
|
1046
1026
|
result.push(newCol);
|
|
1047
1027
|
});
|
|
1048
1028
|
return result;
|
|
@@ -1058,54 +1038,39 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1058
1038
|
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
1059
1039
|
*/
|
|
1060
1040
|
field(name) {
|
|
1061
|
-
return new FormField(this.
|
|
1041
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1062
1042
|
}
|
|
1063
1043
|
};
|
|
1064
1044
|
|
|
1065
|
-
// src/pageObjects/elements/TableToolbar/TableToolbar.ts
|
|
1066
|
-
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1067
|
-
|
|
1068
1045
|
// src/pageObjects/elements/TableToolbar/TableToolbarButton.ts
|
|
1069
|
-
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
1070
1046
|
var TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1071
1047
|
var TableToolbarButton = class extends AbstractElementWithParent {
|
|
1072
1048
|
name;
|
|
1073
|
-
constructor(
|
|
1074
|
-
super(
|
|
1049
|
+
constructor(parentCssSelector, name, driver) {
|
|
1050
|
+
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1075
1051
|
this.name = name;
|
|
1076
|
-
this.elementBy = import_selenium_webdriver17.By.id(`${TOOLBAR_BUTTON_CLASS}-${name}`);
|
|
1077
1052
|
}
|
|
1078
1053
|
async click() {
|
|
1079
1054
|
const button = await this.getElement();
|
|
1080
|
-
await
|
|
1055
|
+
await wait(async () => {
|
|
1081
1056
|
return await button.isDisplayed() && !await this.isDisabled();
|
|
1082
|
-
},
|
|
1083
|
-
|
|
1057
|
+
}, this.driver, `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`);
|
|
1058
|
+
await click(button, this.driver);
|
|
1084
1059
|
}
|
|
1085
1060
|
async isDisabled() {
|
|
1086
1061
|
const button = await this.getElement();
|
|
1087
|
-
|
|
1088
|
-
return result === "true";
|
|
1062
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
1089
1063
|
}
|
|
1090
1064
|
};
|
|
1091
1065
|
|
|
1092
1066
|
// src/pageObjects/elements/TableToolbar/TableToolbar.ts
|
|
1093
1067
|
var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1094
1068
|
var TableToolbar = class extends AbstractElementWithParent {
|
|
1095
|
-
constructor(
|
|
1096
|
-
super(
|
|
1097
|
-
this.elementBy = import_selenium_webdriver18.By.id(`${TABLE_TOOLBAR_CLASS}-${formName}`);
|
|
1069
|
+
constructor(parentCssSelector, formName, driver) {
|
|
1070
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1098
1071
|
}
|
|
1099
|
-
|
|
1100
|
-
return this.
|
|
1101
|
-
};
|
|
1102
|
-
async button(name) {
|
|
1103
|
-
const toolbar = await this.getTableToolbarElement();
|
|
1104
|
-
const button = await toolbar.findElement(import_selenium_webdriver18.By.id(`${TOOLBAR_BUTTON_CLASS}-${name}`));
|
|
1105
|
-
if (button) {
|
|
1106
|
-
return new TableToolbarButton(this.getTableToolbarElement, name, this.driver);
|
|
1107
|
-
}
|
|
1108
|
-
throw new Error(`Cannot find button by name: ${name}`);
|
|
1072
|
+
button(name) {
|
|
1073
|
+
return new TableToolbarButton(this.getFullCssSelector(), name, this.driver);
|
|
1109
1074
|
}
|
|
1110
1075
|
};
|
|
1111
1076
|
|
|
@@ -1113,7 +1078,7 @@ var TableToolbar = class extends AbstractElementWithParent {
|
|
|
1113
1078
|
var ListForm = class extends AbstractForm {
|
|
1114
1079
|
constructor(driver) {
|
|
1115
1080
|
super(driver);
|
|
1116
|
-
this.
|
|
1081
|
+
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
1117
1082
|
}
|
|
1118
1083
|
/**
|
|
1119
1084
|
* Находит таблицу
|
|
@@ -1123,7 +1088,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1123
1088
|
* expect(listForm.table());
|
|
1124
1089
|
*/
|
|
1125
1090
|
table() {
|
|
1126
|
-
return new Table(this.
|
|
1091
|
+
return new Table(this.containerCssSelector, this.formName, this.driver);
|
|
1127
1092
|
}
|
|
1128
1093
|
/**
|
|
1129
1094
|
* Находит группу на лист форме по имени
|
|
@@ -1133,7 +1098,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1133
1098
|
* expect(await formEdit.group('Name');
|
|
1134
1099
|
*/
|
|
1135
1100
|
group(name) {
|
|
1136
|
-
return new FormGroup(this.
|
|
1101
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1137
1102
|
}
|
|
1138
1103
|
/**
|
|
1139
1104
|
* Находит таблицу
|
|
@@ -1143,7 +1108,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1143
1108
|
* expect(listForm.toolbarButton());
|
|
1144
1109
|
*/
|
|
1145
1110
|
toolbarButton(name) {
|
|
1146
|
-
const toolbar = new TableToolbar(this.
|
|
1111
|
+
const toolbar = new TableToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1147
1112
|
return toolbar.button(name);
|
|
1148
1113
|
}
|
|
1149
1114
|
};
|
|
@@ -1211,11 +1176,13 @@ var LoginPage = class extends AbstractPage {
|
|
|
1211
1176
|
SubsystemsPanel,
|
|
1212
1177
|
TextEditor,
|
|
1213
1178
|
byTestId,
|
|
1179
|
+
byTestIdCssSelector,
|
|
1214
1180
|
click,
|
|
1215
1181
|
config,
|
|
1216
1182
|
createDriver,
|
|
1217
1183
|
editorFactory,
|
|
1218
1184
|
elementIsNotPresent,
|
|
1219
1185
|
signIn,
|
|
1186
|
+
wait,
|
|
1220
1187
|
waitElementIsVisible
|
|
1221
1188
|
});
|