diff --git a/README.md b/README.md index fc7d946..08ad683 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,18 @@ chromedriver.start(args); chromedriver.stop(); ``` + +With the latest version, you can optionally receive a Promise from the `chromedriver.start` function: + +```javascript +var returnPromise = true; +chromedriver + .start(args, returnPromise) + .then(() => { + console.log('chromedriver is ready'); + }); +``` + Note: if your tests are ran asynchronously, chromedriver.stop() will have to be executed as a callback at the end of your tests diff --git a/lib/chromedriver.js b/lib/chromedriver.js index 0fa1bc4..651c49a 100644 --- a/lib/chromedriver.js +++ b/lib/chromedriver.js @@ -1,13 +1,37 @@ var path = require('path'); +var tcpPortUsed = require('tcp-port-used'); +function getPortFromArgs(args) { + var port = 9515; + if (!args){ + return port; + } + var portRegexp = /--port=(\d*)/; + var portArg = args.find(function (arg) { + return portRegexp.test(arg); + }); + if (portArg){ + port = parseInt(portRegexp.exec(portArg)[1]); + } + return port; +}; process.env.PATH = path.join(__dirname, 'chromedriver') + path.delimiter + process.env.PATH; exports.path = process.platform === 'win32' ? path.join(__dirname, 'chromedriver', 'chromedriver.exe') : path.join(__dirname, 'chromedriver', 'chromedriver'); exports.version = '2.43'; -exports.start = function(args) { +exports.start = function(args, returnPromise) { var cp = require('child_process').spawn(exports.path, args); cp.stdout.pipe(process.stdout); cp.stderr.pipe(process.stderr); exports.defaultInstance = cp; - return cp; + if (!returnPromise) { + return cp; + } + var port = getPortFromArgs(args); + var pollInterval = 100; + var timeout = 10000; + return tcpPortUsed.waitUntilUsed(port, pollInterval, timeout) + .then(function () { + return cp; + }); }; exports.stop = function () { if (exports.defaultInstance != null){ diff --git a/package-lock.json b/package-lock.json index 06dc1f5..0ae8787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,6 +136,11 @@ "ms": "2.0.0" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -300,6 +305,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -326,6 +336,21 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", + "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^2.1.0", + "is-url": "^1.2.2" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -571,6 +596,25 @@ "safe-buffer": "~5.1.0" } }, + "tcp-port-used": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.0.tgz", + "integrity": "sha512-urotaMxVc37q9avahpxjSp47ZfN5MvyxXTvbGOiERaSjQ/kQCNTSMKcTyntKowzX27ZgB+jE0qRIDQv/ILiIwg==", + "requires": { + "debug": "3.1.0", + "is2": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", diff --git a/package.json b/package.json index 797efde..beed72c 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "extract-zip": "^1.6.7", "kew": "^0.7.0", "mkdirp": "^0.5.1", - "request": "^2.87.0" + "request": "^2.87.0", + "tcp-port-used": "^1.0.0" } }