flagpole
Version:
Simple and fast DOM integration, headless or headful browser, and REST API testing framework.
201 lines • 9.18 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExtJSResponse = void 0;
const extjs_component_1 = require("./extjs-component");
const puppeteer_response_1 = require("./puppeteer-response");
const util_1 = require("../util");
const helpers_1 = require("../helpers");
const browser_element_1 = require("./browser-element");
const extjs_helper_1 = require("./extjs-helper");
const value_promise_1 = require("../value-promise");
class ExtJSResponse extends puppeteer_response_1.PuppeteerResponse {
constructor(scenario) {
super(scenario);
scenario.before(() => {
scenario.nextPrepend((context) => __awaiter(this, void 0, void 0, function* () {
if (scenario.page === null) {
context.logFailure("Browser page not found");
return;
}
yield scenario.page.waitForFunction(() => !!Ext && !!Ext.ComponentQuery);
yield this._injectScript(`
isExtReady = false;
Ext.onReady(() => {
isExtReady = true;
});
`);
yield scenario.page.waitForFunction("isExtReady");
}));
});
}
findXPath(xPath) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
if (!this.page) {
throw "Page must be defined.";
}
const elements = yield this.page.$x(xPath);
if (elements.length > 0) {
return yield extjs_component_1.ExtJsComponent.create(elements[0], this.context, xPath, xPath);
}
return helpers_1.wrapAsValue(this.context, null, xPath);
}));
}
findAllXPath(xPath) {
return __awaiter(this, void 0, void 0, function* () {
if (!this.page) {
throw "Page must be defined.";
}
const puppeteerElements = [];
if (this.scenario.page !== null) {
const elements = yield this.scenario.page.$x(xPath);
yield util_1.asyncForEach(elements, (el, i) => __awaiter(this, void 0, void 0, function* () {
const element = yield extjs_component_1.ExtJsComponent.create(el, this.context, `${xPath} [${i}]`, xPath);
puppeteerElements.push(element);
}));
}
return puppeteerElements;
});
}
waitForExists(path, a, b) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
if (this.page === null) {
throw "Could not find browser page object.";
}
const ref = yield this.page.waitForFunction(`Ext.ComponentQuery.query("${path}")`, {
timeout: this.getTimeoutFromOverload(a, b),
});
return yield extjs_component_1.ExtJsComponent.create(ref, this.context, `${path}[0]`, path);
}));
}
type(selector, textToType, opts = {}) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
const component = yield this.find(selector);
yield component.type(textToType, opts);
return component;
}));
}
clear(selector) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
const component = yield this.find(selector);
yield component.focus();
yield component.setValue("");
yield component.blur();
return component;
}));
}
getComponentById(id) {
return __awaiter(this, void 0, void 0, function* () {
const ref = yield this._page.evaluateHandle(`Ext.getCmp(${id}")`);
return ref
? yield extjs_component_1.ExtJsComponent.create(ref, this.context, `#${id}`, `#${id}`)
: null;
});
}
_getComponent(js, name, path) {
return __awaiter(this, void 0, void 0, function* () {
const ref = yield this._page.evaluateHandle(js);
return ref
? yield extjs_component_1.ExtJsComponent.create(ref, this.context, name, path)
: helpers_1.wrapAsValue(this.context, null, name, path);
});
}
_injectScript(content) {
return __awaiter(this, void 0, void 0, function* () {
if (this.page === null) {
throw "Page must be defined.";
}
return this.page.addScriptTag({
content: content,
});
});
}
find(selector, a, b) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
const params = helpers_1.getFindParams(a, b);
if (params.opts || params.matches || params.contains) {
return helpers_1.findOne(this, selector, params);
}
const components = yield this._query(selector, params);
if (components.length) {
return components[0];
}
const el = yield this._page.$(selector);
if (el !== null) {
const component = yield this._getComponentOrElementFromHandle(el, selector, selector);
if (component) {
return component;
}
}
return helpers_1.wrapAsValue(this.context, null, selector);
}));
}
findAll(selector, a, b) {
return __awaiter(this, void 0, void 0, function* () {
const params = helpers_1.getFindParams(a, b);
const components = yield (() => __awaiter(this, void 0, void 0, function* () {
const components = yield this._query(selector, params);
if (components.length) {
return components;
}
const elements = yield this._page.$$(selector);
return util_1.asyncMap(elements, (el, i) => __awaiter(this, void 0, void 0, function* () {
return yield this._getComponentOrElementFromHandle(el, helpers_1.getFindName(params, selector, i), `${selector} [${i}]`);
}));
}))();
return helpers_1.filterFind(components, params.contains || params.matches, params.opts);
});
}
selectOption(selector, value) {
return value_promise_1.ValuePromise.execute(() => __awaiter(this, void 0, void 0, function* () {
const component = yield this.find(selector);
if (!component.isNull()) {
component.selectOption(value);
}
return component;
}));
}
_getComponentOrElementFromHandle(el, path, name) {
return __awaiter(this, void 0, void 0, function* () {
const isComponent = !!(yield (yield el.getProperty("data-componentid")).jsonValue());
return isComponent
? this._getComponentFromElementHandle(el)
: browser_element_1.BrowserElement.create(el, this.context, name, path);
});
}
_getComponentFromElementHandle(el) {
return __awaiter(this, void 0, void 0, function* () {
const componentId = yield el.evaluate((node) => {
const id = node.getAttribute("data-componentid");
if (id) {
return id;
}
const closestComponent = node.closest("[data-componentid]");
if (closestComponent) {
return closestComponent.getAttribute("data-componentid");
}
return null;
});
return (componentId && (yield this.getComponentById(componentId))) || null;
});
}
_query(selector, params) {
return __awaiter(this, void 0, void 0, function* () {
const results = yield extjs_helper_1.query(this._page, selector);
const components = yield extjs_helper_1.jsHandleArrayToHandles(results);
return util_1.asyncMap(components, (component, i) => __awaiter(this, void 0, void 0, function* () {
return yield extjs_component_1.ExtJsComponent.create(component, this.context, helpers_1.getFindName(params, selector, i), selector);
}));
});
}
}
exports.ExtJSResponse = ExtJSResponse;
//# sourceMappingURL=extjs-response.js.map
;