d5-testing-library 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FormEdit-MZJH5R5H.mjs +7 -0
- package/dist/ListForm-HDVXB6CG.mjs +7 -0
- package/dist/TreeView-DE5RBMDD.mjs +8 -0
- package/dist/chunk-44JIUIEW.mjs +17 -0
- package/dist/chunk-FP26UOTI.mjs +66 -0
- package/dist/chunk-NWWYF43G.mjs +656 -0
- package/dist/chunk-VWNH6HVN.mjs +1106 -0
- package/dist/cjs/d5-testing-library.cjs +2258 -1607
- package/dist/d5-testing-library.d.ts +62 -48
- package/dist/d5-testing-library.legacy-esm.js +37 -1697
- package/dist/d5-testing-library.mjs +37 -1697
- package/package.json +1 -1
|
@@ -5,6 +5,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __esm = (fn, res) => function __init() {
|
|
9
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
+
};
|
|
8
11
|
var __export = (target, all) => {
|
|
9
12
|
for (var name in all)
|
|
10
13
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -27,88 +30,166 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
27
30
|
));
|
|
28
31
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
32
|
|
|
30
|
-
// src/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
33
|
+
// src/config.ts
|
|
34
|
+
function config(cfg) {
|
|
35
|
+
return configInstance.config(cfg);
|
|
36
|
+
}
|
|
37
|
+
var process, driversMap, createConfigProxy, Config, configInstance;
|
|
38
|
+
var init_config = __esm({
|
|
39
|
+
"src/config.ts"() {
|
|
40
|
+
"use strict";
|
|
41
|
+
process = __toESM(require("process"));
|
|
42
|
+
driversMap = /* @__PURE__ */ new Map();
|
|
43
|
+
createConfigProxy = (config2) => {
|
|
44
|
+
return new Proxy(config2, {
|
|
45
|
+
get(_target, prop) {
|
|
46
|
+
if (prop === "driver") {
|
|
47
|
+
return driversMap.get(process.pid);
|
|
48
|
+
}
|
|
49
|
+
return Reflect.get(...arguments);
|
|
50
|
+
},
|
|
51
|
+
set(_target, prop, value) {
|
|
52
|
+
if (prop === "driver") {
|
|
53
|
+
driversMap.set(process.pid, value);
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return Reflect.set(...arguments);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
Config = class _Config {
|
|
61
|
+
static instance;
|
|
62
|
+
appConfig;
|
|
63
|
+
static getInstance() {
|
|
64
|
+
if (!_Config.instance) {
|
|
65
|
+
_Config.instance = new _Config();
|
|
66
|
+
}
|
|
67
|
+
return _Config.instance;
|
|
68
|
+
}
|
|
69
|
+
config = (cfg) => {
|
|
70
|
+
if (!cfg)
|
|
71
|
+
return createConfigProxy(this.appConfig);
|
|
72
|
+
this.appConfig = cfg;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
configInstance = Config.getInstance();
|
|
76
|
+
}
|
|
58
77
|
});
|
|
59
|
-
module.exports = __toCommonJS(src_exports);
|
|
60
78
|
|
|
61
|
-
// src/
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
return Reflect.set(...arguments);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
var Config = class _Config {
|
|
82
|
-
static instance;
|
|
83
|
-
appConfig;
|
|
84
|
-
static getInstance() {
|
|
85
|
-
if (!_Config.instance) {
|
|
86
|
-
_Config.instance = new _Config();
|
|
79
|
+
// src/utils/fixElementStaleError.ts
|
|
80
|
+
function fixElementStaleError(by, driver) {
|
|
81
|
+
const maxCount = 3;
|
|
82
|
+
let err;
|
|
83
|
+
const call = async (times = 0) => {
|
|
84
|
+
if (times > maxCount)
|
|
85
|
+
throw err;
|
|
86
|
+
try {
|
|
87
|
+
let el = await driver.findElement(by);
|
|
88
|
+
await el.getAttribute("class");
|
|
89
|
+
return el;
|
|
90
|
+
} catch (e) {
|
|
91
|
+
err = e;
|
|
92
|
+
if (e instanceof Error && e.name === "StaleElementReferenceError") {
|
|
93
|
+
return call(++times);
|
|
94
|
+
}
|
|
87
95
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
config = (cfg) => {
|
|
91
|
-
if (!cfg)
|
|
92
|
-
return createConfigProxy(this.appConfig);
|
|
93
|
-
this.appConfig = cfg;
|
|
96
|
+
if (err)
|
|
97
|
+
throw err;
|
|
94
98
|
};
|
|
95
|
-
|
|
96
|
-
var configInstance = Config.getInstance();
|
|
97
|
-
function config(cfg) {
|
|
98
|
-
return configInstance.config(cfg);
|
|
99
|
+
return call();
|
|
99
100
|
}
|
|
101
|
+
var init_fixElementStaleError = __esm({
|
|
102
|
+
"src/utils/fixElementStaleError.ts"() {
|
|
103
|
+
"use strict";
|
|
104
|
+
}
|
|
105
|
+
});
|
|
100
106
|
|
|
101
107
|
// src/pageObjects/AbstractElement.ts
|
|
102
|
-
var
|
|
108
|
+
var import_selenium_webdriver, AbstractElement;
|
|
109
|
+
var init_AbstractElement = __esm({
|
|
110
|
+
"src/pageObjects/AbstractElement.ts"() {
|
|
111
|
+
"use strict";
|
|
112
|
+
import_selenium_webdriver = require("selenium-webdriver");
|
|
113
|
+
init_config();
|
|
114
|
+
init_fixElementStaleError();
|
|
115
|
+
AbstractElement = class {
|
|
116
|
+
driver;
|
|
117
|
+
elementCssSelector;
|
|
118
|
+
constructor(driver, elementCssSelector) {
|
|
119
|
+
this.driver = driver || config().driver;
|
|
120
|
+
this.elementCssSelector = elementCssSelector;
|
|
121
|
+
}
|
|
122
|
+
getFullCssSelector() {
|
|
123
|
+
return this.elementCssSelector;
|
|
124
|
+
}
|
|
125
|
+
joinRelativeCssSelectors(selectors) {
|
|
126
|
+
return selectors.join(" ");
|
|
127
|
+
}
|
|
128
|
+
getElement() {
|
|
129
|
+
return fixElementStaleError(import_selenium_webdriver.By.css(this.getFullCssSelector()), this.driver);
|
|
130
|
+
}
|
|
131
|
+
async getAttribute(attr) {
|
|
132
|
+
const element = await this.getElement();
|
|
133
|
+
return await element.getAttribute(attr);
|
|
134
|
+
}
|
|
135
|
+
async getClasses() {
|
|
136
|
+
return await this.getAttribute("class");
|
|
137
|
+
}
|
|
138
|
+
async getDataTestId() {
|
|
139
|
+
return await this.getAttribute("data-testid");
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
});
|
|
103
144
|
|
|
104
|
-
// src/
|
|
105
|
-
var
|
|
145
|
+
// src/pageObjects/pages/AbstractPage.ts
|
|
146
|
+
var AbstractPage;
|
|
147
|
+
var init_AbstractPage = __esm({
|
|
148
|
+
"src/pageObjects/pages/AbstractPage.ts"() {
|
|
149
|
+
"use strict";
|
|
150
|
+
init_config();
|
|
151
|
+
init_AbstractElement();
|
|
152
|
+
AbstractPage = class extends AbstractElement {
|
|
153
|
+
url;
|
|
154
|
+
host;
|
|
155
|
+
constructor(driver) {
|
|
156
|
+
super(driver);
|
|
157
|
+
this.host = config().auth.host;
|
|
158
|
+
this.url = this.host + this.prependHash(this.path);
|
|
159
|
+
}
|
|
160
|
+
prependHash(urlPath) {
|
|
161
|
+
if (!urlPath.startsWith("/#")) {
|
|
162
|
+
return `/#${urlPath}`;
|
|
163
|
+
}
|
|
164
|
+
return urlPath;
|
|
165
|
+
}
|
|
166
|
+
async goToUrl(url) {
|
|
167
|
+
await this.driver.get(url);
|
|
168
|
+
}
|
|
169
|
+
get path() {
|
|
170
|
+
return "/#";
|
|
171
|
+
}
|
|
172
|
+
async locate() {
|
|
173
|
+
await this.goToUrl(this.url);
|
|
174
|
+
}
|
|
175
|
+
async reloadPage() {
|
|
176
|
+
await this.driver.navigate().refresh();
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
});
|
|
106
181
|
|
|
107
182
|
// src/utils/wait.ts
|
|
108
183
|
async function wait(condition, driver, errorMessage, timeout) {
|
|
109
184
|
driver = driver ?? config().driver;
|
|
110
185
|
await driver.wait(condition, timeout ?? config().timeout, errorMessage);
|
|
111
186
|
}
|
|
187
|
+
var init_wait = __esm({
|
|
188
|
+
"src/utils/wait.ts"() {
|
|
189
|
+
"use strict";
|
|
190
|
+
init_config();
|
|
191
|
+
}
|
|
192
|
+
});
|
|
112
193
|
|
|
113
194
|
// src/utils/waitElementIsVisible.ts
|
|
114
195
|
async function waitElementIsVisible({
|
|
@@ -118,205 +199,81 @@ async function waitElementIsVisible({
|
|
|
118
199
|
driver
|
|
119
200
|
}) {
|
|
120
201
|
driver = driver ?? config().driver;
|
|
121
|
-
const condition =
|
|
202
|
+
const condition = import_selenium_webdriver2.until.elementIsVisible(element);
|
|
122
203
|
await wait(condition.fn, driver, errorMessage ?? condition.description(), timeout ?? config().timeout);
|
|
123
204
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this.elementCssSelector = elementCssSelector;
|
|
132
|
-
}
|
|
133
|
-
getFullCssSelector() {
|
|
134
|
-
return this.elementCssSelector;
|
|
135
|
-
}
|
|
136
|
-
joinRelativeCssSelectors(selectors) {
|
|
137
|
-
return selectors.join(" ");
|
|
138
|
-
}
|
|
139
|
-
async getElement() {
|
|
140
|
-
return this.driver.findElement(import_selenium_webdriver2.By.css(this.getFullCssSelector()));
|
|
141
|
-
}
|
|
142
|
-
async getAttribute(attr) {
|
|
143
|
-
const element = await this.getElement();
|
|
144
|
-
await waitElementIsVisible({
|
|
145
|
-
element,
|
|
146
|
-
driver: this.driver,
|
|
147
|
-
errorMessage: `Element not found: ${this.getFullCssSelector()}`
|
|
148
|
-
});
|
|
149
|
-
return await element.getAttribute(attr);
|
|
150
|
-
}
|
|
151
|
-
async getClasses() {
|
|
152
|
-
return await this.getAttribute("class");
|
|
205
|
+
var import_selenium_webdriver2;
|
|
206
|
+
var init_waitElementIsVisible = __esm({
|
|
207
|
+
"src/utils/waitElementIsVisible.ts"() {
|
|
208
|
+
"use strict";
|
|
209
|
+
import_selenium_webdriver2 = require("selenium-webdriver");
|
|
210
|
+
init_config();
|
|
211
|
+
init_wait();
|
|
153
212
|
}
|
|
154
|
-
|
|
155
|
-
return await this.getAttribute("data-testid");
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
// src/pageObjects/pages/AbstractPage.ts
|
|
160
|
-
var AbstractPage = class extends AbstractElement {
|
|
161
|
-
url;
|
|
162
|
-
host;
|
|
163
|
-
constructor(driver) {
|
|
164
|
-
super(driver);
|
|
165
|
-
this.host = config().auth.host;
|
|
166
|
-
this.url = this.host + this.prependHash(this.path);
|
|
167
|
-
}
|
|
168
|
-
prependHash(urlPath) {
|
|
169
|
-
if (!urlPath.startsWith("/#")) {
|
|
170
|
-
return `/#${urlPath}`;
|
|
171
|
-
}
|
|
172
|
-
return urlPath;
|
|
173
|
-
}
|
|
174
|
-
async goToUrl(url) {
|
|
175
|
-
await this.driver.get(url);
|
|
176
|
-
}
|
|
177
|
-
get path() {
|
|
178
|
-
return "/#";
|
|
179
|
-
}
|
|
180
|
-
async locate() {
|
|
181
|
-
await this.goToUrl(this.url);
|
|
182
|
-
}
|
|
183
|
-
async reloadPage() {
|
|
184
|
-
await this.driver.navigate().refresh();
|
|
185
|
-
}
|
|
186
|
-
};
|
|
213
|
+
});
|
|
187
214
|
|
|
188
215
|
// src/utils/actions.ts
|
|
189
|
-
var click
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
216
|
+
var click;
|
|
217
|
+
var init_actions = __esm({
|
|
218
|
+
"src/utils/actions.ts"() {
|
|
219
|
+
"use strict";
|
|
220
|
+
init_config();
|
|
221
|
+
click = async (webElement, driver) => {
|
|
222
|
+
driver = driver ?? config().driver;
|
|
223
|
+
if (!await webElement.isDisplayed()) {
|
|
224
|
+
await driver.executeScript("arguments[0].scrollIntoView(true);", webElement);
|
|
225
|
+
}
|
|
226
|
+
const actions = driver.actions({ async: true });
|
|
227
|
+
await actions.move({ origin: webElement }).click().perform();
|
|
228
|
+
};
|
|
193
229
|
}
|
|
194
|
-
|
|
195
|
-
await actions.move({ origin: webElement }).click().perform();
|
|
196
|
-
};
|
|
230
|
+
});
|
|
197
231
|
|
|
198
232
|
// src/utils/locators.ts
|
|
199
|
-
var import_selenium_webdriver3
|
|
200
|
-
var
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
usernameField = byTestId("loginField", "input");
|
|
212
|
-
passwordField = byTestId("passwordField", "input");
|
|
213
|
-
loginButton = byTestId("loginButton");
|
|
214
|
-
async locate() {
|
|
215
|
-
await super.locate();
|
|
216
|
-
const login = await this.driver.findElement(this.usernameField);
|
|
217
|
-
await waitElementIsVisible({
|
|
218
|
-
element: login,
|
|
219
|
-
driver: this.driver
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
get path() {
|
|
223
|
-
return LOGIN_PATH;
|
|
224
|
-
}
|
|
225
|
-
async enterUsername(username) {
|
|
226
|
-
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
227
|
-
}
|
|
228
|
-
async enterPassword(password) {
|
|
229
|
-
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
230
|
-
}
|
|
231
|
-
async clickLoginButton() {
|
|
232
|
-
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
233
|
-
}
|
|
234
|
-
async loginWith(username, password) {
|
|
235
|
-
await this.enterUsername(username);
|
|
236
|
-
await this.enterPassword(password);
|
|
237
|
-
await this.clickLoginButton();
|
|
238
|
-
}
|
|
239
|
-
async authorize() {
|
|
240
|
-
await this.loginWith(config().auth.login, config().auth.password);
|
|
233
|
+
var import_selenium_webdriver3, byTestIdCssSelector, byTestId, readonlyLocator;
|
|
234
|
+
var init_locators = __esm({
|
|
235
|
+
"src/utils/locators.ts"() {
|
|
236
|
+
"use strict";
|
|
237
|
+
import_selenium_webdriver3 = require("selenium-webdriver");
|
|
238
|
+
byTestIdCssSelector = (testId, element = "div") => {
|
|
239
|
+
return `${element}[data-testid="${testId}"]`;
|
|
240
|
+
};
|
|
241
|
+
byTestId = (testId, element = "div") => {
|
|
242
|
+
return import_selenium_webdriver3.By.css(byTestIdCssSelector(testId, element));
|
|
243
|
+
};
|
|
244
|
+
readonlyLocator = "readonly";
|
|
241
245
|
}
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
// src/utils/createDriver.ts
|
|
245
|
-
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
246
|
-
var createDriver = async (browser) => {
|
|
247
|
-
const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
|
|
248
|
-
const manage = driver.manage();
|
|
249
|
-
await manage.setTimeouts({ implicit: config().timeout });
|
|
250
|
-
await manage.window().maximize();
|
|
251
|
-
return driver;
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
// src/utils/elementIsNotPresent.ts
|
|
255
|
-
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
256
|
-
var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
257
|
-
return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
|
|
258
|
-
const elements = await driver.findElements(locator);
|
|
259
|
-
return elements.length == 0;
|
|
260
|
-
});
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
// src/utils/signIn.ts
|
|
264
|
-
async function signIn(driver) {
|
|
265
|
-
const webDriver = driver ?? await createDriver();
|
|
266
|
-
config().driver = webDriver;
|
|
267
|
-
const loginPage = new LoginPage(webDriver);
|
|
268
|
-
await loginPage.locate();
|
|
269
|
-
await loginPage.authorize();
|
|
270
|
-
return webDriver;
|
|
271
|
-
}
|
|
246
|
+
});
|
|
272
247
|
|
|
273
248
|
// src/pageObjects/AbstractElementWithParent.ts
|
|
274
|
-
var AbstractElementWithParent
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
305
|
-
var SubsystemsPanel = class extends AbstractElement {
|
|
306
|
-
header;
|
|
307
|
-
constructor(driver) {
|
|
308
|
-
super(driver);
|
|
309
|
-
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
310
|
-
}
|
|
311
|
-
async headerTitle() {
|
|
312
|
-
const title = await this.header.title();
|
|
313
|
-
await wait(async () => await title.getText() != "", this.driver);
|
|
314
|
-
return title.getText();
|
|
249
|
+
var AbstractElementWithParent;
|
|
250
|
+
var init_AbstractElementWithParent = __esm({
|
|
251
|
+
"src/pageObjects/AbstractElementWithParent.ts"() {
|
|
252
|
+
"use strict";
|
|
253
|
+
init_AbstractElement();
|
|
254
|
+
init_locators();
|
|
255
|
+
AbstractElementWithParent = class extends AbstractElement {
|
|
256
|
+
parentCssSelector;
|
|
257
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
258
|
+
super(driver, elementCssSelector);
|
|
259
|
+
this.parentCssSelector = parentCssSelector;
|
|
260
|
+
}
|
|
261
|
+
getFullCssSelector() {
|
|
262
|
+
if (!this.elementCssSelector) {
|
|
263
|
+
return this.parentCssSelector;
|
|
264
|
+
}
|
|
265
|
+
if (!this.parentCssSelector) {
|
|
266
|
+
return this.elementCssSelector;
|
|
267
|
+
}
|
|
268
|
+
return `${this.parentCssSelector} ${this.elementCssSelector}`;
|
|
269
|
+
}
|
|
270
|
+
async isReadonly() {
|
|
271
|
+
const classSting = await this.getClasses();
|
|
272
|
+
return classSting.includes(readonlyLocator);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
315
275
|
}
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
319
|
-
var import_selenium_webdriver8 = require("selenium-webdriver");
|
|
276
|
+
});
|
|
320
277
|
|
|
321
278
|
// src/utils/createDataTestId.ts
|
|
322
279
|
function createDataTestId(formName, itemType, itemName) {
|
|
@@ -343,6 +300,11 @@ function createTableId(formName) {
|
|
|
343
300
|
function createFormButtonTestId(formName, itemName) {
|
|
344
301
|
return createDataTestId(formName, "button" /* BUTTON */, itemName);
|
|
345
302
|
}
|
|
303
|
+
var init_createDataTestId = __esm({
|
|
304
|
+
"src/utils/createDataTestId.ts"() {
|
|
305
|
+
"use strict";
|
|
306
|
+
}
|
|
307
|
+
});
|
|
346
308
|
|
|
347
309
|
// src/utils/waitElementIsClickable.ts
|
|
348
310
|
async function waitElementIsClickable({
|
|
@@ -357,1487 +319,2176 @@ async function waitElementIsClickable({
|
|
|
357
319
|
return await element.isDisplayed() && !isDisabled;
|
|
358
320
|
}, driver, errorMessage, timeout ?? config().timeout);
|
|
359
321
|
}
|
|
322
|
+
var init_waitElementIsClickable = __esm({
|
|
323
|
+
"src/utils/waitElementIsClickable.ts"() {
|
|
324
|
+
"use strict";
|
|
325
|
+
init_config();
|
|
326
|
+
init_wait();
|
|
327
|
+
}
|
|
328
|
+
});
|
|
360
329
|
|
|
361
330
|
// src/pageObjects/elements/TableToolbar/AbstractButton.ts
|
|
362
|
-
var AbstractButton
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
331
|
+
var AbstractButton;
|
|
332
|
+
var init_AbstractButton = __esm({
|
|
333
|
+
"src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
|
|
334
|
+
"use strict";
|
|
335
|
+
init_AbstractElementWithParent();
|
|
336
|
+
init_actions();
|
|
337
|
+
init_waitElementIsClickable();
|
|
338
|
+
AbstractButton = class extends AbstractElementWithParent {
|
|
339
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
340
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
341
|
+
}
|
|
342
|
+
async click() {
|
|
343
|
+
const button = await this.getElement();
|
|
344
|
+
await waitElementIsClickable({
|
|
345
|
+
element: button,
|
|
346
|
+
errorMessage: this.buttonNotDisplayedError(),
|
|
347
|
+
driver: this.driver
|
|
348
|
+
});
|
|
349
|
+
await click(button, this.driver);
|
|
350
|
+
}
|
|
351
|
+
async isDisabled() {
|
|
352
|
+
const button = await this.getElement();
|
|
353
|
+
return await button.getCssValue("pointer-events") === "none";
|
|
354
|
+
}
|
|
355
|
+
};
|
|
378
356
|
}
|
|
379
|
-
};
|
|
357
|
+
});
|
|
380
358
|
|
|
381
359
|
// src/pageObjects/elements/DXComponents/DXButton.ts
|
|
382
|
-
var import_selenium_webdriver7
|
|
383
|
-
var
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
360
|
+
var import_selenium_webdriver7, DXButton;
|
|
361
|
+
var init_DXButton = __esm({
|
|
362
|
+
"src/pageObjects/elements/DXComponents/DXButton.ts"() {
|
|
363
|
+
"use strict";
|
|
364
|
+
init_AbstractButton();
|
|
365
|
+
import_selenium_webdriver7 = require("selenium-webdriver");
|
|
366
|
+
DXButton = class extends AbstractButton {
|
|
367
|
+
async getText() {
|
|
368
|
+
const classes = await this.getClasses();
|
|
369
|
+
if (!classes.includes("dx-button-has-text")) {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
const el = await this.getElement();
|
|
373
|
+
const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
|
|
374
|
+
return await textEl.getText();
|
|
375
|
+
}
|
|
376
|
+
};
|
|
392
377
|
}
|
|
393
|
-
};
|
|
378
|
+
});
|
|
394
379
|
|
|
395
380
|
// src/pageObjects/elements/FormButton.ts
|
|
396
|
-
var FormButton
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
381
|
+
var FormButton;
|
|
382
|
+
var init_FormButton = __esm({
|
|
383
|
+
"src/pageObjects/elements/FormButton.ts"() {
|
|
384
|
+
"use strict";
|
|
385
|
+
init_locators();
|
|
386
|
+
init_createDataTestId();
|
|
387
|
+
init_DXButton();
|
|
388
|
+
FormButton = class extends DXButton {
|
|
389
|
+
name;
|
|
390
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
391
|
+
super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
|
|
392
|
+
this.name = name;
|
|
393
|
+
}
|
|
394
|
+
buttonNotDisplayedError() {
|
|
395
|
+
return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
404
398
|
}
|
|
405
|
-
};
|
|
399
|
+
});
|
|
406
400
|
|
|
407
|
-
// src/pageObjects/
|
|
408
|
-
var
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
async isModal() {
|
|
419
|
-
const el = await this.getContainerElement();
|
|
420
|
-
const value = await el.getAttribute("data-ismodal");
|
|
421
|
-
return value === "true";
|
|
422
|
-
}
|
|
423
|
-
getContainerElement = () => {
|
|
424
|
-
return this.driver.findElement(this.containerBy);
|
|
425
|
-
};
|
|
426
|
-
get formName() {
|
|
427
|
-
return "";
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Возвращает true если форма есть в DOM
|
|
431
|
-
* @example
|
|
432
|
-
* class MyForm extends FormEdit {}
|
|
433
|
-
* //...
|
|
434
|
-
* const formEdit = new MyForm();
|
|
435
|
-
* expect(await formEdit.exists()).toBe(true);
|
|
436
|
-
*/
|
|
437
|
-
async exists() {
|
|
438
|
-
try {
|
|
439
|
-
let elements = await this.driver.findElements(this.containerBy);
|
|
440
|
-
return elements.length > 0;
|
|
441
|
-
} catch (error) {
|
|
442
|
-
return false;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* Получение заголовка на формы
|
|
447
|
-
* @example
|
|
448
|
-
* const listForm = new MyForm();
|
|
449
|
-
* //...
|
|
450
|
-
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
451
|
-
*/
|
|
452
|
-
async getTitleText() {
|
|
453
|
-
if (await this.isModal()) {
|
|
454
|
-
const titleEl2 = await this.driver.findElement(import_selenium_webdriver8.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
455
|
-
return titleEl2.getText();
|
|
456
|
-
}
|
|
457
|
-
let titleEl = await this.driver.findElement(import_selenium_webdriver8.By.className("main-toolbar-form-title"));
|
|
458
|
-
return titleEl.getText();
|
|
459
|
-
}
|
|
460
|
-
button(name) {
|
|
461
|
-
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
401
|
+
// src/pageObjects/AbstractFormElement.ts
|
|
402
|
+
var AbstractFormElement;
|
|
403
|
+
var init_AbstractFormElement = __esm({
|
|
404
|
+
"src/pageObjects/AbstractFormElement.ts"() {
|
|
405
|
+
"use strict";
|
|
406
|
+
init_AbstractElementWithParent();
|
|
407
|
+
AbstractFormElement = class extends AbstractElementWithParent {
|
|
408
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
409
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
462
412
|
}
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
466
|
-
var import_selenium_webdriver17 = require("selenium-webdriver");
|
|
413
|
+
});
|
|
467
414
|
|
|
468
|
-
// src/pageObjects/elements/
|
|
469
|
-
var
|
|
415
|
+
// src/pageObjects/elements/Groups/AbstractGroup.ts
|
|
416
|
+
var AbstractGroup;
|
|
417
|
+
var init_AbstractGroup = __esm({
|
|
418
|
+
"src/pageObjects/elements/Groups/AbstractGroup.ts"() {
|
|
419
|
+
"use strict";
|
|
420
|
+
init_AbstractElementWithParent();
|
|
421
|
+
AbstractGroup = class extends AbstractElementWithParent {
|
|
422
|
+
async isDisplayed() {
|
|
423
|
+
const groupElement = await this.getElement();
|
|
424
|
+
return await groupElement.isDisplayed();
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
});
|
|
470
429
|
|
|
471
|
-
// src/pageObjects/elements/
|
|
472
|
-
var
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
430
|
+
// src/pageObjects/elements/Groups/Panel.ts
|
|
431
|
+
var Panel;
|
|
432
|
+
var init_Panel = __esm({
|
|
433
|
+
"src/pageObjects/elements/Groups/Panel.ts"() {
|
|
434
|
+
"use strict";
|
|
435
|
+
init_AbstractGroup();
|
|
436
|
+
Panel = class extends AbstractGroup {
|
|
437
|
+
};
|
|
476
438
|
}
|
|
477
|
-
};
|
|
439
|
+
});
|
|
478
440
|
|
|
479
|
-
// src/pageObjects/elements/
|
|
480
|
-
var
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
441
|
+
// src/pageObjects/elements/Groups/TabPanel/TabPanel.ts
|
|
442
|
+
var import_selenium_webdriver8, getTabTestIdByName, TabPanel;
|
|
443
|
+
var init_TabPanel = __esm({
|
|
444
|
+
"src/pageObjects/elements/Groups/TabPanel/TabPanel.ts"() {
|
|
445
|
+
"use strict";
|
|
446
|
+
init_AbstractGroup();
|
|
447
|
+
import_selenium_webdriver8 = require("selenium-webdriver");
|
|
448
|
+
init_locators();
|
|
449
|
+
getTabTestIdByName = (name) => `tab-caption-${name}`;
|
|
450
|
+
TabPanel = class extends AbstractGroup {
|
|
451
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
452
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
453
|
+
}
|
|
454
|
+
_getTab(name) {
|
|
455
|
+
return this.driver.findElement(import_selenium_webdriver8.By.css(`${this.getFullCssSelector()} ${byTestIdCssSelector(getTabTestIdByName(name))}`));
|
|
456
|
+
}
|
|
457
|
+
async tabClick(name) {
|
|
458
|
+
const tabEl = this._getTab(name);
|
|
459
|
+
await tabEl.click();
|
|
460
|
+
}
|
|
461
|
+
};
|
|
484
462
|
}
|
|
485
|
-
|
|
486
|
-
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
466
|
+
var groupFactory;
|
|
467
|
+
var init_groupFactory = __esm({
|
|
468
|
+
"src/pageObjects/elements/Groups/groupFactory.ts"() {
|
|
469
|
+
"use strict";
|
|
470
|
+
init_AbstractFormElement();
|
|
471
|
+
init_Panel();
|
|
472
|
+
init_TabPanel();
|
|
473
|
+
groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
474
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
475
|
+
const classSting = await elementInstance.getClasses();
|
|
476
|
+
if (classSting.includes("tab-panel-group"))
|
|
477
|
+
return new TabPanel(parentCssSelector, elementCssSelector, driver);
|
|
478
|
+
if (classSting.includes("panel-group"))
|
|
479
|
+
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
480
|
+
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
481
|
+
};
|
|
487
482
|
}
|
|
488
|
-
|
|
489
|
-
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
// src/pageObjects/elements/FormGroup.ts
|
|
486
|
+
var FormGroup;
|
|
487
|
+
var init_FormGroup = __esm({
|
|
488
|
+
"src/pageObjects/elements/FormGroup.ts"() {
|
|
489
|
+
"use strict";
|
|
490
|
+
init_AbstractElementWithParent();
|
|
491
|
+
init_locators();
|
|
492
|
+
init_createDataTestId();
|
|
493
|
+
init_groupFactory();
|
|
494
|
+
FormGroup = class extends AbstractElementWithParent {
|
|
495
|
+
editor;
|
|
496
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
497
|
+
super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
|
|
498
|
+
}
|
|
499
|
+
async initEditor() {
|
|
500
|
+
if (!this.editor) {
|
|
501
|
+
this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Возвращает булевое значение доступна ли группа
|
|
506
|
+
* @example
|
|
507
|
+
* expect(await tableList.group('MainSuperPanel').isDisplayed();
|
|
508
|
+
*/
|
|
509
|
+
async isDisplayed() {
|
|
510
|
+
try {
|
|
511
|
+
await this.initEditor();
|
|
512
|
+
return this.editor.isDisplayed();
|
|
513
|
+
} catch {
|
|
514
|
+
return false;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Происходит клик по табе
|
|
519
|
+
* @example
|
|
520
|
+
* expect(await tableList.group('TabPanel').tabClick(tabName);
|
|
521
|
+
*/
|
|
522
|
+
async tabClick(name) {
|
|
523
|
+
await this.initEditor();
|
|
524
|
+
await this.editor.tabClick(name);
|
|
525
|
+
}
|
|
526
|
+
};
|
|
490
527
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
// src/pageObjects/elements/Forms/AbstractForm.ts
|
|
531
|
+
var AbstractForm;
|
|
532
|
+
var init_AbstractForm = __esm({
|
|
533
|
+
"src/pageObjects/elements/Forms/AbstractForm.ts"() {
|
|
534
|
+
"use strict";
|
|
535
|
+
init_AbstractPage();
|
|
536
|
+
init_FormButton();
|
|
537
|
+
init_FormGroup();
|
|
538
|
+
AbstractForm = class extends AbstractPage {
|
|
539
|
+
containerCssSelector = "";
|
|
540
|
+
_formName = "";
|
|
541
|
+
containerBy;
|
|
542
|
+
getContainerElement = () => {
|
|
543
|
+
return this.driver.findElement(this.containerBy);
|
|
544
|
+
};
|
|
545
|
+
set formName(name) {
|
|
546
|
+
this._formName = name;
|
|
547
|
+
}
|
|
548
|
+
get formName() {
|
|
549
|
+
return this._formName;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Возвращает true если форма есть в DOM
|
|
553
|
+
* @example
|
|
554
|
+
* class MyForm extends FormEdit {}
|
|
555
|
+
* //...
|
|
556
|
+
* const formEdit = new MyForm();
|
|
557
|
+
* expect(await formEdit.exists()).toBe(true);
|
|
558
|
+
*/
|
|
559
|
+
async exists() {
|
|
560
|
+
try {
|
|
561
|
+
let elements = await this.driver.findElements(this.containerBy);
|
|
562
|
+
return elements.length > 0;
|
|
563
|
+
} catch (error) {
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
button(name) {
|
|
568
|
+
return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Находит группу на форме по имени
|
|
572
|
+
* @example
|
|
573
|
+
* const formEdit = new MyForm();
|
|
574
|
+
* //...
|
|
575
|
+
* expect(await formEdit.group('Name');
|
|
576
|
+
*/
|
|
577
|
+
group(name) {
|
|
578
|
+
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
579
|
+
}
|
|
580
|
+
};
|
|
494
581
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
// src/pageObjects/elements/Forms/types.ts
|
|
585
|
+
var init_types = __esm({
|
|
586
|
+
"src/pageObjects/elements/Forms/types.ts"() {
|
|
587
|
+
"use strict";
|
|
499
588
|
}
|
|
500
|
-
|
|
501
|
-
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
// src/pageObjects/elements/Table/utils.ts
|
|
592
|
+
function getCssRowByIndexSelector(index) {
|
|
593
|
+
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
594
|
+
}
|
|
595
|
+
function getCssCellByIndexSelector(index) {
|
|
596
|
+
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
597
|
+
}
|
|
598
|
+
var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
|
|
599
|
+
var init_utils = __esm({
|
|
600
|
+
"src/pageObjects/elements/Table/utils.ts"() {
|
|
601
|
+
"use strict";
|
|
602
|
+
import_selenium_webdriver9 = require("selenium-webdriver");
|
|
603
|
+
getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
604
|
+
getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
605
|
+
getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
606
|
+
transformInputIndex = (index) => index + 1;
|
|
607
|
+
transformOutputIndex = (index) => +index - 1;
|
|
502
608
|
}
|
|
503
|
-
};
|
|
609
|
+
});
|
|
504
610
|
|
|
505
|
-
// src/pageObjects/elements/
|
|
506
|
-
var
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
this.setClearStrategy(new InputClearStrategy());
|
|
611
|
+
// src/pageObjects/elements/Table/types.ts
|
|
612
|
+
var init_types2 = __esm({
|
|
613
|
+
"src/pageObjects/elements/Table/types.ts"() {
|
|
614
|
+
"use strict";
|
|
510
615
|
}
|
|
511
|
-
|
|
512
|
-
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
619
|
+
var import_selenium_webdriver10, Cell;
|
|
620
|
+
var init_Cell = __esm({
|
|
621
|
+
"src/pageObjects/elements/Table/elements/Cell.ts"() {
|
|
622
|
+
"use strict";
|
|
623
|
+
import_selenium_webdriver10 = require("selenium-webdriver");
|
|
624
|
+
init_AbstractElementWithParent();
|
|
625
|
+
init_utils();
|
|
626
|
+
init_types2();
|
|
627
|
+
Cell = class extends AbstractElementWithParent {
|
|
628
|
+
_index;
|
|
629
|
+
getCellIndex;
|
|
630
|
+
constructor(parentCssSelector, getCellIndex, index, driver) {
|
|
631
|
+
super(parentCssSelector, getCssCellByIndexSelector(index), driver);
|
|
632
|
+
this.getCellIndex = getCellIndex;
|
|
633
|
+
this._index = index;
|
|
634
|
+
}
|
|
635
|
+
set index(index) {
|
|
636
|
+
this._index = index;
|
|
637
|
+
this.elementCssSelector = getCssCellByIndexSelector(index);
|
|
638
|
+
}
|
|
639
|
+
async getBooleanValue(cellEl) {
|
|
640
|
+
const booleanEl = await cellEl.findElement(import_selenium_webdriver10.By.className("boolean-widget"));
|
|
641
|
+
return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
|
|
642
|
+
}
|
|
643
|
+
async getTagsValue(cellEl) {
|
|
644
|
+
const tagsCssSelector = ".multiselect-container .multiselect-cell";
|
|
645
|
+
const tags = await cellEl.findElements(import_selenium_webdriver10.By.css(tagsCssSelector));
|
|
646
|
+
const values = [];
|
|
647
|
+
for (const tag of tags) {
|
|
648
|
+
values.push(await tag.getAttribute("textContent"));
|
|
649
|
+
}
|
|
650
|
+
return values;
|
|
651
|
+
}
|
|
652
|
+
async getElement() {
|
|
653
|
+
if (this._index == null) {
|
|
654
|
+
this.index = await this.getCellIndex();
|
|
655
|
+
}
|
|
656
|
+
return super.getElement();
|
|
657
|
+
}
|
|
658
|
+
async getValue() {
|
|
659
|
+
const cellEl = await this.getElement();
|
|
660
|
+
const cellElClass = await cellEl.getAttribute("class");
|
|
661
|
+
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
662
|
+
return this.getBooleanValue(cellEl);
|
|
663
|
+
if (cellElClass.includes("tags-column" /* Tags */))
|
|
664
|
+
return this.getTagsValue(cellEl);
|
|
665
|
+
return cellEl.getText();
|
|
666
|
+
}
|
|
667
|
+
getIndex() {
|
|
668
|
+
return this._index;
|
|
669
|
+
}
|
|
670
|
+
};
|
|
513
671
|
}
|
|
514
|
-
|
|
515
|
-
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
// src/pageObjects/elements/Table/elements/Row.ts
|
|
675
|
+
var import_selenium_webdriver11, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
|
|
676
|
+
var init_Row = __esm({
|
|
677
|
+
"src/pageObjects/elements/Table/elements/Row.ts"() {
|
|
678
|
+
"use strict";
|
|
679
|
+
import_selenium_webdriver11 = require("selenium-webdriver");
|
|
680
|
+
init_Cell();
|
|
681
|
+
init_utils();
|
|
682
|
+
init_AbstractElementWithParent();
|
|
683
|
+
init_actions();
|
|
684
|
+
init_wait();
|
|
685
|
+
DX_SELECTION_CLASS = "dx-selection";
|
|
686
|
+
DX_ROW_EDIT_CLASS = "dx-edit-row";
|
|
687
|
+
DX_DATA_ROW_CLASS = "dx-data-row";
|
|
688
|
+
Row = class extends AbstractElementWithParent {
|
|
689
|
+
index;
|
|
690
|
+
getColumnBy;
|
|
691
|
+
constructor(parentCssSelector, index, driver, getColumnBy) {
|
|
692
|
+
super(parentCssSelector, getCssRowByIndexSelector(index), driver);
|
|
693
|
+
this.index = index;
|
|
694
|
+
this.getColumnBy = getColumnBy;
|
|
695
|
+
}
|
|
696
|
+
_getCell({ index, name, title }) {
|
|
697
|
+
return new Cell(
|
|
698
|
+
this.getFullCssSelector(),
|
|
699
|
+
() => {
|
|
700
|
+
return this.getColumnBy({ title, name }).getIndex();
|
|
701
|
+
},
|
|
702
|
+
index,
|
|
703
|
+
this.driver
|
|
704
|
+
);
|
|
705
|
+
}
|
|
706
|
+
getCellByIndex(index) {
|
|
707
|
+
return this._getCell({ index });
|
|
708
|
+
}
|
|
709
|
+
getCell(name) {
|
|
710
|
+
return this._getCell({ name });
|
|
711
|
+
}
|
|
712
|
+
getCellByTitle(title) {
|
|
713
|
+
return this._getCell({ title });
|
|
714
|
+
}
|
|
715
|
+
async select() {
|
|
716
|
+
const rowEl = await this.getElement();
|
|
717
|
+
await click(rowEl, this.driver);
|
|
718
|
+
await wait(
|
|
719
|
+
async () => {
|
|
720
|
+
const classes = await this.getClasses();
|
|
721
|
+
return classes.includes(DX_SELECTION_CLASS);
|
|
722
|
+
},
|
|
723
|
+
this.driver,
|
|
724
|
+
"Cannot select row"
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
async isSelected() {
|
|
728
|
+
const result = await this.getAttribute("aria-selected");
|
|
729
|
+
return result === "true";
|
|
730
|
+
}
|
|
731
|
+
getIndex() {
|
|
732
|
+
return this.index;
|
|
733
|
+
}
|
|
734
|
+
async getCells() {
|
|
735
|
+
const cells = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
|
|
736
|
+
const result = [];
|
|
737
|
+
cells.forEach((_, index) => {
|
|
738
|
+
const newCell = this.getCellByIndex(index);
|
|
739
|
+
result.push(newCell);
|
|
740
|
+
});
|
|
741
|
+
return result;
|
|
742
|
+
}
|
|
743
|
+
async clickInlineButton(buttonClass) {
|
|
744
|
+
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
745
|
+
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
746
|
+
this.index
|
|
747
|
+
)}"] .${buttonClass}`;
|
|
748
|
+
const button = await this.driver.findElement(
|
|
749
|
+
import_selenium_webdriver11.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
750
|
+
);
|
|
751
|
+
return click(button, this.driver);
|
|
752
|
+
}
|
|
753
|
+
async checkEditingMode(isEditing, msg) {
|
|
754
|
+
await wait(
|
|
755
|
+
async () => {
|
|
756
|
+
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
757
|
+
},
|
|
758
|
+
this.driver,
|
|
759
|
+
msg
|
|
760
|
+
);
|
|
761
|
+
}
|
|
762
|
+
async edit() {
|
|
763
|
+
await this.clickInlineButton("edit");
|
|
764
|
+
await this.checkEditingMode(true, "Row did not switch to edit mode");
|
|
765
|
+
}
|
|
766
|
+
async save() {
|
|
767
|
+
await this.clickInlineButton("save");
|
|
768
|
+
await this.checkEditingMode(false, "Row did not saved");
|
|
769
|
+
}
|
|
770
|
+
async cancel() {
|
|
771
|
+
await this.clickInlineButton("cancel");
|
|
772
|
+
await this.checkEditingMode(false, "Row did not switch to normal mode");
|
|
773
|
+
}
|
|
774
|
+
};
|
|
516
775
|
}
|
|
517
|
-
};
|
|
776
|
+
});
|
|
518
777
|
|
|
519
|
-
// src/pageObjects/elements/
|
|
520
|
-
var
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
778
|
+
// src/pageObjects/elements/Table/elements/Column.ts
|
|
779
|
+
var import_selenium_webdriver12, Column;
|
|
780
|
+
var init_Column = __esm({
|
|
781
|
+
"src/pageObjects/elements/Table/elements/Column.ts"() {
|
|
782
|
+
"use strict";
|
|
783
|
+
import_selenium_webdriver12 = require("selenium-webdriver");
|
|
784
|
+
init_utils();
|
|
785
|
+
init_AbstractElementWithParent();
|
|
786
|
+
init_fixElementStaleError();
|
|
787
|
+
Column = class extends AbstractElementWithParent {
|
|
788
|
+
_index;
|
|
789
|
+
_caption;
|
|
790
|
+
_name;
|
|
791
|
+
headerCssSelector;
|
|
792
|
+
constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
|
|
793
|
+
super(parentCssSelector, "", driver);
|
|
794
|
+
this._name = name;
|
|
795
|
+
this.index = index;
|
|
796
|
+
this._caption = caption;
|
|
797
|
+
this.headerCssSelector = headerCssSelector;
|
|
798
|
+
}
|
|
799
|
+
set index(index) {
|
|
800
|
+
this._index = index;
|
|
801
|
+
this.elementCssSelector = getColumnByIndexCssSelector(index);
|
|
802
|
+
}
|
|
803
|
+
get index() {
|
|
804
|
+
return this._index;
|
|
805
|
+
}
|
|
806
|
+
async getElement() {
|
|
807
|
+
await this.getIndex();
|
|
808
|
+
return super.getElement();
|
|
809
|
+
}
|
|
810
|
+
async getColumnHeaderIndexBy(cssSelector) {
|
|
811
|
+
const column = await fixElementStaleError(import_selenium_webdriver12.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
|
|
812
|
+
return transformOutputIndex(await column.getAttribute("aria-colindex"));
|
|
813
|
+
}
|
|
814
|
+
async getIndexByCaption() {
|
|
815
|
+
return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
|
|
816
|
+
}
|
|
817
|
+
async getIndexByName() {
|
|
818
|
+
return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
|
|
819
|
+
}
|
|
820
|
+
async caption() {
|
|
821
|
+
const el = await this.getElement();
|
|
822
|
+
return el.getText();
|
|
823
|
+
}
|
|
824
|
+
async getIndex() {
|
|
825
|
+
if (this.index != null) {
|
|
826
|
+
return this.index;
|
|
827
|
+
}
|
|
828
|
+
if (this._caption != null) {
|
|
829
|
+
this.index = await this.getIndexByCaption();
|
|
830
|
+
return this.index;
|
|
831
|
+
}
|
|
832
|
+
if (this._name != null) {
|
|
833
|
+
this.index = await this.getIndexByName();
|
|
834
|
+
return this.index;
|
|
835
|
+
}
|
|
836
|
+
throw new Error("Cant get the index in the column");
|
|
837
|
+
}
|
|
838
|
+
};
|
|
524
839
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
// src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
|
|
843
|
+
var InputClearStrategy;
|
|
844
|
+
var init_InputClearStrategy = __esm({
|
|
845
|
+
"src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
|
|
846
|
+
"use strict";
|
|
847
|
+
InputClearStrategy = class {
|
|
848
|
+
async clear(editor) {
|
|
849
|
+
const inputEl = await editor.getInputElement();
|
|
850
|
+
await inputEl.clear();
|
|
851
|
+
}
|
|
852
|
+
};
|
|
528
853
|
}
|
|
529
|
-
|
|
530
|
-
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
// src/pageObjects/elements/Editors/AbstractEditor.ts
|
|
857
|
+
var import_selenium_webdriver13, AbstractDXEditorWithInput;
|
|
858
|
+
var init_AbstractEditor = __esm({
|
|
859
|
+
"src/pageObjects/elements/Editors/AbstractEditor.ts"() {
|
|
860
|
+
"use strict";
|
|
861
|
+
import_selenium_webdriver13 = require("selenium-webdriver");
|
|
862
|
+
init_actions();
|
|
863
|
+
init_InputClearStrategy();
|
|
864
|
+
init_AbstractElementWithParent();
|
|
865
|
+
AbstractDXEditorWithInput = class extends AbstractElementWithParent {
|
|
866
|
+
clearStrategy = new InputClearStrategy();
|
|
867
|
+
setClearStrategy(strategy) {
|
|
868
|
+
this.clearStrategy = strategy;
|
|
869
|
+
}
|
|
870
|
+
getInputCssSelector() {
|
|
871
|
+
return `${this.getFullCssSelector()} .dx-texteditor-input`;
|
|
872
|
+
}
|
|
873
|
+
async getInputElement() {
|
|
874
|
+
return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
|
|
875
|
+
}
|
|
876
|
+
async getInputValue() {
|
|
877
|
+
const inputEl = await this.getInputElement();
|
|
878
|
+
return inputEl.getAttribute("value");
|
|
879
|
+
}
|
|
880
|
+
async setInputValue(value) {
|
|
881
|
+
const inputEl = await this.getInputElement();
|
|
882
|
+
await click(inputEl, this.driver);
|
|
883
|
+
await inputEl.sendKeys(value, import_selenium_webdriver13.Key.ENTER);
|
|
884
|
+
}
|
|
885
|
+
async clear() {
|
|
886
|
+
await this.clearStrategy.clear(this);
|
|
887
|
+
}
|
|
888
|
+
};
|
|
531
889
|
}
|
|
532
|
-
};
|
|
890
|
+
});
|
|
533
891
|
|
|
534
|
-
// src/pageObjects/elements/Editors/
|
|
535
|
-
var
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
}
|
|
892
|
+
// src/pageObjects/elements/Editors/TextEditor.ts
|
|
893
|
+
var TextEditor;
|
|
894
|
+
var init_TextEditor = __esm({
|
|
895
|
+
"src/pageObjects/elements/Editors/TextEditor.ts"() {
|
|
896
|
+
"use strict";
|
|
897
|
+
init_AbstractEditor();
|
|
898
|
+
init_InputClearStrategy();
|
|
899
|
+
TextEditor = class extends AbstractDXEditorWithInput {
|
|
900
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
901
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
902
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
903
|
+
}
|
|
904
|
+
getValue() {
|
|
905
|
+
return this.getInputValue();
|
|
906
|
+
}
|
|
907
|
+
setValue(value) {
|
|
908
|
+
return this.setInputValue(value);
|
|
909
|
+
}
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
});
|
|
549
913
|
|
|
550
|
-
// src/pageObjects/
|
|
551
|
-
var
|
|
552
|
-
|
|
553
|
-
|
|
914
|
+
// src/pageObjects/elements/Editors/NumberEditor.ts
|
|
915
|
+
var NumberEditor;
|
|
916
|
+
var init_NumberEditor = __esm({
|
|
917
|
+
"src/pageObjects/elements/Editors/NumberEditor.ts"() {
|
|
918
|
+
"use strict";
|
|
919
|
+
init_AbstractEditor();
|
|
920
|
+
init_InputClearStrategy();
|
|
921
|
+
NumberEditor = class extends AbstractDXEditorWithInput {
|
|
922
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
923
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
924
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
925
|
+
}
|
|
926
|
+
async getValue() {
|
|
927
|
+
const value = await super.getInputValue();
|
|
928
|
+
return value == "" ? null : Number.parseFloat(value);
|
|
929
|
+
}
|
|
930
|
+
setValue(value) {
|
|
931
|
+
return this.setInputValue(value);
|
|
932
|
+
}
|
|
933
|
+
};
|
|
554
934
|
}
|
|
555
|
-
};
|
|
935
|
+
});
|
|
556
936
|
|
|
557
|
-
// src/pageObjects/elements/Editors/
|
|
558
|
-
var
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
937
|
+
// src/pageObjects/elements/Editors/types.ts
|
|
938
|
+
var ControlClass;
|
|
939
|
+
var init_types3 = __esm({
|
|
940
|
+
"src/pageObjects/elements/Editors/types.ts"() {
|
|
941
|
+
"use strict";
|
|
942
|
+
ControlClass = /* @__PURE__ */ ((ControlClass2) => {
|
|
943
|
+
ControlClass2["Text"] = "text-control";
|
|
944
|
+
ControlClass2["TextArea"] = "text-area-control";
|
|
945
|
+
ControlClass2["Number"] = "number-control";
|
|
946
|
+
ControlClass2["CheckBox"] = "check-box";
|
|
947
|
+
ControlClass2["Multiselect"] = "multi-select-control";
|
|
948
|
+
ControlClass2["Select"] = "select-control";
|
|
949
|
+
ControlClass2["Switch"] = "switch-control";
|
|
950
|
+
ControlClass2["Date"] = "date-control";
|
|
951
|
+
ControlClass2["SingleDateRange"] = "single-date-range-control";
|
|
952
|
+
ControlClass2["BooleanSelector"] = "buttons-group";
|
|
953
|
+
ControlClass2["ButtonGroup"] = "button-group-field";
|
|
954
|
+
return ControlClass2;
|
|
955
|
+
})(ControlClass || {});
|
|
573
956
|
}
|
|
574
|
-
};
|
|
957
|
+
});
|
|
575
958
|
|
|
576
|
-
// src/pageObjects/elements/Editors/
|
|
577
|
-
var
|
|
959
|
+
// src/pageObjects/elements/Editors/CheckBox.ts
|
|
960
|
+
var CheckBox;
|
|
961
|
+
var init_CheckBox = __esm({
|
|
962
|
+
"src/pageObjects/elements/Editors/CheckBox.ts"() {
|
|
963
|
+
"use strict";
|
|
964
|
+
init_actions();
|
|
965
|
+
init_AbstractElementWithParent();
|
|
966
|
+
CheckBox = class extends AbstractElementWithParent {
|
|
967
|
+
async getValue() {
|
|
968
|
+
const result = await this.getAttribute("aria-checked");
|
|
969
|
+
if (result === "true")
|
|
970
|
+
return 1;
|
|
971
|
+
if (result === "false")
|
|
972
|
+
return 0;
|
|
973
|
+
return null;
|
|
974
|
+
}
|
|
975
|
+
async setValue(value) {
|
|
976
|
+
const inputEl = await this.getElement();
|
|
977
|
+
const currentValue = await this.getValue();
|
|
978
|
+
if (currentValue !== value) {
|
|
979
|
+
await click(inputEl, this.driver);
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
};
|
|
983
|
+
}
|
|
984
|
+
});
|
|
578
985
|
|
|
579
986
|
// src/utils/xpathHelper.ts
|
|
580
|
-
var XPathHelper
|
|
581
|
-
|
|
582
|
-
|
|
987
|
+
var XPathHelper;
|
|
988
|
+
var init_xpathHelper = __esm({
|
|
989
|
+
"src/utils/xpathHelper.ts"() {
|
|
990
|
+
"use strict";
|
|
991
|
+
XPathHelper = class {
|
|
992
|
+
static getClassAndValueXpath(cssClass, value) {
|
|
993
|
+
return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
|
|
994
|
+
}
|
|
995
|
+
};
|
|
583
996
|
}
|
|
584
|
-
};
|
|
997
|
+
});
|
|
585
998
|
|
|
586
999
|
// src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
|
|
587
|
-
var
|
|
588
|
-
var
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
1000
|
+
var import_selenium_webdriver14, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
|
|
1001
|
+
var init_ClearButtonStrategy = __esm({
|
|
1002
|
+
"src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
|
|
1003
|
+
"use strict";
|
|
1004
|
+
import_selenium_webdriver14 = require("selenium-webdriver");
|
|
1005
|
+
init_actions();
|
|
1006
|
+
DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
|
|
1007
|
+
DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
|
|
1008
|
+
ClearButtonStrategy = class {
|
|
1009
|
+
editorContainerClass;
|
|
1010
|
+
_driver;
|
|
1011
|
+
constructor(editorContainerClass, driver) {
|
|
1012
|
+
this.editorContainerClass = editorContainerClass;
|
|
1013
|
+
this._driver = driver;
|
|
1014
|
+
}
|
|
1015
|
+
async isEmptyEditorField() {
|
|
1016
|
+
const editorContainer = await this._driver.findElement(import_selenium_webdriver14.By.css(this.editorContainerClass));
|
|
1017
|
+
const classAttribute = await editorContainer.getAttribute("class");
|
|
1018
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
|
|
1019
|
+
}
|
|
1020
|
+
async clear() {
|
|
1021
|
+
if (await this.isEmptyEditorField()) {
|
|
1022
|
+
throw new Error("This field is already empty");
|
|
1023
|
+
}
|
|
1024
|
+
const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
|
|
1025
|
+
const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
|
|
1026
|
+
await click(clearBtn, this._driver);
|
|
1027
|
+
}
|
|
1028
|
+
};
|
|
609
1029
|
}
|
|
610
|
-
};
|
|
1030
|
+
});
|
|
611
1031
|
|
|
612
1032
|
// src/pageObjects/elements/Editors/SelectBoxEditor.ts
|
|
613
|
-
var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS
|
|
614
|
-
var
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
1033
|
+
var import_selenium_webdriver15, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
|
|
1034
|
+
var init_SelectBoxEditor = __esm({
|
|
1035
|
+
"src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
|
|
1036
|
+
"use strict";
|
|
1037
|
+
init_AbstractEditor();
|
|
1038
|
+
import_selenium_webdriver15 = require("selenium-webdriver");
|
|
1039
|
+
init_xpathHelper();
|
|
1040
|
+
init_actions();
|
|
1041
|
+
init_ClearButtonStrategy();
|
|
1042
|
+
SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
|
|
1043
|
+
combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
|
|
1044
|
+
dropDownOptionClick = async (optionValue, driver, delay = true) => {
|
|
1045
|
+
const { implicit } = await driver.manage().getTimeouts();
|
|
1046
|
+
let optElement = null;
|
|
1047
|
+
const timeout = delay ? implicit : 200;
|
|
1048
|
+
let err = null;
|
|
1049
|
+
try {
|
|
1050
|
+
await driver.manage().setTimeouts({ implicit: timeout });
|
|
1051
|
+
optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
|
|
1052
|
+
await click(optElement, driver);
|
|
1053
|
+
} catch (e) {
|
|
1054
|
+
err = new Error(`Item not found: "${optionValue}"`);
|
|
1055
|
+
} finally {
|
|
1056
|
+
await driver.manage().setTimeouts({ implicit });
|
|
1057
|
+
}
|
|
1058
|
+
if (err)
|
|
1059
|
+
throw err;
|
|
1060
|
+
};
|
|
1061
|
+
SelectBoxEditor = class extends AbstractDXEditorWithInput {
|
|
1062
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1063
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1064
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1065
|
+
}
|
|
1066
|
+
async setSelectInputValue(value) {
|
|
1067
|
+
const inputEl = await this.getInputElement();
|
|
1068
|
+
await click(inputEl, this.driver);
|
|
1069
|
+
try {
|
|
1070
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
1071
|
+
} catch {
|
|
1072
|
+
await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
|
|
1073
|
+
await dropDownOptionClick(value, this.driver);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
async getValue() {
|
|
1077
|
+
const value = await super.getInputValue();
|
|
1078
|
+
return value == "" ? null : value;
|
|
1079
|
+
}
|
|
1080
|
+
setValue(value) {
|
|
1081
|
+
return this.setSelectInputValue(value);
|
|
1082
|
+
}
|
|
1083
|
+
};
|
|
653
1084
|
}
|
|
654
|
-
};
|
|
1085
|
+
});
|
|
655
1086
|
|
|
656
1087
|
// src/pageObjects/elements/Editors/SwitchEditor.ts
|
|
657
|
-
var SwitchEditor
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
1088
|
+
var SwitchEditor;
|
|
1089
|
+
var init_SwitchEditor = __esm({
|
|
1090
|
+
"src/pageObjects/elements/Editors/SwitchEditor.ts"() {
|
|
1091
|
+
"use strict";
|
|
1092
|
+
init_actions();
|
|
1093
|
+
init_AbstractElementWithParent();
|
|
1094
|
+
init_wait();
|
|
1095
|
+
SwitchEditor = class extends AbstractElementWithParent {
|
|
1096
|
+
async getValue() {
|
|
1097
|
+
const result = await this.getAttribute("aria-label");
|
|
1098
|
+
if (result === "ON")
|
|
1099
|
+
return 1;
|
|
1100
|
+
if (result === "OFF")
|
|
1101
|
+
return 0;
|
|
1102
|
+
return null;
|
|
1103
|
+
}
|
|
1104
|
+
async setValue(value) {
|
|
1105
|
+
if (value !== 0 && value !== 1) {
|
|
1106
|
+
value = value ? 1 : 0;
|
|
1107
|
+
}
|
|
1108
|
+
const inputEl = await this.getElement();
|
|
1109
|
+
const currentValue = await this.getValue();
|
|
1110
|
+
if (currentValue === value) {
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
await click(inputEl, this.driver);
|
|
1114
|
+
await wait(async () => {
|
|
1115
|
+
const updatedValue = await this.getValue();
|
|
1116
|
+
return updatedValue !== currentValue;
|
|
1117
|
+
}, this.driver);
|
|
1118
|
+
}
|
|
1119
|
+
};
|
|
680
1120
|
}
|
|
681
|
-
};
|
|
1121
|
+
});
|
|
682
1122
|
|
|
683
1123
|
// src/pageObjects/elements/Editors/TagBox.ts
|
|
684
|
-
var
|
|
685
|
-
var
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
1124
|
+
var import_selenium_webdriver16, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
|
|
1125
|
+
var init_TagBox = __esm({
|
|
1126
|
+
"src/pageObjects/elements/Editors/TagBox.ts"() {
|
|
1127
|
+
"use strict";
|
|
1128
|
+
init_AbstractEditor();
|
|
1129
|
+
import_selenium_webdriver16 = require("selenium-webdriver");
|
|
1130
|
+
init_actions();
|
|
1131
|
+
init_locators();
|
|
1132
|
+
init_SelectBoxEditor();
|
|
1133
|
+
init_ClearButtonStrategy();
|
|
1134
|
+
init_wait();
|
|
1135
|
+
TAGS_SELECTOR = ".dx-tag .tag-text";
|
|
1136
|
+
DX_TAG_CONTAINER = "dx-tag-container";
|
|
1137
|
+
DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
|
|
1138
|
+
BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
|
|
1139
|
+
TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
|
|
1140
|
+
TagBox = class extends AbstractDXEditorWithInput {
|
|
1141
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1142
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1143
|
+
this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
|
|
1144
|
+
}
|
|
1145
|
+
async setTagBoxInputValue(values) {
|
|
1146
|
+
const lastElement = values[values.length - 1];
|
|
1147
|
+
const inputEl = await this.getInputElement();
|
|
1148
|
+
await inputEl.click();
|
|
1149
|
+
for (const value of values) {
|
|
1150
|
+
await this.selectOption(inputEl, value, lastElement);
|
|
1151
|
+
}
|
|
1152
|
+
await this.confirmSelection();
|
|
1153
|
+
}
|
|
1154
|
+
async waitOptionSelection() {
|
|
1155
|
+
const option = await this.driver.findElement(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
|
|
1156
|
+
await wait(() => option.isDisplayed(), this.driver);
|
|
1157
|
+
}
|
|
1158
|
+
async selectOption(inputEl, value, lastElement) {
|
|
1159
|
+
try {
|
|
1160
|
+
await dropDownOptionClick(value, this.driver, false);
|
|
1161
|
+
} catch {
|
|
1162
|
+
await inputEl.sendKeys(value);
|
|
1163
|
+
await dropDownOptionClick(value, this.driver);
|
|
1164
|
+
}
|
|
1165
|
+
await this.waitOptionSelection();
|
|
1166
|
+
if (value !== lastElement) {
|
|
1167
|
+
await inputEl.clear();
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
async confirmSelection() {
|
|
1171
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver16.By.css(BTN_OK_SELECTOR));
|
|
1172
|
+
await click(btnOk, this.driver);
|
|
1173
|
+
}
|
|
1174
|
+
async getTagBoxInputValue() {
|
|
1175
|
+
if (await this.isTagBoxEmpty()) {
|
|
1176
|
+
return [];
|
|
1177
|
+
}
|
|
1178
|
+
const tags = await this.driver.findElements(
|
|
1179
|
+
import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
|
|
1180
|
+
);
|
|
1181
|
+
const values = [];
|
|
1182
|
+
for (const tag of tags) {
|
|
1183
|
+
values.push(await tag.getAttribute("textContent"));
|
|
1184
|
+
}
|
|
1185
|
+
return values;
|
|
1186
|
+
}
|
|
1187
|
+
async isTagBoxEmpty() {
|
|
1188
|
+
const classAttribute = await this.getClasses();
|
|
1189
|
+
return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
|
|
1190
|
+
}
|
|
1191
|
+
async getValue() {
|
|
1192
|
+
const value = await this.getTagBoxInputValue();
|
|
1193
|
+
return value.length ? value : null;
|
|
1194
|
+
}
|
|
1195
|
+
async setValue(values) {
|
|
1196
|
+
if (!Array.isArray(values)) {
|
|
1197
|
+
throw new Error("The provided value is not an array");
|
|
1198
|
+
}
|
|
1199
|
+
await this.setTagBoxInputValue(values);
|
|
1200
|
+
}
|
|
1201
|
+
async remove(itemText) {
|
|
1202
|
+
const tagValues = await this.getValue();
|
|
1203
|
+
const tagExists = tagValues.includes(itemText);
|
|
1204
|
+
if (!tagExists) {
|
|
1205
|
+
throw new Error(`The tag with the text: ${itemText} was not found`);
|
|
1206
|
+
}
|
|
1207
|
+
const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
|
|
1208
|
+
const clearBtn = await this.driver.findElement(
|
|
1209
|
+
import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
|
|
1210
|
+
);
|
|
1211
|
+
await click(clearBtn, this.driver);
|
|
1212
|
+
}
|
|
1213
|
+
};
|
|
762
1214
|
}
|
|
763
|
-
};
|
|
1215
|
+
});
|
|
764
1216
|
|
|
765
1217
|
// src/pageObjects/elements/Editors/ButtonGroup.ts
|
|
766
|
-
var
|
|
767
|
-
var
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
return this.getDataValue(selectedEl);
|
|
779
|
-
}
|
|
780
|
-
async setValue(value) {
|
|
781
|
-
const items = await this.getItems();
|
|
782
|
-
let buttonEl = void 0;
|
|
783
|
-
for (const item of items) {
|
|
784
|
-
const text = await this.getDataValue(item);
|
|
785
|
-
if (text == value) {
|
|
786
|
-
buttonEl = item;
|
|
787
|
-
break;
|
|
1218
|
+
var import_selenium_webdriver17, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
|
|
1219
|
+
var init_ButtonGroup = __esm({
|
|
1220
|
+
"src/pageObjects/elements/Editors/ButtonGroup.ts"() {
|
|
1221
|
+
"use strict";
|
|
1222
|
+
init_actions();
|
|
1223
|
+
import_selenium_webdriver17 = require("selenium-webdriver");
|
|
1224
|
+
init_AbstractElementWithParent();
|
|
1225
|
+
ITEM_CLASS = "dx-buttongroup-item";
|
|
1226
|
+
SELECTED_CLASS = "dx-state-selected";
|
|
1227
|
+
ButtonGroup = class extends AbstractElementWithParent {
|
|
1228
|
+
getItems() {
|
|
1229
|
+
return this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
|
|
788
1230
|
}
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
1231
|
+
getDataValue(el) {
|
|
1232
|
+
return el.getAttribute("data-value");
|
|
1233
|
+
}
|
|
1234
|
+
async getValue() {
|
|
1235
|
+
const selectedEl = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
|
|
1236
|
+
return this.getDataValue(selectedEl);
|
|
1237
|
+
}
|
|
1238
|
+
async setValue(value) {
|
|
1239
|
+
const items = await this.getItems();
|
|
1240
|
+
let buttonEl = void 0;
|
|
1241
|
+
for (const item of items) {
|
|
1242
|
+
const text = await this.getDataValue(item);
|
|
1243
|
+
if (text == value) {
|
|
1244
|
+
buttonEl = item;
|
|
1245
|
+
break;
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
if (!buttonEl)
|
|
1249
|
+
throw new Error(`Cannot find item in button group with text: ${value}`);
|
|
1250
|
+
await click(buttonEl, this.driver);
|
|
1251
|
+
}
|
|
1252
|
+
};
|
|
793
1253
|
}
|
|
794
|
-
};
|
|
1254
|
+
});
|
|
795
1255
|
|
|
796
1256
|
// src/pageObjects/elements/Editors/BooleanSelector.ts
|
|
797
|
-
var BooleanSelector
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
1257
|
+
var BooleanSelector;
|
|
1258
|
+
var init_BooleanSelector = __esm({
|
|
1259
|
+
"src/pageObjects/elements/Editors/BooleanSelector.ts"() {
|
|
1260
|
+
"use strict";
|
|
1261
|
+
init_ButtonGroup();
|
|
1262
|
+
BooleanSelector = class extends ButtonGroup {
|
|
1263
|
+
// @ts-ignore
|
|
1264
|
+
async getValue() {
|
|
1265
|
+
const value = await super.getValue();
|
|
1266
|
+
return value === "null" ? null : value === "1" ? 1 : 0;
|
|
1267
|
+
}
|
|
1268
|
+
// @ts-ignore
|
|
1269
|
+
async setValue(value) {
|
|
1270
|
+
const val = value == null ? "null" : value ? "1" : "0";
|
|
1271
|
+
await super.setValue(val);
|
|
1272
|
+
}
|
|
1273
|
+
};
|
|
807
1274
|
}
|
|
808
|
-
};
|
|
809
|
-
|
|
810
|
-
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
811
|
-
var import_selenium_webdriver15 = require("selenium-webdriver");
|
|
812
|
-
|
|
813
|
-
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
814
|
-
var import_selenium_webdriver14 = require("selenium-webdriver");
|
|
1275
|
+
});
|
|
815
1276
|
|
|
816
1277
|
// src/pageObjects/elements/Editors/Date/utils.ts
|
|
817
|
-
var formatDMYDate
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
1278
|
+
var formatDMYDate;
|
|
1279
|
+
var init_utils2 = __esm({
|
|
1280
|
+
"src/pageObjects/elements/Editors/Date/utils.ts"() {
|
|
1281
|
+
"use strict";
|
|
1282
|
+
formatDMYDate = (date) => {
|
|
1283
|
+
const [year, month, day] = date.toJSON().split("T")[0].split("-");
|
|
1284
|
+
return `${day}${month}${year}`;
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
});
|
|
821
1288
|
|
|
822
1289
|
// src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
|
|
823
|
-
var BTN_CALENDAR_POPOVER_OPEN_SELECTOR
|
|
824
|
-
var
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
1290
|
+
var import_selenium_webdriver18, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
|
|
1291
|
+
var init_BaseDateEditor = __esm({
|
|
1292
|
+
"src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
|
|
1293
|
+
"use strict";
|
|
1294
|
+
init_AbstractEditor();
|
|
1295
|
+
init_InputClearStrategy();
|
|
1296
|
+
import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1297
|
+
init_locators();
|
|
1298
|
+
init_actions();
|
|
1299
|
+
init_utils2();
|
|
1300
|
+
BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
|
|
1301
|
+
BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
|
|
1302
|
+
BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
|
|
1303
|
+
BTN_SAVE_SELECTOR = "DateRange__button-save";
|
|
1304
|
+
BaseDateEditor = class extends AbstractDXEditorWithInput {
|
|
1305
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1306
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1307
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
1308
|
+
}
|
|
1309
|
+
async setDateValue(value) {
|
|
1310
|
+
const actions = this.driver.actions({ async: true });
|
|
1311
|
+
const dateField = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()}`));
|
|
1312
|
+
const dateFieldDataTestID = await this.getDataTestId();
|
|
1313
|
+
const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
|
|
1314
|
+
const dateInputEl = await this.getInputElement();
|
|
1315
|
+
await dateInputEl.clear();
|
|
1316
|
+
if (Array.isArray(value)) {
|
|
1317
|
+
const formattedDates = value.map(formatDMYDate);
|
|
1318
|
+
const button = await dateField.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
|
|
1319
|
+
await button.click();
|
|
1320
|
+
const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver18.By.css(calendarPopoverSelector));
|
|
1321
|
+
const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
1322
|
+
const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
|
|
1323
|
+
await dateFromInput.click();
|
|
1324
|
+
await dateFromInput.sendKeys(formattedDates[0]);
|
|
1325
|
+
await dateToInput.click();
|
|
1326
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
|
|
1327
|
+
await dateToInput.sendKeys(formattedDates[1]);
|
|
1328
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.ENTER).perform();
|
|
1329
|
+
const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
|
|
1330
|
+
await btnOk.click();
|
|
1331
|
+
} else {
|
|
1332
|
+
const formattedDate = formatDMYDate(value);
|
|
1333
|
+
await click(dateInputEl, this.driver);
|
|
1334
|
+
await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
|
|
1335
|
+
await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
};
|
|
860
1339
|
}
|
|
861
|
-
};
|
|
1340
|
+
});
|
|
862
1341
|
|
|
863
1342
|
// src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
|
|
864
|
-
var SingleDateEditor
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
1343
|
+
var import_selenium_webdriver19, SingleDateEditor;
|
|
1344
|
+
var init_SingleDateEditor = __esm({
|
|
1345
|
+
"src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
|
|
1346
|
+
"use strict";
|
|
1347
|
+
import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1348
|
+
init_InputClearStrategy();
|
|
1349
|
+
init_BaseDateEditor();
|
|
1350
|
+
SingleDateEditor = class extends BaseDateEditor {
|
|
1351
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1352
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1353
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
1354
|
+
}
|
|
1355
|
+
async getDateElement() {
|
|
1356
|
+
return this.driver.findElement(import_selenium_webdriver19.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
|
|
1357
|
+
}
|
|
1358
|
+
async getDateValue() {
|
|
1359
|
+
const inputEl = await this.getDateElement();
|
|
1360
|
+
return inputEl.getAttribute("value");
|
|
1361
|
+
}
|
|
1362
|
+
async getValue() {
|
|
1363
|
+
const value = await this.getDateValue();
|
|
1364
|
+
return value == "" ? null : new Date(value);
|
|
1365
|
+
}
|
|
1366
|
+
setValue(value) {
|
|
1367
|
+
if (typeof value === "object") {
|
|
1368
|
+
return this.setDateValue(value);
|
|
1369
|
+
}
|
|
1370
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
1371
|
+
}
|
|
1372
|
+
};
|
|
885
1373
|
}
|
|
886
|
-
};
|
|
1374
|
+
});
|
|
887
1375
|
|
|
888
1376
|
// src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
|
|
889
|
-
var
|
|
890
|
-
var
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
1377
|
+
var import_selenium_webdriver20, DateRangeEditor;
|
|
1378
|
+
var init_DateRangeEditor = __esm({
|
|
1379
|
+
"src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
|
|
1380
|
+
"use strict";
|
|
1381
|
+
import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1382
|
+
init_InputClearStrategy();
|
|
1383
|
+
init_BaseDateEditor();
|
|
1384
|
+
DateRangeEditor = class extends BaseDateEditor {
|
|
1385
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1386
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1387
|
+
this.setClearStrategy(new InputClearStrategy());
|
|
1388
|
+
}
|
|
1389
|
+
async getDateElement() {
|
|
1390
|
+
return this.driver.findElement(import_selenium_webdriver20.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
|
|
1391
|
+
}
|
|
1392
|
+
async getDateValue() {
|
|
1393
|
+
const inputEl = await this.getDateElement();
|
|
1394
|
+
const dateFromStr = await inputEl.getAttribute("datefrom");
|
|
1395
|
+
const dateToStr = await inputEl.getAttribute("dateto");
|
|
1396
|
+
const dateFrom = new Date(dateFromStr);
|
|
1397
|
+
const dateTo = new Date(dateToStr);
|
|
1398
|
+
return [dateFrom, dateTo];
|
|
1399
|
+
}
|
|
1400
|
+
async getValue() {
|
|
1401
|
+
const values = await this.getDateValue();
|
|
1402
|
+
return !values.length ? null : values;
|
|
1403
|
+
}
|
|
1404
|
+
setValue(value) {
|
|
1405
|
+
if (typeof value === "object") {
|
|
1406
|
+
return this.setDateValue(value);
|
|
1407
|
+
}
|
|
1408
|
+
throw new Error(`Value is incorrect. It should be Object`);
|
|
1409
|
+
}
|
|
1410
|
+
};
|
|
915
1411
|
}
|
|
916
|
-
};
|
|
1412
|
+
});
|
|
917
1413
|
|
|
918
1414
|
// src/pageObjects/elements/Editors/Date/DateEditor.ts
|
|
919
|
-
var DateEditor
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
1415
|
+
var DateEditor;
|
|
1416
|
+
var init_DateEditor = __esm({
|
|
1417
|
+
"src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
|
|
1418
|
+
"use strict";
|
|
1419
|
+
init_SingleDateEditor();
|
|
1420
|
+
init_DateRangeEditor();
|
|
1421
|
+
init_AbstractFormElement();
|
|
1422
|
+
init_AbstractEditor();
|
|
1423
|
+
init_types3();
|
|
1424
|
+
DateEditor = class extends AbstractDXEditorWithInput {
|
|
1425
|
+
editorInstance = null;
|
|
1426
|
+
initPromise;
|
|
1427
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1428
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1429
|
+
this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
|
|
1430
|
+
}
|
|
1431
|
+
async init(parentCssSelector, elementCssSelector, driver) {
|
|
1432
|
+
await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
|
|
1433
|
+
}
|
|
1434
|
+
async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
|
|
1435
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1436
|
+
const classString = await elementInstance.getClasses();
|
|
1437
|
+
switch (true) {
|
|
1438
|
+
case classString.includes("date-control" /* Date */):
|
|
1439
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1440
|
+
break;
|
|
1441
|
+
case classString.includes("single-date-range-control" /* SingleDateRange */):
|
|
1442
|
+
this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
|
|
1443
|
+
break;
|
|
1444
|
+
default:
|
|
1445
|
+
this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
async ensureInitialized() {
|
|
1449
|
+
if (!this.editorInstance) {
|
|
1450
|
+
await this.initPromise;
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
async setValue(value) {
|
|
1454
|
+
await this.ensureInitialized();
|
|
1455
|
+
if (this.editorInstance) {
|
|
1456
|
+
await this.editorInstance.setValue(value);
|
|
1457
|
+
return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1458
|
+
}
|
|
1459
|
+
throw new Error("Editor instance is not initialized.");
|
|
1460
|
+
}
|
|
1461
|
+
async getValue() {
|
|
1462
|
+
await this.ensureInitialized();
|
|
1463
|
+
if (this.editorInstance) {
|
|
1464
|
+
return this.editorInstance.getValue();
|
|
1465
|
+
}
|
|
1466
|
+
throw new Error("Editor instance is not initialized.");
|
|
1467
|
+
}
|
|
1468
|
+
};
|
|
962
1469
|
}
|
|
963
|
-
};
|
|
1470
|
+
});
|
|
964
1471
|
|
|
965
1472
|
// src/pageObjects/elements/Editors/editorFactory.ts
|
|
966
|
-
var editorFactory
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
1473
|
+
var editorFactory;
|
|
1474
|
+
var init_editorFactory = __esm({
|
|
1475
|
+
"src/pageObjects/elements/Editors/editorFactory.ts"() {
|
|
1476
|
+
"use strict";
|
|
1477
|
+
init_types3();
|
|
1478
|
+
init_AbstractFormElement();
|
|
1479
|
+
init_TextEditor();
|
|
1480
|
+
init_NumberEditor();
|
|
1481
|
+
init_CheckBox();
|
|
1482
|
+
init_SelectBoxEditor();
|
|
1483
|
+
init_SwitchEditor();
|
|
1484
|
+
init_TagBox();
|
|
1485
|
+
init_BooleanSelector();
|
|
1486
|
+
init_ButtonGroup();
|
|
1487
|
+
init_DateEditor();
|
|
1488
|
+
editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1489
|
+
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1490
|
+
const classSting = await elementInstance.getClasses();
|
|
1491
|
+
if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
|
|
1492
|
+
return new TextEditor(parentCssSelector, elementCssSelector, driver);
|
|
1493
|
+
if (classSting.includes("number-control" /* Number */))
|
|
1494
|
+
return new NumberEditor(parentCssSelector, elementCssSelector, driver);
|
|
1495
|
+
if (classSting.includes("check-box" /* CheckBox */))
|
|
1496
|
+
return new CheckBox(parentCssSelector, elementCssSelector, driver);
|
|
1497
|
+
if (classSting.includes("multi-select-control" /* Multiselect */))
|
|
1498
|
+
return new TagBox(parentCssSelector, elementCssSelector, driver);
|
|
1499
|
+
if (classSting.includes("select-control" /* Select */))
|
|
1500
|
+
return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
|
|
1501
|
+
if (classSting.includes("switch-control" /* Switch */))
|
|
1502
|
+
return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
|
|
1503
|
+
if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
|
|
1504
|
+
return new DateEditor(parentCssSelector, elementCssSelector, driver);
|
|
1505
|
+
}
|
|
1506
|
+
if (classSting.includes("buttons-group" /* BooleanSelector */))
|
|
1507
|
+
return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
|
|
1508
|
+
if (classSting.includes("button-group-field" /* ButtonGroup */))
|
|
1509
|
+
return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
|
|
1510
|
+
throw new Error("Unknown type of editor. Please write ticket to the support");
|
|
1511
|
+
};
|
|
1512
|
+
}
|
|
1513
|
+
});
|
|
990
1514
|
|
|
991
|
-
// src/pageObjects/elements/
|
|
992
|
-
var
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1000
|
-
}
|
|
1515
|
+
// src/pageObjects/elements/Editors/index.ts
|
|
1516
|
+
var init_Editors = __esm({
|
|
1517
|
+
"src/pageObjects/elements/Editors/index.ts"() {
|
|
1518
|
+
"use strict";
|
|
1519
|
+
init_TextEditor();
|
|
1520
|
+
init_NumberEditor();
|
|
1521
|
+
init_editorFactory();
|
|
1522
|
+
init_types3();
|
|
1001
1523
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1524
|
+
});
|
|
1525
|
+
|
|
1526
|
+
// src/pageObjects/elements/AbstractEditor.ts
|
|
1527
|
+
var AbstractEditor;
|
|
1528
|
+
var init_AbstractEditor2 = __esm({
|
|
1529
|
+
"src/pageObjects/elements/AbstractEditor.ts"() {
|
|
1530
|
+
"use strict";
|
|
1531
|
+
init_AbstractElementWithParent();
|
|
1532
|
+
init_Editors();
|
|
1533
|
+
AbstractEditor = class extends AbstractElementWithParent {
|
|
1534
|
+
editor;
|
|
1535
|
+
constructor(parentCssSelector, elementCssSelector, driver) {
|
|
1536
|
+
super(parentCssSelector, elementCssSelector, driver);
|
|
1537
|
+
}
|
|
1538
|
+
async initEditor() {
|
|
1539
|
+
if (!this.editor) {
|
|
1540
|
+
this.editor = await editorFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
/**
|
|
1544
|
+
* Возвращает значение в поле
|
|
1545
|
+
* @example
|
|
1546
|
+
* expect(await formEdit.field('NumberFld').getValue()).toBe(10);
|
|
1547
|
+
* expect(await formEdit.field('TextFld').getValue()).toBe('TestValue');
|
|
1548
|
+
*/
|
|
1549
|
+
async getValue() {
|
|
1550
|
+
await this.initEditor();
|
|
1551
|
+
return this.editor.getValue();
|
|
1552
|
+
}
|
|
1553
|
+
/**
|
|
1554
|
+
* Устанавливает значение в поле
|
|
1555
|
+
* @example
|
|
1556
|
+
* await formEdit.field('NumberFld').setValue(123);
|
|
1557
|
+
* await formEdit.field('TextFld').setValue('TestValue');
|
|
1558
|
+
*/
|
|
1559
|
+
async setValue(value) {
|
|
1560
|
+
await this.initEditor();
|
|
1561
|
+
return this.editor.setValue(value);
|
|
1562
|
+
}
|
|
1563
|
+
/**
|
|
1564
|
+
* Очищает значение в поле
|
|
1565
|
+
* @example
|
|
1566
|
+
* await formEdit.field('NumberFld').clear();
|
|
1567
|
+
*/
|
|
1568
|
+
async clear() {
|
|
1569
|
+
await this.initEditor();
|
|
1570
|
+
if (!this.editor.clear) {
|
|
1571
|
+
throw new Error("The clear method is not available for this field type.");
|
|
1572
|
+
}
|
|
1573
|
+
return this.editor.clear();
|
|
1574
|
+
}
|
|
1575
|
+
/**
|
|
1576
|
+
* Удаляет тег по переданному тексту
|
|
1577
|
+
* @example
|
|
1578
|
+
* await formEdit.field('TagBox').remove('test');
|
|
1579
|
+
*/
|
|
1580
|
+
async remove(itemText) {
|
|
1581
|
+
await this.initEditor();
|
|
1582
|
+
if (!this.editor.remove) {
|
|
1583
|
+
throw new Error("This method is only available for the TagBox field.");
|
|
1584
|
+
}
|
|
1585
|
+
return this.editor.remove(itemText);
|
|
1586
|
+
}
|
|
1587
|
+
/**
|
|
1588
|
+
* Возвращает значение true|false в зависимости readOnly поле или нет
|
|
1589
|
+
* @example
|
|
1590
|
+
* expect(await formEdit.field('NumberFld').isReadonly()).toBe(true);
|
|
1591
|
+
* expect(await formEdit.field('TextFld').isReadonly()).toBe(false);
|
|
1592
|
+
*/
|
|
1593
|
+
async isReadonly() {
|
|
1594
|
+
await this.initEditor();
|
|
1595
|
+
return this.editor.isReadonly();
|
|
1596
|
+
}
|
|
1597
|
+
};
|
|
1055
1598
|
}
|
|
1056
|
-
};
|
|
1599
|
+
});
|
|
1057
1600
|
|
|
1058
1601
|
// src/pageObjects/elements/FormField.ts
|
|
1059
|
-
var FormField
|
|
1060
|
-
|
|
1061
|
-
|
|
1602
|
+
var FormField;
|
|
1603
|
+
var init_FormField = __esm({
|
|
1604
|
+
"src/pageObjects/elements/FormField.ts"() {
|
|
1605
|
+
"use strict";
|
|
1606
|
+
init_locators();
|
|
1607
|
+
init_createDataTestId();
|
|
1608
|
+
init_AbstractEditor2();
|
|
1609
|
+
FormField = class extends AbstractEditor {
|
|
1610
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1611
|
+
super(parentCssSelector, byTestIdCssSelector(createFieldTestId(formName, name)), driver);
|
|
1612
|
+
}
|
|
1613
|
+
};
|
|
1062
1614
|
}
|
|
1063
|
-
};
|
|
1615
|
+
});
|
|
1064
1616
|
|
|
1065
|
-
// src/pageObjects/elements/
|
|
1066
|
-
var
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1617
|
+
// src/pageObjects/elements/Table/Table.ts
|
|
1618
|
+
var import_selenium_webdriver21, Table;
|
|
1619
|
+
var init_Table = __esm({
|
|
1620
|
+
"src/pageObjects/elements/Table/Table.ts"() {
|
|
1621
|
+
"use strict";
|
|
1622
|
+
import_selenium_webdriver21 = require("selenium-webdriver");
|
|
1623
|
+
init_createDataTestId();
|
|
1624
|
+
init_AbstractElementWithParent();
|
|
1625
|
+
init_Row();
|
|
1626
|
+
init_Column();
|
|
1627
|
+
init_FormField();
|
|
1628
|
+
Table = class extends AbstractElementWithParent {
|
|
1629
|
+
formName;
|
|
1630
|
+
headerCssSelector;
|
|
1631
|
+
constructor(parentCssSelector, headerCssSelector, formName, driver) {
|
|
1632
|
+
super(parentCssSelector, `#${createTableId(formName)}`, driver);
|
|
1633
|
+
this.formName = formName;
|
|
1634
|
+
this.headerCssSelector = headerCssSelector;
|
|
1635
|
+
}
|
|
1636
|
+
getColumnBy = (args) => {
|
|
1637
|
+
if (args.title) {
|
|
1638
|
+
return this.getColumnByTitle(args.title);
|
|
1639
|
+
}
|
|
1640
|
+
return this.getColumnByName(args.name);
|
|
1641
|
+
};
|
|
1642
|
+
getRowByIndex(index) {
|
|
1643
|
+
return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1644
|
+
}
|
|
1645
|
+
getColumnByIndex(index) {
|
|
1646
|
+
return new Column({
|
|
1647
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1648
|
+
driver: this.driver,
|
|
1649
|
+
index
|
|
1650
|
+
});
|
|
1651
|
+
}
|
|
1652
|
+
getColumnByTitle = (title) => {
|
|
1653
|
+
return new Column({
|
|
1654
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1655
|
+
headerCssSelector: this.headerCssSelector,
|
|
1656
|
+
caption: title,
|
|
1657
|
+
driver: this.driver
|
|
1658
|
+
});
|
|
1659
|
+
};
|
|
1660
|
+
getColumnByName = (name) => {
|
|
1661
|
+
return new Column({
|
|
1662
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1663
|
+
headerCssSelector: this.headerCssSelector,
|
|
1664
|
+
name,
|
|
1665
|
+
driver: this.driver
|
|
1666
|
+
});
|
|
1667
|
+
};
|
|
1668
|
+
selectRowByIndex(index) {
|
|
1669
|
+
return this.getRowByIndex(index).select();
|
|
1670
|
+
}
|
|
1671
|
+
async getRows() {
|
|
1672
|
+
const rows = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
|
|
1673
|
+
const result = [];
|
|
1674
|
+
rows.forEach((_, index) => {
|
|
1675
|
+
const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
|
|
1676
|
+
result.push(newRow);
|
|
1677
|
+
});
|
|
1678
|
+
return result;
|
|
1679
|
+
}
|
|
1680
|
+
async getColumns() {
|
|
1681
|
+
const columns = await this.driver.findElements(
|
|
1682
|
+
import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
|
|
1683
|
+
);
|
|
1684
|
+
const result = [];
|
|
1685
|
+
columns.forEach((_, index) => {
|
|
1686
|
+
const newCol = new Column({
|
|
1687
|
+
parentCssSelector: this.getFullCssSelector(),
|
|
1688
|
+
index,
|
|
1689
|
+
driver: this.driver
|
|
1690
|
+
});
|
|
1691
|
+
result.push(newCol);
|
|
1692
|
+
});
|
|
1693
|
+
return result;
|
|
1694
|
+
}
|
|
1695
|
+
element() {
|
|
1696
|
+
return this.getElement();
|
|
1697
|
+
}
|
|
1698
|
+
/**
|
|
1699
|
+
* Находит поле когда форма находится в состоянии редактирования
|
|
1700
|
+
* @example
|
|
1701
|
+
* const form = new MyForm();
|
|
1702
|
+
* //...
|
|
1703
|
+
* expect(await form.field('Name').getValue()).toBe('test value');
|
|
1704
|
+
*/
|
|
1705
|
+
field(name) {
|
|
1706
|
+
return new FormField(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1707
|
+
}
|
|
1708
|
+
};
|
|
1070
1709
|
}
|
|
1071
|
-
};
|
|
1072
|
-
|
|
1073
|
-
// src/pageObjects/elements/Groups/Panel.ts
|
|
1074
|
-
var Panel = class extends AbstractGroup {
|
|
1075
|
-
};
|
|
1076
|
-
|
|
1077
|
-
// src/pageObjects/elements/Groups/groupFactory.ts
|
|
1078
|
-
var groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
|
|
1079
|
-
const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
|
|
1080
|
-
const classSting = await elementInstance.getClasses();
|
|
1081
|
-
if (classSting.includes("panel-group"))
|
|
1082
|
-
return new Panel(parentCssSelector, elementCssSelector, driver);
|
|
1083
|
-
throw new Error("Unknown type of group. Please write ticket to the support");
|
|
1084
|
-
};
|
|
1710
|
+
});
|
|
1085
1711
|
|
|
1086
|
-
// src/pageObjects/elements/
|
|
1087
|
-
var
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
async isDisplayed() {
|
|
1103
|
-
try {
|
|
1104
|
-
await this.initEditor();
|
|
1105
|
-
return this.editor.isDisplayed();
|
|
1106
|
-
} catch {
|
|
1107
|
-
return false;
|
|
1108
|
-
}
|
|
1712
|
+
// src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
|
|
1713
|
+
var ToolbarGroupButton;
|
|
1714
|
+
var init_ToolbarGroupButton = __esm({
|
|
1715
|
+
"src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts"() {
|
|
1716
|
+
"use strict";
|
|
1717
|
+
init_AbstractButton();
|
|
1718
|
+
ToolbarGroupButton = class extends AbstractButton {
|
|
1719
|
+
name;
|
|
1720
|
+
constructor(parentCssSelector, name, driver) {
|
|
1721
|
+
super(parentCssSelector, ``, driver);
|
|
1722
|
+
this.name = name;
|
|
1723
|
+
}
|
|
1724
|
+
buttonNotDisplayedError() {
|
|
1725
|
+
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1726
|
+
}
|
|
1727
|
+
};
|
|
1109
1728
|
}
|
|
1110
|
-
};
|
|
1729
|
+
});
|
|
1111
1730
|
|
|
1112
|
-
// src/pageObjects/elements/
|
|
1113
|
-
var
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
}
|
|
1130
|
-
/**
|
|
1131
|
-
* Проверяет не отключена ли кнопка Сохранить
|
|
1132
|
-
* @example
|
|
1133
|
-
* const formEdit = new MyForm();
|
|
1134
|
-
* //...
|
|
1135
|
-
* await formEdit.isSaveButtonDisabled();
|
|
1136
|
-
*/
|
|
1137
|
-
async isSaveButtonDisabled() {
|
|
1138
|
-
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
1139
|
-
const result = await saveButton.getAttribute("aria-disabled");
|
|
1140
|
-
return result === "true";
|
|
1141
|
-
}
|
|
1142
|
-
/**
|
|
1143
|
-
* Находит группу формы редактирования по имени
|
|
1144
|
-
* @example
|
|
1145
|
-
* const formEdit = new MyForm();
|
|
1146
|
-
* //...
|
|
1147
|
-
* expect(await formEdit.group('Name');
|
|
1148
|
-
*/
|
|
1149
|
-
group(name) {
|
|
1150
|
-
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1151
|
-
}
|
|
1152
|
-
/**
|
|
1153
|
-
* Нажатие на кнопку Сохранить
|
|
1154
|
-
* @example
|
|
1155
|
-
* const formEdit = new MyForm();
|
|
1156
|
-
* //...
|
|
1157
|
-
* await formEdit.saveButtonClick();
|
|
1158
|
-
*/
|
|
1159
|
-
async saveButtonClick() {
|
|
1160
|
-
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
1161
|
-
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
1162
|
-
await click(saveButton, this.driver);
|
|
1163
|
-
}
|
|
1164
|
-
/**
|
|
1165
|
-
* Нажатие на кнопку Закрить
|
|
1166
|
-
* @example
|
|
1167
|
-
* const formEdit = new MyForm();
|
|
1168
|
-
* //...
|
|
1169
|
-
* await formEdit.closeButtonClick();
|
|
1170
|
-
*/
|
|
1171
|
-
async closeButtonClick() {
|
|
1172
|
-
const closeButton = await this.driver.findElement(this.closeButtonBy);
|
|
1173
|
-
await click(closeButton, this.driver);
|
|
1731
|
+
// src/pageObjects/elements/TableToolbar/ToolbarButton.ts
|
|
1732
|
+
var TOOLBAR_BUTTON_CLASS, ToolbarButton;
|
|
1733
|
+
var init_ToolbarButton = __esm({
|
|
1734
|
+
"src/pageObjects/elements/TableToolbar/ToolbarButton.ts"() {
|
|
1735
|
+
"use strict";
|
|
1736
|
+
init_AbstractButton();
|
|
1737
|
+
TOOLBAR_BUTTON_CLASS = "toolbar-button";
|
|
1738
|
+
ToolbarButton = class extends AbstractButton {
|
|
1739
|
+
name;
|
|
1740
|
+
constructor(parentCssSelector, name, driver) {
|
|
1741
|
+
super(parentCssSelector, `#${TOOLBAR_BUTTON_CLASS}-${name}`, driver);
|
|
1742
|
+
this.name = name;
|
|
1743
|
+
}
|
|
1744
|
+
buttonNotDisplayedError() {
|
|
1745
|
+
return `Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1746
|
+
}
|
|
1747
|
+
};
|
|
1174
1748
|
}
|
|
1175
|
-
};
|
|
1176
|
-
|
|
1177
|
-
// src/pageObjects/elements/Table/Table.ts
|
|
1178
|
-
var import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1179
|
-
|
|
1180
|
-
// src/pageObjects/elements/Table/elements/Row.ts
|
|
1181
|
-
var import_selenium_webdriver20 = require("selenium-webdriver");
|
|
1182
|
-
|
|
1183
|
-
// src/pageObjects/elements/Table/elements/Cell.ts
|
|
1184
|
-
var import_selenium_webdriver19 = require("selenium-webdriver");
|
|
1185
|
-
|
|
1186
|
-
// src/pageObjects/elements/Table/utils.ts
|
|
1187
|
-
var import_selenium_webdriver18 = require("selenium-webdriver");
|
|
1188
|
-
function getCssRowByIndexSelector(index) {
|
|
1189
|
-
return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
|
|
1190
|
-
}
|
|
1191
|
-
var getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
|
|
1192
|
-
var getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
|
|
1193
|
-
var getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
|
|
1194
|
-
function getCssCellByIndexSelector(index) {
|
|
1195
|
-
return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
|
|
1196
|
-
}
|
|
1197
|
-
var transformInputIndex = (index) => index + 1;
|
|
1198
|
-
var transformOutputIndex = (index) => +index - 1;
|
|
1749
|
+
});
|
|
1199
1750
|
|
|
1200
|
-
// src/
|
|
1201
|
-
var
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
values.push(await tag.getAttribute("textContent"));
|
|
1223
|
-
}
|
|
1224
|
-
return values;
|
|
1225
|
-
}
|
|
1226
|
-
async getElement() {
|
|
1227
|
-
if (this._index == null) {
|
|
1228
|
-
this.index = await this.getCellIndex();
|
|
1229
|
-
}
|
|
1230
|
-
return super.getElement();
|
|
1231
|
-
}
|
|
1232
|
-
async getValue() {
|
|
1233
|
-
const cellEl = await this.getElement();
|
|
1234
|
-
const cellElClass = await cellEl.getAttribute("class");
|
|
1235
|
-
if (cellElClass.includes("boolean-column" /* Boolean */))
|
|
1236
|
-
return this.getBooleanValue(cellEl);
|
|
1237
|
-
if (cellElClass.includes("tags-column" /* Tags */))
|
|
1238
|
-
return this.getTagsValue(cellEl);
|
|
1239
|
-
return cellEl.getText();
|
|
1240
|
-
}
|
|
1241
|
-
getIndex() {
|
|
1242
|
-
return this._index;
|
|
1751
|
+
// src/utils/typesUtil.ts
|
|
1752
|
+
var types, type, isArray, isString;
|
|
1753
|
+
var init_typesUtil = __esm({
|
|
1754
|
+
"src/utils/typesUtil.ts"() {
|
|
1755
|
+
"use strict";
|
|
1756
|
+
types = {
|
|
1757
|
+
"[object Array]": "array",
|
|
1758
|
+
"[object Date]": "date",
|
|
1759
|
+
"[object Object]": "object",
|
|
1760
|
+
"[object String]": "string",
|
|
1761
|
+
"[object Null]": "null"
|
|
1762
|
+
};
|
|
1763
|
+
type = function(object) {
|
|
1764
|
+
const typeOfObject = Object.prototype.toString.call(object);
|
|
1765
|
+
return typeof object === "object" ? types[typeOfObject] || "object" : typeof object;
|
|
1766
|
+
};
|
|
1767
|
+
isArray = function(value) {
|
|
1768
|
+
return type(value) === "array";
|
|
1769
|
+
};
|
|
1770
|
+
isString = function(object) {
|
|
1771
|
+
return typeof object === "string";
|
|
1772
|
+
};
|
|
1243
1773
|
}
|
|
1244
|
-
};
|
|
1774
|
+
});
|
|
1245
1775
|
|
|
1246
|
-
// src/pageObjects/elements/
|
|
1247
|
-
var
|
|
1248
|
-
var
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
|
|
1307
|
-
const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
|
|
1308
|
-
this.index
|
|
1309
|
-
)}"] .${buttonClass}`;
|
|
1310
|
-
const button = await this.driver.findElement(
|
|
1311
|
-
import_selenium_webdriver20.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
|
|
1312
|
-
);
|
|
1313
|
-
return click(button, this.driver);
|
|
1314
|
-
}
|
|
1315
|
-
async checkEditingMode(isEditing, msg) {
|
|
1316
|
-
await wait(
|
|
1317
|
-
async () => {
|
|
1318
|
-
return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
|
|
1319
|
-
},
|
|
1320
|
-
this.driver,
|
|
1321
|
-
msg
|
|
1322
|
-
);
|
|
1323
|
-
}
|
|
1324
|
-
async edit() {
|
|
1325
|
-
await this.clickInlineButton("edit");
|
|
1326
|
-
await this.checkEditingMode(true, "Row did not switch to edit mode");
|
|
1327
|
-
}
|
|
1328
|
-
async save() {
|
|
1329
|
-
await this.clickInlineButton("save");
|
|
1330
|
-
await this.checkEditingMode(false, "Row did not saved");
|
|
1331
|
-
}
|
|
1332
|
-
async cancel() {
|
|
1333
|
-
await this.clickInlineButton("cancel");
|
|
1334
|
-
await this.checkEditingMode(false, "Row did not switch to normal mode");
|
|
1776
|
+
// src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
|
|
1777
|
+
var import_selenium_webdriver22, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
|
|
1778
|
+
var init_ToolbarMenu = __esm({
|
|
1779
|
+
"src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
|
|
1780
|
+
"use strict";
|
|
1781
|
+
import_selenium_webdriver22 = require("selenium-webdriver");
|
|
1782
|
+
init_typesUtil();
|
|
1783
|
+
init_AbstractElementWithParent();
|
|
1784
|
+
init_locators();
|
|
1785
|
+
init_actions();
|
|
1786
|
+
init_waitElementIsClickable();
|
|
1787
|
+
init_fixElementStaleError();
|
|
1788
|
+
SPINDOWN_CLASS = ".dx-icon-spindown";
|
|
1789
|
+
buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
|
|
1790
|
+
getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
|
|
1791
|
+
buttonByTextXpath = (text) => `.//span[contains(@class, "dx-menu-item-text") and contains(text(), "${text}")]`;
|
|
1792
|
+
ToolbarMenu = class extends AbstractElementWithParent {
|
|
1793
|
+
_formName;
|
|
1794
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1795
|
+
super(parentCssSelector, getFullCssSelector(formName, name), driver);
|
|
1796
|
+
this._formName = formName;
|
|
1797
|
+
}
|
|
1798
|
+
async openDropdownMenu() {
|
|
1799
|
+
const dropdown = await this.getElement();
|
|
1800
|
+
await click(dropdown, this.driver);
|
|
1801
|
+
}
|
|
1802
|
+
getCssSelectorToButton(name) {
|
|
1803
|
+
return byTestId(`ftb-${this._formName}-${name}`);
|
|
1804
|
+
}
|
|
1805
|
+
buttonNotDisplayedError(name) {
|
|
1806
|
+
return `Toolbar menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1807
|
+
}
|
|
1808
|
+
async goToButton(name, by) {
|
|
1809
|
+
const toolbarMenuItem = await fixElementStaleError(by, this.driver);
|
|
1810
|
+
await waitElementIsClickable({
|
|
1811
|
+
element: toolbarMenuItem,
|
|
1812
|
+
errorMessage: this.buttonNotDisplayedError(name),
|
|
1813
|
+
driver: this.driver
|
|
1814
|
+
});
|
|
1815
|
+
await click(toolbarMenuItem, this.driver);
|
|
1816
|
+
}
|
|
1817
|
+
async clickButton(name) {
|
|
1818
|
+
await this.openDropdownMenu();
|
|
1819
|
+
if (!isString(name) && !isArray(name))
|
|
1820
|
+
throw new Error(`"name" must be a string or array of string`);
|
|
1821
|
+
let lName = isString(name) ? [name] : name;
|
|
1822
|
+
for (let n of lName) {
|
|
1823
|
+
await this.goToButton(n, this.getCssSelectorToButton(n));
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
async clickButtonByTitle(title) {
|
|
1827
|
+
await this.openDropdownMenu();
|
|
1828
|
+
if (!isString(title) && !isArray(title))
|
|
1829
|
+
throw new Error(`"title" must be a string or array of string`);
|
|
1830
|
+
let lTitle = isString(title) ? [title] : title;
|
|
1831
|
+
for (let t of lTitle) {
|
|
1832
|
+
await this.goToButton(t, import_selenium_webdriver22.By.xpath(buttonByTextXpath(t)));
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
};
|
|
1335
1836
|
}
|
|
1336
|
-
};
|
|
1837
|
+
});
|
|
1337
1838
|
|
|
1338
|
-
// src/pageObjects/elements/
|
|
1339
|
-
var
|
|
1340
|
-
var
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
return this.index;
|
|
1382
|
-
}
|
|
1383
|
-
if (this._caption != null) {
|
|
1384
|
-
this.index = await this.getIndexByCaption();
|
|
1385
|
-
return this.index;
|
|
1386
|
-
}
|
|
1387
|
-
if (this._name != null) {
|
|
1388
|
-
this.index = await this.getIndexByName();
|
|
1389
|
-
return this.index;
|
|
1390
|
-
}
|
|
1391
|
-
throw new Error("Cant get the index in the column");
|
|
1839
|
+
// src/pageObjects/elements/TableToolbar/ToolbarItem.ts
|
|
1840
|
+
var GROUP_BUTTON_CLASS, toolbarItemSelector, ToolbarItem;
|
|
1841
|
+
var init_ToolbarItem = __esm({
|
|
1842
|
+
"src/pageObjects/elements/TableToolbar/ToolbarItem.ts"() {
|
|
1843
|
+
"use strict";
|
|
1844
|
+
init_AbstractElementWithParent();
|
|
1845
|
+
init_ToolbarGroupButton();
|
|
1846
|
+
init_ToolbarButton();
|
|
1847
|
+
init_locators();
|
|
1848
|
+
init_ToolbarMenu();
|
|
1849
|
+
GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
1850
|
+
toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
1851
|
+
ToolbarItem = class extends AbstractElementWithParent {
|
|
1852
|
+
_button;
|
|
1853
|
+
_formName;
|
|
1854
|
+
_itemName;
|
|
1855
|
+
constructor(parentCssSelector, formName, itemName, driver) {
|
|
1856
|
+
super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
|
|
1857
|
+
this._itemName = itemName;
|
|
1858
|
+
this._formName = formName;
|
|
1859
|
+
}
|
|
1860
|
+
async init() {
|
|
1861
|
+
if (this._button)
|
|
1862
|
+
return this._button;
|
|
1863
|
+
const classNames = await this.getClasses();
|
|
1864
|
+
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
1865
|
+
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
|
|
1866
|
+
return;
|
|
1867
|
+
}
|
|
1868
|
+
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
|
|
1869
|
+
}
|
|
1870
|
+
async click() {
|
|
1871
|
+
await this.init();
|
|
1872
|
+
await this._button.click();
|
|
1873
|
+
}
|
|
1874
|
+
async isDisabled() {
|
|
1875
|
+
await this.init();
|
|
1876
|
+
return await this._button.isDisabled();
|
|
1877
|
+
}
|
|
1878
|
+
get menu() {
|
|
1879
|
+
return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
|
|
1880
|
+
}
|
|
1881
|
+
};
|
|
1392
1882
|
}
|
|
1393
|
-
};
|
|
1883
|
+
});
|
|
1394
1884
|
|
|
1395
|
-
// src/pageObjects/elements/
|
|
1396
|
-
var
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
getColumnByIndex(index) {
|
|
1414
|
-
return new Column({
|
|
1415
|
-
parentCssSelector: this.getFullCssSelector(),
|
|
1416
|
-
driver: this.driver,
|
|
1417
|
-
index
|
|
1418
|
-
});
|
|
1885
|
+
// src/pageObjects/elements/TableToolbar/FormToolbar.ts
|
|
1886
|
+
var TABLE_TOOLBAR_CLASS, FormToolbar;
|
|
1887
|
+
var init_FormToolbar = __esm({
|
|
1888
|
+
"src/pageObjects/elements/TableToolbar/FormToolbar.ts"() {
|
|
1889
|
+
"use strict";
|
|
1890
|
+
init_AbstractElementWithParent();
|
|
1891
|
+
init_ToolbarItem();
|
|
1892
|
+
TABLE_TOOLBAR_CLASS = "d5-table-toolbar";
|
|
1893
|
+
FormToolbar = class extends AbstractElementWithParent {
|
|
1894
|
+
formName;
|
|
1895
|
+
constructor(parentCssSelector, formName, driver) {
|
|
1896
|
+
super(parentCssSelector, `#${TABLE_TOOLBAR_CLASS}-${formName}`, driver);
|
|
1897
|
+
this.formName = formName;
|
|
1898
|
+
}
|
|
1899
|
+
button(name) {
|
|
1900
|
+
return new ToolbarItem(this.getFullCssSelector(), this.formName, name, this.driver);
|
|
1901
|
+
}
|
|
1902
|
+
};
|
|
1419
1903
|
}
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1904
|
+
});
|
|
1905
|
+
|
|
1906
|
+
// src/pageObjects/elements/Filters/FormFilterField.ts
|
|
1907
|
+
var FormFilterField;
|
|
1908
|
+
var init_FormFilterField = __esm({
|
|
1909
|
+
"src/pageObjects/elements/Filters/FormFilterField.ts"() {
|
|
1910
|
+
"use strict";
|
|
1911
|
+
init_locators();
|
|
1912
|
+
init_createDataTestId();
|
|
1913
|
+
init_AbstractEditor2();
|
|
1914
|
+
FormFilterField = class extends AbstractEditor {
|
|
1915
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1916
|
+
super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
|
|
1917
|
+
}
|
|
1918
|
+
/**
|
|
1919
|
+
* Возвращает значение в поле
|
|
1920
|
+
* @example
|
|
1921
|
+
* expect(await form.formFilter('NumberFld').getValue()).toBe(10);
|
|
1922
|
+
* expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
|
|
1923
|
+
*/
|
|
1924
|
+
async getValue() {
|
|
1925
|
+
return super.getValue();
|
|
1926
|
+
}
|
|
1927
|
+
/**
|
|
1928
|
+
* Устанавливает значение в поле
|
|
1929
|
+
* @example
|
|
1930
|
+
* await form.formFilter('NumberFld').setValue(123);
|
|
1931
|
+
* await form.formFilter('TextFld').setValue('TestValue');
|
|
1932
|
+
*/
|
|
1933
|
+
async setValue(value) {
|
|
1934
|
+
return super.setValue(value);
|
|
1935
|
+
}
|
|
1936
|
+
/**
|
|
1937
|
+
* Очищает значение в поле
|
|
1938
|
+
* @example
|
|
1939
|
+
* await form.formFilter('NumberFld').clear();
|
|
1940
|
+
*/
|
|
1941
|
+
async clear() {
|
|
1942
|
+
return super.clear();
|
|
1943
|
+
}
|
|
1944
|
+
/**
|
|
1945
|
+
* Удаляет тег по переданному тексту
|
|
1946
|
+
* @example
|
|
1947
|
+
* await form.formFilter('TagBox').remove('test');
|
|
1948
|
+
*/
|
|
1949
|
+
async remove(itemText) {
|
|
1950
|
+
return super.remove(itemText);
|
|
1951
|
+
}
|
|
1952
|
+
};
|
|
1462
1953
|
}
|
|
1463
|
-
|
|
1464
|
-
|
|
1954
|
+
});
|
|
1955
|
+
|
|
1956
|
+
// src/pageObjects/elements/Filters/PanelFilterField.ts
|
|
1957
|
+
var PanelFilterField;
|
|
1958
|
+
var init_PanelFilterField = __esm({
|
|
1959
|
+
"src/pageObjects/elements/Filters/PanelFilterField.ts"() {
|
|
1960
|
+
"use strict";
|
|
1961
|
+
init_locators();
|
|
1962
|
+
init_createDataTestId();
|
|
1963
|
+
init_AbstractEditor2();
|
|
1964
|
+
PanelFilterField = class extends AbstractEditor {
|
|
1965
|
+
constructor(parentCssSelector, formName, name, driver) {
|
|
1966
|
+
super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
|
|
1967
|
+
}
|
|
1968
|
+
/**
|
|
1969
|
+
* Возвращает значение в поле
|
|
1970
|
+
* @example
|
|
1971
|
+
* expect(await form.filterPanel.filterField('NumberFld').getValue()).toBe(10);
|
|
1972
|
+
* expect(await form.filterPanel.filterField('TextFld').getValue()).toBe('TestValue');
|
|
1973
|
+
*/
|
|
1974
|
+
async getValue() {
|
|
1975
|
+
return super.getValue();
|
|
1976
|
+
}
|
|
1977
|
+
/**
|
|
1978
|
+
* Устанавливает значение в поле
|
|
1979
|
+
* @example
|
|
1980
|
+
* await form.filterPanel.filterField('NumberFld').setValue(123);
|
|
1981
|
+
* await form.filterPanel.filterField('TextFld').setValue('TestValue');
|
|
1982
|
+
*/
|
|
1983
|
+
async setValue(value) {
|
|
1984
|
+
return super.setValue(value);
|
|
1985
|
+
}
|
|
1986
|
+
/**
|
|
1987
|
+
* Очищает значение в поле
|
|
1988
|
+
* @example
|
|
1989
|
+
* await form.filterPanel.filterField('NumberFld').clear();
|
|
1990
|
+
*/
|
|
1991
|
+
async clear() {
|
|
1992
|
+
return super.clear();
|
|
1993
|
+
}
|
|
1994
|
+
/**
|
|
1995
|
+
* Удаляет тег по переданному тексту
|
|
1996
|
+
* @example
|
|
1997
|
+
* await form.filterPanel.filterField('TagBox').remove('test');
|
|
1998
|
+
*/
|
|
1999
|
+
async remove(itemText) {
|
|
2000
|
+
return super.remove(itemText);
|
|
2001
|
+
}
|
|
2002
|
+
};
|
|
1465
2003
|
}
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
2004
|
+
});
|
|
2005
|
+
|
|
2006
|
+
// src/pageObjects/elements/Filters/FilterPanel.ts
|
|
2007
|
+
var import_selenium_webdriver23, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
|
|
2008
|
+
var init_FilterPanel = __esm({
|
|
2009
|
+
"src/pageObjects/elements/Filters/FilterPanel.ts"() {
|
|
2010
|
+
"use strict";
|
|
2011
|
+
import_selenium_webdriver23 = require("selenium-webdriver");
|
|
2012
|
+
init_AbstractElement();
|
|
2013
|
+
init_PanelFilterField();
|
|
2014
|
+
init_actions();
|
|
2015
|
+
drawerSelector = (formName) => `.secondary-drawer-side-panel.form-${formName}`;
|
|
2016
|
+
FILTER_PANEL_SELECTOR = ".filter-panel";
|
|
2017
|
+
CLOSE_SELECTOR = ".button-close";
|
|
2018
|
+
FilterPanel = class extends AbstractElement {
|
|
2019
|
+
_formName;
|
|
2020
|
+
get filterPanelSelector() {
|
|
2021
|
+
return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
|
|
2022
|
+
}
|
|
2023
|
+
async filterPanelButtons() {
|
|
2024
|
+
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
2025
|
+
const el = await this.getElement();
|
|
2026
|
+
return el.findElements(import_selenium_webdriver23.By.css(selector));
|
|
2027
|
+
}
|
|
2028
|
+
constructor(formName, driver) {
|
|
2029
|
+
super(driver, drawerSelector(formName));
|
|
2030
|
+
this._formName = formName;
|
|
2031
|
+
}
|
|
2032
|
+
/**
|
|
2033
|
+
* Возвращает фильтр на панели фильтрации
|
|
2034
|
+
* @returns {PanelFilterField}
|
|
2035
|
+
* @example
|
|
2036
|
+
* await form.filterPanel.filterField('NumberFld');
|
|
2037
|
+
*/
|
|
2038
|
+
filterField(name) {
|
|
2039
|
+
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
|
|
2040
|
+
}
|
|
2041
|
+
async apply() {
|
|
2042
|
+
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
2043
|
+
await click(btn, this.driver);
|
|
2044
|
+
}
|
|
2045
|
+
async findButtonByTitle(title) {
|
|
2046
|
+
const buttons = await this.filterPanelButtons();
|
|
2047
|
+
for (const btn of buttons) {
|
|
2048
|
+
if (await btn.getText() === title) {
|
|
2049
|
+
return btn;
|
|
2050
|
+
}
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
2053
|
+
async clearAll() {
|
|
2054
|
+
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
2055
|
+
await click(btn, this.driver);
|
|
2056
|
+
await this.driver.sleep(300);
|
|
2057
|
+
}
|
|
2058
|
+
async close() {
|
|
2059
|
+
const btn = await this.driver.findElement(import_selenium_webdriver23.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
2060
|
+
await click(btn, this.driver);
|
|
2061
|
+
}
|
|
2062
|
+
};
|
|
1475
2063
|
}
|
|
1476
|
-
};
|
|
2064
|
+
});
|
|
1477
2065
|
|
|
1478
|
-
// src/pageObjects/elements/
|
|
1479
|
-
var
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
2066
|
+
// src/pageObjects/elements/Forms/ListForm.ts
|
|
2067
|
+
var ListForm_exports = {};
|
|
2068
|
+
__export(ListForm_exports, {
|
|
2069
|
+
default: () => ListForm
|
|
2070
|
+
});
|
|
2071
|
+
var DATAGRID_HEADER_CSS_SELECTOR, ListForm;
|
|
2072
|
+
var init_ListForm = __esm({
|
|
2073
|
+
"src/pageObjects/elements/Forms/ListForm.ts"() {
|
|
2074
|
+
"use strict";
|
|
2075
|
+
init_Form();
|
|
2076
|
+
init_Table();
|
|
2077
|
+
init_FormToolbar();
|
|
2078
|
+
init_FormFilterField();
|
|
2079
|
+
init_FilterPanel();
|
|
2080
|
+
DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
|
|
2081
|
+
ListForm = class extends Form {
|
|
2082
|
+
headerCssSelector;
|
|
2083
|
+
constructor(driver) {
|
|
2084
|
+
super(driver);
|
|
2085
|
+
this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
|
|
2086
|
+
this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
|
|
2087
|
+
}
|
|
2088
|
+
/**
|
|
2089
|
+
* Находит таблицу
|
|
2090
|
+
* @example
|
|
2091
|
+
* const listForm = new MyForm();
|
|
2092
|
+
* //...
|
|
2093
|
+
* expect(listForm.table());
|
|
2094
|
+
*/
|
|
2095
|
+
table() {
|
|
2096
|
+
return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
|
|
2097
|
+
}
|
|
2098
|
+
/**
|
|
2099
|
+
* Находит таблицу
|
|
2100
|
+
* @example
|
|
2101
|
+
* const listForm = new MyForm();
|
|
2102
|
+
* //...
|
|
2103
|
+
* expect(listForm.toolbarButton());
|
|
2104
|
+
*/
|
|
2105
|
+
toolbarButton(name) {
|
|
2106
|
+
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
2107
|
+
return toolbar.button(name);
|
|
2108
|
+
}
|
|
2109
|
+
/**
|
|
2110
|
+
* Фильтр который расположен на форме
|
|
2111
|
+
* @example
|
|
2112
|
+
* const listForm = new MyForm();
|
|
2113
|
+
* //...
|
|
2114
|
+
* expect(listForm.formFilter());
|
|
2115
|
+
*/
|
|
2116
|
+
formFilter(name) {
|
|
2117
|
+
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
2118
|
+
}
|
|
2119
|
+
/**
|
|
2120
|
+
* Модель панели фильтрации
|
|
2121
|
+
* @returns {FilterPanel}
|
|
2122
|
+
* @example
|
|
2123
|
+
* const listForm = new MyForm();
|
|
2124
|
+
* //...
|
|
2125
|
+
* expect(listForm.filterPanel());
|
|
2126
|
+
*/
|
|
2127
|
+
get filterPanel() {
|
|
2128
|
+
return new FilterPanel(this.formName, this.driver);
|
|
2129
|
+
}
|
|
2130
|
+
};
|
|
1484
2131
|
}
|
|
1485
|
-
|
|
1486
|
-
|
|
2132
|
+
});
|
|
2133
|
+
|
|
2134
|
+
// src/pageObjects/elements/Forms/TreeView.ts
|
|
2135
|
+
var TreeView_exports = {};
|
|
2136
|
+
__export(TreeView_exports, {
|
|
2137
|
+
default: () => TreeView
|
|
2138
|
+
});
|
|
2139
|
+
var TREELIST_HEADER_CSS_SELECTOR, TreeView;
|
|
2140
|
+
var init_TreeView = __esm({
|
|
2141
|
+
"src/pageObjects/elements/Forms/TreeView.ts"() {
|
|
2142
|
+
"use strict";
|
|
2143
|
+
init_ListForm();
|
|
2144
|
+
TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
|
|
2145
|
+
TreeView = class extends ListForm {
|
|
2146
|
+
constructor(driver) {
|
|
2147
|
+
super(driver);
|
|
2148
|
+
this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
|
|
2149
|
+
this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
|
|
2150
|
+
}
|
|
2151
|
+
};
|
|
1487
2152
|
}
|
|
1488
|
-
};
|
|
2153
|
+
});
|
|
1489
2154
|
|
|
1490
|
-
// src/pageObjects/elements/
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
2155
|
+
// src/pageObjects/elements/Forms/createSubFormInstance.ts
|
|
2156
|
+
function subformCssSelector(parentCssSelector, testId) {
|
|
2157
|
+
return `${parentCssSelector} ${byTestIdCssSelector(testId)}`;
|
|
2158
|
+
}
|
|
2159
|
+
async function classDependencyInjector(formType) {
|
|
2160
|
+
let SubFormFactoryClass;
|
|
2161
|
+
switch (formType) {
|
|
2162
|
+
case "1" /* LIST */:
|
|
2163
|
+
SubFormFactoryClass = (await Promise.resolve().then(() => (init_ListForm(), ListForm_exports))).default;
|
|
2164
|
+
break;
|
|
2165
|
+
case "3" /* TREE */:
|
|
2166
|
+
SubFormFactoryClass = (await Promise.resolve().then(() => (init_TreeView(), TreeView_exports))).default;
|
|
2167
|
+
break;
|
|
2168
|
+
case "2" /* EDIT */:
|
|
2169
|
+
case "99" /* FREE_FORM */:
|
|
2170
|
+
case "4" /* REPORT */:
|
|
2171
|
+
SubFormFactoryClass = (await Promise.resolve().then(() => (init_FormEdit(), FormEdit_exports))).default;
|
|
2172
|
+
break;
|
|
2173
|
+
default:
|
|
2174
|
+
throw new Error(`Unsupported form type ${formType}`);
|
|
2175
|
+
}
|
|
2176
|
+
return SubFormFactoryClass;
|
|
2177
|
+
}
|
|
2178
|
+
var subFormTestId;
|
|
2179
|
+
var init_createSubFormInstance = __esm({
|
|
2180
|
+
"src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
|
|
2181
|
+
"use strict";
|
|
2182
|
+
init_locators();
|
|
2183
|
+
init_types();
|
|
2184
|
+
subFormTestId = (name) => `subform-${name}`;
|
|
1497
2185
|
}
|
|
1498
|
-
|
|
1499
|
-
|
|
2186
|
+
});
|
|
2187
|
+
|
|
2188
|
+
// src/pageObjects/elements/Forms/Form.ts
|
|
2189
|
+
var import_selenium_webdriver24, formTestId, Form;
|
|
2190
|
+
var init_Form = __esm({
|
|
2191
|
+
"src/pageObjects/elements/Forms/Form.ts"() {
|
|
2192
|
+
"use strict";
|
|
2193
|
+
init_locators();
|
|
2194
|
+
import_selenium_webdriver24 = require("selenium-webdriver");
|
|
2195
|
+
init_AbstractForm();
|
|
2196
|
+
init_waitElementIsVisible();
|
|
2197
|
+
init_createSubFormInstance();
|
|
2198
|
+
formTestId = (formName) => `form-content-wrapper-${formName}`;
|
|
2199
|
+
Form = class extends AbstractForm {
|
|
2200
|
+
popupContainerCssSelector;
|
|
2201
|
+
constructor(driver) {
|
|
2202
|
+
super(driver);
|
|
2203
|
+
this.setSubFormMode();
|
|
2204
|
+
}
|
|
2205
|
+
async isModal() {
|
|
2206
|
+
const el = await this.getContainerElement();
|
|
2207
|
+
const value = await el.getAttribute("data-ismodal");
|
|
2208
|
+
return value === "true";
|
|
2209
|
+
}
|
|
2210
|
+
/**
|
|
2211
|
+
* Получение заголовка на формы
|
|
2212
|
+
* @example
|
|
2213
|
+
* const listForm = new MyForm();
|
|
2214
|
+
* //...
|
|
2215
|
+
* expect(await listForm.getTitleText()).toBe('MyFormTitle');
|
|
2216
|
+
*/
|
|
2217
|
+
async getTitleText() {
|
|
2218
|
+
if (await this.isModal()) {
|
|
2219
|
+
const titleEl2 = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.popupContainerCssSelector} .popup-title`));
|
|
2220
|
+
return titleEl2.getText();
|
|
2221
|
+
}
|
|
2222
|
+
let titleEl = await this.driver.findElement(import_selenium_webdriver24.By.className("main-toolbar-form-title"));
|
|
2223
|
+
return titleEl.getText();
|
|
2224
|
+
}
|
|
2225
|
+
setSubFormMode() {
|
|
2226
|
+
const testId = formTestId(this.formName);
|
|
2227
|
+
this.containerBy = byTestId(testId);
|
|
2228
|
+
this.containerCssSelector = byTestIdCssSelector(testId);
|
|
2229
|
+
}
|
|
2230
|
+
/**
|
|
2231
|
+
* Возвращает сабформу
|
|
2232
|
+
* @returns {Promise<ListForm | TreeView | FormEdit>}
|
|
2233
|
+
* @example
|
|
2234
|
+
* const form = new MyForm();
|
|
2235
|
+
* //...
|
|
2236
|
+
* expect(await form.subForm(name));
|
|
2237
|
+
*/
|
|
2238
|
+
async subForm(name) {
|
|
2239
|
+
const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
|
|
2240
|
+
const byCssSelector = import_selenium_webdriver24.By.css(cssSelector);
|
|
2241
|
+
const subFormEl = await this.driver.findElement(byCssSelector);
|
|
2242
|
+
await waitElementIsVisible({
|
|
2243
|
+
element: subFormEl,
|
|
2244
|
+
driver: this.driver,
|
|
2245
|
+
errorMessage: `Subform "${name}" is not visible`
|
|
2246
|
+
});
|
|
2247
|
+
const formType = await subFormEl.getAttribute("data-formtype");
|
|
2248
|
+
const formName = await subFormEl.getAttribute("data-formname");
|
|
2249
|
+
let SubFormFactoryClass = await classDependencyInjector(formType);
|
|
2250
|
+
const SubForm = class extends SubFormFactoryClass {
|
|
2251
|
+
setSubFormMode() {
|
|
2252
|
+
this.containerCssSelector = cssSelector;
|
|
2253
|
+
this.containerBy = byCssSelector;
|
|
2254
|
+
}
|
|
2255
|
+
get formName() {
|
|
2256
|
+
return formName;
|
|
2257
|
+
}
|
|
2258
|
+
};
|
|
2259
|
+
return new SubForm(this.driver);
|
|
2260
|
+
}
|
|
2261
|
+
};
|
|
1500
2262
|
}
|
|
1501
|
-
};
|
|
2263
|
+
});
|
|
1502
2264
|
|
|
1503
|
-
// src/pageObjects/elements/
|
|
1504
|
-
var
|
|
2265
|
+
// src/pageObjects/elements/Forms/FormEdit.ts
|
|
2266
|
+
var FormEdit_exports = {};
|
|
2267
|
+
__export(FormEdit_exports, {
|
|
2268
|
+
default: () => FormEdit
|
|
2269
|
+
});
|
|
2270
|
+
var import_selenium_webdriver25, FormEdit;
|
|
2271
|
+
var init_FormEdit = __esm({
|
|
2272
|
+
"src/pageObjects/elements/Forms/FormEdit.ts"() {
|
|
2273
|
+
"use strict";
|
|
2274
|
+
init_Form();
|
|
2275
|
+
import_selenium_webdriver25 = require("selenium-webdriver");
|
|
2276
|
+
init_FormField();
|
|
2277
|
+
init_actions();
|
|
2278
|
+
init_wait();
|
|
2279
|
+
FormEdit = class extends Form {
|
|
2280
|
+
saveButtonBy = import_selenium_webdriver25.By.id("button-save");
|
|
2281
|
+
closeButtonBy = import_selenium_webdriver25.By.id("button-cancel");
|
|
2282
|
+
constructor(driver) {
|
|
2283
|
+
super(driver);
|
|
2284
|
+
this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
|
|
2285
|
+
}
|
|
2286
|
+
/**
|
|
2287
|
+
* Находит поле формы редактирования по имени
|
|
2288
|
+
* @example
|
|
2289
|
+
* const formEdit = new MyForm();
|
|
2290
|
+
* //...
|
|
2291
|
+
* expect(await formEdit.field('Name').getValue()).toBe('test value');
|
|
2292
|
+
*/
|
|
2293
|
+
field(name) {
|
|
2294
|
+
return new FormField(this.containerCssSelector, this.formName, name, this.driver);
|
|
2295
|
+
}
|
|
2296
|
+
/**
|
|
2297
|
+
* Проверяет не отключена ли кнопка Сохранить
|
|
2298
|
+
* @example
|
|
2299
|
+
* const formEdit = new MyForm();
|
|
2300
|
+
* //...
|
|
2301
|
+
* await formEdit.isSaveButtonDisabled();
|
|
2302
|
+
*/
|
|
2303
|
+
async isSaveButtonDisabled() {
|
|
2304
|
+
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
2305
|
+
const result = await saveButton.getAttribute("aria-disabled");
|
|
2306
|
+
return result === "true";
|
|
2307
|
+
}
|
|
2308
|
+
/**
|
|
2309
|
+
* Нажатие на кнопку Сохранить
|
|
2310
|
+
* @example
|
|
2311
|
+
* const formEdit = new MyForm();
|
|
2312
|
+
* //...
|
|
2313
|
+
* await formEdit.saveButtonClick();
|
|
2314
|
+
*/
|
|
2315
|
+
async saveButtonClick() {
|
|
2316
|
+
const saveButton = await this.driver.findElement(this.saveButtonBy);
|
|
2317
|
+
await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
|
|
2318
|
+
await click(saveButton, this.driver);
|
|
2319
|
+
}
|
|
2320
|
+
/**
|
|
2321
|
+
* Нажатие на кнопку Закрить
|
|
2322
|
+
* @example
|
|
2323
|
+
* const formEdit = new MyForm();
|
|
2324
|
+
* //...
|
|
2325
|
+
* await formEdit.closeButtonClick();
|
|
2326
|
+
*/
|
|
2327
|
+
async closeButtonClick() {
|
|
2328
|
+
const closeButton = await this.driver.findElement(this.closeButtonBy);
|
|
2329
|
+
await click(closeButton, this.driver);
|
|
2330
|
+
}
|
|
2331
|
+
};
|
|
2332
|
+
}
|
|
2333
|
+
});
|
|
1505
2334
|
|
|
1506
|
-
// src/
|
|
1507
|
-
var
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
2335
|
+
// src/index.ts
|
|
2336
|
+
var src_exports = {};
|
|
2337
|
+
__export(src_exports, {
|
|
2338
|
+
AbstractPage: () => AbstractPage,
|
|
2339
|
+
ControlClass: () => ControlClass,
|
|
2340
|
+
Dialog: () => Dialog,
|
|
2341
|
+
FilterPanel: () => FilterPanel,
|
|
2342
|
+
FormEdit: () => FormEdit,
|
|
2343
|
+
FormField: () => FormField,
|
|
2344
|
+
FormFilterField: () => FormFilterField,
|
|
2345
|
+
ListForm: () => ListForm,
|
|
2346
|
+
LoginPage: () => LoginPage,
|
|
2347
|
+
NumberEditor: () => NumberEditor,
|
|
2348
|
+
PanelFilterField: () => PanelFilterField,
|
|
2349
|
+
SubsystemsPanel: () => SubsystemsPanel,
|
|
2350
|
+
TextEditor: () => TextEditor,
|
|
2351
|
+
TreeView: () => TreeView,
|
|
2352
|
+
byTestId: () => byTestId,
|
|
2353
|
+
byTestIdCssSelector: () => byTestIdCssSelector,
|
|
2354
|
+
click: () => click,
|
|
2355
|
+
config: () => config,
|
|
2356
|
+
createDriver: () => createDriver,
|
|
2357
|
+
editorFactory: () => editorFactory,
|
|
2358
|
+
elementIsNotPresent: () => elementIsNotPresent,
|
|
2359
|
+
readonlyLocator: () => readonlyLocator,
|
|
2360
|
+
signIn: () => signIn,
|
|
2361
|
+
wait: () => wait,
|
|
2362
|
+
waitElementIsVisible: () => waitElementIsVisible
|
|
2363
|
+
});
|
|
2364
|
+
module.exports = __toCommonJS(src_exports);
|
|
2365
|
+
init_config();
|
|
1524
2366
|
|
|
1525
|
-
// src/pageObjects/
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
async
|
|
1537
|
-
|
|
1538
|
-
await
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
return byTestId(`ftb-${this._formName}-${name}`);
|
|
1542
|
-
}
|
|
1543
|
-
buttonNotDisplayedError(name) {
|
|
1544
|
-
return `Toolbar menu button ${name} cannot be clicked. It is not displayed or it is disabled`;
|
|
1545
|
-
}
|
|
1546
|
-
async goToButton(name, selector) {
|
|
1547
|
-
const toolbarMenuItem = this.driver.findElement(selector);
|
|
1548
|
-
await waitElementIsClickable({
|
|
1549
|
-
element: toolbarMenuItem,
|
|
1550
|
-
errorMessage: this.buttonNotDisplayedError(name),
|
|
2367
|
+
// src/pageObjects/pages/LoginPage.ts
|
|
2368
|
+
init_AbstractPage();
|
|
2369
|
+
init_config();
|
|
2370
|
+
init_waitElementIsVisible();
|
|
2371
|
+
init_actions();
|
|
2372
|
+
init_locators();
|
|
2373
|
+
var LOGIN_PATH = "/login";
|
|
2374
|
+
var LoginPage = class extends AbstractPage {
|
|
2375
|
+
usernameField = byTestId("loginField", "input");
|
|
2376
|
+
passwordField = byTestId("passwordField", "input");
|
|
2377
|
+
loginButton = byTestId("loginButton");
|
|
2378
|
+
async locate() {
|
|
2379
|
+
await super.locate();
|
|
2380
|
+
const login = await this.driver.findElement(this.usernameField);
|
|
2381
|
+
await waitElementIsVisible({
|
|
2382
|
+
element: login,
|
|
1551
2383
|
driver: this.driver
|
|
1552
2384
|
});
|
|
1553
|
-
await click(toolbarMenuItem, this.driver);
|
|
1554
2385
|
}
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
if (isString(name)) {
|
|
1558
|
-
const selector = this.getCssSelectorToButton(name);
|
|
1559
|
-
await this.goToButton(name, selector);
|
|
1560
|
-
}
|
|
1561
|
-
if (isArray(name)) {
|
|
1562
|
-
for (let n of name) {
|
|
1563
|
-
const selector = this.getCssSelectorToButton(n);
|
|
1564
|
-
await this.goToButton(n, selector);
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
2386
|
+
get path() {
|
|
2387
|
+
return LOGIN_PATH;
|
|
1567
2388
|
}
|
|
1568
|
-
async
|
|
1569
|
-
await this.
|
|
1570
|
-
if (isString(title)) {
|
|
1571
|
-
const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(title));
|
|
1572
|
-
await this.goToButton(title, selector);
|
|
1573
|
-
}
|
|
1574
|
-
if (isArray(title)) {
|
|
1575
|
-
for (let t of title) {
|
|
1576
|
-
const selector = import_selenium_webdriver23.By.xpath(buttonByTextXpath(t));
|
|
1577
|
-
await this.goToButton(t, selector);
|
|
1578
|
-
}
|
|
1579
|
-
}
|
|
2389
|
+
async enterUsername(username) {
|
|
2390
|
+
await this.driver.findElement(this.usernameField).sendKeys(username);
|
|
1580
2391
|
}
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
// src/pageObjects/elements/TableToolbar/ToolbarItem.ts
|
|
1584
|
-
var GROUP_BUTTON_CLASS = "toolbar-group-button";
|
|
1585
|
-
var toolbarItemSelector = (form, name) => byTestIdCssSelector(`ftb-${form}-${name}`);
|
|
1586
|
-
var ToolbarItem = class extends AbstractElementWithParent {
|
|
1587
|
-
_button;
|
|
1588
|
-
_formName;
|
|
1589
|
-
_itemName;
|
|
1590
|
-
constructor(parentCssSelector, formName, itemName, driver) {
|
|
1591
|
-
super(parentCssSelector, toolbarItemSelector(formName, itemName), driver);
|
|
1592
|
-
this._itemName = itemName;
|
|
1593
|
-
this._formName = formName;
|
|
1594
|
-
}
|
|
1595
|
-
async init() {
|
|
1596
|
-
if (this._button)
|
|
1597
|
-
return this._button;
|
|
1598
|
-
const classNames = await this.getClasses();
|
|
1599
|
-
if (classNames.includes(GROUP_BUTTON_CLASS)) {
|
|
1600
|
-
this._button = new ToolbarGroupButton(this.getFullCssSelector(), this._itemName, this.driver);
|
|
1601
|
-
return;
|
|
1602
|
-
}
|
|
1603
|
-
this._button = new ToolbarButton(this.parentCssSelector, this._itemName, this.driver);
|
|
2392
|
+
async enterPassword(password) {
|
|
2393
|
+
await this.driver.findElement(this.passwordField).sendKeys(password);
|
|
1604
2394
|
}
|
|
1605
|
-
async
|
|
1606
|
-
await this.
|
|
1607
|
-
await this._button.click();
|
|
2395
|
+
async clickLoginButton() {
|
|
2396
|
+
await click(await this.driver.findElement(this.loginButton), this.driver);
|
|
1608
2397
|
}
|
|
1609
|
-
async
|
|
1610
|
-
await this.
|
|
1611
|
-
|
|
2398
|
+
async loginWith(username, password) {
|
|
2399
|
+
await this.enterUsername(username);
|
|
2400
|
+
await this.enterPassword(password);
|
|
2401
|
+
await this.clickLoginButton();
|
|
1612
2402
|
}
|
|
1613
|
-
|
|
1614
|
-
|
|
2403
|
+
async authorize() {
|
|
2404
|
+
await this.loginWith(config().auth.login, config().auth.password);
|
|
1615
2405
|
}
|
|
1616
2406
|
};
|
|
1617
2407
|
|
|
1618
|
-
// src/
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
2408
|
+
// src/index.ts
|
|
2409
|
+
init_locators();
|
|
2410
|
+
|
|
2411
|
+
// src/utils/createDriver.ts
|
|
2412
|
+
var import_selenium_webdriver4 = require("selenium-webdriver");
|
|
2413
|
+
init_config();
|
|
2414
|
+
var createDriver = async (browser) => {
|
|
2415
|
+
const driver = await new import_selenium_webdriver4.Builder().forBrowser(browser ?? config().browser).build();
|
|
2416
|
+
const manage = driver.manage();
|
|
2417
|
+
await manage.setTimeouts({ implicit: config().timeout });
|
|
2418
|
+
await manage.window().maximize();
|
|
2419
|
+
return driver;
|
|
1629
2420
|
};
|
|
1630
2421
|
|
|
1631
|
-
// src/
|
|
1632
|
-
var
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
* @example
|
|
1639
|
-
* expect(await form.formFilter('NumberFld').getValue()).toBe(10);
|
|
1640
|
-
* expect(await form.formFilter('TextFld').getValue()).toBe('TestValue');
|
|
1641
|
-
*/
|
|
1642
|
-
async getValue() {
|
|
1643
|
-
return super.getValue();
|
|
1644
|
-
}
|
|
1645
|
-
/**
|
|
1646
|
-
* Устанавливает значение в поле
|
|
1647
|
-
* @example
|
|
1648
|
-
* await form.formFilter('NumberFld').setValue(123);
|
|
1649
|
-
* await form.formFilter('TextFld').setValue('TestValue');
|
|
1650
|
-
*/
|
|
1651
|
-
async setValue(value) {
|
|
1652
|
-
return super.setValue(value);
|
|
1653
|
-
}
|
|
1654
|
-
/**
|
|
1655
|
-
* Очищает значение в поле
|
|
1656
|
-
* @example
|
|
1657
|
-
* await form.formFilter('NumberFld').clear();
|
|
1658
|
-
*/
|
|
1659
|
-
async clear() {
|
|
1660
|
-
return super.clear();
|
|
1661
|
-
}
|
|
1662
|
-
/**
|
|
1663
|
-
* Удаляет тег по переданному тексту
|
|
1664
|
-
* @example
|
|
1665
|
-
* await form.formFilter('TagBox').remove('test');
|
|
1666
|
-
*/
|
|
1667
|
-
async remove(itemText) {
|
|
1668
|
-
return super.remove(itemText);
|
|
1669
|
-
}
|
|
2422
|
+
// src/utils/elementIsNotPresent.ts
|
|
2423
|
+
var import_selenium_webdriver5 = require("selenium-webdriver");
|
|
2424
|
+
var elementIsNotPresent = function elementIsNotPresent2(locator) {
|
|
2425
|
+
return new import_selenium_webdriver5.Condition("for no element to be located " + locator, async function(driver) {
|
|
2426
|
+
const elements = await driver.findElements(locator);
|
|
2427
|
+
return elements.length == 0;
|
|
2428
|
+
});
|
|
1670
2429
|
};
|
|
1671
2430
|
|
|
1672
|
-
// src/
|
|
1673
|
-
|
|
2431
|
+
// src/index.ts
|
|
2432
|
+
init_waitElementIsVisible();
|
|
2433
|
+
init_wait();
|
|
1674
2434
|
|
|
1675
|
-
// src/
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
*/
|
|
1686
|
-
async getValue() {
|
|
1687
|
-
return super.getValue();
|
|
1688
|
-
}
|
|
1689
|
-
/**
|
|
1690
|
-
* Устанавливает значение в поле
|
|
1691
|
-
* @example
|
|
1692
|
-
* await form.filterPanel.filterField('NumberFld').setValue(123);
|
|
1693
|
-
* await form.filterPanel.filterField('TextFld').setValue('TestValue');
|
|
1694
|
-
*/
|
|
1695
|
-
async setValue(value) {
|
|
1696
|
-
return super.setValue(value);
|
|
1697
|
-
}
|
|
1698
|
-
/**
|
|
1699
|
-
* Очищает значение в поле
|
|
1700
|
-
* @example
|
|
1701
|
-
* await form.filterPanel.filterField('NumberFld').clear();
|
|
1702
|
-
*/
|
|
1703
|
-
async clear() {
|
|
1704
|
-
return super.clear();
|
|
1705
|
-
}
|
|
1706
|
-
/**
|
|
1707
|
-
* Удаляет тег по переданному тексту
|
|
1708
|
-
* @example
|
|
1709
|
-
* await form.filterPanel.filterField('TagBox').remove('test');
|
|
1710
|
-
*/
|
|
1711
|
-
async remove(itemText) {
|
|
1712
|
-
return super.remove(itemText);
|
|
1713
|
-
}
|
|
1714
|
-
};
|
|
2435
|
+
// src/utils/signIn.ts
|
|
2436
|
+
init_config();
|
|
2437
|
+
async function signIn(driver) {
|
|
2438
|
+
const webDriver = driver ?? await createDriver();
|
|
2439
|
+
config().driver = webDriver;
|
|
2440
|
+
const loginPage = new LoginPage(webDriver);
|
|
2441
|
+
await loginPage.locate();
|
|
2442
|
+
await loginPage.authorize();
|
|
2443
|
+
return webDriver;
|
|
2444
|
+
}
|
|
1715
2445
|
|
|
1716
|
-
// src/
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
var CLOSE_SELECTOR = ".button-close";
|
|
1720
|
-
var FilterPanel = class extends AbstractElement {
|
|
1721
|
-
_formName;
|
|
1722
|
-
get filterPanelSelector() {
|
|
1723
|
-
return `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR}`;
|
|
1724
|
-
}
|
|
1725
|
-
async filterPanelButtons() {
|
|
1726
|
-
const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
|
|
1727
|
-
const el = await this.getElement();
|
|
1728
|
-
return el.findElements(import_selenium_webdriver24.By.css(selector));
|
|
1729
|
-
}
|
|
1730
|
-
constructor(formName, driver) {
|
|
1731
|
-
super(driver, drawerSelector(formName));
|
|
1732
|
-
this._formName = formName;
|
|
1733
|
-
}
|
|
1734
|
-
/**
|
|
1735
|
-
* Возвращает фильтр на панели фильтрации
|
|
1736
|
-
* @returns {PanelFilterField}
|
|
1737
|
-
* @example
|
|
1738
|
-
* await form.filterPanel.filterField('NumberFld');
|
|
1739
|
-
*/
|
|
1740
|
-
filterField(name) {
|
|
1741
|
-
return new PanelFilterField(this.filterPanelSelector, this._formName, name, this.driver);
|
|
1742
|
-
}
|
|
1743
|
-
async apply() {
|
|
1744
|
-
const btn = await this.findButtonByTitle("\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438");
|
|
1745
|
-
await click(btn, this.driver);
|
|
1746
|
-
}
|
|
1747
|
-
async findButtonByTitle(title) {
|
|
1748
|
-
const buttons = await this.filterPanelButtons();
|
|
1749
|
-
for (const btn of buttons) {
|
|
1750
|
-
if (await btn.getText() === title) {
|
|
1751
|
-
return btn;
|
|
1752
|
-
}
|
|
1753
|
-
}
|
|
1754
|
-
}
|
|
1755
|
-
async clearAll() {
|
|
1756
|
-
const btn = await this.findButtonByTitle("\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438");
|
|
1757
|
-
await click(btn, this.driver);
|
|
1758
|
-
await this.driver.sleep(300);
|
|
1759
|
-
}
|
|
1760
|
-
async close() {
|
|
1761
|
-
const btn = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
|
|
1762
|
-
await click(btn, this.driver);
|
|
1763
|
-
}
|
|
1764
|
-
};
|
|
2446
|
+
// src/index.ts
|
|
2447
|
+
init_actions();
|
|
2448
|
+
init_AbstractPage();
|
|
1765
2449
|
|
|
1766
|
-
// src/pageObjects/elements/
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
/**
|
|
1776
|
-
* Находит таблицу
|
|
1777
|
-
* @example
|
|
1778
|
-
* const listForm = new MyForm();
|
|
1779
|
-
* //...
|
|
1780
|
-
* expect(listForm.table());
|
|
1781
|
-
*/
|
|
1782
|
-
table() {
|
|
1783
|
-
return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
|
|
1784
|
-
}
|
|
1785
|
-
/**
|
|
1786
|
-
* Находит группу на лист форме по имени
|
|
1787
|
-
* @example
|
|
1788
|
-
* const formEdit = new MyForm();
|
|
1789
|
-
* //...
|
|
1790
|
-
* expect(await formEdit.group('Name');
|
|
1791
|
-
*/
|
|
1792
|
-
group(name) {
|
|
1793
|
-
return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
|
|
1794
|
-
}
|
|
1795
|
-
/**
|
|
1796
|
-
* Находит таблицу
|
|
1797
|
-
* @example
|
|
1798
|
-
* const listForm = new MyForm();
|
|
1799
|
-
* //...
|
|
1800
|
-
* expect(listForm.toolbarButton());
|
|
1801
|
-
*/
|
|
1802
|
-
toolbarButton(name) {
|
|
1803
|
-
const toolbar = new FormToolbar(this.containerCssSelector, this.formName, this.driver);
|
|
1804
|
-
return toolbar.button(name);
|
|
1805
|
-
}
|
|
1806
|
-
/**
|
|
1807
|
-
* Фильтр который расположен на форме
|
|
1808
|
-
* @example
|
|
1809
|
-
* const listForm = new MyForm();
|
|
1810
|
-
* //...
|
|
1811
|
-
* expect(listForm.formFilter());
|
|
1812
|
-
*/
|
|
1813
|
-
formFilter(name) {
|
|
1814
|
-
return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
|
|
1815
|
-
}
|
|
1816
|
-
/**
|
|
1817
|
-
* Модель панели фильтрации
|
|
1818
|
-
* @returns {FilterPanel}
|
|
1819
|
-
* @example
|
|
1820
|
-
* const listForm = new MyForm();
|
|
1821
|
-
* //...
|
|
1822
|
-
* expect(listForm.filterPanel());
|
|
1823
|
-
*/
|
|
1824
|
-
get filterPanel() {
|
|
1825
|
-
return new FilterPanel(this.formName, this.driver);
|
|
2450
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2451
|
+
init_AbstractElement();
|
|
2452
|
+
|
|
2453
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanelHeader.ts
|
|
2454
|
+
init_AbstractElementWithParent();
|
|
2455
|
+
var import_selenium_webdriver6 = require("selenium-webdriver");
|
|
2456
|
+
var SubsystemsPanelHeader = class extends AbstractElementWithParent {
|
|
2457
|
+
async title() {
|
|
2458
|
+
return this.driver.findElement(import_selenium_webdriver6.By.css(this.getFullCssSelector()));
|
|
1826
2459
|
}
|
|
1827
2460
|
};
|
|
1828
2461
|
|
|
1829
|
-
// src/pageObjects/elements/
|
|
1830
|
-
|
|
1831
|
-
|
|
2462
|
+
// src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
|
|
2463
|
+
init_wait();
|
|
2464
|
+
init_locators();
|
|
2465
|
+
var SubsystemsPanel = class extends AbstractElement {
|
|
2466
|
+
header;
|
|
1832
2467
|
constructor(driver) {
|
|
1833
2468
|
super(driver);
|
|
1834
|
-
this.
|
|
1835
|
-
|
|
2469
|
+
this.header = new SubsystemsPanelHeader("#aside", byTestIdCssSelector("subsystems-panel-title", "span"), this.driver);
|
|
2470
|
+
}
|
|
2471
|
+
async headerTitle() {
|
|
2472
|
+
const title = await this.header.title();
|
|
2473
|
+
await wait(async () => await title.getText() != "", this.driver);
|
|
2474
|
+
return title.getText();
|
|
1836
2475
|
}
|
|
1837
2476
|
};
|
|
1838
2477
|
|
|
2478
|
+
// src/index.ts
|
|
2479
|
+
init_FormEdit();
|
|
2480
|
+
init_ListForm();
|
|
2481
|
+
init_TreeView();
|
|
2482
|
+
init_Editors();
|
|
2483
|
+
init_FormField();
|
|
2484
|
+
init_FormFilterField();
|
|
2485
|
+
init_PanelFilterField();
|
|
2486
|
+
init_FilterPanel();
|
|
2487
|
+
|
|
1839
2488
|
// src/pageObjects/elements/Dialog.ts
|
|
1840
|
-
|
|
2489
|
+
init_AbstractElement();
|
|
2490
|
+
var import_selenium_webdriver26 = require("selenium-webdriver");
|
|
2491
|
+
init_AbstractButton();
|
|
1841
2492
|
var DIALOG_CLASS = ".d5-dialog";
|
|
1842
2493
|
var DIALOG_TITLE_CLASS = ".dialog__title";
|
|
1843
2494
|
var DIALOG_TEXT_CLASS = ".dialog__text";
|
|
@@ -1851,7 +2502,7 @@ var DialogButton = class extends AbstractButton {
|
|
|
1851
2502
|
}
|
|
1852
2503
|
async getElement() {
|
|
1853
2504
|
const panel = await super.getElement();
|
|
1854
|
-
return panel.findElement(
|
|
2505
|
+
return panel.findElement(import_selenium_webdriver26.By.xpath(buttonByTextXpath2(this.text)));
|
|
1855
2506
|
}
|
|
1856
2507
|
buttonNotDisplayedError() {
|
|
1857
2508
|
return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
|
|
@@ -1871,11 +2522,11 @@ var Dialog = class extends AbstractElement {
|
|
|
1871
2522
|
return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
|
|
1872
2523
|
}
|
|
1873
2524
|
async title() {
|
|
1874
|
-
const el = await this.driver.findElement(
|
|
2525
|
+
const el = await this.driver.findElement(import_selenium_webdriver26.By.css(this.titleSelector));
|
|
1875
2526
|
return await el.getText();
|
|
1876
2527
|
}
|
|
1877
2528
|
async text() {
|
|
1878
|
-
const el = await this.driver.findElement(
|
|
2529
|
+
const el = await this.driver.findElement(import_selenium_webdriver26.By.css(this.textSelector));
|
|
1879
2530
|
return await el.getText();
|
|
1880
2531
|
}
|
|
1881
2532
|
button(text) {
|