This code defines a clickElement
function that simulates a mouse click on an element with a specified id
using the Chrome debugger, and exports it along with an Express router instance that listens for POST requests to click elements. The clickElement
function uses a sequence of Chrome debugger commands to resolve the element, evaluate a promise, and simulate a mouse click at the resolved coordinates.
var importer = require('../Core');
var express = require('express');
var router = express.Router();
function clickElement(id) {
// TODO: scroll page
return promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'DOM.resolveNode', {
objectId: id
})
.then(r => {
console.log(r);
promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Runtime.evaluate', {
expression: `new window.BackupPromise(resolve => setTimeout(() => {
resolve();
}, 500))`,
awaitPromise: true
})})
.then(r => promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Input.dispatchMouseEvent', {
type: 'mousePressed',
x: r.x,
y: r.y,
}))
.catch(e => console.log(e))
// TODO: click center
}
router.post('/session/:sessionId/element/:id/click', (req, res) => {
response(res, clickElement(parseInt(req.params['id'])))
}); //,"ClickElement",ExecuteClickElement,
module.exports = {
clickElement,
router
}
const { promisifyChrome, getTab, response } = require('../Core');
const express = require('express');
const clickElement = (id) => {
return promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'DOM.resolveNode', {
objectId: id
})
.then((node) => {
console.log(node);
return promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Runtime.evaluate', {
expression: `new window.BackupPromise(resolve => setTimeout(() => {
resolve();
}, 500))`,
awaitPromise: true
});
})
.then(() => {
const { x, y } = node.result;
return promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Input.dispatchMouseEvent', {
type:'mousePressed',
x,
y,
});
})
.catch((error) => {
console.error(error);
return { code: 500, message: 'Error clicking element' };
});
};
const router = express.Router();
router.post('/session/:sessionId/element/:id/click', (req, res) => {
response(res, clickElement(parseInt(req.params['id'])));
});
module.exports = {
clickElement,
router,
};
var importer = require('../Core');
var express = require('express');
var router = express.Router();
../Core
module and the express
framework.express.Router
class is created.clickElement
Functionfunction clickElement(id) {
// TODO: scroll page
return promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'DOM.resolveNode', {
objectId: id
})
.then(r => {
console.log(r);
promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Runtime.evaluate', {
expression: `new window.BackupPromise(resolve => setTimeout(() => {
resolve();
}, 500))`,
awaitPromise: true
})})
.then(r => promisifyChrome('debugger.sendCommand', {
tabId: getTab()
}, 'Input.dispatchMouseEvent', {
type:'mousePressed',
x: r.x,
y: r.y,
}))
.catch(e => console.log(e))
// TODO: click center
}
clickElement
function simulates a mouse click on an element with the specified id
.promisifyChrome
function to send commands to the Chrome debugger.DOM.resolveNode
to resolve the node with the specified id
.Runtime.evaluate
to evaluate a promise that resolves after a 500ms delay.Input.dispatchMouseEvent
to simulate a mouse click at the coordinates of the resolved node.router.post('/session/:sessionId/element/:id/click', (req, res) => {
response(res, clickElement(parseInt(req.params['id'])))
});
/session/:sessionId/element/:id/click
endpoint.clickElement
function with the id
parameter from the request URL and passes the result to the response
function.module.exports = {
clickElement,
router
}
clickElement
function and the Express router instance.