flagpole
Version:
Simple and fast DOM integration, headless or headful browser, and REST API testing framework.
220 lines • 9.43 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 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