d5-testing-library 1.5.0 → 1.7.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormEdit-2OXEIJRD.mjs +7 -0
- package/dist/ListForm-NWULJ2P6.mjs +7 -0
- package/dist/TreeView-USLYNLBL.mjs +8 -0
- package/dist/{chunk-FP26UOTI.mjs → chunk-H6LCUGIP.mjs} +1 -1
- package/dist/{chunk-VWNH6HVN.mjs → chunk-ISIVPVER.mjs} +152 -32
- package/dist/{chunk-44JIUIEW.mjs → chunk-M7ZEJQ34.mjs} +1 -1
- package/dist/{chunk-NWWYF43G.mjs → chunk-PVVYHCDQ.mjs} +124 -2
- package/dist/cjs/d5-testing-library.cjs +1407 -995
- package/dist/d5-testing-library.d.ts +194 -64
- package/dist/d5-testing-library.legacy-esm.js +137 -8
- package/dist/d5-testing-library.mjs +137 -8
- package/package.json +4 -2
- package/dist/FormEdit-MZJH5R5H.mjs +0 -7
- package/dist/ListForm-HDVXB6CG.mjs +0 -7
- package/dist/TreeView-DE5RBMDD.mjs +0 -8
|
@@ -120,10 +120,29 @@ declare function signIn(driver?: WebDriver): Promise<WebDriver>;
|
|
|
120
120
|
*/
|
|
121
121
|
declare const click: (webElement: WebElement, driver?: WebDriver) => Promise<void>;
|
|
122
122
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
interface Editor {
|
|
124
|
+
setValue(value: any): Promise<void>;
|
|
125
|
+
getValue(): Promise<any>;
|
|
126
|
+
remove?(itemText: string): Promise<void>;
|
|
127
|
+
clear?(): Promise<void>;
|
|
128
|
+
isReadonly?(): Promise<boolean>;
|
|
129
|
+
}
|
|
130
|
+
declare enum ControlClass {
|
|
131
|
+
Text = "text-control",
|
|
132
|
+
TextArea = "text-area-control",
|
|
133
|
+
Number = "number-control",
|
|
134
|
+
CheckBox = "check-box",
|
|
135
|
+
Multiselect = "multi-select-control",
|
|
136
|
+
Select = "select-control",
|
|
137
|
+
Switch = "switch-control",
|
|
138
|
+
Date = "date-control",
|
|
139
|
+
SingleDateRange = "single-date-range-control",
|
|
140
|
+
BooleanSelector = "buttons-group",
|
|
141
|
+
ButtonGroup = "button-group-field"
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
interface ClearStrategy {
|
|
145
|
+
clear(editor: Editor): Promise<void>;
|
|
127
146
|
}
|
|
128
147
|
|
|
129
148
|
declare abstract class AbstractElementWithParent extends AbstractElement {
|
|
@@ -133,6 +152,92 @@ declare abstract class AbstractElementWithParent extends AbstractElement {
|
|
|
133
152
|
isReadonly(): Promise<boolean>;
|
|
134
153
|
}
|
|
135
154
|
|
|
155
|
+
declare abstract class AbstractDXEditorWithInput extends AbstractElementWithParent implements Editor {
|
|
156
|
+
private clearStrategy;
|
|
157
|
+
protected setClearStrategy(strategy: ClearStrategy): void;
|
|
158
|
+
protected getInputCssSelector(): string;
|
|
159
|
+
getInputElement(): Promise<selenium_webdriver.WebElement>;
|
|
160
|
+
protected getInputValue(): Promise<string>;
|
|
161
|
+
protected setInputValue(value: string): Promise<void>;
|
|
162
|
+
clear(): Promise<void>;
|
|
163
|
+
abstract setValue(value: any): Promise<void>;
|
|
164
|
+
abstract getValue(): Promise<any>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
declare class TextEditor extends AbstractDXEditorWithInput {
|
|
168
|
+
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
169
|
+
getValue(): Promise<string>;
|
|
170
|
+
setValue(value: string): Promise<void>;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
declare class NumberEditor extends AbstractDXEditorWithInput {
|
|
174
|
+
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
175
|
+
getValue(): Promise<number | null>;
|
|
176
|
+
setValue(value: any): Promise<void>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
declare const editorFactory: (parentCssSelector: string, elementCssSelector: string, driver: WebDriver) => Promise<Editor>;
|
|
180
|
+
|
|
181
|
+
interface ISubsystemItem {
|
|
182
|
+
driver?: WebDriver;
|
|
183
|
+
bySelector: By;
|
|
184
|
+
}
|
|
185
|
+
declare class SubsystemItem {
|
|
186
|
+
private readonly bySelector;
|
|
187
|
+
private readonly driver;
|
|
188
|
+
constructor({ driver, bySelector }: ISubsystemItem);
|
|
189
|
+
getElement(): Promise<selenium_webdriver.WebElement>;
|
|
190
|
+
getTitle(): Promise<string>;
|
|
191
|
+
click(): Promise<void>;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
declare class SubsystemsPanel extends AbstractElement {
|
|
195
|
+
private header;
|
|
196
|
+
constructor(driver?: WebDriver);
|
|
197
|
+
headerTitle(): Promise<string>;
|
|
198
|
+
protected getSearchComponent(): TextEditor;
|
|
199
|
+
/**
|
|
200
|
+
* Находит сабсистему по заголовку
|
|
201
|
+
* @example
|
|
202
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
203
|
+
* //...
|
|
204
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
205
|
+
*/
|
|
206
|
+
search(title: string): Promise<void>;
|
|
207
|
+
/**
|
|
208
|
+
* Очищает поиск сабсистем
|
|
209
|
+
* @example
|
|
210
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
211
|
+
* //...
|
|
212
|
+
* await subsystemsPanel.searchClear();
|
|
213
|
+
*/
|
|
214
|
+
searchClear(): Promise<void>;
|
|
215
|
+
/**
|
|
216
|
+
* Возвращает сабсистему по имени
|
|
217
|
+
* @example
|
|
218
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
219
|
+
* //...
|
|
220
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
221
|
+
*/
|
|
222
|
+
item(name: string): SubsystemItem;
|
|
223
|
+
/**
|
|
224
|
+
* Возвращает сабсистему по заголовку
|
|
225
|
+
* @example
|
|
226
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
227
|
+
* //...
|
|
228
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
229
|
+
*/
|
|
230
|
+
itemByTitle(title: string): SubsystemItem;
|
|
231
|
+
/**
|
|
232
|
+
* Возвращается на уровень выше по сабсистемам
|
|
233
|
+
* @example
|
|
234
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
235
|
+
* //...
|
|
236
|
+
* wait subsystemsPanel.back();
|
|
237
|
+
*/
|
|
238
|
+
back(): Promise<void>;
|
|
239
|
+
}
|
|
240
|
+
|
|
136
241
|
interface Button {
|
|
137
242
|
click(): Promise<void>;
|
|
138
243
|
isDisabled(): Promise<boolean>;
|
|
@@ -154,15 +259,18 @@ declare class FormButton extends DXButton {
|
|
|
154
259
|
protected buttonNotDisplayedError(): string;
|
|
155
260
|
}
|
|
156
261
|
|
|
157
|
-
interface Group {
|
|
262
|
+
interface Group<TItem = unknown> {
|
|
158
263
|
isDisplayed(): Promise<boolean>;
|
|
159
|
-
|
|
264
|
+
click?(): Promise<void>;
|
|
265
|
+
itemClick?(name: string): Promise<void>;
|
|
266
|
+
item?(name: string): TItem;
|
|
267
|
+
accordionClick?(): Promise<void>;
|
|
160
268
|
}
|
|
161
269
|
|
|
162
270
|
declare class FormGroup extends AbstractElementWithParent implements Group {
|
|
163
|
-
|
|
271
|
+
private groupInstance;
|
|
164
272
|
constructor(parentCssSelector: string, formName: string, name: string, driver?: WebDriver);
|
|
165
|
-
private
|
|
273
|
+
private initInstance;
|
|
166
274
|
/**
|
|
167
275
|
* Возвращает булевое значение доступна ли группа
|
|
168
276
|
* @example
|
|
@@ -170,11 +278,25 @@ declare class FormGroup extends AbstractElementWithParent implements Group {
|
|
|
170
278
|
*/
|
|
171
279
|
isDisplayed(): Promise<boolean>;
|
|
172
280
|
/**
|
|
173
|
-
*
|
|
281
|
+
* Клик по элементам группы.
|
|
282
|
+
* Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
|
|
174
283
|
* @example
|
|
175
|
-
* expect(await tableList.group('TabPanel').
|
|
284
|
+
* expect(await tableList.group('TabPanel').itemClick('Tab');
|
|
285
|
+
* expect(await tableList.group('Accordion').itemClick('AccordionItem');
|
|
176
286
|
*/
|
|
177
|
-
|
|
287
|
+
itemClick(name: string): Promise<void>;
|
|
288
|
+
/**
|
|
289
|
+
* Метод работает если группа - это элемент аккордеона или вкладка таб панели
|
|
290
|
+
* @example
|
|
291
|
+
* expect(await tableList.group('Tab').click();
|
|
292
|
+
* expect(await tableList.group('AccordionItem').click();
|
|
293
|
+
*/
|
|
294
|
+
click(): Promise<void>;
|
|
295
|
+
collapse(): Promise<void>;
|
|
296
|
+
expand(): Promise<void>;
|
|
297
|
+
isExpanded(): Promise<boolean>;
|
|
298
|
+
isCollapsed(): Promise<boolean>;
|
|
299
|
+
isActive(): Promise<boolean>;
|
|
178
300
|
}
|
|
179
301
|
|
|
180
302
|
declare class AbstractForm extends AbstractPage {
|
|
@@ -228,57 +350,6 @@ declare abstract class Form extends AbstractForm {
|
|
|
228
350
|
subForm(name: string): Promise<unknown>;
|
|
229
351
|
}
|
|
230
352
|
|
|
231
|
-
interface Editor {
|
|
232
|
-
setValue(value: any): Promise<void>;
|
|
233
|
-
getValue(): Promise<any>;
|
|
234
|
-
remove?(itemText: string): Promise<void>;
|
|
235
|
-
clear?(): Promise<void>;
|
|
236
|
-
isReadonly?(): Promise<boolean>;
|
|
237
|
-
}
|
|
238
|
-
declare enum ControlClass {
|
|
239
|
-
Text = "text-control",
|
|
240
|
-
TextArea = "text-area-control",
|
|
241
|
-
Number = "number-control",
|
|
242
|
-
CheckBox = "check-box",
|
|
243
|
-
Multiselect = "multi-select-control",
|
|
244
|
-
Select = "select-control",
|
|
245
|
-
Switch = "switch-control",
|
|
246
|
-
Date = "date-control",
|
|
247
|
-
SingleDateRange = "single-date-range-control",
|
|
248
|
-
BooleanSelector = "buttons-group",
|
|
249
|
-
ButtonGroup = "button-group-field"
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
interface ClearStrategy {
|
|
253
|
-
clear(editor: Editor): Promise<void>;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
declare abstract class AbstractDXEditorWithInput extends AbstractElementWithParent implements Editor {
|
|
257
|
-
private clearStrategy;
|
|
258
|
-
protected setClearStrategy(strategy: ClearStrategy): void;
|
|
259
|
-
protected getInputCssSelector(): string;
|
|
260
|
-
getInputElement(): Promise<selenium_webdriver.WebElement>;
|
|
261
|
-
protected getInputValue(): Promise<string>;
|
|
262
|
-
protected setInputValue(value: string): Promise<void>;
|
|
263
|
-
clear(): Promise<void>;
|
|
264
|
-
abstract setValue(value: any): Promise<void>;
|
|
265
|
-
abstract getValue(): Promise<any>;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
declare class TextEditor extends AbstractDXEditorWithInput {
|
|
269
|
-
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
270
|
-
getValue(): Promise<string>;
|
|
271
|
-
setValue(value: string): Promise<void>;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
declare class NumberEditor extends AbstractDXEditorWithInput {
|
|
275
|
-
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
276
|
-
getValue(): Promise<number | null>;
|
|
277
|
-
setValue(value: any): Promise<void>;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
declare const editorFactory: (parentCssSelector: string, elementCssSelector: string, driver: WebDriver) => Promise<Editor>;
|
|
281
|
-
|
|
282
353
|
declare class AbstractEditor extends AbstractElementWithParent implements Editor {
|
|
283
354
|
protected editor: Editor;
|
|
284
355
|
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
@@ -527,7 +598,7 @@ declare class PanelFilterField extends AbstractEditor {
|
|
|
527
598
|
}
|
|
528
599
|
|
|
529
600
|
declare class FilterPanel extends AbstractElement {
|
|
530
|
-
private _formName;
|
|
601
|
+
private readonly _formName;
|
|
531
602
|
private get filterPanelSelector();
|
|
532
603
|
private filterPanelButtons;
|
|
533
604
|
constructor(formName: string, driver?: WebDriver);
|
|
@@ -544,6 +615,52 @@ declare class FilterPanel extends AbstractElement {
|
|
|
544
615
|
close(): Promise<void>;
|
|
545
616
|
}
|
|
546
617
|
|
|
618
|
+
declare class HeaderFilterField extends AbstractEditor {
|
|
619
|
+
constructor(parentCssSelector: string, formName: string, name: string, driver?: WebDriver);
|
|
620
|
+
getValue(): Promise<any>;
|
|
621
|
+
setValue(value: any): Promise<void>;
|
|
622
|
+
clear(): Promise<void>;
|
|
623
|
+
remove(itemText: string): Promise<void>;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
declare class ColumnFilter extends AbstractElement {
|
|
627
|
+
private readonly _formName;
|
|
628
|
+
private readonly _name;
|
|
629
|
+
private _column;
|
|
630
|
+
constructor(formName: string, name: string, column: Column, driver?: WebDriver);
|
|
631
|
+
private getApplyButton;
|
|
632
|
+
private getCancelButton;
|
|
633
|
+
protected apply(): Promise<void>;
|
|
634
|
+
protected cancel(): Promise<void>;
|
|
635
|
+
protected initFilter(): Promise<HeaderFilterField>;
|
|
636
|
+
/**
|
|
637
|
+
* Возвращает значение в поле
|
|
638
|
+
* @example
|
|
639
|
+
* expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
|
|
640
|
+
* expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
|
|
641
|
+
*/
|
|
642
|
+
getValue(): Promise<any>;
|
|
643
|
+
/**
|
|
644
|
+
* Устанавливает значение в поле
|
|
645
|
+
* @example
|
|
646
|
+
* await form.columnFilter('NumberFld').setValue(123);
|
|
647
|
+
* await form.columnFilter('TextFld').setValue('TestValue');
|
|
648
|
+
*/
|
|
649
|
+
setValue(value: any): Promise<void>;
|
|
650
|
+
/**
|
|
651
|
+
* Очищает значение в поле
|
|
652
|
+
* @example
|
|
653
|
+
* await form.columnFilter('NumberFld').clear();
|
|
654
|
+
*/
|
|
655
|
+
clear(): Promise<void>;
|
|
656
|
+
/**
|
|
657
|
+
* Удаляет тег по переданному тексту
|
|
658
|
+
* @example
|
|
659
|
+
* await form.columnFilter('TagBox').remove('test');
|
|
660
|
+
*/
|
|
661
|
+
remove(itemText: string): Promise<void>;
|
|
662
|
+
}
|
|
663
|
+
|
|
547
664
|
declare class ListForm extends Form {
|
|
548
665
|
protected headerCssSelector: string;
|
|
549
666
|
constructor(driver: WebDriver);
|
|
@@ -571,6 +688,7 @@ declare class ListForm extends Form {
|
|
|
571
688
|
* expect(listForm.formFilter());
|
|
572
689
|
*/
|
|
573
690
|
formFilter(name: string): FormFilterField;
|
|
691
|
+
columnFilter(name: string): ColumnFilter;
|
|
574
692
|
/**
|
|
575
693
|
* Модель панели фильтрации
|
|
576
694
|
* @returns {FilterPanel}
|
|
@@ -586,6 +704,18 @@ declare class TreeView extends ListForm {
|
|
|
586
704
|
constructor(driver: WebDriver);
|
|
587
705
|
}
|
|
588
706
|
|
|
707
|
+
declare class ReportForm extends FormEdit {
|
|
708
|
+
constructor(driver: WebDriver);
|
|
709
|
+
/**
|
|
710
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
711
|
+
* @example
|
|
712
|
+
* const formReport = new MyForm();
|
|
713
|
+
* //...
|
|
714
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
715
|
+
*/
|
|
716
|
+
filterField(name: string): FormField;
|
|
717
|
+
}
|
|
718
|
+
|
|
589
719
|
declare class DialogButton extends AbstractButton implements Button {
|
|
590
720
|
private readonly text;
|
|
591
721
|
constructor(parentCssSelector: string, text: string, driver?: WebDriver);
|
|
@@ -602,4 +732,4 @@ declare class Dialog extends AbstractElement {
|
|
|
602
732
|
button(text: string): DialogButton;
|
|
603
733
|
}
|
|
604
734
|
|
|
605
|
-
export { AbstractPage, ControlClass, Dialog, Editor, FilterPanel, FormEdit, FormField, FormFilterField, ListForm, LoginPage, NumberEditor, PanelFilterField, SubsystemsPanel, TextEditor, TreeView, byTestId, byTestIdCssSelector, click, config, createDriver, editorFactory, elementIsNotPresent, readonlyLocator, signIn, wait, waitElementIsVisible };
|
|
735
|
+
export { AbstractPage, ControlClass, Dialog, Editor, FilterPanel, FormEdit, FormField, FormFilterField, ListForm, LoginPage, NumberEditor, PanelFilterField, ReportForm, SubsystemsPanel, TextEditor, TreeView, byTestId, byTestIdCssSelector, click, config, createDriver, editorFactory, elementIsNotPresent, readonlyLocator, signIn, wait, waitElementIsVisible };
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TreeView
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M7ZEJQ34.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FilterPanel,
|
|
6
6
|
FormFilterField,
|
|
7
7
|
ListForm,
|
|
8
8
|
PanelFilterField
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-PVVYHCDQ.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FormEdit
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-H6LCUGIP.mjs";
|
|
13
13
|
import {
|
|
14
14
|
AbstractButton,
|
|
15
15
|
AbstractElement,
|
|
16
16
|
AbstractElementWithParent,
|
|
17
17
|
AbstractPage,
|
|
18
18
|
ControlClass,
|
|
19
|
+
DX_CLEAR_BUTTON_AREA,
|
|
19
20
|
FormField,
|
|
20
21
|
NumberEditor,
|
|
21
22
|
TextEditor,
|
|
@@ -23,11 +24,13 @@ import {
|
|
|
23
24
|
byTestIdCssSelector,
|
|
24
25
|
click,
|
|
25
26
|
config,
|
|
27
|
+
createSubSystemTestId,
|
|
26
28
|
editorFactory,
|
|
29
|
+
fixElementStaleError,
|
|
27
30
|
readonlyLocator,
|
|
28
31
|
wait,
|
|
29
32
|
waitElementIsVisible
|
|
30
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-ISIVPVER.mjs";
|
|
31
34
|
|
|
32
35
|
// src/pageObjects/pages/LoginPage.ts
|
|
33
36
|
var LOGIN_PATH = "/login";
|
|
@@ -103,6 +106,36 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
|
103
106
|
};
|
|
104
107
|
|
|
105
108
|
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
109
|
+
import { By as By3 } from "selenium-webdriver";
|
|
110
|
+
|
|
111
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
|
|
112
|
+
var SubsystemItem = class {
|
|
113
|
+
bySelector;
|
|
114
|
+
driver;
|
|
115
|
+
constructor({ driver, bySelector }) {
|
|
116
|
+
this.bySelector = bySelector;
|
|
117
|
+
this.driver = driver;
|
|
118
|
+
}
|
|
119
|
+
async getElement() {
|
|
120
|
+
return fixElementStaleError(this.bySelector, this.driver);
|
|
121
|
+
}
|
|
122
|
+
async getTitle() {
|
|
123
|
+
const el = await this.getElement();
|
|
124
|
+
return await el.getAttribute("data-title");
|
|
125
|
+
}
|
|
126
|
+
async click() {
|
|
127
|
+
const el = await this.getElement();
|
|
128
|
+
await click(el, this.driver);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
133
|
+
var SEARCH_ITEM_SELECTOR = "search-item";
|
|
134
|
+
var BACK_BUTTON_SELECTOR = "subsystem-back-item";
|
|
135
|
+
var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
|
|
136
|
+
var byTitleCssSelector = (title) => {
|
|
137
|
+
return `span[data-title="${title}"]`;
|
|
138
|
+
};
|
|
106
139
|
var SubsystemsPanel = class extends AbstractElement {
|
|
107
140
|
header;
|
|
108
141
|
constructor(driver) {
|
|
@@ -114,10 +147,105 @@ var SubsystemsPanel = class extends AbstractElement {
|
|
|
114
147
|
await wait(async () => await title.getText() != "", this.driver);
|
|
115
148
|
return title.getText();
|
|
116
149
|
}
|
|
150
|
+
getSearchComponent() {
|
|
151
|
+
return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Находит сабсистему по заголовку
|
|
155
|
+
* @example
|
|
156
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
157
|
+
* //...
|
|
158
|
+
* await subsystemsPanel.search('SubSystemTitle');
|
|
159
|
+
*/
|
|
160
|
+
async search(title) {
|
|
161
|
+
const searchComponent = this.getSearchComponent();
|
|
162
|
+
await searchComponent.setValue(title);
|
|
163
|
+
await wait(
|
|
164
|
+
async () => {
|
|
165
|
+
const findElement = await this.itemByTitle(title).getElement();
|
|
166
|
+
const classes = await findElement.getAttribute("class");
|
|
167
|
+
return classes.includes(SEARCH_ITEM_SELECTOR);
|
|
168
|
+
},
|
|
169
|
+
this.driver,
|
|
170
|
+
`Cannot find element: ${title}`
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Очищает поиск сабсистем
|
|
175
|
+
* @example
|
|
176
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
177
|
+
* //...
|
|
178
|
+
* await subsystemsPanel.searchClear();
|
|
179
|
+
*/
|
|
180
|
+
async searchClear() {
|
|
181
|
+
const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
|
|
182
|
+
const clearBtn = await this.driver.findElement(By3.css(clearBtnSelector));
|
|
183
|
+
if (await clearBtn.isDisplayed()) {
|
|
184
|
+
await click(clearBtn, this.driver);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Возвращает сабсистему по имени
|
|
189
|
+
* @example
|
|
190
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
191
|
+
* //...
|
|
192
|
+
* const subsystem = subsystemsPanel.item('SubSystemName');
|
|
193
|
+
*/
|
|
194
|
+
item(name) {
|
|
195
|
+
const elementCSS = createSubSystemTestId(name);
|
|
196
|
+
return new SubsystemItem({ driver: this.driver, bySelector: By3.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Возвращает сабсистему по заголовку
|
|
200
|
+
* @example
|
|
201
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
202
|
+
* //...
|
|
203
|
+
* const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
|
|
204
|
+
*/
|
|
205
|
+
itemByTitle(title) {
|
|
206
|
+
return new SubsystemItem({ driver: this.driver, bySelector: By3.css(byTitleCssSelector(title)) });
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Возвращается на уровень выше по сабсистемам
|
|
210
|
+
* @example
|
|
211
|
+
* const subsystemsPanel= new SubsystemsPanel();
|
|
212
|
+
* //...
|
|
213
|
+
* wait subsystemsPanel.back();
|
|
214
|
+
*/
|
|
215
|
+
async back() {
|
|
216
|
+
const backButton = this.driver.findElement(By3.css(`#aside .${BACK_BUTTON_SELECTOR}`));
|
|
217
|
+
await waitElementIsVisible(
|
|
218
|
+
{
|
|
219
|
+
element: backButton,
|
|
220
|
+
driver: this.driver
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
await click(backButton, this.driver);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
228
|
+
import { By as By4 } from "selenium-webdriver";
|
|
229
|
+
var ReportForm = class extends FormEdit {
|
|
230
|
+
constructor(driver) {
|
|
231
|
+
super(driver);
|
|
232
|
+
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
233
|
+
this.saveButtonBy = By4.id("button-apply");
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
237
|
+
* @example
|
|
238
|
+
* const formReport = new MyForm();
|
|
239
|
+
* //...
|
|
240
|
+
* expect(await formReport.filterField('Name').getValue()).toBe('test value');
|
|
241
|
+
*/
|
|
242
|
+
filterField(name) {
|
|
243
|
+
return super.field(name);
|
|
244
|
+
}
|
|
117
245
|
};
|
|
118
246
|
|
|
119
247
|
// src/pageObjects/elements/Dialog.ts
|
|
120
|
-
import { By as
|
|
248
|
+
import { By as By5 } from "selenium-webdriver";
|
|
121
249
|
var DIALOG_CLASS = ".d5-dialog";
|
|
122
250
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
123
251
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
@@ -131,7 +259,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
131
259
|
}
|
|
132
260
|
async getElement() {
|
|
133
261
|
const panel = await super.getElement();
|
|
134
|
-
return panel.findElement(
|
|
262
|
+
return panel.findElement(By5.xpath(buttonByTextXpath(this.text)));
|
|
135
263
|
}
|
|
136
264
|
buttonNotDisplayedError() {
|
|
137
265
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -151,11 +279,11 @@ var Dialog = class extends AbstractElement {
|
|
|
151
279
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
152
280
|
}
|
|
153
281
|
async title() {
|
|
154
|
-
const el = await this.driver.findElement(
|
|
282
|
+
const el = await this.driver.findElement(By5.css(this.titleSelector));
|
|
155
283
|
return await el.getText();
|
|
156
284
|
}
|
|
157
285
|
async text() {
|
|
158
|
-
const el = await this.driver.findElement(
|
|
286
|
+
const el = await this.driver.findElement(By5.css(this.textSelector));
|
|
159
287
|
return await el.getText();
|
|
160
288
|
}
|
|
161
289
|
button(text) {
|
|
@@ -174,6 +302,7 @@ export {
|
|
|
174
302
|
LoginPage,
|
|
175
303
|
NumberEditor,
|
|
176
304
|
PanelFilterField,
|
|
305
|
+
ReportForm,
|
|
177
306
|
SubsystemsPanel,
|
|
178
307
|
TextEditor,
|
|
179
308
|
TreeView,
|