simple_webdriver_client.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const http = require("http");
  4. const url = require("url");
  5. /**
  6. * Super dumb and simple WebDriver client. Works with selenium standalone, may or may not work yet
  7. * directly with other drivers.
  8. */
  9. class SimpleWebDriverClient {
  10. constructor(seleniumAddress) {
  11. this.seleniumAddress = seleniumAddress;
  12. }
  13. /**
  14. * Send an execute script command.
  15. *
  16. * @param sessionId
  17. * @param data A JSON blob with the script and arguments to execute.
  18. */
  19. execute(sessionId, data) {
  20. const url = ['session', sessionId, 'execute'].join('/');
  21. return this.createSeleniumRequest('POST', url, data);
  22. }
  23. /**
  24. * Send an execute async script command.
  25. *
  26. * @param sessionId
  27. * @param data A JSON blob with the script and arguments to execute.
  28. */
  29. executeAsync(sessionId, data) {
  30. const url = ['session', sessionId, 'execute_async'].join('/');
  31. return this.createSeleniumRequest('POST', url, data);
  32. }
  33. /**
  34. * Get the location of an element.
  35. *
  36. * @param sessionId
  37. * @param elementId
  38. * @returns Promise<{}> A promise that resolves with the x and y coordinates of the element.
  39. */
  40. getLocation(sessionId, elementId) {
  41. const url = ['session', sessionId, 'element', elementId, 'location'].join('/');
  42. return this.createSeleniumRequest('GET', url);
  43. }
  44. /**
  45. * Get the size of an element.
  46. *
  47. * @param sessionId
  48. * @param elementId
  49. * @returns Promise<{}> A promise that resolves with the height and width of the element.
  50. */
  51. getSize(sessionId, elementId) {
  52. const url = ['session', sessionId, 'element', elementId, 'size'].join('/');
  53. return this.createSeleniumRequest('GET', url);
  54. }
  55. createSeleniumRequest(method, messageUrl, data) {
  56. let parsedUrl = url.parse(this.seleniumAddress);
  57. let options = {};
  58. options['method'] = method;
  59. options['path'] = parsedUrl.path + '/' + messageUrl;
  60. options['hostname'] = parsedUrl.hostname;
  61. options['port'] = parseInt(parsedUrl.port);
  62. let request = http.request(options);
  63. return new Promise((resolve, reject) => {
  64. if (data) {
  65. request.write(data);
  66. }
  67. request.end();
  68. request.on('response', (resp) => {
  69. let respData = '';
  70. resp.on('data', (d) => {
  71. respData += d;
  72. });
  73. resp.on('error', (err) => {
  74. reject(err);
  75. });
  76. resp.on('end', () => {
  77. let response = JSON.parse(respData);
  78. // Selenium 3.5.x or greater
  79. if (response.status && response.status > 0) {
  80. console.error(`Got status ${response.status} from selenium`, response.value);
  81. reject(JSON.stringify(response.value));
  82. }
  83. // Selenium 3.0.x
  84. if (response.state && response.state !== 'success') {
  85. console.error(`Got response ${response.state} from selenium`, response.value);
  86. reject(JSON.stringify(response.value));
  87. }
  88. resolve(response.value);
  89. });
  90. });
  91. });
  92. }
  93. ;
  94. }
  95. exports.SimpleWebDriverClient = SimpleWebDriverClient;
  96. //# sourceMappingURL=simple_webdriver_client.js.map