UNPKG

@copperjs/copper

Version:
110 lines 4.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.elements = exports.elementHandles = void 0; const errors_1 = require("../../../common/errors"); const W3C_ELEMENT_ID = 'element-6066-11e4-a52e-4f735466cecf'; exports.elementHandles = new (class { constructor() { this.pages = new WeakMap(); } getPageMap(page) { if (this.pages.has(page)) { return this.pages.get(page); } const elementsMap = new Map(); this.pages.set(page, elementsMap); return elementsMap; } getElementId(element) { var _a; return (_a = element._remoteObject.objectId) !== null && _a !== void 0 ? _a : ''; } set(page, element) { const elementsMap = this.getPageMap(page); const elementId = this.getElementId(element); if (elementsMap.has(elementId)) { return elementsMap.get(elementId); } else { elementsMap.set(elementId, element); } } get(page, elementId) { const elementsMap = this.getPageMap(page); return elementsMap.get(elementId); } })(); const elements = (app, opts, done) => { app.post('/element', async (req) => { // we intentionally ignore most locator strategies that are not CSS selectors or xpath // If someone is interested in implementing the other ones it should be easy and be my guest. const { using, value } = req.body; if (!using || !value) { throw new errors_1.WebdriverError('missing either using or value'); } let elementHandle = null; if (using === 'css selector') { elementHandle = await req.puppeteer.page.$(value); } if (using === 'xpath') { elementHandle = (await req.puppeteer.page.$x(value))[0]; } if (!elementHandle) { throw new errors_1.WebdriverError('no such element'); } exports.elementHandles.set(req.puppeteer.page, elementHandle); return { status: 0, value: { [W3C_ELEMENT_ID]: exports.elementHandles.getElementId(elementHandle) }, state: 'success' }; }); app.get('/element/:elementId/text', async (req) => { const { elementId } = req.params; if (!elementId) { throw new Error('missing element id'); } const elementHandle = exports.elementHandles.get(req.puppeteer.page, elementId); if (!elementHandle) { throw new Error(`element ${elementId} does not exist`); } const value = await elementHandle.evaluate(/* istanbul ignore next */ (el) => el.innerHTML); return { status: 0, value, state: 'success' }; }); app.post('/element/:elementId/click', async (req) => { const { elementId } = req.params; if (!elementId) { throw new Error('missing element id'); } const elementHandle = exports.elementHandles.get(req.puppeteer.page, elementId); if (!elementHandle) { throw new Error(`element ${elementId} does not exist`); } await elementHandle.click(); return { status: 0, value: null, state: 'success' }; }); app.post('/element/:elementId/value', async (req) => { const { elementId } = req.params; if (!elementId) { throw new Error('missing element id'); } const elementHandle = exports.elementHandles.get(req.puppeteer.page, elementId); if (!elementHandle) { throw new Error(`element ${elementId} does not exist`); } const text = Array.isArray(req.body.value) ? req.body.value.join('') : req.body.value; await elementHandle.type(text); return { status: 0, value: null, state: 'success' }; }); app.post('/element/:elementId/clear', async (req) => { const { elementId } = req.params; if (!elementId) { throw new Error('missing element id'); } const elementHandle = exports.elementHandles.get(req.puppeteer.page, elementId); if (!elementHandle) { throw new Error(`element ${elementId} does not exist`); } await elementHandle.type(''); return { status: 0, value: null, state: 'success' }; }); done(); }; exports.elements = elements; //# sourceMappingURL=elements.js.map