selenium server | Cell 5 | | Search

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.

Cell 6

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
}

What the code could have been:

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,
};

Code Breakdown

Requires and Dependencies

var importer = require('../Core');
var express = require('express');
var router = express.Router();

clickElement Function

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
}

Express Router Middleware

router.post('/session/:sessionId/element/:id/click', (req, res) => {
    response(res, clickElement(parseInt(req.params['id'])))
});

Module Exports

module.exports = {
    clickElement,
    router
}