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