UNPKG

flagpole

Version:

Simple and fast DOM integration, headless or headful browser, and REST API testing framework.

220 lines 9.43 kB
"use strict"; 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 extjscomponent_1 = require("./extjscomponent"); const puppeteerresponse_1 = require("./puppeteerresponse"); const util_1 = require("./util"); const browserelement_1 = require("./browserelement"); class ExtJSResponse extends puppeteerresponse_1.PuppeteerResponse { get responseTypeName() { return "ExtJS"; } get responseType() { return "extjs"; } constructor(scenario) { super(scenario); scenario.before(() => { scenario.nextPrepend((context) => __awaiter(this, void 0, void 0, function* () { if (context.page === null) { context.logFailure("Browser page not found"); return; } yield context.page.waitForFunction(() => !!Ext && !!Ext.ComponentQuery); yield this._injectScript(` isExtReady = false; Ext.onReady(() => { isExtReady = true; }); `); yield context.page.waitForFunction("isExtReady"); })); }); } findXPath(xPath) { return __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 extjscomponent_1.ExtJsComponent.create(elements[0], this.context, xPath); } return util_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 response = this; const puppeteerElements = []; if (this.context.page !== null) { const elements = yield this.context.page.$x(xPath); yield util_1.asyncForEach(elements, (el, i) => __awaiter(this, void 0, void 0, function* () { const element = yield extjscomponent_1.ExtJsComponent.create(el, response.context, `${xPath} [${i}]`, xPath); puppeteerElements.push(element); })); } return puppeteerElements; }); } waitForExists(path, timeout = 5000) { return __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: timeout, }); return yield extjscomponent_1.ExtJsComponent.create(ref, this.context, `${path}[0]`, path); }); } type(selector, textToType, opts = {}) { return __awaiter(this, void 0, void 0, function* () { if (this.page !== null) { const component = yield this.find(selector); if (component instanceof extjscomponent_1.ExtJsComponent) { return component.type(textToType, opts); } else { throw new Error(`Could not find component at ${selector}`); } } throw new Error(`Can not type into element ${selector}`); }); } clear(selector) { return __awaiter(this, void 0, void 0, function* () { if (this.page !== null) { const component = yield this.find(selector); if (component instanceof extjscomponent_1.ExtJsComponent) { component.focus(); component.setValue(""); component.blur(); } else { throw new Error(`Could not find component at ${selector}`); } } throw new Error(`Can not type into this element ${selector}`); }); } getComponentById(id) { return __awaiter(this, void 0, void 0, function* () { const ref = yield this._page.evaluateHandle(`Ext.getCmp(${id}")`); return ref ? yield extjscomponent_1.ExtJsComponent.create(ref, this.context, `#${id}`) : null; }); } _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 __awaiter(this, void 0, void 0, function* () { const params = util_1.getFindParams(a, b); if (params.opts || params.matches || params.contains) { return util_1.findOne(this, selector, params); } const components = yield this._query(selector); 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 util_1.wrapAsValue(this.context, null, selector); }); } findAll(selector, a, b) { return __awaiter(this, void 0, void 0, function* () { const components = yield (() => __awaiter(this, void 0, void 0, function* () { const components = yield this._query(selector); 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* () { const component = yield this._getComponentOrElementFromHandle(el, selector, `${selector} [${i}]`); })); }))(); const params = util_1.getFindParams(a, b); return util_1.filterFind(components, params.contains || params.matches, params.opts); }); } selectOption(selector, value) { return __awaiter(this, void 0, void 0, function* () { const component = yield this.find(selector); if (!component.isNull()) { component.selectOption(value); } }); } _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) : browserelement_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) { return __awaiter(this, void 0, void 0, function* () { const components = yield this._queryGetHandle(selector); return util_1.asyncMap(components, (component, i) => __awaiter(this, void 0, void 0, function* () { return yield extjscomponent_1.ExtJsComponent.create(component, this.context, `${selector}[${i}]`); })); }); } _queryGetHandle(selector) { return __awaiter(this, void 0, void 0, function* () { const results = yield this._page.evaluateHandle((selector) => Ext.ComponentQuery.query(selector), selector); const length = yield results.evaluate((r) => r.length); const components = []; for (let i = 0; i < length; i++) { components.push(yield results.evaluateHandle((r, i) => r[i], i)); } return components; }); } } exports.ExtJSResponse = ExtJSResponse; //# sourceMappingURL=extjsresponse.js.map