d5-testing-library 1.6.0 → 1.7.0-alpha.1
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-XOCYARDX.mjs +7 -0
- package/dist/ListForm-R7WQIGBI.mjs +7 -0
- package/dist/TreeView-STUAAR65.mjs +8 -0
- package/dist/{chunk-PNSQQKEY.mjs → chunk-CKCSBNKD.mjs} +1 -1
- package/dist/{chunk-4VLJL7OZ.mjs → chunk-JITTN2NY.mjs} +35 -13
- package/dist/{chunk-CFJ5JWM7.mjs → chunk-Q67RHZDP.mjs} +1 -1
- package/dist/{chunk-3EQV252X.mjs → chunk-WUPIBFH7.mjs} +127 -4
- package/dist/cjs/d5-testing-library.cjs +1365 -1093
- package/dist/d5-testing-library.d.ts +158 -56
- package/dist/d5-testing-library.legacy-esm.js +118 -10
- package/dist/d5-testing-library.mjs +118 -10
- package/package.json +4 -2
- package/dist/FormEdit-Z2QDWFFG.mjs +0 -7
- package/dist/ListForm-JAFTOUFG.mjs +0 -7
- package/dist/TreeView-YUECOEFI.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>;
|
|
@@ -191,6 +296,7 @@ declare class FormGroup extends AbstractElementWithParent implements Group {
|
|
|
191
296
|
expand(): Promise<void>;
|
|
192
297
|
isExpanded(): Promise<boolean>;
|
|
193
298
|
isCollapsed(): Promise<boolean>;
|
|
299
|
+
isActive(): Promise<boolean>;
|
|
194
300
|
}
|
|
195
301
|
|
|
196
302
|
declare class AbstractForm extends AbstractPage {
|
|
@@ -244,57 +350,6 @@ declare abstract class Form extends AbstractForm {
|
|
|
244
350
|
subForm(name: string): Promise<unknown>;
|
|
245
351
|
}
|
|
246
352
|
|
|
247
|
-
interface Editor {
|
|
248
|
-
setValue(value: any): Promise<void>;
|
|
249
|
-
getValue(): Promise<any>;
|
|
250
|
-
remove?(itemText: string): Promise<void>;
|
|
251
|
-
clear?(): Promise<void>;
|
|
252
|
-
isReadonly?(): Promise<boolean>;
|
|
253
|
-
}
|
|
254
|
-
declare enum ControlClass {
|
|
255
|
-
Text = "text-control",
|
|
256
|
-
TextArea = "text-area-control",
|
|
257
|
-
Number = "number-control",
|
|
258
|
-
CheckBox = "check-box",
|
|
259
|
-
Multiselect = "multi-select-control",
|
|
260
|
-
Select = "select-control",
|
|
261
|
-
Switch = "switch-control",
|
|
262
|
-
Date = "date-control",
|
|
263
|
-
SingleDateRange = "single-date-range-control",
|
|
264
|
-
BooleanSelector = "buttons-group",
|
|
265
|
-
ButtonGroup = "button-group-field"
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
interface ClearStrategy {
|
|
269
|
-
clear(editor: Editor): Promise<void>;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
declare abstract class AbstractDXEditorWithInput extends AbstractElementWithParent implements Editor {
|
|
273
|
-
private clearStrategy;
|
|
274
|
-
protected setClearStrategy(strategy: ClearStrategy): void;
|
|
275
|
-
protected getInputCssSelector(): string;
|
|
276
|
-
getInputElement(): Promise<selenium_webdriver.WebElement>;
|
|
277
|
-
protected getInputValue(): Promise<string>;
|
|
278
|
-
protected setInputValue(value: string): Promise<void>;
|
|
279
|
-
clear(): Promise<void>;
|
|
280
|
-
abstract setValue(value: any): Promise<void>;
|
|
281
|
-
abstract getValue(): Promise<any>;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
declare class TextEditor extends AbstractDXEditorWithInput {
|
|
285
|
-
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
286
|
-
getValue(): Promise<string>;
|
|
287
|
-
setValue(value: string): Promise<void>;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
declare class NumberEditor extends AbstractDXEditorWithInput {
|
|
291
|
-
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
292
|
-
getValue(): Promise<number | null>;
|
|
293
|
-
setValue(value: any): Promise<void>;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
declare const editorFactory: (parentCssSelector: string, elementCssSelector: string, driver: WebDriver) => Promise<Editor>;
|
|
297
|
-
|
|
298
353
|
declare class AbstractEditor extends AbstractElementWithParent implements Editor {
|
|
299
354
|
protected editor: Editor;
|
|
300
355
|
constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
|
|
@@ -543,7 +598,7 @@ declare class PanelFilterField extends AbstractEditor {
|
|
|
543
598
|
}
|
|
544
599
|
|
|
545
600
|
declare class FilterPanel extends AbstractElement {
|
|
546
|
-
private _formName;
|
|
601
|
+
private readonly _formName;
|
|
547
602
|
private get filterPanelSelector();
|
|
548
603
|
private filterPanelButtons;
|
|
549
604
|
constructor(formName: string, driver?: WebDriver);
|
|
@@ -560,6 +615,52 @@ declare class FilterPanel extends AbstractElement {
|
|
|
560
615
|
close(): Promise<void>;
|
|
561
616
|
}
|
|
562
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
|
+
|
|
563
664
|
declare class ListForm extends Form {
|
|
564
665
|
protected headerCssSelector: string;
|
|
565
666
|
constructor(driver: WebDriver);
|
|
@@ -587,6 +688,7 @@ declare class ListForm extends Form {
|
|
|
587
688
|
* expect(listForm.formFilter());
|
|
588
689
|
*/
|
|
589
690
|
formFilter(name: string): FormFilterField;
|
|
691
|
+
columnFilter(name: string): ColumnFilter;
|
|
590
692
|
/**
|
|
591
693
|
* Модель панели фильтрации
|
|
592
694
|
* @returns {FilterPanel}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TreeView
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q67RHZDP.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FilterPanel,
|
|
6
6
|
FormFilterField,
|
|
7
7
|
ListForm,
|
|
8
8
|
PanelFilterField
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-WUPIBFH7.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FormEdit
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-CKCSBNKD.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-JITTN2NY.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,15 +147,90 @@ 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
|
+
}
|
|
117
225
|
};
|
|
118
226
|
|
|
119
227
|
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
120
|
-
import { By as
|
|
228
|
+
import { By as By4 } from "selenium-webdriver";
|
|
121
229
|
var ReportForm = class extends FormEdit {
|
|
122
230
|
constructor(driver) {
|
|
123
231
|
super(driver);
|
|
124
232
|
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
125
|
-
this.saveButtonBy =
|
|
233
|
+
this.saveButtonBy = By4.id("button-apply");
|
|
126
234
|
}
|
|
127
235
|
/**
|
|
128
236
|
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
@@ -137,7 +245,7 @@ var ReportForm = class extends FormEdit {
|
|
|
137
245
|
};
|
|
138
246
|
|
|
139
247
|
// src/pageObjects/elements/Dialog.ts
|
|
140
|
-
import { By as
|
|
248
|
+
import { By as By5 } from "selenium-webdriver";
|
|
141
249
|
var DIALOG_CLASS = ".d5-dialog";
|
|
142
250
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
143
251
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
@@ -151,7 +259,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
151
259
|
}
|
|
152
260
|
async getElement() {
|
|
153
261
|
const panel = await super.getElement();
|
|
154
|
-
return panel.findElement(
|
|
262
|
+
return panel.findElement(By5.xpath(buttonByTextXpath(this.text)));
|
|
155
263
|
}
|
|
156
264
|
buttonNotDisplayedError() {
|
|
157
265
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -171,11 +279,11 @@ var Dialog = class extends AbstractElement {
|
|
|
171
279
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
172
280
|
}
|
|
173
281
|
async title() {
|
|
174
|
-
const el = await this.driver.findElement(
|
|
282
|
+
const el = await this.driver.findElement(By5.css(this.titleSelector));
|
|
175
283
|
return await el.getText();
|
|
176
284
|
}
|
|
177
285
|
async text() {
|
|
178
|
-
const el = await this.driver.findElement(
|
|
286
|
+
const el = await this.driver.findElement(By5.css(this.textSelector));
|
|
179
287
|
return await el.getText();
|
|
180
288
|
}
|
|
181
289
|
button(text) {
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TreeView
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q67RHZDP.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FilterPanel,
|
|
6
6
|
FormFilterField,
|
|
7
7
|
ListForm,
|
|
8
8
|
PanelFilterField
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-WUPIBFH7.mjs";
|
|
10
10
|
import {
|
|
11
11
|
FormEdit
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-CKCSBNKD.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-JITTN2NY.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,15 +147,90 @@ 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
|
+
}
|
|
117
225
|
};
|
|
118
226
|
|
|
119
227
|
// src/pageObjects/elements/Forms/ReportForm.ts
|
|
120
|
-
import { By as
|
|
228
|
+
import { By as By4 } from "selenium-webdriver";
|
|
121
229
|
var ReportForm = class extends FormEdit {
|
|
122
230
|
constructor(driver) {
|
|
123
231
|
super(driver);
|
|
124
232
|
this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
|
|
125
|
-
this.saveButtonBy =
|
|
233
|
+
this.saveButtonBy = By4.id("button-apply");
|
|
126
234
|
}
|
|
127
235
|
/**
|
|
128
236
|
* Знаходить поле/фільтр у формі репорту за ім'ям
|
|
@@ -137,7 +245,7 @@ var ReportForm = class extends FormEdit {
|
|
|
137
245
|
};
|
|
138
246
|
|
|
139
247
|
// src/pageObjects/elements/Dialog.ts
|
|
140
|
-
import { By as
|
|
248
|
+
import { By as By5 } from "selenium-webdriver";
|
|
141
249
|
var DIALOG_CLASS = ".d5-dialog";
|
|
142
250
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
143
251
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
@@ -151,7 +259,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
151
259
|
}
|
|
152
260
|
async getElement() {
|
|
153
261
|
const panel = await super.getElement();
|
|
154
|
-
return panel.findElement(
|
|
262
|
+
return panel.findElement(By5.xpath(buttonByTextXpath(this.text)));
|
|
155
263
|
}
|
|
156
264
|
buttonNotDisplayedError() {
|
|
157
265
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -171,11 +279,11 @@ var Dialog = class extends AbstractElement {
|
|
|
171
279
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
172
280
|
}
|
|
173
281
|
async title() {
|
|
174
|
-
const el = await this.driver.findElement(
|
|
282
|
+
const el = await this.driver.findElement(By5.css(this.titleSelector));
|
|
175
283
|
return await el.getText();
|
|
176
284
|
}
|
|
177
285
|
async text() {
|
|
178
|
-
const el = await this.driver.findElement(
|
|
286
|
+
const el = await this.driver.findElement(By5.css(this.textSelector));
|
|
179
287
|
return await el.getText();
|
|
180
288
|
}
|
|
181
289
|
button(text) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "d5-testing-library",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0-alpha.1",
|
|
4
4
|
"description": "e2e testing D5 projects",
|
|
5
5
|
"main": "dist/cjs/d5-testing-library.cjs",
|
|
6
6
|
"module": "dist/d5-testing-library.legacy-esm.js",
|
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
"build": "tsup",
|
|
23
23
|
"changelog": "node ./scripts/releaseChangelog.mjs changelog -p v1.0.1",
|
|
24
24
|
"prepublishOnly": "yarn clean",
|
|
25
|
-
"prepack": "yarn build"
|
|
25
|
+
"prepack": "yarn build",
|
|
26
|
+
"preminor": "npm version preminor --preid=alpha",
|
|
27
|
+
"prerelease": "npm version prerelease --preid=alpha"
|
|
26
28
|
},
|
|
27
29
|
"files": [
|
|
28
30
|
"dist"
|