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