blob: d735356746f0dae0339c04730ae51cfa1be8337e [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const http = require("http");
const url = require("url");
/**
* Super dumb and simple WebDriver client. Works with selenium standalone, may or may not work yet
* directly with other drivers.
*/
class SimpleWebDriverClient {
constructor(seleniumAddress) {
this.seleniumAddress = seleniumAddress;
}
/**
* Send an execute script command.
*
* @param sessionId
* @param data A JSON blob with the script and arguments to execute.
*/
execute(sessionId, data) {
const url = ['session', sessionId, 'execute'].join('/');
return this.createSeleniumRequest('POST', url, data);
}
/**
* Send an execute async script command.
*
* @param sessionId
* @param data A JSON blob with the script and arguments to execute.
*/
executeAsync(sessionId, data) {
const url = ['session', sessionId, 'execute_async'].join('/');
return this.createSeleniumRequest('POST', url, data);
}
/**
* Get the location of an element.
*
* @param sessionId
* @param elementId
* @returns Promise<{}> A promise that resolves with the x and y coordinates of the element.
*/
getLocation(sessionId, elementId) {
const url = ['session', sessionId, 'element', elementId, 'location'].join('/');
return this.createSeleniumRequest('GET', url);
}
/**
* Get the size of an element.
*
* @param sessionId
* @param elementId
* @returns Promise<{}> A promise that resolves with the height and width of the element.
*/
getSize(sessionId, elementId) {
const url = ['session', sessionId, 'element', elementId, 'size'].join('/');
return this.createSeleniumRequest('GET', url);
}
createSeleniumRequest(method, messageUrl, data) {
let parsedUrl = url.parse(this.seleniumAddress);
let options = {};
options['method'] = method;
options['path'] = parsedUrl.path + '/' + messageUrl;
options['hostname'] = parsedUrl.hostname;
options['port'] = parseInt(parsedUrl.port);
let request = http.request(options);
return new Promise((resolve, reject) => {
if (data) {
request.write(data);
}
request.end();
request.on('response', (resp) => {
let respData = '';
resp.on('data', (d) => {
respData += d;
});
resp.on('error', (err) => {
reject(err);
});
resp.on('end', () => {
let response = JSON.parse(respData);
// Selenium 3.5.x or greater
if (response.status && response.status > 0) {
console.error(`Got status ${response.status} from selenium`, response.value);
reject(JSON.stringify(response.value));
}
// Selenium 3.0.x
if (response.state && response.state !== 'success') {
console.error(`Got response ${response.state} from selenium`, response.value);
reject(JSON.stringify(response.value));
}
resolve(response.value);
});
});
});
}
;
}
exports.SimpleWebDriverClient = SimpleWebDriverClient;
//# sourceMappingURL=simple_webdriver_client.js.map