@umbraco/playwright-testhelpers 16.0.24 → 16.0.25

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.
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookApiHelper = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const json_models_builders_1 = require("@umbraco/json-models-builders");
6
+ const ConstantHelper_1 = require("./ConstantHelper");
7
+ class WebhookApiHelper {
8
+ api;
9
+ page;
10
+ webhookSiteUrl = 'https://webhook.site/';
11
+ constructor(api, page) {
12
+ this.api = api;
13
+ this.page = page;
14
+ }
15
+ async get(id) {
16
+ const response = await this.api.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);
17
+ const json = await response.json();
18
+ if (json !== null) {
19
+ return json;
20
+ }
21
+ return null;
22
+ }
23
+ async doesExist(id) {
24
+ const response = await this.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);
25
+ return response.status() === 200;
26
+ }
27
+ async create(webhookData) {
28
+ if (webhookData == null) {
29
+ return;
30
+ }
31
+ const response = await this.api.post(this.api.baseUrl + '/umbraco/management/api/v1/webhook', webhookData);
32
+ // Returns the id of the created webhook
33
+ return response.headers().location.split("/").pop();
34
+ }
35
+ async delete(id) {
36
+ return await this.api.delete(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);
37
+ }
38
+ async update(webhook) {
39
+ return await this.api.put(this.api.baseUrl + '/umbraco/management/api/v1/webhook/', webhook);
40
+ }
41
+ async getAll() {
42
+ return await this.api.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook?pageSize=50&skip=0&take=10000');
43
+ }
44
+ async doesNameExist(name) {
45
+ return await this.getByName(name);
46
+ }
47
+ async getByName(name) {
48
+ const allWebhooks = await this.getAll();
49
+ const jsonWebhooks = await allWebhooks.json();
50
+ for (const webhook of jsonWebhooks.items) {
51
+ if (webhook.name === name) {
52
+ return await this.get(webhook.id);
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ async ensureNameNotExists(name) {
58
+ const allWebhooks = await this.getAll();
59
+ const jsonWebhooks = await allWebhooks.json();
60
+ for (const webhook of jsonWebhooks.items) {
61
+ if (webhook.name === name) {
62
+ return await this.delete(webhook.id);
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+ async generateWebhookSiteToken() {
68
+ const createWebhookResponse = await this.page.request.post(this.webhookSiteUrl + 'token', {
69
+ headers: {
70
+ 'Accept': 'application/json'
71
+ }
72
+ });
73
+ const webhookData = await createWebhookResponse.json();
74
+ const webhookToken = webhookData.uuid;
75
+ return webhookToken;
76
+ }
77
+ async getWebhookSiteRequestResponse(webhookSiteToken, timeoutMs = 15000, pollInterval = 1000) {
78
+ const requestUrl = this.webhookSiteUrl + 'token/' + webhookSiteToken + '/requests';
79
+ const start = Date.now();
80
+ while (Date.now() - start < timeoutMs) {
81
+ const requestResponse = await this.page.request.get(requestUrl, {
82
+ headers: {
83
+ 'Accept': 'application/json'
84
+ }
85
+ });
86
+ const requestJson = await requestResponse.json();
87
+ if (requestJson.total > 0) {
88
+ return requestJson.data;
89
+ }
90
+ // Polling again if there is no webhook received yet
91
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
92
+ }
93
+ return null;
94
+ }
95
+ async doesWebhookHaveEvent(webhookName, eventName) {
96
+ const webhookData = await this.getByName(webhookName);
97
+ return webhookData.events.find(event => event.eventName === eventName);
98
+ }
99
+ async doesWebhookHaveContentTypeId(webhookName, contentTypeId) {
100
+ const webhookData = await this.getByName(webhookName);
101
+ return webhookData.contentTypeKeys.includes(contentTypeId);
102
+ }
103
+ async doesWebhookHaveHeader(webhookName, headerName, headerValue) {
104
+ const webhookData = await this.getByName(webhookName);
105
+ return webhookData.headers[headerName] === headerValue;
106
+ }
107
+ async doesWebhookHaveUrl(webhookName, url) {
108
+ const webhookData = await this.getByName(webhookName);
109
+ return webhookData.url === url;
110
+ }
111
+ async isWebhookEnabled(webhookName, isEnabled = true) {
112
+ const webhookData = await this.getByName(webhookName);
113
+ return (0, test_1.expect)(webhookData.enabled).toBe(isEnabled);
114
+ }
115
+ async getEventTypeValue(eventName) {
116
+ const eventData = ConstantHelper_1.ConstantHelper.webhookEvents.find(event => event.eventName === eventName);
117
+ return eventData?.eventType || '';
118
+ }
119
+ async getEventAliasValue(eventName) {
120
+ const eventData = ConstantHelper_1.ConstantHelper.webhookEvents.find(event => event.eventName === eventName);
121
+ return eventData?.alias || '';
122
+ }
123
+ async createDefaultWebhook(webhookName, webhookSiteToken, eventName = 'Content Published', isEnabled = true) {
124
+ await this.ensureNameNotExists(webhookName);
125
+ const webhookUrl = this.webhookSiteUrl + webhookSiteToken;
126
+ const eventAlias = await this.getEventAliasValue(eventName);
127
+ const webhook = new json_models_builders_1.WebhookBuilder()
128
+ .withName(webhookName)
129
+ .withUrl(webhookUrl)
130
+ .withEventAlias(eventAlias)
131
+ .withEnabled(isEnabled)
132
+ .build();
133
+ return await this.create(webhook);
134
+ }
135
+ async createWebhookForSpecificContentType(webhookName, webhookSiteToken, eventName, contentTypeName) {
136
+ await this.ensureNameNotExists(webhookName);
137
+ const webhookUrl = this.webhookSiteUrl + webhookSiteToken;
138
+ const eventAlias = await this.getEventAliasValue(eventName);
139
+ const eventType = await this.getEventTypeValue(eventName);
140
+ let contentTypeData;
141
+ if (eventType == 'Content') {
142
+ contentTypeData = await this.api.documentType.getByName(contentTypeName);
143
+ }
144
+ else {
145
+ contentTypeData = await this.api.mediaType.getByName(contentTypeName);
146
+ }
147
+ const webhook = new json_models_builders_1.WebhookBuilder()
148
+ .withName(webhookName)
149
+ .withUrl(webhookUrl)
150
+ .withEventAlias(eventAlias)
151
+ .withContentTypeKey(contentTypeData.id)
152
+ .build();
153
+ return await this.create(webhook);
154
+ }
155
+ async createWebhookWithHeader(webhookName, webhookSiteToken, eventName, headerName, headerValue) {
156
+ await this.ensureNameNotExists(webhookName);
157
+ const webhookUrl = this.webhookSiteUrl + webhookSiteToken;
158
+ const eventAlias = await this.getEventAliasValue(eventName);
159
+ const webhook = new json_models_builders_1.WebhookBuilder()
160
+ .withName(webhookName)
161
+ .withUrl(webhookUrl)
162
+ .withEventAlias(eventAlias)
163
+ .withHeader(headerName, headerValue)
164
+ .build();
165
+ return await this.create(webhook);
166
+ }
167
+ }
168
+ exports.WebhookApiHelper = WebhookApiHelper;
169
+ //# sourceMappingURL=WebhookApiHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookApiHelper.js","sourceRoot":"","sources":["../../../lib/helpers/WebhookApiHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import {expect, Page} from \"@playwright/test\";\nimport {ApiHelpers} from \"./ApiHelpers\";\nimport {WebhookBuilder} from \"@umbraco/json-models-builders\";\nimport {ConstantHelper} from \"./ConstantHelper\";\n\nexport class WebhookApiHelper {\n api: ApiHelpers;\n page: Page;\n webhookSiteUrl: string = 'https://webhook.site/';\n\n constructor(api: ApiHelpers, page: Page) {\n this.api = api;\n this.page = page;\n }\n\n async get(id: string) {\n const response = await this.api.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);\n const json = await response.json();\n\n if (json !== null) {\n return json;\n }\n return null;\n }\n\n async doesExist(id: string) {\n const response = await this.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);\n return response.status() === 200;\n }\n\n async create(webhookData) {\n if (webhookData == null) {\n return;\n }\n const response = await this.api.post(this.api.baseUrl + '/umbraco/management/api/v1/webhook', webhookData);\n // Returns the id of the created webhook\n return response.headers().location.split(\"/\").pop();\n }\n\n async delete(id: string) {\n return await this.api.delete(this.api.baseUrl + '/umbraco/management/api/v1/webhook/' + id);\n }\n\n async update(webhook: object) {\n return await this.api.put(this.api.baseUrl + '/umbraco/management/api/v1/webhook/', webhook);\n }\n\n async getAll() {\n return await this.api.get(this.api.baseUrl + '/umbraco/management/api/v1/webhook?pageSize=50&skip=0&take=10000');\n }\n\n async doesNameExist(name: string) {\n return await this.getByName(name);\n }\n\n async getByName(name: string) {\n const allWebhooks = await this.getAll();\n const jsonWebhooks = await allWebhooks.json();\n\n for (const webhook of jsonWebhooks.items) {\n if (webhook.name === name) {\n return await this.get(webhook.id);\n }\n }\n return null;\n }\n\n async ensureNameNotExists(name: string) {\n const allWebhooks = await this.getAll();\n const jsonWebhooks = await allWebhooks.json();\n\n for (const webhook of jsonWebhooks.items) {\n if (webhook.name === name) {\n return await this.delete(webhook.id);\n }\n }\n return null;\n }\n\n async generateWebhookSiteToken() {\n const createWebhookResponse = await this.page.request.post(this.webhookSiteUrl + 'token', {\n headers: {\n 'Accept': 'application/json'\n }\n });\n const webhookData = await createWebhookResponse.json();\n const webhookToken = webhookData.uuid;\n return webhookToken;\n }\n\n async getWebhookSiteRequestResponse(webhookSiteToken: string, timeoutMs: number = 15000, pollInterval: number = 1000) {\n const requestUrl = this.webhookSiteUrl + 'token/' + webhookSiteToken + '/requests';\n const start = Date.now();\n\n while (Date.now() - start < timeoutMs) {\n const requestResponse = await this.page.request.get(requestUrl, {\n headers: {\n 'Accept': 'application/json'\n }\n });\n const requestJson = await requestResponse.json();\n if (requestJson.total > 0) {\n return requestJson.data;\n }\n \n // Polling again if there is no webhook received yet\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n return null;\n }\n\n async doesWebhookHaveEvent(webhookName: string, eventName: string) {\n const webhookData = await this.getByName(webhookName);\n return webhookData.events.find(event => event.eventName === eventName);\n }\n\n async doesWebhookHaveContentTypeId(webhookName: string, contentTypeId: string) {\n const webhookData = await this.getByName(webhookName);\n return webhookData.contentTypeKeys.includes(contentTypeId);\n }\n\n async doesWebhookHaveHeader(webhookName: string, headerName: string, headerValue: string) {\n const webhookData = await this.getByName(webhookName);\n return webhookData.headers[headerName] === headerValue;\n }\n\n async doesWebhookHaveUrl(webhookName: string, url: string) {\n const webhookData = await this.getByName(webhookName);\n return webhookData.url === url;\n }\n\n async isWebhookEnabled(webhookName: string, isEnabled: boolean = true) {\n const webhookData = await this.getByName(webhookName);\n return expect(webhookData.enabled).toBe(isEnabled);\n }\n\n async getEventTypeValue(eventName: string) {\n const eventData = ConstantHelper.webhookEvents.find(event => event.eventName === eventName);\n return eventData?.eventType || '';\n }\n\n async getEventAliasValue(eventName: string) {\n const eventData = ConstantHelper.webhookEvents.find(event => event.eventName === eventName);\n return eventData?.alias || '';\n }\n\n async createDefaultWebhook(webhookName: string, webhookSiteToken: string, eventName: string = 'Content Published', isEnabled: boolean = true) {\n await this.ensureNameNotExists(webhookName);\n const webhookUrl = this.webhookSiteUrl + webhookSiteToken;\n const eventAlias = await this.getEventAliasValue(eventName);\n\n const webhook = new WebhookBuilder()\n .withName(webhookName)\n .withUrl(webhookUrl)\n .withEventAlias(eventAlias)\n .withEnabled(isEnabled)\n .build();\n\n return await this.create(webhook);\n }\n\n async createWebhookForSpecificContentType(webhookName: string, webhookSiteToken: string, eventName: string, contentTypeName: string) {\n await this.ensureNameNotExists(webhookName);\n const webhookUrl = this.webhookSiteUrl + webhookSiteToken;\n const eventAlias = await this.getEventAliasValue(eventName);\n const eventType = await this.getEventTypeValue(eventName);\n let contentTypeData;\n if (eventType == 'Content') {\n contentTypeData = await this.api.documentType.getByName(contentTypeName);\n } else {\n contentTypeData = await this.api.mediaType.getByName(contentTypeName);\n }\n\n const webhook = new WebhookBuilder()\n .withName(webhookName)\n .withUrl(webhookUrl)\n .withEventAlias(eventAlias)\n .withContentTypeKey(contentTypeData.id)\n .build();\n\n return await this.create(webhook);\n }\n\n async createWebhookWithHeader(webhookName: string, webhookSiteToken: string, eventName: string, headerName: string, headerValue: string) {\n await this.ensureNameNotExists(webhookName);\n const webhookUrl = this.webhookSiteUrl + webhookSiteToken;\n const eventAlias = await this.getEventAliasValue(eventName);\n\n const webhook = new WebhookBuilder()\n .withName(webhookName)\n .withUrl(webhookUrl)\n .withEventAlias(eventAlias)\n .withHeader(headerName, headerValue)\n .build();\n\n return await this.create(webhook);\n }\n}"]}
@@ -0,0 +1,29 @@
1
+ import { Page } from "@playwright/test";
2
+ import { UiBaseLocators } from "./UiBaseLocators";
3
+ export declare class WebhookUiHelper extends UiBaseLocators {
4
+ private readonly webhookCreateBtn;
5
+ private readonly webhookNameTxt;
6
+ private readonly urlTxt;
7
+ private readonly chooseEventBtn;
8
+ private readonly chooseContentTypeBtn;
9
+ private readonly enabledToggle;
10
+ private readonly addHeadersBtn;
11
+ private readonly headerNameTxt;
12
+ private readonly headerValueTxt;
13
+ private readonly deleteWebhookEntityAction;
14
+ private readonly headerRemoveBtn;
15
+ constructor(page: Page);
16
+ goToWebhooks(): Promise<void>;
17
+ goToWebhookWithName(name: string): Promise<void>;
18
+ clickWebhookCreateButton(): Promise<void>;
19
+ enterWebhookName(name: string): Promise<void>;
20
+ enterUrl(url: string): Promise<void>;
21
+ clickChooseEventButton(): Promise<void>;
22
+ clickChooseContentTypeButton(): Promise<void>;
23
+ clickEnabledToggleButton(): Promise<void>;
24
+ clickAddHeadersButton(): Promise<void>;
25
+ enterHeaderName(name: string): Promise<void>;
26
+ enterHeaderValue(value: string): Promise<void>;
27
+ clickDeleteWebhookWithName(name: string): Promise<void>;
28
+ clickHeaderRemoveButton(): Promise<void>;
29
+ }
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookUiHelper = void 0;
4
+ const test_1 = require("@playwright/test");
5
+ const UiBaseLocators_1 = require("./UiBaseLocators");
6
+ const ConstantHelper_1 = require("./ConstantHelper");
7
+ class WebhookUiHelper extends UiBaseLocators_1.UiBaseLocators {
8
+ webhookCreateBtn;
9
+ webhookNameTxt;
10
+ urlTxt;
11
+ chooseEventBtn;
12
+ chooseContentTypeBtn;
13
+ enabledToggle;
14
+ addHeadersBtn;
15
+ headerNameTxt;
16
+ headerValueTxt;
17
+ deleteWebhookEntityAction;
18
+ headerRemoveBtn;
19
+ constructor(page) {
20
+ super(page);
21
+ this.webhookCreateBtn = page.getByTestId('collection-action:Umb.CollectionAction.Webhook.Create');
22
+ this.webhookNameTxt = page.locator('#name #input');
23
+ this.urlTxt = page.locator('umb-property-layout[label="URL"] #input');
24
+ this.chooseEventBtn = page.locator('umb-property-layout[label="Events"]').getByLabel('Choose');
25
+ this.chooseContentTypeBtn = page.locator('umb-property-layout[label="Content Type"]').getByLabel('Choose');
26
+ this.enabledToggle = page.locator('umb-property-layout[label="Enabled"] #toggle');
27
+ this.addHeadersBtn = page.locator('umb-property-layout[label="Headers"] #add');
28
+ this.headerNameTxt = page.locator('umb-input-webhook-headers').locator('[list="nameList"]');
29
+ this.headerValueTxt = page.locator('umb-input-webhook-headers').locator('[list="valueList"]');
30
+ this.deleteWebhookEntityAction = page.getByTestId('entity-action:Umb.EntityAction.Webhook.Delete');
31
+ this.headerRemoveBtn = page.locator('umb-input-webhook-headers').locator('[label="Remove"]');
32
+ }
33
+ async goToWebhooks() {
34
+ await this.goToSection(ConstantHelper_1.ConstantHelper.sections.settings);
35
+ await this.goToSettingsTreeItem('Webhooks');
36
+ }
37
+ async goToWebhookWithName(name) {
38
+ await this.goToWebhooks();
39
+ await this.clickTextButtonWithName(name);
40
+ }
41
+ async clickWebhookCreateButton() {
42
+ await (0, test_1.expect)(this.webhookCreateBtn).toBeVisible();
43
+ await this.webhookCreateBtn.click();
44
+ }
45
+ async enterWebhookName(name) {
46
+ await (0, test_1.expect)(this.webhookNameTxt).toBeVisible();
47
+ await this.webhookNameTxt.clear();
48
+ await this.webhookNameTxt.fill(name);
49
+ }
50
+ async enterUrl(url) {
51
+ await (0, test_1.expect)(this.urlTxt).toBeVisible();
52
+ await this.urlTxt.clear();
53
+ await this.urlTxt.fill(url);
54
+ }
55
+ async clickChooseEventButton() {
56
+ await (0, test_1.expect)(this.chooseEventBtn).toBeVisible();
57
+ await this.chooseEventBtn.click();
58
+ }
59
+ async clickChooseContentTypeButton() {
60
+ await (0, test_1.expect)(this.chooseContentTypeBtn).toBeVisible();
61
+ await this.chooseContentTypeBtn.click();
62
+ }
63
+ async clickEnabledToggleButton() {
64
+ await (0, test_1.expect)(this.enabledToggle).toBeVisible();
65
+ await this.enabledToggle.click();
66
+ }
67
+ async clickAddHeadersButton() {
68
+ await (0, test_1.expect)(this.addHeadersBtn).toBeVisible();
69
+ await this.addHeadersBtn.click();
70
+ }
71
+ async enterHeaderName(name) {
72
+ await (0, test_1.expect)(this.headerNameTxt).toBeVisible();
73
+ await this.headerNameTxt.clear();
74
+ await this.headerNameTxt.fill(name);
75
+ }
76
+ async enterHeaderValue(value) {
77
+ await (0, test_1.expect)(this.headerValueTxt).toBeVisible();
78
+ await this.headerValueTxt.clear();
79
+ await this.headerValueTxt.fill(value);
80
+ }
81
+ async clickDeleteWebhookWithName(name) {
82
+ const deleteLocator = this.page.locator('uui-table-row').filter({ has: this.page.getByText(name, { exact: true }) }).locator(this.deleteWebhookEntityAction);
83
+ await (0, test_1.expect)(deleteLocator).toBeVisible();
84
+ await deleteLocator.click();
85
+ }
86
+ async clickHeaderRemoveButton() {
87
+ await (0, test_1.expect)(this.headerRemoveBtn).toBeVisible();
88
+ await this.headerRemoveBtn.click();
89
+ }
90
+ }
91
+ exports.WebhookUiHelper = WebhookUiHelper;
92
+ //# sourceMappingURL=WebhookUiHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookUiHelper.js","sourceRoot":"","sources":["../../../lib/helpers/WebhookUiHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import {Page, Locator, expect} from \"@playwright/test\"\nimport {UiBaseLocators} from \"./UiBaseLocators\";\nimport {ConstantHelper} from \"./ConstantHelper\";\n\nexport class WebhookUiHelper extends UiBaseLocators {\n private readonly webhookCreateBtn: Locator;\n private readonly webhookNameTxt: Locator;\n private readonly urlTxt: Locator;\n private readonly chooseEventBtn: Locator;\n private readonly chooseContentTypeBtn: Locator;\n private readonly enabledToggle: Locator;\n private readonly addHeadersBtn: Locator;\n private readonly headerNameTxt: Locator;\n private readonly headerValueTxt: Locator;\n private readonly deleteWebhookEntityAction: Locator;\n private readonly headerRemoveBtn: Locator;\n\n constructor(page: Page) {\n super(page);\n this.webhookCreateBtn = page.getByTestId('collection-action:Umb.CollectionAction.Webhook.Create');\n this.webhookNameTxt = page.locator('#name #input');\n this.urlTxt = page.locator('umb-property-layout[label=\"URL\"] #input');\n this.chooseEventBtn = page.locator('umb-property-layout[label=\"Events\"]').getByLabel('Choose');\n this.chooseContentTypeBtn = page.locator('umb-property-layout[label=\"Content Type\"]').getByLabel('Choose');\n this.enabledToggle = page.locator('umb-property-layout[label=\"Enabled\"] #toggle');\n this.addHeadersBtn = page.locator('umb-property-layout[label=\"Headers\"] #add');\n this.headerNameTxt = page.locator('umb-input-webhook-headers').locator('[list=\"nameList\"]');\n this.headerValueTxt = page.locator('umb-input-webhook-headers').locator('[list=\"valueList\"]');\n this.deleteWebhookEntityAction = page.getByTestId('entity-action:Umb.EntityAction.Webhook.Delete');\n this.headerRemoveBtn = page.locator('umb-input-webhook-headers').locator('[label=\"Remove\"]');\n }\n\n async goToWebhooks() {\n await this.goToSection(ConstantHelper.sections.settings);\n await this.goToSettingsTreeItem('Webhooks');\n }\n\n async goToWebhookWithName(name: string) {\n await this.goToWebhooks();\n await this.clickTextButtonWithName(name);\n }\n\n async clickWebhookCreateButton() {\n await expect(this.webhookCreateBtn).toBeVisible();\n await this.webhookCreateBtn.click();\n }\n\n async enterWebhookName(name: string) {\n await expect(this.webhookNameTxt).toBeVisible();\n await this.webhookNameTxt.clear();\n await this.webhookNameTxt.fill(name)\n }\n\n async enterUrl(url: string) {\n await expect(this.urlTxt).toBeVisible();\n await this.urlTxt.clear();\n await this.urlTxt.fill(url);\n }\n\n async clickChooseEventButton() {\n await expect(this.chooseEventBtn).toBeVisible();\n await this.chooseEventBtn.click();\n }\n\n async clickChooseContentTypeButton() {\n await expect(this.chooseContentTypeBtn).toBeVisible();\n await this.chooseContentTypeBtn.click();\n }\n\n async clickEnabledToggleButton() {\n await expect(this.enabledToggle).toBeVisible();\n await this.enabledToggle.click();\n }\n\n async clickAddHeadersButton() {\n await expect(this.addHeadersBtn).toBeVisible();\n await this.addHeadersBtn.click();\n }\n\n async enterHeaderName(name: string) {\n await expect(this.headerNameTxt).toBeVisible();\n await this.headerNameTxt.clear();\n await this.headerNameTxt.fill(name);\n }\n\n async enterHeaderValue(value: string) {\n await expect(this.headerValueTxt).toBeVisible();\n await this.headerValueTxt.clear();\n await this.headerValueTxt.fill(value);\n }\n\n async clickDeleteWebhookWithName(name: string) {\n const deleteLocator = this.page.locator('uui-table-row').filter({has: this.page.getByText(name, {exact: true})}).locator(this.deleteWebhookEntityAction);\n await expect(deleteLocator).toBeVisible();\n await deleteLocator.click();\n }\n\n async clickHeaderRemoveButton() {\n await expect(this.headerRemoveBtn).toBeVisible();\n await this.headerRemoveBtn.click();\n }\n}"]}