@thinkwise/testwise 0.1.12 → 0.1.65
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/Testwise.ts +5 -1
- package/components/filter/FilterForm.ts +1 -1
- package/components/filter/FindForm.ts +1 -1
- package/components/grid/Grid.ts +88 -12
- package/components/grid/GridObjects.ts +16 -8
- package/components/index.ts +7 -3
- package/components/pop-up/PopUpComponent.ts +1 -1
- package/components/tab/BaseTab.ts +42 -0
- package/components/tab/BaseTabObjects.ts +23 -0
- package/components/tab/ComponentTab.ts +35 -0
- package/components/tab/ComponentTabObjects.ts +14 -0
- package/components/tab/DetailTab.ts +20 -0
- package/components/tab/DetailTabObjects.ts +10 -0
- package/components/task/TaskBar.ts +29 -9
- package/components/task/TaskBarObjects.ts +24 -0
- package/components/task/TaskTile.ts +28 -0
- package/components/task/TaskTileObjects.ts +20 -0
- package/controls/LookupDropdown.ts +54 -0
- package/controls/index.ts +1 -0
- package/dist/Testwise.js +4 -2
- package/dist/Testwise.js.map +1 -1
- package/dist/biome.json +52 -0
- package/dist/components/filter/FilterForm.d.ts +5 -0
- package/dist/components/filter/FilterForm.js +10 -0
- package/dist/components/filter/FilterForm.js.map +1 -0
- package/dist/components/filter/FindForm.d.ts +5 -0
- package/dist/components/filter/FindForm.js +10 -0
- package/dist/components/filter/FindForm.js.map +1 -0
- package/dist/components/grid/Grid.d.ts +25 -6
- package/dist/components/grid/Grid.js +80 -16
- package/dist/components/grid/Grid.js.map +1 -1
- package/dist/components/grid/GridObjects.d.ts +5 -3
- package/dist/components/grid/GridObjects.js +9 -6
- package/dist/components/grid/GridObjects.js.map +1 -1
- package/dist/components/index.d.ts +7 -3
- package/dist/components/index.js +7 -3
- package/dist/components/index.js.map +1 -1
- package/dist/components/pop-up/PopUpComponent.js +1 -1
- package/dist/components/pop-up/PopUpComponent.js.map +1 -1
- package/dist/components/pop-up/{PopUpComponentModels.js → PopUpComponentObjects.js} +1 -1
- package/dist/components/pop-up/PopUpComponentObjects.js.map +1 -0
- package/dist/components/tab/BaseTab.d.ts +11 -0
- package/dist/components/tab/BaseTab.js +34 -0
- package/dist/components/tab/BaseTab.js.map +1 -0
- package/dist/components/tab/BaseTabObjects.d.ts +10 -0
- package/dist/components/tab/BaseTabObjects.js +14 -0
- package/dist/components/tab/BaseTabObjects.js.map +1 -0
- package/dist/components/tab/ComponentTab.d.ts +11 -0
- package/dist/components/tab/ComponentTab.js +27 -0
- package/dist/components/tab/ComponentTab.js.map +1 -0
- package/dist/components/tab/ComponentTabObjects.d.ts +7 -0
- package/dist/components/tab/ComponentTabObjects.js +10 -0
- package/dist/components/tab/ComponentTabObjects.js.map +1 -0
- package/dist/components/tab/DetailTab.d.ts +9 -0
- package/dist/components/tab/DetailTab.js +15 -0
- package/dist/components/tab/DetailTab.js.map +1 -0
- package/dist/components/tab/DetailTabObjects.d.ts +5 -0
- package/dist/components/tab/DetailTabObjects.js +7 -0
- package/dist/components/tab/DetailTabObjects.js.map +1 -0
- package/dist/components/task/TaskBar.d.ts +17 -0
- package/dist/components/task/TaskBar.js +23 -0
- package/dist/components/task/TaskBar.js.map +1 -0
- package/dist/components/task/TaskBarObjects.d.ts +17 -0
- package/dist/components/task/TaskBarObjects.js +19 -0
- package/dist/components/task/TaskBarObjects.js.map +1 -0
- package/dist/components/task/TaskTile.d.ts +14 -0
- package/dist/components/task/TaskTile.js +20 -0
- package/dist/components/task/TaskTile.js.map +1 -0
- package/dist/components/task/TaskTileObjects.d.ts +13 -0
- package/dist/components/task/TaskTileObjects.js +15 -0
- package/dist/components/task/TaskTileObjects.js.map +1 -0
- package/dist/config.json +10 -10
- package/dist/controls/LookupDropdown.d.ts +11 -0
- package/dist/controls/LookupDropdown.js +39 -0
- package/dist/controls/LookupDropdown.js.map +1 -0
- package/dist/controls/index.d.ts +1 -0
- package/dist/controls/index.js +2 -0
- package/dist/controls/index.js.map +1 -0
- package/dist/enums/LogLevel.d.ts +2 -3
- package/dist/enums/LogLevel.js +1 -2
- package/dist/enums/LogLevel.js.map +1 -1
- package/dist/enums/index.d.ts +1 -0
- package/dist/enums/index.js +2 -0
- package/dist/enums/index.js.map +1 -0
- package/dist/example-code/TestifyService.js +22 -12
- package/dist/example-code/TestifyService.js.map +1 -1
- package/dist/helpers/Ensure.d.ts +2 -0
- package/dist/helpers/Ensure.js +10 -0
- package/dist/helpers/Ensure.js.map +1 -0
- package/dist/helpers/FlightTracker.d.ts +6 -0
- package/dist/helpers/FlightTracker.js +25 -0
- package/dist/helpers/FlightTracker.js.map +1 -0
- package/dist/helpers/GlobalWaitEventHandler.d.ts +12 -0
- package/dist/helpers/GlobalWaitEventHandler.js +53 -0
- package/dist/helpers/GlobalWaitEventHandler.js.map +1 -0
- package/dist/helpers/LoginHelper.d.ts +3 -2
- package/dist/helpers/LoginHelper.js +14 -8
- package/dist/helpers/LoginHelper.js.map +1 -1
- package/dist/helpers/Poll.d.ts +2 -0
- package/dist/helpers/Poll.js +17 -0
- package/dist/helpers/Poll.js.map +1 -0
- package/dist/helpers/RegexHelper.d.ts +5 -0
- package/dist/helpers/RegexHelper.js +16 -0
- package/dist/helpers/RegexHelper.js.map +1 -0
- package/dist/helpers/UserSimulationHelper.d.ts +1 -1
- package/dist/helpers/UserSimulationHelper.js +10 -6
- package/dist/helpers/UserSimulationHelper.js.map +1 -1
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +8 -12
- package/dist/index.js +9 -13
- package/dist/index.js.map +1 -1
- package/dist/package-lock.json +4087 -0
- package/dist/package.json +59 -0
- package/dist/page-extensions/GoToDeepLink.js +15 -1
- package/dist/page-extensions/GoToDeepLink.js.map +1 -1
- package/dist/page-extensions/LoginFeatures.d.ts +2 -1
- package/dist/page-extensions/LoginFeatures.js +3 -0
- package/dist/page-extensions/LoginFeatures.js.map +1 -1
- package/dist/page-extensions/WaitEventHandler.d.ts +12 -0
- package/dist/page-extensions/WaitEventHandler.js +15 -0
- package/dist/page-extensions/WaitEventHandler.js.map +1 -0
- package/dist/page-extensions/index.d.ts +3 -0
- package/dist/page-extensions/index.js +4 -0
- package/dist/page-extensions/index.js.map +1 -0
- package/dist/page-overrides/ClickOverride.d.ts +1 -0
- package/dist/page-overrides/ClickOverride.js +46 -25
- package/dist/page-overrides/ClickOverride.js.map +1 -1
- package/dist/page-overrides/FillOverride.d.ts +7 -0
- package/dist/page-overrides/FillOverride.js +106 -0
- package/dist/page-overrides/FillOverride.js.map +1 -0
- package/dist/page-overrides/index.d.ts +1 -0
- package/dist/page-overrides/index.js +2 -0
- package/dist/page-overrides/index.js.map +1 -0
- package/dist/scripts/Testwise.template.json +25 -0
- package/dist/scripts/tsconfig.template.json +12 -0
- package/dist/services/ConfigBuilder.js +25 -2
- package/dist/services/ConfigBuilder.js.map +1 -1
- package/dist/services/Logger.d.ts +1 -2
- package/dist/services/Logger.js +69 -15
- package/dist/services/Logger.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/dist/tsconfig.json +20 -0
- package/dist/types/PollTypes.d.ts +6 -0
- package/dist/types/PollTypes.js +2 -0
- package/dist/types/PollTypes.js.map +1 -0
- package/dist/types/Universal.js +2 -0
- package/dist/types/Universal.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/enums/LogLevel.ts +2 -3
- package/enums/index.ts +1 -0
- package/example-code/TestifyService.ts +26 -12
- package/helpers/Ensure.ts +9 -0
- package/helpers/FlightTracker.ts +26 -0
- package/helpers/GlobalWaitEventHandler.ts +66 -0
- package/helpers/LoginHelper.ts +20 -8
- package/helpers/Poll.ts +19 -0
- package/helpers/RegexHelper.ts +17 -0
- package/helpers/UserSimulationHelper.ts +11 -6
- package/helpers/index.ts +2 -0
- package/index.ts +9 -13
- package/package.json +24 -8
- package/page-extensions/GoToDeepLink.ts +17 -1
- package/page-extensions/LoginFeatures.ts +6 -1
- package/page-extensions/WaitEventHandler.ts +26 -0
- package/page-extensions/index.ts +3 -0
- package/page-overrides/ClickOverride.ts +60 -26
- package/page-overrides/FillOverride.ts +133 -0
- package/page-overrides/index.ts +1 -0
- package/promptCredentials.js +124 -113
- package/scripts/Testwise.template.json +4 -1
- package/scripts/main.js +11 -0
- package/scripts/setup.js +34 -0
- package/scripts/tsconfig.template.json +12 -0
- package/services/ConfigBuilder.ts +29 -2
- package/services/Logger.ts +73 -15
- package/services/index.ts +1 -0
- package/tsconfig.json +20 -0
- package/types/PollTypes.ts +6 -0
- package/types/index.ts +2 -0
- package/.ci/azure-pipelines.yaml +0 -80
- package/.eslintcache +0 -1
- package/.gitattributes +0 -3
- package/.gitconfig +0 -2
- package/.vscode/settings.json +0 -20
- package/components/tab/Tab.ts +0 -29
- package/components/task/TaskTiles.ts +0 -11
- package/dist/components/pop-up/PopUpComponentModels.js.map +0 -1
- package/dist/enums/ActionbarRegions.d.ts +0 -5
- package/dist/enums/ActionbarRegions.js +0 -7
- package/dist/enums/ActionbarRegions.js.map +0 -1
- package/dist/enums/ButtonEnums.d.ts +0 -24
- package/dist/enums/ButtonEnums.js +0 -29
- package/dist/enums/ButtonEnums.js.map +0 -1
- package/dist/helpers/InflightRequestTracker.d.ts +0 -10
- package/dist/helpers/InflightRequestTracker.js +0 -26
- package/dist/helpers/InflightRequestTracker.js.map +0 -1
- package/dist/types/universal.js +0 -2
- package/dist/types/universal.js.map +0 -1
- package/enums/ActionbarRegions.ts +0 -5
- package/enums/ButtonEnums.ts +0 -28
- package/helpers/InflightRequestTracker.ts +0 -33
- package/scripts/add-config.js +0 -23
- /package/components/pop-up/{PopUpComponentModels.ts → PopUpComponentObjects.ts} +0 -0
- /package/dist/components/pop-up/{PopUpComponentModels.d.ts → PopUpComponentObjects.d.ts} +0 -0
- /package/dist/types/{universal.d.ts → Universal.d.ts} +0 -0
- /package/types/{universal.ts → Universal.ts} +0 -0
package/Testwise.ts
CHANGED
|
@@ -2,7 +2,9 @@ import { test as base } from '@playwright/test';
|
|
|
2
2
|
import { GoToDeepLink } from './page-extensions/GoToDeepLink.js';
|
|
3
3
|
import { LoginFeatures } from './page-extensions/LoginFeatures.js';
|
|
4
4
|
import { UserSimulation } from './page-extensions/UserSimulation.js';
|
|
5
|
+
import { WaitEventHandler } from './page-extensions/WaitEventHandler.js';
|
|
5
6
|
import { ClickOverride } from './page-overrides/ClickOverride.js';
|
|
7
|
+
import { FillOverride } from './page-overrides/FillOverride.js';
|
|
6
8
|
import type { Test } from './types/CoreTypes.js';
|
|
7
9
|
|
|
8
10
|
function combineExtensions(baseTest: Test, ...extensions: { new (test: Test): { test: Test } }[]) {
|
|
@@ -14,9 +16,11 @@ export const test: Test = combineExtensions(
|
|
|
14
16
|
|
|
15
17
|
// Override section
|
|
16
18
|
ClickOverride,
|
|
19
|
+
FillOverride,
|
|
17
20
|
|
|
18
21
|
// Extend section
|
|
19
22
|
GoToDeepLink,
|
|
20
23
|
LoginFeatures,
|
|
21
|
-
UserSimulation
|
|
24
|
+
UserSimulation,
|
|
25
|
+
WaitEventHandler
|
|
22
26
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
|
-
import { BaseComponent } from '../BaseComponent';
|
|
2
|
+
import { BaseComponent } from '../BaseComponent.js';
|
|
3
3
|
|
|
4
4
|
export class FilterForm extends BaseComponent {
|
|
5
5
|
public async getLocator(context?: Locator): Promise<Locator> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
|
-
import { BaseComponent } from '../BaseComponent';
|
|
2
|
+
import { BaseComponent } from '../BaseComponent.js';
|
|
3
3
|
|
|
4
4
|
export class FindForm extends BaseComponent {
|
|
5
5
|
public async getLocator(context?: Locator): Promise<Locator> {
|
package/components/grid/Grid.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { pollUntil } from '../../helpers/Poll.js';
|
|
3
|
+
import { escapeRegex } from '../../helpers/RegexHelper.js';
|
|
2
4
|
import { GridObjects } from './GridObjects.js';
|
|
3
5
|
|
|
4
6
|
export class Grid {
|
|
@@ -29,7 +31,10 @@ export class Grid {
|
|
|
29
31
|
* @param value - The exact text value of the cell to retrieve.
|
|
30
32
|
* @returns A Locator for the cell containing the specified value.
|
|
31
33
|
*/
|
|
32
|
-
public getCellByExactValue
|
|
34
|
+
public getCellByExactValue(value: string): Locator {
|
|
35
|
+
const valueToFindRegex = new RegExp(`^${escapeRegex(value)}$`);
|
|
36
|
+
return this._gridObjects.cellByValue(valueToFindRegex);
|
|
37
|
+
}
|
|
33
38
|
|
|
34
39
|
/**
|
|
35
40
|
* Opens the Excel-style filter popup for the specified grid column.
|
|
@@ -54,7 +59,9 @@ export class Grid {
|
|
|
54
59
|
|
|
55
60
|
const filteredRows = await Promise.all(
|
|
56
61
|
allRows.map(async (row) => {
|
|
57
|
-
const
|
|
62
|
+
const cellLocator = row.locator(`[col-id="${colIdToMatchOn}"]`);
|
|
63
|
+
if ((await cellLocator.count()) === 0) return null; // Cell not found, skip row
|
|
64
|
+
const text = await cellLocator.textContent();
|
|
58
65
|
return text === valueToMatch ? row : null;
|
|
59
66
|
})
|
|
60
67
|
);
|
|
@@ -200,22 +207,91 @@ export class Grid {
|
|
|
200
207
|
}
|
|
201
208
|
|
|
202
209
|
/**
|
|
203
|
-
* Filters a column
|
|
210
|
+
* Filters a grid column using the Excel-style filter popup.
|
|
211
|
+
*
|
|
212
|
+
* @param columnName - The column to filter
|
|
213
|
+
* @param valueToSelect - The value to select
|
|
214
|
+
* @param deselectAll - If true, clears existing selections first (default: true)
|
|
204
215
|
*
|
|
205
|
-
* @
|
|
206
|
-
*
|
|
207
|
-
*
|
|
216
|
+
* @example
|
|
217
|
+
* await grid.filterByColumnValueExcelStyle('Status', 'Active');
|
|
218
|
+
* await grid.filterByColumnValueExcelStyle('Status', 'Pending', false);
|
|
208
219
|
*/
|
|
209
|
-
public async filterByColumnValueExcelStyle(
|
|
220
|
+
public async filterByColumnValueExcelStyle(
|
|
221
|
+
columnName: string,
|
|
222
|
+
valueToSelect: string,
|
|
223
|
+
deselectAll: boolean = true
|
|
224
|
+
): Promise<void> {
|
|
210
225
|
await this.openExcelStyleFilterPopup(columnName);
|
|
211
|
-
|
|
226
|
+
|
|
227
|
+
// Get column ID from header and normalize it (snake_case -> kebab-case)
|
|
228
|
+
const header = this._gridObjects.columnHeaderByName(columnName);
|
|
229
|
+
const rawColumnId = await header.getAttribute('col-id');
|
|
230
|
+
if (!rawColumnId) {
|
|
231
|
+
throw new Error(`Could not find col-id for column "${columnName}"`);
|
|
232
|
+
}
|
|
233
|
+
const columnId = rawColumnId.toLowerCase().replace(/_/g, '-');
|
|
234
|
+
|
|
235
|
+
const popup = this._gridObjects.excelStyleFilterPopup(columnId);
|
|
212
236
|
await popup.waitFor({ state: 'visible' });
|
|
213
|
-
const checkbox = this._gridObjects.excelStyleFilterPopupOptionByText(valueToSelect);
|
|
214
|
-
await checkbox.check();
|
|
215
237
|
|
|
216
|
-
|
|
217
|
-
|
|
238
|
+
if (deselectAll) {
|
|
239
|
+
await this._gridObjects.excelStyleFilterSelectAllCheckbox(columnId).uncheck();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const valueRegex = new RegExp(`^${escapeRegex(valueToSelect)}$`, 'i');
|
|
243
|
+
const optionButton = this._gridObjects.excelStyleFilterPopupOptionByText(columnId, valueRegex);
|
|
244
|
+
await optionButton.locator('input[type="checkbox"]').check();
|
|
218
245
|
|
|
246
|
+
await this._gridObjects.gridCell().first().click();
|
|
219
247
|
await popup.waitFor({ state: 'detached' });
|
|
220
248
|
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Returns a Locator for all rows in the grid.
|
|
252
|
+
* @returns {Locator} Locator for grid rows.
|
|
253
|
+
*/
|
|
254
|
+
public rows(): Locator {
|
|
255
|
+
return this._gridObjects.rows();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Verifies the number of rows in the grid and checks for "No result" overlay if zero.
|
|
260
|
+
* @param expectedRowCount The expected number of rows.
|
|
261
|
+
*/
|
|
262
|
+
public async verifyNumberOfRowsInGrid(expectedRowCount: number): Promise<void> {
|
|
263
|
+
if (expectedRowCount === 0) {
|
|
264
|
+
if (await this.hasNoRowsOverlay()) {
|
|
265
|
+
return;
|
|
266
|
+
} else {
|
|
267
|
+
throw new Error('Expected "No result" overlay to be visible');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
await pollUntil(() => this.rows().count(), {
|
|
272
|
+
predicate: (n: number) => n === expectedRowCount
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Verifies if the "No result" overlay is visible in the grid.
|
|
278
|
+
* @returns A promise that resolves to true if the overlay is visible, otherwise false.
|
|
279
|
+
*/
|
|
280
|
+
public async hasNoRowsOverlay(): Promise<boolean> {
|
|
281
|
+
try {
|
|
282
|
+
const overlay = this._gridObjects.noRowsOverlay();
|
|
283
|
+
await pollUntil(
|
|
284
|
+
async () => {
|
|
285
|
+
const txt = (await overlay.textContent())?.trim() ?? '';
|
|
286
|
+
return txt.includes('No result');
|
|
287
|
+
},
|
|
288
|
+
{ predicate: Boolean }
|
|
289
|
+
);
|
|
290
|
+
} catch {
|
|
291
|
+
console.error('The "No result" overlay is not displaying the expected text.');
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return await this._gridObjects.noRowsOverlay().isVisible();
|
|
296
|
+
}
|
|
221
297
|
}
|
|
@@ -20,8 +20,10 @@ export class GridObjects extends BaseComponentObjects {
|
|
|
20
20
|
|
|
21
21
|
public rowByIndex = (row: number) => this.context.locator(`[role="row"][row-index="${row}"]`);
|
|
22
22
|
|
|
23
|
-
public cellByValue = (value:
|
|
24
|
-
this.context.locator('[role="button"]', {
|
|
23
|
+
public cellByValue = (value: RegExp) =>
|
|
24
|
+
this.context.locator('[role="button"]', {
|
|
25
|
+
hasText: value
|
|
26
|
+
});
|
|
25
27
|
|
|
26
28
|
public rows = () => this.context.locator('[role="row"]');
|
|
27
29
|
|
|
@@ -33,13 +35,19 @@ export class GridObjects extends BaseComponentObjects {
|
|
|
33
35
|
|
|
34
36
|
public columnByRowLocator = (rowLocator: Locator) => rowLocator.locator('.ag-cell');
|
|
35
37
|
|
|
36
|
-
public excelStyleFilterPopup = () => this._page.
|
|
38
|
+
public excelStyleFilterPopup = (columnId: string) => this._page.getByTestId(`lookup-excel-filter__${columnId}__list`);
|
|
37
39
|
|
|
38
|
-
public
|
|
39
|
-
this.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
public excelStyleFilterSelectAllCheckbox = (columnId: string) =>
|
|
41
|
+
this._page.locator(
|
|
42
|
+
`[data-testid="lookup-excel-filter__${columnId}__list-item-select-all-checkbox"] input[type="checkbox"]`
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
public excelStyleFilterPopupOptionByText = (columnId: string, optionText: RegExp) =>
|
|
46
|
+
this._page
|
|
47
|
+
.locator(`[data-testid^="lookup-excel-filter__${columnId}__list-item-button__"]`)
|
|
48
|
+
.filter({ hasText: optionText });
|
|
43
49
|
|
|
44
50
|
public gridCell = () => this.context.locator('[role="gridcell"]');
|
|
51
|
+
|
|
52
|
+
public noRowsOverlay = () => this.context.locator('.ag-overlay-no-rows-center');
|
|
45
53
|
}
|
package/components/index.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
export * from './form/Form.js';
|
|
2
|
-
export * from './grid/Grid.js';
|
|
3
|
-
export * from './Splitter.js';
|
|
4
1
|
export * from './actionbar/Actionbar.js';
|
|
5
2
|
export * from './export/ExportComponent.js';
|
|
3
|
+
export * from './form/Form.js';
|
|
4
|
+
export * from './grid/Grid.js';
|
|
6
5
|
export * from './pop-up/PopUpComponent.js';
|
|
6
|
+
export * from './Splitter.js';
|
|
7
|
+
export * from './tab/ComponentTab.js';
|
|
8
|
+
export * from './tab/DetailTab.js';
|
|
9
|
+
export * from './task/TaskBar.js';
|
|
10
|
+
export * from './task/TaskTile.js';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseTabObjects } from './BaseTabObjects.js';
|
|
3
|
+
|
|
4
|
+
export class BaseTab {
|
|
5
|
+
protected _objects: BaseTabObjects;
|
|
6
|
+
|
|
7
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
8
|
+
this._objects = new BaseTabObjects(page, context);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// --- Common actions ---
|
|
12
|
+
|
|
13
|
+
// Clicks a tab by its tabstrip test id prefix (e.g., "form", "users", "list").
|
|
14
|
+
// Uses the role="tab" element with data-testid^="tabstrip__tab__{name}".
|
|
15
|
+
public async openById(name: string): Promise<void> {
|
|
16
|
+
await this._objects.tabByTestId(name).click();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Clicks a tab by index within the scoped tablist context.
|
|
20
|
+
public async openByIndex(index: number): Promise<void> {
|
|
21
|
+
await this._objects.tabByIndex(index).click();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// --- Useful getters ---
|
|
25
|
+
public async getTabById(name: string): Promise<Locator> {
|
|
26
|
+
return this._objects.tabByTestId(name);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public async getTabByIndex(index: number): Promise<Locator> {
|
|
30
|
+
return this._objects.tabByIndex(index);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Reads the badge value on a tab. Non-visible/invalid → 0.
|
|
34
|
+
public async getBadgeCount(name: string): Promise<number> {
|
|
35
|
+
const badge = this._objects.badgeByName(name);
|
|
36
|
+
const visible = await badge.isVisible().catch(() => false);
|
|
37
|
+
if (!visible) return 0;
|
|
38
|
+
const txt = (await badge.textContent())?.trim() ?? '0';
|
|
39
|
+
const n = Number.parseInt(txt, 10);
|
|
40
|
+
return Number.isNaN(n) ? 0 : n;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseComponentObjects } from '../BaseComponentObjects.js';
|
|
3
|
+
|
|
4
|
+
export class BaseTabObjects extends BaseComponentObjects {
|
|
5
|
+
protected _page: Page;
|
|
6
|
+
|
|
7
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
8
|
+
super(page, context);
|
|
9
|
+
this._page = page;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public tabList = (): Locator => this.context.getByRole('tablist');
|
|
13
|
+
|
|
14
|
+
public tabByTestId = (name: string): Locator =>
|
|
15
|
+
this.tabList().locator(`[role="tab"][data-testid^="tabstrip__tab__${name.toLowerCase()}__"]`);
|
|
16
|
+
|
|
17
|
+
// use role for generic index-based selection
|
|
18
|
+
public tabByIndex = (index: number): Locator => this.tabList().getByRole('tab').nth(index);
|
|
19
|
+
|
|
20
|
+
// badge: leave as a CSS anchor on the tab testid
|
|
21
|
+
public badgeByName = (name: string): Locator =>
|
|
22
|
+
this._page.locator(`[role="tab"][data-testid^="tabstrip__tab__${name.toLowerCase()}"] [data-testid$="__badge"]`);
|
|
23
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseTab } from './BaseTab.js';
|
|
3
|
+
import { ComponentTabObjects } from './ComponentTabObjects.js';
|
|
4
|
+
|
|
5
|
+
export class ComponentTab extends BaseTab {
|
|
6
|
+
protected _objects: ComponentTabObjects;
|
|
7
|
+
|
|
8
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
9
|
+
super(page, context);
|
|
10
|
+
this._objects = new ComponentTabObjects(page, context);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// --- Component-specific helpers ---
|
|
14
|
+
|
|
15
|
+
// Opens the “List” tab in this tabstrip (default tabindex = -1 for master).
|
|
16
|
+
// If tabindex is left empty, the default is "-1" which is the master/base list tabindex
|
|
17
|
+
public async openListTab(tabindex: string = '-1'): Promise<void> {
|
|
18
|
+
await this._objects.listTab(tabindex).click();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Returns the “List” tab locator (scoped).
|
|
22
|
+
public async getListTab(tabindex: string = '-1'): Promise<Locator> {
|
|
23
|
+
return this._objects.listTab(tabindex);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Opens the “Form” tab in this tabstrip (scoped).
|
|
27
|
+
public async openFormTab(): Promise<void> {
|
|
28
|
+
await this._objects.formTab().click();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Returns the “Form” tab locator (scoped).
|
|
32
|
+
public async getFormTab(): Promise<Locator> {
|
|
33
|
+
return this._objects.formTab();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseTabObjects } from './BaseTabObjects.js';
|
|
3
|
+
|
|
4
|
+
export class ComponentTabObjects extends BaseTabObjects {
|
|
5
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
6
|
+
super(page, context);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Component-specific selectors
|
|
10
|
+
public listTab = (tabindex: string): Locator =>
|
|
11
|
+
this.tabList().locator(`[role="tab"][data-testid^="tabstrip__tab__list"][tabindex="${tabindex}"]`);
|
|
12
|
+
|
|
13
|
+
public formTab = (): Locator => this.tabList().locator(`[role="tab"][data-testid^="tabstrip__tab__form"]`);
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseTab } from './BaseTab.js';
|
|
3
|
+
import { DetailTabObjects } from './DetailTabObjects.js';
|
|
4
|
+
|
|
5
|
+
export class DetailTab extends BaseTab {
|
|
6
|
+
protected _objects: DetailTabObjects;
|
|
7
|
+
|
|
8
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
9
|
+
super(page, context);
|
|
10
|
+
this._objects = new DetailTabObjects(page, context);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public async getDetailTabById(name: string): Promise<Locator> {
|
|
14
|
+
return this._objects.tabByTestId(name);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public async getDetailTabByIndex(index: number): Promise<Locator> {
|
|
18
|
+
return this._objects.tabByIndex(index);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseTabObjects } from './BaseTabObjects.js';
|
|
3
|
+
|
|
4
|
+
export class DetailTabObjects extends BaseTabObjects {
|
|
5
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
6
|
+
super(page, context);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// No extra selectors yet — extend here if detail tabs ever get custom ones
|
|
10
|
+
}
|
|
@@ -1,11 +1,31 @@
|
|
|
1
|
-
import type { Locator } from '@playwright/test';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export class TaskBar
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { TaskBarObjects } from './TaskBarObjects.js';
|
|
3
|
+
|
|
4
|
+
export class TaskBar {
|
|
5
|
+
private _taskBarObjects: TaskBarObjects;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param taskBarContext the taskbar container element (same idea as Grid's context)
|
|
9
|
+
*/
|
|
10
|
+
constructor(page: Page, taskBarContext: Locator | null = null) {
|
|
11
|
+
this._taskBarObjects = new TaskBarObjects(page, taskBarContext);
|
|
10
12
|
}
|
|
13
|
+
|
|
14
|
+
/** returns all task buttons */
|
|
15
|
+
public tasks = (): Locator => this._taskBarObjects.tasks(); // matches Grid's "rows()" noun-style
|
|
16
|
+
|
|
17
|
+
/** returns a task button by its data-testid key */
|
|
18
|
+
public getTaskById = (key: string): Locator => this._taskBarObjects.taskById(key);
|
|
19
|
+
|
|
20
|
+
/** returns a task button by its visible label */
|
|
21
|
+
public getTaskByLabel = (label: string): Locator => this._taskBarObjects.taskByLabel(label);
|
|
22
|
+
|
|
23
|
+
/** light action sugar (keep assertions in tests) */
|
|
24
|
+
public clickById = async (key: string): Promise<void> => {
|
|
25
|
+
await this.getTaskById(key).click();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
public clickByLabel = async (label: string): Promise<void> => {
|
|
29
|
+
await this.getTaskByLabel(label).click();
|
|
30
|
+
};
|
|
11
31
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseComponentObjects } from '../BaseComponentObjects.js';
|
|
3
|
+
|
|
4
|
+
export class TaskBarObjects extends BaseComponentObjects {
|
|
5
|
+
/**
|
|
6
|
+
* @param page playwright page
|
|
7
|
+
* @param context the taskbar container element itself (e.g. page.getByTestId('task-toolbar-section').nth(0))
|
|
8
|
+
*/
|
|
9
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
10
|
+
super(page, context);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** returns the taskbar container (same as provided context) */
|
|
14
|
+
public container = (): Locator => this.context;
|
|
15
|
+
|
|
16
|
+
/** all task buttons within this taskbar */
|
|
17
|
+
public tasks = (): Locator => this.context.locator('button[data-testid^="toolbar__task__"]');
|
|
18
|
+
|
|
19
|
+
/** task by its data-testid key, e.g. toolbar__task__task-edit-a-category */
|
|
20
|
+
public taskById = (actionKey: string): Locator => this.context.getByTestId(`toolbar__task__${actionKey}`);
|
|
21
|
+
|
|
22
|
+
/** task by accessible label, e.g. "Add new category" */
|
|
23
|
+
public taskByLabel = (label: string): Locator => this.context.getByRole('button', { name: label });
|
|
24
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { TaskTileObjects } from './TaskTileObjects.js';
|
|
3
|
+
|
|
4
|
+
export class TaskTile {
|
|
5
|
+
private _taskTileObjects: TaskTileObjects;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param taskTileContext the tasktile container element
|
|
9
|
+
*/
|
|
10
|
+
constructor(page: Page, taskTileContext: Locator | null = null) {
|
|
11
|
+
this._taskTileObjects = new TaskTileObjects(page, taskTileContext);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** returns all task tile buttons */
|
|
15
|
+
public tasks = (): Locator => this._taskTileObjects.tasks();
|
|
16
|
+
|
|
17
|
+
public getTaskById = (key: string): Locator => this._taskTileObjects.taskById(key);
|
|
18
|
+
|
|
19
|
+
public getTaskByLabel = (label: string): Locator => this._taskTileObjects.taskByLabel(label);
|
|
20
|
+
|
|
21
|
+
public clickById = async (key: string): Promise<void> => {
|
|
22
|
+
await this.getTaskById(key).click();
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
public clickByLabel = async (label: string): Promise<void> => {
|
|
26
|
+
await this.getTaskByLabel(label).click();
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Locator, Page } from '@playwright/test';
|
|
2
|
+
import { BaseComponentObjects } from '../BaseComponentObjects.js';
|
|
3
|
+
|
|
4
|
+
export class TaskTileObjects extends BaseComponentObjects {
|
|
5
|
+
constructor(page: Page, context: Locator | null = null) {
|
|
6
|
+
super(page, context);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** returns the taskbar container (same as provided context) */
|
|
10
|
+
public container = (): Locator => this.context;
|
|
11
|
+
|
|
12
|
+
/** all task buttons within this taskbar */
|
|
13
|
+
public tasks = (): Locator => this.context.locator('button[data-testid^="tasktiles"]');
|
|
14
|
+
|
|
15
|
+
/** task by its data-testid key, e.g. tasktiles__task__task-edit-a-category */
|
|
16
|
+
public taskById = (actionKey: string): Locator => this.context.getByTestId(`tasktiles__task__${actionKey}`);
|
|
17
|
+
|
|
18
|
+
/** task by accessible label, e.g. "Add new category" */
|
|
19
|
+
public taskByLabel = (label: string): Locator => this.context.getByRole('button', { name: label });
|
|
20
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: needed flexibility */
|
|
3
|
+
import type { Locator } from '@playwright/test';
|
|
4
|
+
import { escapeRegex } from '../helpers/RegexHelper.js';
|
|
5
|
+
|
|
6
|
+
class LookupDropdown {
|
|
7
|
+
private _locator: Locator;
|
|
8
|
+
|
|
9
|
+
constructor(locator: Locator) {
|
|
10
|
+
this._locator = locator;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async lookupSelect(optionToSelect: string): Promise<void> {
|
|
14
|
+
await Promise.all([this._locator.click(), this._locator.page().waitForResponse('**/list_**')]);
|
|
15
|
+
|
|
16
|
+
await this._locator.fill(optionToSelect);
|
|
17
|
+
await this._locator.page().waitEventHandler.setCanContinue(true);
|
|
18
|
+
|
|
19
|
+
await this.select(optionToSelect);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async selectOption(optionText: string): Promise<void> {
|
|
23
|
+
await this._locator.click();
|
|
24
|
+
await this.select(optionText);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private async select(optionToSelect: string) {
|
|
28
|
+
const optionsToSelectRegex = new RegExp(`^${escapeRegex(optionToSelect)}$`, 'i');
|
|
29
|
+
|
|
30
|
+
await this._locator.page().getByTestId('autocomplete__menu').getByText(optionsToSelectRegex).click();
|
|
31
|
+
await this._locator
|
|
32
|
+
.page()
|
|
33
|
+
.waitForFunction((el) => document.activeElement === el, await this._locator.elementHandle());
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createLookupDropdown(locator: Locator): LookupDropdown & Locator {
|
|
38
|
+
const dropdown = new LookupDropdown(locator);
|
|
39
|
+
|
|
40
|
+
return new Proxy(dropdown, {
|
|
41
|
+
get(target, prop, receiver) {
|
|
42
|
+
if (prop in target) {
|
|
43
|
+
return Reflect.get(target, prop, receiver);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const value = (locator as any)[prop];
|
|
47
|
+
|
|
48
|
+
if (typeof value === 'function') {
|
|
49
|
+
return value.bind(locator);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
}) as LookupDropdown & Locator;
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './LookupDropdown.js';
|
package/dist/Testwise.js
CHANGED
|
@@ -2,13 +2,15 @@ import { test as base } from '@playwright/test';
|
|
|
2
2
|
import { GoToDeepLink } from './page-extensions/GoToDeepLink.js';
|
|
3
3
|
import { LoginFeatures } from './page-extensions/LoginFeatures.js';
|
|
4
4
|
import { UserSimulation } from './page-extensions/UserSimulation.js';
|
|
5
|
+
import { WaitEventHandler } from './page-extensions/WaitEventHandler.js';
|
|
5
6
|
import { ClickOverride } from './page-overrides/ClickOverride.js';
|
|
7
|
+
import { FillOverride } from './page-overrides/FillOverride.js';
|
|
6
8
|
function combineExtensions(baseTest, ...extensions) {
|
|
7
9
|
return extensions.reduce((test, Extension) => new Extension(test).test, baseTest);
|
|
8
10
|
}
|
|
9
11
|
export const test = combineExtensions(base,
|
|
10
12
|
// Override section
|
|
11
|
-
ClickOverride,
|
|
13
|
+
ClickOverride, FillOverride,
|
|
12
14
|
// Extend section
|
|
13
|
-
GoToDeepLink, LoginFeatures, UserSimulation);
|
|
15
|
+
GoToDeepLink, LoginFeatures, UserSimulation, WaitEventHandler);
|
|
14
16
|
//# sourceMappingURL=Testwise.js.map
|
package/dist/Testwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Testwise.js","sourceRoot":"","sources":["../Testwise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"Testwise.js","sourceRoot":"","sources":["../Testwise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAGhE,SAAS,iBAAiB,CAAC,QAAc,EAAE,GAAG,UAAkD;IAC9F,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAS,iBAAiB,CACzC,IAAI;AAEJ,mBAAmB;AACnB,aAAa,EACb,YAAY;AAEZ,iBAAiB;AACjB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,CACjB,CAAC"}
|
package/dist/biome.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
|
|
3
|
+
"vcs": {
|
|
4
|
+
"enabled": true,
|
|
5
|
+
"clientKind": "git",
|
|
6
|
+
"useIgnoreFile": true
|
|
7
|
+
},
|
|
8
|
+
"files": {
|
|
9
|
+
"ignoreUnknown": false
|
|
10
|
+
},
|
|
11
|
+
"formatter": {
|
|
12
|
+
"enabled": true,
|
|
13
|
+
"indentStyle": "space",
|
|
14
|
+
"indentWidth": 2,
|
|
15
|
+
"lineWidth": 120
|
|
16
|
+
},
|
|
17
|
+
"linter": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"rules": {
|
|
20
|
+
"recommended": true,
|
|
21
|
+
"correctness": {
|
|
22
|
+
"noUnusedImports": "warn"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"javascript": {
|
|
27
|
+
"formatter": {
|
|
28
|
+
"quoteStyle": "single",
|
|
29
|
+
"jsxQuoteStyle": "double",
|
|
30
|
+
"quoteProperties": "asNeeded",
|
|
31
|
+
"trailingCommas": "none",
|
|
32
|
+
"semicolons": "always",
|
|
33
|
+
"arrowParentheses": "always",
|
|
34
|
+
"bracketSameLine": false,
|
|
35
|
+
"attributePosition": "auto",
|
|
36
|
+
"bracketSpacing": true
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"json": {
|
|
40
|
+
"formatter": {
|
|
41
|
+
"enabled": false
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"assist": {
|
|
45
|
+
"enabled": true,
|
|
46
|
+
"actions": {
|
|
47
|
+
"source": {
|
|
48
|
+
"organizeImports": "on"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseComponent } from '../BaseComponent.js';
|
|
2
|
+
export class FilterForm extends BaseComponent {
|
|
3
|
+
async getLocator(context) {
|
|
4
|
+
if (context) {
|
|
5
|
+
return context.getByTestId(this.id);
|
|
6
|
+
}
|
|
7
|
+
return this.page.getByTestId(this.id);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=FilterForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterForm.js","sourceRoot":"","sources":["../../../components/filter/FilterForm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,UAAW,SAAQ,aAAa;IACpC,KAAK,CAAC,UAAU,CAAC,OAAiB;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;CACF"}
|