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.
@@ -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
- declare class SubsystemsPanel extends AbstractElement {
124
- private header;
125
- constructor(driver?: WebDriver);
126
- headerTitle(): Promise<string>;
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
- tabClick(name: string): Promise<void>;
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
- editor: Group;
271
+ private groupInstance;
164
272
  constructor(parentCssSelector: string, formName: string, name: string, driver?: WebDriver);
165
- private initEditor;
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').tabClick(tabName);
284
+ * expect(await tableList.group('TabPanel').itemClick('Tab');
285
+ * expect(await tableList.group('Accordion').itemClick('AccordionItem');
176
286
  */
177
- tabClick(name: string): Promise<void>;
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-44JIUIEW.mjs";
3
+ } from "./chunk-M7ZEJQ34.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-NWWYF43G.mjs";
9
+ } from "./chunk-PVVYHCDQ.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-FP26UOTI.mjs";
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-VWNH6HVN.mjs";
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 By3 } from "selenium-webdriver";
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(By3.xpath(buttonByTextXpath(this.text)));
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(By3.css(this.titleSelector));
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(By3.css(this.textSelector));
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,