@copperjs/copper
Version:
A lightweight chromium grid
110 lines • 4.37 kB
JavaScript
;
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