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
|
@@ -77,8 +77,11 @@ var AbstractPage = class extends AbstractElement {
|
|
|
77
77
|
|
|
78
78
|
// src/utils/locators.ts
|
|
79
79
|
import { By } from "selenium-webdriver";
|
|
80
|
+
var byTestIdCssSelector = (testId, element = "div") => {
|
|
81
|
+
return `${element}[data-testid="${testId}"]`;
|
|
82
|
+
};
|
|
80
83
|
var byTestId = (testId, element = "div") => {
|
|
81
|
-
return By.css(
|
|
84
|
+
return By.css(byTestIdCssSelector(testId, element));
|
|
82
85
|
};
|
|
83
86
|
|
|
84
87
|
// src/utils/createDriver.ts
|
|
@@ -102,36 +105,55 @@ var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
|
102
105
|
|
|
103
106
|
// src/utils/waitElementIsVisible.ts
|
|
104
107
|
import { until } from "selenium-webdriver";
|
|
105
|
-
|
|
108
|
+
|
|
109
|
+
// src/utils/wait.ts
|
|
110
|
+
async function wait(condition, driver, errorMessage, timeout) {
|
|
111
|
+
driver = driver ?? config().driver;
|
|
112
|
+
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/utils/waitElementIsVisible.ts
|
|
116
|
+
async function waitElementIsVisible({
|
|
117
|
+
element,
|
|
118
|
+
timeout,
|
|
119
|
+
errorMessage,
|
|
120
|
+
driver
|
|
121
|
+
}) {
|
|
106
122
|
driver = driver ?? config().driver;
|
|
107
123
|
const condition = until.elementIsVisible(element);
|
|
108
|
-
await
|
|
124
|
+
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
109
125
|
}
|
|
110
126
|
|
|
111
127
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
128
|
+
import { By as By3 } from "selenium-webdriver";
|
|
112
129
|
var AbstractElementWithParent = class extends AbstractElement {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
constructor(
|
|
130
|
+
elementCssSelector;
|
|
131
|
+
parentCssSelector;
|
|
132
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
116
133
|
super(driver);
|
|
117
|
-
this.
|
|
134
|
+
this.parentCssSelector = parentCssSelector;
|
|
135
|
+
this.elementCssSelector = elementCssSelector;
|
|
136
|
+
}
|
|
137
|
+
getFullCssSelector() {
|
|
138
|
+
if (!this.elementCssSelector) {
|
|
139
|
+
return this.parentCssSelector;
|
|
140
|
+
}
|
|
141
|
+
if (!this.parentCssSelector) {
|
|
142
|
+
return this.elementCssSelector;
|
|
143
|
+
}
|
|
144
|
+
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
118
145
|
}
|
|
119
146
|
async getElement() {
|
|
120
|
-
|
|
121
|
-
await waitElementIsVisible({
|
|
122
|
-
element: parentEl,
|
|
123
|
-
driver: this.driver
|
|
124
|
-
});
|
|
125
|
-
const el = await parentEl.findElement(this.elementBy);
|
|
126
|
-
await waitElementIsVisible({
|
|
127
|
-
element: el,
|
|
128
|
-
driver: this.driver
|
|
129
|
-
});
|
|
130
|
-
return el;
|
|
147
|
+
return this.driver.findElement(By3.css(this.getFullCssSelector()));
|
|
131
148
|
}
|
|
132
149
|
async getAttribute(attr) {
|
|
133
|
-
const
|
|
134
|
-
|
|
150
|
+
const element = await this.getElement();
|
|
151
|
+
await waitElementIsVisible({
|
|
152
|
+
element,
|
|
153
|
+
driver: this.driver,
|
|
154
|
+
errorMessage: `Element not found: ${this.getFullCssSelector()}`
|
|
155
|
+
});
|
|
156
|
+
return await element.getAttribute(attr);
|
|
135
157
|
}
|
|
136
158
|
async getClasses() {
|
|
137
159
|
return await this.getAttribute("class");
|
|
@@ -139,39 +161,36 @@ var AbstractElementWithParent = class extends AbstractElement {
|
|
|
139
161
|
};
|
|
140
162
|
|
|
141
163
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
164
|
+
import { By as By4 } from "selenium-webdriver";
|
|
142
165
|
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
143
|
-
titleBy = byTestId("subsystems-panel-title", "span");
|
|
144
166
|
async title() {
|
|
145
|
-
|
|
146
|
-
return panel.findElement(this.titleBy);
|
|
167
|
+
return this.driver.findElement(By4.css(this.getFullCssSelector()));
|
|
147
168
|
}
|
|
148
169
|
};
|
|
149
170
|
|
|
150
171
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
151
|
-
import { By as By3 } from "selenium-webdriver";
|
|
152
172
|
var SubsystemsPanel = class extends AbstractElement {
|
|
153
|
-
panelBy = By3.id("aside");
|
|
154
173
|
header;
|
|
155
174
|
constructor(driver) {
|
|
156
175
|
super(driver);
|
|
157
|
-
this.header = new SubsystemsPanelHeader(
|
|
176
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
158
177
|
}
|
|
159
|
-
panelElement = () => {
|
|
160
|
-
return this.driver.findElement(this.panelBy);
|
|
161
|
-
};
|
|
162
178
|
headerTitle() {
|
|
163
179
|
return this.header.title().then((el) => el.getText());
|
|
164
180
|
}
|
|
165
181
|
};
|
|
166
182
|
|
|
167
183
|
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
168
|
-
import { By as
|
|
184
|
+
import { By as By5 } from "selenium-webdriver";
|
|
169
185
|
var AbstractForm = class extends AbstractPage {
|
|
186
|
+
containerCssSelector = "";
|
|
170
187
|
containerBy;
|
|
171
|
-
|
|
188
|
+
popupContainerCssSelector;
|
|
172
189
|
constructor(driver) {
|
|
173
190
|
super(driver);
|
|
174
|
-
|
|
191
|
+
const testId = `form-content-wrapper-${this.formName}`;
|
|
192
|
+
this.containerBy = byTestId(testId);
|
|
193
|
+
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
175
194
|
}
|
|
176
195
|
async isModal() {
|
|
177
196
|
const el = await this.getContainerElement();
|
|
@@ -194,7 +213,7 @@ var AbstractForm = class extends AbstractPage {
|
|
|
194
213
|
*/
|
|
195
214
|
async exists() {
|
|
196
215
|
try {
|
|
197
|
-
await
|
|
216
|
+
await wait(elementIsNotPresent(this.containerBy), this.driver);
|
|
198
217
|
return false;
|
|
199
218
|
} catch {
|
|
200
219
|
return true;
|
|
@@ -209,29 +228,19 @@ var AbstractForm = class extends AbstractPage {
|
|
|
209
228
|
*/
|
|
210
229
|
async getTitleText() {
|
|
211
230
|
if (await this.isModal()) {
|
|
212
|
-
const
|
|
213
|
-
const titleEl2 = await popupEl.findElement(By4.className("popup-title"));
|
|
231
|
+
const titleEl2 = await this.driver.findElement(By5.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
214
232
|
return titleEl2.getText();
|
|
215
233
|
}
|
|
216
|
-
let
|
|
217
|
-
let titleEl = await container.findElement(By4.className("form-toolbar-name-container"));
|
|
234
|
+
let titleEl = await this.driver.findElement(By5.css(`${this.containerCssSelector} .form-toolbar-name-container`));
|
|
218
235
|
return titleEl.getText();
|
|
219
236
|
}
|
|
220
237
|
};
|
|
221
238
|
|
|
222
239
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
223
|
-
import { By as
|
|
240
|
+
import { By as By12 } from "selenium-webdriver";
|
|
224
241
|
|
|
225
242
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
226
|
-
import { By as
|
|
227
|
-
|
|
228
|
-
// src/pageObjects/AbstractFormElement.ts
|
|
229
|
-
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
230
|
-
constructor(getParentElement, elementBy, driver) {
|
|
231
|
-
super(getParentElement, driver);
|
|
232
|
-
this.elementBy = elementBy;
|
|
233
|
-
}
|
|
234
|
-
};
|
|
243
|
+
import { By as By6, Key } from "selenium-webdriver";
|
|
235
244
|
|
|
236
245
|
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
237
246
|
var InputClearStrategy = class {
|
|
@@ -242,14 +251,16 @@ var InputClearStrategy = class {
|
|
|
242
251
|
};
|
|
243
252
|
|
|
244
253
|
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
245
|
-
var AbstractDXEditorWithInput = class extends
|
|
254
|
+
var AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
246
255
|
clearStrategy = new InputClearStrategy();
|
|
247
256
|
setClearStrategy(strategy) {
|
|
248
257
|
this.clearStrategy = strategy;
|
|
249
258
|
}
|
|
259
|
+
getInputCssSelector() {
|
|
260
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
261
|
+
}
|
|
250
262
|
async getInputElement() {
|
|
251
|
-
|
|
252
|
-
return controlEl.findElement(By5.className("dx-texteditor-input"));
|
|
263
|
+
return this.driver.findElement(By6.css(this.getInputCssSelector()));
|
|
253
264
|
}
|
|
254
265
|
async getInputValue() {
|
|
255
266
|
const inputEl = await this.getInputElement();
|
|
@@ -267,8 +278,8 @@ var AbstractDXEditorWithInput = class extends AbstractFormElement {
|
|
|
267
278
|
|
|
268
279
|
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
269
280
|
var TextEditor = class extends AbstractDXEditorWithInput {
|
|
270
|
-
constructor(
|
|
271
|
-
super(
|
|
281
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
282
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
272
283
|
this.setClearStrategy(new InputClearStrategy());
|
|
273
284
|
}
|
|
274
285
|
getValue() {
|
|
@@ -281,8 +292,8 @@ var TextEditor = class extends AbstractDXEditorWithInput {
|
|
|
281
292
|
|
|
282
293
|
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
283
294
|
var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
284
|
-
constructor(
|
|
285
|
-
super(
|
|
295
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
296
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
286
297
|
this.setClearStrategy(new InputClearStrategy());
|
|
287
298
|
}
|
|
288
299
|
async getValue() {
|
|
@@ -294,11 +305,17 @@ var NumberEditor = class extends AbstractDXEditorWithInput {
|
|
|
294
305
|
}
|
|
295
306
|
};
|
|
296
307
|
|
|
308
|
+
// src/pageObjects/AbstractFormElement.ts
|
|
309
|
+
var AbstractFormElement = class extends AbstractElementWithParent {
|
|
310
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
311
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
|
|
297
315
|
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
298
|
-
var CheckBox = class extends
|
|
316
|
+
var CheckBox = class extends AbstractElementWithParent {
|
|
299
317
|
async getValue() {
|
|
300
|
-
const
|
|
301
|
-
const result = await inputEl.getAttribute("aria-checked");
|
|
318
|
+
const result = await this.getAttribute("aria-checked");
|
|
302
319
|
if (result === "true")
|
|
303
320
|
return 1;
|
|
304
321
|
if (result === "false")
|
|
@@ -315,7 +332,7 @@ var CheckBox = class extends AbstractFormElement {
|
|
|
315
332
|
};
|
|
316
333
|
|
|
317
334
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
318
|
-
import { By as
|
|
335
|
+
import { By as By8, Key as Key2 } from "selenium-webdriver";
|
|
319
336
|
|
|
320
337
|
// src/utils/xpathHelper.ts
|
|
321
338
|
var XPathHelper = class {
|
|
@@ -328,28 +345,28 @@ var XPathHelper = class {
|
|
|
328
345
|
};
|
|
329
346
|
|
|
330
347
|
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
331
|
-
import { By as
|
|
348
|
+
import { By as By7 } from "selenium-webdriver";
|
|
332
349
|
var DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
333
350
|
var DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
334
351
|
var ClearButtonStrategy = class {
|
|
335
352
|
editorContainerClass;
|
|
336
|
-
|
|
353
|
+
_driver;
|
|
354
|
+
constructor(editorContainerClass, driver) {
|
|
337
355
|
this.editorContainerClass = editorContainerClass;
|
|
356
|
+
this._driver = driver;
|
|
338
357
|
}
|
|
339
|
-
async isEmptyEditorField(
|
|
340
|
-
const
|
|
341
|
-
const editorContainer = await parentEl.findElement(By6.className(this.editorContainerClass));
|
|
358
|
+
async isEmptyEditorField() {
|
|
359
|
+
const editorContainer = await this._driver.findElement(By7.css(this.editorContainerClass));
|
|
342
360
|
const classAttribute = await editorContainer.getAttribute("class");
|
|
343
361
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
344
362
|
}
|
|
345
|
-
async clear(
|
|
346
|
-
if (await this.isEmptyEditorField(
|
|
363
|
+
async clear() {
|
|
364
|
+
if (await this.isEmptyEditorField()) {
|
|
347
365
|
throw new Error("This field is already empty");
|
|
348
366
|
}
|
|
349
|
-
const clearBtnSelector =
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
await click(clearBtn, editor.driver);
|
|
367
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
368
|
+
const clearBtn = await this._driver.findElement(By7.css(clearBtnSelector));
|
|
369
|
+
await click(clearBtn, this._driver);
|
|
353
370
|
}
|
|
354
371
|
};
|
|
355
372
|
|
|
@@ -360,25 +377,17 @@ var combinedValueXpath = (value) => `${XPathHelper.getRoleXpath(SELECT_BOX_ELEME
|
|
|
360
377
|
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS,
|
|
361
378
|
value
|
|
362
379
|
)}`;
|
|
363
|
-
var DX_SELECTBOX = "dx-selectbox";
|
|
364
380
|
var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
365
|
-
constructor(
|
|
366
|
-
super(
|
|
367
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
381
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
382
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
383
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
368
384
|
}
|
|
369
385
|
async setSelectInputValue(value) {
|
|
370
386
|
const inputEl = await this.getInputElement();
|
|
371
387
|
await click(inputEl, this.driver);
|
|
372
388
|
await inputEl.sendKeys(value, Key2.ENTER);
|
|
373
|
-
await
|
|
374
|
-
|
|
375
|
-
const optElement = await inputEl.findElement(By7.xpath(combinedValueXpath(value)));
|
|
376
|
-
await click(optElement, this.driver);
|
|
377
|
-
return true;
|
|
378
|
-
} catch (e) {
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
}, 2e3);
|
|
389
|
+
const optElement = await inputEl.findElement(By8.xpath(combinedValueXpath(value)));
|
|
390
|
+
await click(optElement, this.driver);
|
|
382
391
|
}
|
|
383
392
|
async getValue() {
|
|
384
393
|
const value = await super.getInputValue();
|
|
@@ -390,10 +399,9 @@ var SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
|
390
399
|
};
|
|
391
400
|
|
|
392
401
|
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
393
|
-
var SwitchEditor = class extends
|
|
402
|
+
var SwitchEditor = class extends AbstractElementWithParent {
|
|
394
403
|
async getValue() {
|
|
395
|
-
const
|
|
396
|
-
const result = await inputEl.getAttribute("aria-label");
|
|
404
|
+
const result = await this.getAttribute("aria-label");
|
|
397
405
|
if (result === "ON")
|
|
398
406
|
return 1;
|
|
399
407
|
if (result === "OFF")
|
|
@@ -406,27 +414,27 @@ var SwitchEditor = class extends AbstractFormElement {
|
|
|
406
414
|
}
|
|
407
415
|
const inputEl = await this.getElement();
|
|
408
416
|
const currentValue = await this.getValue();
|
|
409
|
-
if (currentValue
|
|
410
|
-
|
|
411
|
-
await this.driver.wait(async () => {
|
|
412
|
-
const updatedValue = await this.getValue();
|
|
413
|
-
return updatedValue !== currentValue;
|
|
414
|
-
});
|
|
417
|
+
if (currentValue === value) {
|
|
418
|
+
return;
|
|
415
419
|
}
|
|
420
|
+
await click(inputEl, this.driver);
|
|
421
|
+
await wait(async () => {
|
|
422
|
+
const updatedValue = await this.getValue();
|
|
423
|
+
return updatedValue !== currentValue;
|
|
424
|
+
}, this.driver);
|
|
416
425
|
}
|
|
417
426
|
};
|
|
418
427
|
|
|
419
428
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
420
|
-
import { By as
|
|
429
|
+
import { By as By9 } from "selenium-webdriver";
|
|
421
430
|
var TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
422
431
|
var DX_TAG_CONTAINER = "dx-tag-container";
|
|
423
|
-
var DX_TAGBOX = "dx-tagbox";
|
|
424
432
|
var DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
425
433
|
var BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
426
434
|
var TagBox = class extends AbstractDXEditorWithInput {
|
|
427
|
-
constructor(
|
|
428
|
-
super(
|
|
429
|
-
this.setClearStrategy(new ClearButtonStrategy(
|
|
435
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
436
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
437
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
430
438
|
}
|
|
431
439
|
async setTagBoxInputValue(values) {
|
|
432
440
|
const lastElement = values[values.length - 1];
|
|
@@ -439,35 +447,26 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
439
447
|
}
|
|
440
448
|
async selectOption(inputEl, value, lastElement) {
|
|
441
449
|
await inputEl.sendKeys(value);
|
|
442
|
-
await
|
|
443
|
-
|
|
444
|
-
const optElement = await inputEl.findElement(By8.xpath(combinedValueXpath(value)));
|
|
445
|
-
await click(optElement, this.driver);
|
|
446
|
-
return true;
|
|
447
|
-
} catch (e) {
|
|
448
|
-
return false;
|
|
449
|
-
}
|
|
450
|
-
});
|
|
450
|
+
const optElement = await inputEl.findElement(By9.xpath(combinedValueXpath(value)));
|
|
451
|
+
await click(optElement, this.driver);
|
|
451
452
|
if (value !== lastElement) {
|
|
452
453
|
await inputEl.clear();
|
|
453
454
|
}
|
|
454
455
|
}
|
|
455
456
|
async confirmSelection() {
|
|
456
457
|
const inputEl = await this.getInputElement();
|
|
457
|
-
const option = await inputEl.findElement(
|
|
458
|
-
const btnOk = await this.driver.findElement(
|
|
459
|
-
await
|
|
458
|
+
const option = await inputEl.findElement(By9.xpath(XPathHelper.getRoleXpath(SELECT_BOX_ELEMENT_ROLE)));
|
|
459
|
+
const btnOk = await this.driver.findElement(By9.css(BTN_OK_SELECTOR));
|
|
460
|
+
await wait(async () => {
|
|
460
461
|
return await option.getAttribute("aria-selected") === "true";
|
|
461
|
-
});
|
|
462
|
+
}, this.driver);
|
|
462
463
|
await click(btnOk, this.driver);
|
|
463
464
|
}
|
|
464
465
|
async getTagBoxInputValue() {
|
|
465
466
|
if (await this.isTagBoxEmpty()) {
|
|
466
467
|
return [];
|
|
467
468
|
}
|
|
468
|
-
const
|
|
469
|
-
const inputEl = await parentEl.findElement(By8.className(DX_TAG_CONTAINER));
|
|
470
|
-
const tags = await inputEl.findElements(By8.css(TAGS_SELECTOR));
|
|
469
|
+
const tags = await this.driver.findElements(By9.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`));
|
|
471
470
|
const values = [];
|
|
472
471
|
for (const tag of tags) {
|
|
473
472
|
const text = await tag.getText();
|
|
@@ -476,9 +475,7 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
476
475
|
return values;
|
|
477
476
|
}
|
|
478
477
|
async isTagBoxEmpty() {
|
|
479
|
-
const
|
|
480
|
-
const tagboxContainer = await parentEl.findElement(By8.className(DX_TAGBOX));
|
|
481
|
-
const classAttribute = await tagboxContainer.getAttribute("class");
|
|
478
|
+
const classAttribute = await this.getClasses();
|
|
482
479
|
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
483
480
|
}
|
|
484
481
|
async getValue() {
|
|
@@ -497,28 +494,25 @@ var TagBox = class extends AbstractDXEditorWithInput {
|
|
|
497
494
|
if (!tagExists) {
|
|
498
495
|
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
499
496
|
}
|
|
500
|
-
const
|
|
501
|
-
const
|
|
502
|
-
const clearBtnTestId = byTestId(`clear-button-${itemText}`);
|
|
503
|
-
const clearBtn = await inputEl.findElement(clearBtnTestId);
|
|
497
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
498
|
+
const clearBtn = await this.driver.findElement(By9.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`));
|
|
504
499
|
await click(clearBtn, this.driver);
|
|
505
500
|
}
|
|
506
501
|
};
|
|
507
502
|
|
|
508
503
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
509
|
-
import { By as
|
|
504
|
+
import { By as By10 } from "selenium-webdriver";
|
|
510
505
|
var ITEM_CLASS = "dx-buttongroup-item";
|
|
511
506
|
var SELECTED_CLASS = "dx-state-selected";
|
|
512
|
-
var ButtonGroup = class extends
|
|
513
|
-
|
|
514
|
-
return
|
|
507
|
+
var ButtonGroup = class extends AbstractElementWithParent {
|
|
508
|
+
getItems() {
|
|
509
|
+
return this.driver.findElements(By10.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
515
510
|
}
|
|
516
511
|
getDataValue(el) {
|
|
517
512
|
return el.getAttribute("data-value");
|
|
518
513
|
}
|
|
519
514
|
async getValue() {
|
|
520
|
-
const
|
|
521
|
-
const selectedEl = await inputEl.findElement(By9.className(`${ITEM_CLASS} ${SELECTED_CLASS}`));
|
|
515
|
+
const selectedEl = await this.driver.findElement(By10.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
522
516
|
return this.getDataValue(selectedEl);
|
|
523
517
|
}
|
|
524
518
|
async setValue(value) {
|
|
@@ -552,19 +546,14 @@ var BooleanSelector = class extends ButtonGroup {
|
|
|
552
546
|
};
|
|
553
547
|
|
|
554
548
|
// src/pageObjects/elements/Editors/DateEditor.ts
|
|
555
|
-
import { By as
|
|
549
|
+
import { By as By11, Key as Key3 } from "selenium-webdriver";
|
|
556
550
|
var DateEditor = class extends AbstractDXEditorWithInput {
|
|
557
|
-
constructor(
|
|
558
|
-
super(
|
|
551
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
552
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
559
553
|
this.setClearStrategy(new InputClearStrategy());
|
|
560
554
|
}
|
|
561
|
-
async getControlElement() {
|
|
562
|
-
const controlEl = await this.getElement();
|
|
563
|
-
return controlEl.findElement(By10.className("dx-dropdowneditor-input-wrapper"));
|
|
564
|
-
}
|
|
565
555
|
async getDateElement() {
|
|
566
|
-
|
|
567
|
-
return controlEl.findElement(By10.css("input[type=hidden]"));
|
|
556
|
+
return this.driver.findElement(By11.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
568
557
|
}
|
|
569
558
|
async setDateValue(value) {
|
|
570
559
|
const dateEl = await this.getInputElement();
|
|
@@ -594,27 +583,27 @@ var DateEditor = class extends AbstractDXEditorWithInput {
|
|
|
594
583
|
};
|
|
595
584
|
|
|
596
585
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
597
|
-
var editorFactory = async (
|
|
598
|
-
const elementInstance = new AbstractFormElement(
|
|
586
|
+
var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
587
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
599
588
|
const classSting = await elementInstance.getClasses();
|
|
600
589
|
if (classSting.includes("text-control"))
|
|
601
|
-
return new TextEditor(
|
|
590
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
602
591
|
if (classSting.includes("number-control"))
|
|
603
|
-
return new NumberEditor(
|
|
592
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
604
593
|
if (classSting.includes("check-box"))
|
|
605
|
-
return new CheckBox(
|
|
594
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
606
595
|
if (classSting.includes("multi-select-control"))
|
|
607
|
-
return new TagBox(
|
|
596
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
608
597
|
if (classSting.includes("select-control"))
|
|
609
|
-
return new SelectBoxEditor(
|
|
598
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
610
599
|
if (classSting.includes("switch-control"))
|
|
611
|
-
return new SwitchEditor(
|
|
600
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
612
601
|
if (classSting.includes("date-control"))
|
|
613
|
-
return new DateEditor(
|
|
602
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
614
603
|
if (classSting.includes("buttons-group"))
|
|
615
|
-
return new BooleanSelector(
|
|
604
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
616
605
|
if (classSting.includes("button-group-field"))
|
|
617
|
-
return new ButtonGroup(
|
|
606
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
618
607
|
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
619
608
|
};
|
|
620
609
|
|
|
@@ -635,13 +624,12 @@ function createTableId(formName) {
|
|
|
635
624
|
// src/pageObjects/elements/FormField.ts
|
|
636
625
|
var FormField = class extends AbstractElementWithParent {
|
|
637
626
|
editor;
|
|
638
|
-
constructor(
|
|
639
|
-
super(
|
|
640
|
-
this.elementBy = byTestId(createFieldTestId(formName, name));
|
|
627
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
628
|
+
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
641
629
|
}
|
|
642
630
|
async initEditor() {
|
|
643
631
|
if (!this.editor) {
|
|
644
|
-
this.editor = await editorFactory(this.
|
|
632
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
645
633
|
}
|
|
646
634
|
}
|
|
647
635
|
/**
|
|
@@ -691,36 +679,35 @@ var FormField = class extends AbstractElementWithParent {
|
|
|
691
679
|
};
|
|
692
680
|
|
|
693
681
|
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
694
|
-
var
|
|
695
|
-
};
|
|
696
|
-
|
|
697
|
-
// src/pageObjects/elements/Groups/Panel.ts
|
|
698
|
-
var Panel = class extends AbstractDXGroup {
|
|
682
|
+
var AbstractGroup = class extends AbstractElementWithParent {
|
|
699
683
|
async isDisplayed() {
|
|
700
684
|
const groupElement = await this.getElement();
|
|
701
685
|
return await groupElement.isDisplayed();
|
|
702
686
|
}
|
|
703
687
|
};
|
|
704
688
|
|
|
689
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
690
|
+
var Panel = class extends AbstractGroup {
|
|
691
|
+
};
|
|
692
|
+
|
|
705
693
|
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
706
|
-
var groupFactory = async (
|
|
707
|
-
const elementInstance = new AbstractFormElement(
|
|
694
|
+
var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
695
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
708
696
|
const classSting = await elementInstance.getClasses();
|
|
709
697
|
if (classSting.includes("panel-group"))
|
|
710
|
-
return new Panel(
|
|
698
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
711
699
|
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
712
700
|
};
|
|
713
701
|
|
|
714
702
|
// src/pageObjects/elements/FormGroup.ts
|
|
715
703
|
var FormGroup = class extends AbstractElementWithParent {
|
|
716
704
|
editor;
|
|
717
|
-
constructor(
|
|
718
|
-
super(
|
|
719
|
-
this.elementBy = byTestId(createGroupTestId(formName, name));
|
|
705
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
706
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
720
707
|
}
|
|
721
708
|
async initEditor() {
|
|
722
709
|
if (!this.editor) {
|
|
723
|
-
this.editor = await groupFactory(this.
|
|
710
|
+
this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
724
711
|
}
|
|
725
712
|
}
|
|
726
713
|
/**
|
|
@@ -729,17 +716,21 @@ var FormGroup = class extends AbstractElementWithParent {
|
|
|
729
716
|
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
730
717
|
*/
|
|
731
718
|
async isDisplayed() {
|
|
732
|
-
|
|
733
|
-
|
|
719
|
+
try {
|
|
720
|
+
await this.initEditor();
|
|
721
|
+
return this.editor.isDisplayed();
|
|
722
|
+
} catch {
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
734
725
|
}
|
|
735
726
|
};
|
|
736
727
|
|
|
737
728
|
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
738
729
|
var FormEdit = class extends AbstractForm {
|
|
739
|
-
saveButtonBy =
|
|
730
|
+
saveButtonBy = By12.id("button-save");
|
|
740
731
|
constructor(driver) {
|
|
741
732
|
super(driver);
|
|
742
|
-
this.
|
|
733
|
+
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
743
734
|
}
|
|
744
735
|
/**
|
|
745
736
|
* Находит поле формы редактирования по имени
|
|
@@ -749,7 +740,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
749
740
|
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
750
741
|
*/
|
|
751
742
|
field(name) {
|
|
752
|
-
return new FormField(this.
|
|
743
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.driver);
|
|
753
744
|
}
|
|
754
745
|
/**
|
|
755
746
|
* Проверяет не отключена ли кнопка Сохранить
|
|
@@ -771,7 +762,7 @@ var FormEdit = class extends AbstractForm {
|
|
|
771
762
|
* expect(await formEdit.group('Name');
|
|
772
763
|
*/
|
|
773
764
|
group(name) {
|
|
774
|
-
return new FormGroup(this.
|
|
765
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
775
766
|
}
|
|
776
767
|
/**
|
|
777
768
|
* Нажатие на кнопку Сохранить
|
|
@@ -782,50 +773,55 @@ var FormEdit = class extends AbstractForm {
|
|
|
782
773
|
*/
|
|
783
774
|
async saveButtonClick() {
|
|
784
775
|
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
785
|
-
await
|
|
776
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
786
777
|
await click(saveButton, this.driver);
|
|
787
778
|
}
|
|
788
779
|
};
|
|
789
780
|
|
|
790
|
-
// src/pageObjects/elements/Forms/ListForm.ts
|
|
791
|
-
import { By as By17 } from "selenium-webdriver";
|
|
792
|
-
|
|
793
781
|
// src/pageObjects/elements/Table/Table.ts
|
|
782
|
+
import { By as By16 } from "selenium-webdriver";
|
|
783
|
+
|
|
784
|
+
// src/pageObjects/elements/Table/elements/Row.ts
|
|
794
785
|
import { By as By14 } from "selenium-webdriver";
|
|
795
786
|
|
|
796
787
|
// src/pageObjects/elements/Table/utils.ts
|
|
797
|
-
import { By as
|
|
798
|
-
|
|
799
|
-
return
|
|
800
|
-
}
|
|
788
|
+
import { By as By13 } from "selenium-webdriver";
|
|
789
|
+
function getCssRowByIndexSelector(index) {
|
|
790
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
791
|
+
}
|
|
801
792
|
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
802
|
-
var getColumnPathByIndex = (index) => {
|
|
803
|
-
return By12.css(getColumnByIndexCssSelector(index));
|
|
804
|
-
};
|
|
805
793
|
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
806
|
-
|
|
807
|
-
return
|
|
808
|
-
}
|
|
794
|
+
function getCssCellByIndexSelector(index) {
|
|
795
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
796
|
+
}
|
|
809
797
|
var transformInputIndex = (index) => index + 1;
|
|
810
798
|
var transformOutputIndex = (index) => +index - 1;
|
|
811
799
|
|
|
812
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
813
|
-
import { By as By13 } from "selenium-webdriver";
|
|
814
|
-
|
|
815
800
|
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
816
801
|
var Cell = class extends AbstractElementWithParent {
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
this.
|
|
802
|
+
_index;
|
|
803
|
+
getCellIndex;
|
|
804
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
805
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
806
|
+
this.getCellIndex = getCellIndex;
|
|
807
|
+
this._index = index;
|
|
808
|
+
}
|
|
809
|
+
set index(index) {
|
|
810
|
+
this._index = index;
|
|
811
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
812
|
+
}
|
|
813
|
+
async getElement() {
|
|
814
|
+
if (this._index == null) {
|
|
815
|
+
this.index = await this.getCellIndex();
|
|
816
|
+
}
|
|
817
|
+
return super.getElement();
|
|
822
818
|
}
|
|
823
819
|
async getValue() {
|
|
824
820
|
const cellEl = await this.getElement();
|
|
825
821
|
return cellEl.getText();
|
|
826
822
|
}
|
|
827
823
|
getIndex() {
|
|
828
|
-
return this.
|
|
824
|
+
return this._index;
|
|
829
825
|
}
|
|
830
826
|
};
|
|
831
827
|
|
|
@@ -836,50 +832,42 @@ var DX_DATA_ROW_CLASS = "dx-data-row";
|
|
|
836
832
|
var Row = class extends AbstractElementWithParent {
|
|
837
833
|
index;
|
|
838
834
|
getColumnByCaption;
|
|
839
|
-
constructor(
|
|
840
|
-
super(
|
|
835
|
+
constructor(parentCssSelector, index, driver, getColumnByCaption) {
|
|
836
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
841
837
|
this.index = index;
|
|
842
|
-
this.elementBy = getRowPathByIndex(index);
|
|
843
838
|
this.getColumnByCaption = getColumnByCaption;
|
|
844
839
|
}
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
return new Cell(rowEl, index, this.driver);
|
|
850
|
-
}
|
|
851
|
-
throw new Error(`Cannot find cell by index: ${index}`);
|
|
840
|
+
_getCell(index, caption) {
|
|
841
|
+
return new Cell(this.getFullCssSelector(), () => {
|
|
842
|
+
return this.getColumnByCaption(caption).getIndex();
|
|
843
|
+
}, index, this.driver);
|
|
852
844
|
}
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
}
|
|
859
|
-
throw new Error("Unknown caption of cell");
|
|
845
|
+
getCellByIndex(index) {
|
|
846
|
+
return this._getCell(index);
|
|
847
|
+
}
|
|
848
|
+
getCell(caption) {
|
|
849
|
+
return this._getCell(void 0, caption);
|
|
860
850
|
}
|
|
861
851
|
async select() {
|
|
862
852
|
const rowEl = await this.getElement();
|
|
863
853
|
await click(rowEl, this.driver);
|
|
864
|
-
await
|
|
865
|
-
const classes = await
|
|
854
|
+
await wait(async () => {
|
|
855
|
+
const classes = await this.getClasses();
|
|
866
856
|
return classes.includes(DX_SELECTION_CLASS);
|
|
867
|
-
},
|
|
857
|
+
}, this.driver, "Cannot select row");
|
|
868
858
|
}
|
|
869
859
|
async isSelected() {
|
|
870
|
-
const
|
|
871
|
-
const result = await rowEl.getAttribute("aria-selected");
|
|
860
|
+
const result = await this.getAttribute("aria-selected");
|
|
872
861
|
return result === "true";
|
|
873
862
|
}
|
|
874
863
|
getIndex() {
|
|
875
864
|
return this.index;
|
|
876
865
|
}
|
|
877
866
|
async getCells() {
|
|
878
|
-
const
|
|
879
|
-
const cells = await rowEl.findElements(By13.css(`td[role="gridcell"]`));
|
|
867
|
+
const cells = await this.driver.findElements(By14.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
880
868
|
const result = [];
|
|
881
869
|
cells.forEach((_, index) => {
|
|
882
|
-
const newCell =
|
|
870
|
+
const newCell = this.getCellByIndex(index);
|
|
883
871
|
result.push(newCell);
|
|
884
872
|
});
|
|
885
873
|
return result;
|
|
@@ -887,15 +875,13 @@ var Row = class extends AbstractElementWithParent {
|
|
|
887
875
|
async clickInlineButton(buttonClass) {
|
|
888
876
|
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
889
877
|
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(this.index)}"] .${buttonClass}`;
|
|
890
|
-
const button =
|
|
891
|
-
By13.css(`${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
892
|
-
);
|
|
878
|
+
const button = await this.driver.findElement(By14.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`));
|
|
893
879
|
return click(button, this.driver);
|
|
894
880
|
}
|
|
895
881
|
async checkEditingMode(isEditing, msg) {
|
|
896
|
-
await
|
|
882
|
+
await wait(async () => {
|
|
897
883
|
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
898
|
-
},
|
|
884
|
+
}, this.driver, msg);
|
|
899
885
|
}
|
|
900
886
|
async edit() {
|
|
901
887
|
await this.clickInlineButton("edit");
|
|
@@ -912,18 +898,41 @@ var Row = class extends AbstractElementWithParent {
|
|
|
912
898
|
};
|
|
913
899
|
|
|
914
900
|
// src/pageObjects/elements/Table/elements/Column.ts
|
|
901
|
+
import { By as By15 } from "selenium-webdriver";
|
|
902
|
+
var getHeaderCssSelector = () => {
|
|
903
|
+
return ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
904
|
+
};
|
|
915
905
|
var Column = class extends AbstractElementWithParent {
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
906
|
+
_index;
|
|
907
|
+
_caption;
|
|
908
|
+
constructor(parentCssSelector, caption, index, driver) {
|
|
909
|
+
super(parentCssSelector, "", driver);
|
|
919
910
|
this.index = index;
|
|
920
|
-
this.
|
|
911
|
+
this._caption = caption;
|
|
912
|
+
}
|
|
913
|
+
set index(index) {
|
|
914
|
+
this._index = index;
|
|
915
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
916
|
+
}
|
|
917
|
+
get index() {
|
|
918
|
+
return this._index;
|
|
919
|
+
}
|
|
920
|
+
async getElement() {
|
|
921
|
+
await this.getIndex();
|
|
922
|
+
return super.getElement();
|
|
923
|
+
}
|
|
924
|
+
async getIndexByCaption() {
|
|
925
|
+
const column = await this.driver.findElement(By15.css(`${this.parentCssSelector} ${getHeaderCssSelector()} ${getColumnByCaptionCssSelector(this._caption)}`));
|
|
926
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
921
927
|
}
|
|
922
928
|
async caption() {
|
|
923
929
|
const el = await this.getElement();
|
|
924
930
|
return el.getText();
|
|
925
931
|
}
|
|
926
|
-
getIndex() {
|
|
932
|
+
async getIndex() {
|
|
933
|
+
if (this.index == null) {
|
|
934
|
+
this.index = await this.getIndexByCaption();
|
|
935
|
+
}
|
|
927
936
|
return this.index;
|
|
928
937
|
}
|
|
929
938
|
};
|
|
@@ -931,67 +940,36 @@ var Column = class extends AbstractElementWithParent {
|
|
|
931
940
|
// src/pageObjects/elements/Table/Table.ts
|
|
932
941
|
var Table = class extends AbstractElementWithParent {
|
|
933
942
|
formName;
|
|
934
|
-
constructor(
|
|
935
|
-
super(
|
|
936
|
-
this.elementBy = By14.id(createTableId(formName));
|
|
943
|
+
constructor(parentCssSelector, formName, driver) {
|
|
944
|
+
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
937
945
|
this.formName = formName;
|
|
938
946
|
}
|
|
939
|
-
|
|
940
|
-
return
|
|
947
|
+
getRowByIndex(index) {
|
|
948
|
+
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption.bind(this));
|
|
941
949
|
}
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
return parentEl.findElement(By14.css(`div[role="grid"]`));
|
|
950
|
+
getColumnByIndex(index) {
|
|
951
|
+
return new Column(this.getFullCssSelector(), void 0, index, this.driver);
|
|
945
952
|
}
|
|
946
|
-
|
|
947
|
-
return this.
|
|
953
|
+
getColumnByCaption = (caption) => {
|
|
954
|
+
return new Column(this.getFullCssSelector(), caption, void 0, this.driver);
|
|
948
955
|
};
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
const row = await gridContainer.findElement(getRowPathByIndex(index));
|
|
952
|
-
if (row) {
|
|
953
|
-
return new Row(this.getTableElement, index, this.driver, this.getColumnByCaption.bind(this));
|
|
954
|
-
}
|
|
955
|
-
throw new Error(`Cannot find row by index: ${index}`);
|
|
956
|
-
}
|
|
957
|
-
async getColumnByIndex(index) {
|
|
958
|
-
const column = await (await this.getElement()).findElement(By14.css(`${this.getHeaderCssSelector()} ${getColumnByIndexCssSelector(index)}`));
|
|
959
|
-
if (column) {
|
|
960
|
-
return new Column(this.getTableElement, index, this.driver);
|
|
961
|
-
}
|
|
962
|
-
throw new Error(`Cannot find column by index: ${index}`);
|
|
963
|
-
}
|
|
964
|
-
async getColumnByCaption(caption) {
|
|
965
|
-
const column = await (await this.getElement()).findElement(By14.css(`${this.getHeaderCssSelector()} ${getColumnByCaptionCssSelector(caption)}`));
|
|
966
|
-
if (column) {
|
|
967
|
-
const index = await column.getAttribute("aria-colindex");
|
|
968
|
-
return new Column(this.getTableElement, transformOutputIndex(index), this.driver);
|
|
969
|
-
}
|
|
970
|
-
throw new Error(`Cannot find column by caption: ${caption}`);
|
|
971
|
-
}
|
|
972
|
-
async selectRowByIndex(index) {
|
|
973
|
-
const row = await this.getRowByIndex(index);
|
|
974
|
-
if (row) {
|
|
975
|
-
await row.select();
|
|
976
|
-
} else {
|
|
977
|
-
throw new Error(`Cannot find row by index: ${index}`);
|
|
978
|
-
}
|
|
956
|
+
selectRowByIndex(index) {
|
|
957
|
+
return this.getRowByIndex(index).select();
|
|
979
958
|
}
|
|
980
959
|
async getRows() {
|
|
981
|
-
const
|
|
982
|
-
const rows = await gridContainer.findElements(By14.className("dx-row dx-data-row"));
|
|
960
|
+
const rows = await this.driver.findElements(By16.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
983
961
|
const result = [];
|
|
984
962
|
rows.forEach((_, index) => {
|
|
985
|
-
const newRow = new Row(this.
|
|
963
|
+
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnByCaption);
|
|
986
964
|
result.push(newRow);
|
|
987
965
|
});
|
|
988
966
|
return result;
|
|
989
967
|
}
|
|
990
968
|
async getColumns() {
|
|
991
|
-
const columns = await
|
|
969
|
+
const columns = await this.driver.findElements(By16.css(`${this.getFullCssSelector()} ${getHeaderCssSelector()} td[role="columnheader"]`));
|
|
992
970
|
const result = [];
|
|
993
971
|
columns.forEach((_, index) => {
|
|
994
|
-
const newCol = new Column(this.
|
|
972
|
+
const newCol = new Column(this.getFullCssSelector(), void 0, index, this.driver);
|
|
995
973
|
result.push(newCol);
|
|
996
974
|
});
|
|
997
975
|
return result;
|
|
@@ -1007,54 +985,39 @@ var Table = class extends AbstractElementWithParent {
|
|
|
1007
985
|
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
1008
986
|
*/
|
|
1009
987
|
field(name) {
|
|
1010
|
-
return new FormField(this.
|
|
988
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1011
989
|
}
|
|
1012
990
|
};
|
|
1013
991
|
|
|
1014
|
-
// src/pageObjects/elements/TableToolbar/TableToolbar.ts
|
|
1015
|
-
import { By as By16 } from "selenium-webdriver";
|
|
1016
|
-
|
|
1017
992
|
// src/pageObjects/elements/TableToolbar/TableToolbarButton.ts
|
|
1018
|
-
import { By as By15 } from "selenium-webdriver";
|
|
1019
993
|
var TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1020
994
|
var TableToolbarButton = class extends AbstractElementWithParent {
|
|
1021
995
|
name;
|
|
1022
|
-
constructor(
|
|
1023
|
-
super(
|
|
996
|
+
constructor(parentCssSelector, name, driver) {
|
|
997
|
+
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1024
998
|
this.name = name;
|
|
1025
|
-
this.elementBy = By15.id(`${TOOLBAR_BUTTON_CLASS}-${name}`);
|
|
1026
999
|
}
|
|
1027
1000
|
async click() {
|
|
1028
1001
|
const button = await this.getElement();
|
|
1029
|
-
await
|
|
1002
|
+
await wait(async () => {
|
|
1030
1003
|
return await button.isDisplayed() && !await this.isDisabled();
|
|
1031
|
-
},
|
|
1032
|
-
|
|
1004
|
+
}, this.driver, `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`);
|
|
1005
|
+
await click(button, this.driver);
|
|
1033
1006
|
}
|
|
1034
1007
|
async isDisabled() {
|
|
1035
1008
|
const button = await this.getElement();
|
|
1036
|
-
|
|
1037
|
-
return result === "true";
|
|
1009
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
1038
1010
|
}
|
|
1039
1011
|
};
|
|
1040
1012
|
|
|
1041
1013
|
// src/pageObjects/elements/TableToolbar/TableToolbar.ts
|
|
1042
1014
|
var TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1043
1015
|
var TableToolbar = class extends AbstractElementWithParent {
|
|
1044
|
-
constructor(
|
|
1045
|
-
super(
|
|
1046
|
-
this.elementBy = By16.id(`${TABLE_TOOLBAR_CLASS}-${formName}`);
|
|
1016
|
+
constructor(parentCssSelector, formName, driver) {
|
|
1017
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1047
1018
|
}
|
|
1048
|
-
|
|
1049
|
-
return this.
|
|
1050
|
-
};
|
|
1051
|
-
async button(name) {
|
|
1052
|
-
const toolbar = await this.getTableToolbarElement();
|
|
1053
|
-
const button = await toolbar.findElement(By16.id(`${TOOLBAR_BUTTON_CLASS}-${name}`));
|
|
1054
|
-
if (button) {
|
|
1055
|
-
return new TableToolbarButton(this.getTableToolbarElement, name, this.driver);
|
|
1056
|
-
}
|
|
1057
|
-
throw new Error(`Cannot find button by name: ${name}`);
|
|
1019
|
+
button(name) {
|
|
1020
|
+
return new TableToolbarButton(this.getFullCssSelector(), name, this.driver);
|
|
1058
1021
|
}
|
|
1059
1022
|
};
|
|
1060
1023
|
|
|
@@ -1062,7 +1025,7 @@ var TableToolbar = class extends AbstractElementWithParent {
|
|
|
1062
1025
|
var ListForm = class extends AbstractForm {
|
|
1063
1026
|
constructor(driver) {
|
|
1064
1027
|
super(driver);
|
|
1065
|
-
this.
|
|
1028
|
+
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
1066
1029
|
}
|
|
1067
1030
|
/**
|
|
1068
1031
|
* Находит таблицу
|
|
@@ -1072,7 +1035,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1072
1035
|
* expect(listForm.table());
|
|
1073
1036
|
*/
|
|
1074
1037
|
table() {
|
|
1075
|
-
return new Table(this.
|
|
1038
|
+
return new Table(this.containerCssSelector, this.formName, this.driver);
|
|
1076
1039
|
}
|
|
1077
1040
|
/**
|
|
1078
1041
|
* Находит группу на лист форме по имени
|
|
@@ -1082,7 +1045,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1082
1045
|
* expect(await formEdit.group('Name');
|
|
1083
1046
|
*/
|
|
1084
1047
|
group(name) {
|
|
1085
|
-
return new FormGroup(this.
|
|
1048
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1086
1049
|
}
|
|
1087
1050
|
/**
|
|
1088
1051
|
* Находит таблицу
|
|
@@ -1092,7 +1055,7 @@ var ListForm = class extends AbstractForm {
|
|
|
1092
1055
|
* expect(listForm.toolbarButton());
|
|
1093
1056
|
*/
|
|
1094
1057
|
toolbarButton(name) {
|
|
1095
|
-
const toolbar = new TableToolbar(this.
|
|
1058
|
+
const toolbar = new TableToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1096
1059
|
return toolbar.button(name);
|
|
1097
1060
|
}
|
|
1098
1061
|
};
|
|
@@ -1159,11 +1122,13 @@ export {
|
|
|
1159
1122
|
SubsystemsPanel,
|
|
1160
1123
|
TextEditor,
|
|
1161
1124
|
byTestId,
|
|
1125
|
+
byTestIdCssSelector,
|
|
1162
1126
|
click,
|
|
1163
1127
|
config,
|
|
1164
1128
|
createDriver,
|
|
1165
1129
|
editorFactory,
|
|
1166
1130
|
elementIsNotPresent,
|
|
1167
1131
|
signIn,
|
|
1132
|
+
wait,
|
|
1168
1133
|
waitElementIsVisible
|
|
1169
1134
|
};
|