├── .github └── workflows │ └── Semgrep.yml ├── .gitignore ├── CODEOWNERS ├── README.md ├── mocha └── BrowserStackRemoteUnit.js ├── package-lock.json ├── package.json ├── parallel.js └── single.js /.github/workflows/Semgrep.yml: -------------------------------------------------------------------------------- 1 | # Name of this GitHub Actions workflow. 2 | name: Semgrep 3 | 4 | on: 5 | # Scan changed files in PRs (diff-aware scanning): 6 | # The branches below must be a subset of the branches above 7 | pull_request: 8 | branches: ["master", "main"] 9 | push: 10 | branches: ["master", "main"] 11 | schedule: 12 | - cron: '0 6 * * *' 13 | 14 | 15 | permissions: 16 | contents: read 17 | 18 | jobs: 19 | semgrep: 20 | # User definable name of this GitHub Actions job. 21 | permissions: 22 | contents: read # for actions/checkout to fetch code 23 | security-events: write # for github/codeql-action/upload-sarif to upload SARIF results 24 | name: semgrep/ci 25 | # If you are self-hosting, change the following `runs-on` value: 26 | runs-on: ubuntu-latest 27 | 28 | container: 29 | # A Docker image with Semgrep installed. Do not change this. 30 | image: returntocorp/semgrep 31 | 32 | # Skip any PR created by dependabot to avoid permission issues: 33 | if: (github.actor != 'dependabot[bot]') 34 | 35 | steps: 36 | # Fetch project source with GitHub Actions Checkout. 37 | - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 38 | # Run the "semgrep ci" command on the command line of the docker image. 39 | - run: semgrep ci --sarif --output=semgrep.sarif 40 | env: 41 | # Add the rules that Semgrep uses by setting the SEMGREP_RULES environment variable. 42 | SEMGREP_RULES: p/default # more at semgrep.dev/explore 43 | 44 | - name: Upload SARIF file for GitHub Advanced Security Dashboard 45 | uses: github/codeql-action/upload-sarif@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0 46 | with: 47 | sarif_file: semgrep.sarif 48 | if: always() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @browserstack/automate-public-repos 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Automate Node Samples 2 | 3 | This repository contains code samples from http://browserstack.com/automate/node. Please feel free to clone the repo and use the example code. 4 | 5 | Master branch contains **Selenium 3** samples, for **Selenium 4 - W3C protocol** please checkout [selenium-4](https://github.com/browserstack/automate-node-samples/tree/selenium-4) branch 6 | 7 | Do remember to switch the BROWSERSTACK_USERNAME and BROWSERSTACK_ACCESS_KEY with your own browserstack credentials. 8 | 9 | #### Setup 10 | To setup run `npm install` 11 | 12 | #### Samples 13 | 1. `node single.js` : Run test on a single browser. 14 | 2. `node parallel.js` : Run test on multiple browsers. 15 | 3. `mocha mocha/BrowserStackRemoteUnit.js` : Run sample mocha test. 16 | 17 | ## Other frameworks 18 | 19 | For other nodejs frameworks, refer to their individual repositories - 20 | 21 | - [Internjs](https://github.com/browserstack/intern-browserstack) 22 | - [Protractor](https://github.com/browserstack/protractor-browserstack) 23 | - [Nightwatch](https://github.com/browserstack/nightwatch-browserstack) 24 | - [WD](https://github.com/browserstack/wd-browserstack) 25 | - [Nemo](https://github.com/browserstack/nemo-browserstack) 26 | -------------------------------------------------------------------------------- /mocha/BrowserStackRemoteUnit.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | 3 | const { Builder, By, Key, until } = require('selenium-webdriver'); 4 | const http = require('http'); 5 | 6 | const BROWSERSTACK_USERNAME = process.env.BROWSERSTACK_USERNAME || 'BROWSERSTACK_USERNAME'; 7 | const BROWSERSTACK_ACCESS_KEY = process.env.BROWSERSTACK_ACCESS_KEY || 'BROWSERSTACK_ACCESS_KEY'; 8 | 9 | let HttpAgent = new http.Agent({ 10 | keepAlive: true, 11 | }); 12 | 13 | describe('Google Search', function () { 14 | let driver; 15 | 16 | before(function () { 17 | let capabilities = { 18 | browserName: 'Firefox', 19 | name: 'Firefox Test', 20 | os: 'Windows', 21 | build: 'Test Build 01', 22 | project: 'My Awesome App', 23 | 'browserstack.debug': true, 24 | }; 25 | driver = new Builder() 26 | .usingHttpAgent(HttpAgent) 27 | .withCapabilities(capabilities) 28 | .usingServer(`http://${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}@hub-cloud.browserstack.com/wd/hub`) 29 | .build(); 30 | }); 31 | 32 | it('should append query to title', function (done) { 33 | this.timeout(30000); 34 | driver.get('http://www.google.com/ncr').then(() => { 35 | driver.findElement(By.name('q')).then((element) => { 36 | element.sendKeys('BrowserStack', Key.RETURN).then(() => { 37 | driver.wait(until.stalenessOf(element)).then(() => driver.getTitle().then((title) => { 38 | assert.equal(title, 'BrowserStack - Google Search'); 39 | done(); 40 | })); 41 | }); 42 | }); 43 | }); 44 | }); 45 | 46 | after(function () { 47 | driver.quit(); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "automate-node-samples", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-colors": { 8 | "version": "3.2.3", 9 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 10 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" 11 | }, 12 | "ansi-regex": { 13 | "version": "3.0.0", 14 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 15 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 16 | }, 17 | "ansi-styles": { 18 | "version": "3.2.1", 19 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 20 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 21 | "requires": { 22 | "color-convert": "^1.9.0" 23 | } 24 | }, 25 | "anymatch": { 26 | "version": "3.1.1", 27 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 28 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 29 | "requires": { 30 | "normalize-path": "^3.0.0", 31 | "picomatch": "^2.0.4" 32 | } 33 | }, 34 | "argparse": { 35 | "version": "1.0.10", 36 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 37 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 38 | "requires": { 39 | "sprintf-js": "~1.0.2" 40 | } 41 | }, 42 | "balanced-match": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 45 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 46 | }, 47 | "binary-extensions": { 48 | "version": "2.0.0", 49 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 50 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" 51 | }, 52 | "brace-expansion": { 53 | "version": "1.1.11", 54 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 55 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 56 | "requires": { 57 | "balanced-match": "^1.0.0", 58 | "concat-map": "0.0.1" 59 | } 60 | }, 61 | "braces": { 62 | "version": "3.0.2", 63 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 64 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 65 | "requires": { 66 | "fill-range": "^7.0.1" 67 | } 68 | }, 69 | "browser-stdout": { 70 | "version": "1.3.1", 71 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 72 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 73 | }, 74 | "camelcase": { 75 | "version": "5.3.1", 76 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 77 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 78 | }, 79 | "chalk": { 80 | "version": "2.4.2", 81 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 82 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 83 | "requires": { 84 | "ansi-styles": "^3.2.1", 85 | "escape-string-regexp": "^1.0.5", 86 | "supports-color": "^5.3.0" 87 | }, 88 | "dependencies": { 89 | "supports-color": { 90 | "version": "5.5.0", 91 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 92 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 93 | "requires": { 94 | "has-flag": "^3.0.0" 95 | } 96 | } 97 | } 98 | }, 99 | "chokidar": { 100 | "version": "3.3.0", 101 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 102 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 103 | "requires": { 104 | "anymatch": "~3.1.1", 105 | "braces": "~3.0.2", 106 | "fsevents": "~2.1.1", 107 | "glob-parent": "~5.1.0", 108 | "is-binary-path": "~2.1.0", 109 | "is-glob": "~4.0.1", 110 | "normalize-path": "~3.0.0", 111 | "readdirp": "~3.2.0" 112 | } 113 | }, 114 | "cliui": { 115 | "version": "5.0.0", 116 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 117 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 118 | "requires": { 119 | "string-width": "^3.1.0", 120 | "strip-ansi": "^5.2.0", 121 | "wrap-ansi": "^5.1.0" 122 | }, 123 | "dependencies": { 124 | "ansi-regex": { 125 | "version": "4.1.0", 126 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 127 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 128 | }, 129 | "string-width": { 130 | "version": "3.1.0", 131 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 132 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 133 | "requires": { 134 | "emoji-regex": "^7.0.1", 135 | "is-fullwidth-code-point": "^2.0.0", 136 | "strip-ansi": "^5.1.0" 137 | } 138 | }, 139 | "strip-ansi": { 140 | "version": "5.2.0", 141 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 142 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 143 | "requires": { 144 | "ansi-regex": "^4.1.0" 145 | } 146 | } 147 | } 148 | }, 149 | "color-convert": { 150 | "version": "1.9.3", 151 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 152 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 153 | "requires": { 154 | "color-name": "1.1.3" 155 | } 156 | }, 157 | "color-name": { 158 | "version": "1.1.3", 159 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 160 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 161 | }, 162 | "concat-map": { 163 | "version": "0.0.1", 164 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 165 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 166 | }, 167 | "core-js": { 168 | "version": "2.3.0", 169 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", 170 | "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=" 171 | }, 172 | "core-util-is": { 173 | "version": "1.0.2", 174 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 175 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 176 | }, 177 | "debug": { 178 | "version": "3.2.6", 179 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 180 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 181 | "requires": { 182 | "ms": "^2.1.1" 183 | } 184 | }, 185 | "decamelize": { 186 | "version": "1.2.0", 187 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 188 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 189 | }, 190 | "define-properties": { 191 | "version": "1.1.3", 192 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 193 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 194 | "requires": { 195 | "object-keys": "^1.0.12" 196 | } 197 | }, 198 | "diff": { 199 | "version": "3.5.0", 200 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 201 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" 202 | }, 203 | "emoji-regex": { 204 | "version": "7.0.3", 205 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 206 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 207 | }, 208 | "es-abstract": { 209 | "version": "1.17.5", 210 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 211 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 212 | "requires": { 213 | "es-to-primitive": "^1.2.1", 214 | "function-bind": "^1.1.1", 215 | "has": "^1.0.3", 216 | "has-symbols": "^1.0.1", 217 | "is-callable": "^1.1.5", 218 | "is-regex": "^1.0.5", 219 | "object-inspect": "^1.7.0", 220 | "object-keys": "^1.1.1", 221 | "object.assign": "^4.1.0", 222 | "string.prototype.trimleft": "^2.1.1", 223 | "string.prototype.trimright": "^2.1.1" 224 | } 225 | }, 226 | "es-to-primitive": { 227 | "version": "1.2.1", 228 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 229 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 230 | "requires": { 231 | "is-callable": "^1.1.4", 232 | "is-date-object": "^1.0.1", 233 | "is-symbol": "^1.0.2" 234 | } 235 | }, 236 | "es6-promise": { 237 | "version": "3.0.2", 238 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", 239 | "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=" 240 | }, 241 | "escape-string-regexp": { 242 | "version": "1.0.5", 243 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 244 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 245 | }, 246 | "esprima": { 247 | "version": "4.0.1", 248 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 249 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 250 | }, 251 | "fill-range": { 252 | "version": "7.0.1", 253 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 254 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 255 | "requires": { 256 | "to-regex-range": "^5.0.1" 257 | } 258 | }, 259 | "find-up": { 260 | "version": "3.0.0", 261 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 262 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 263 | "requires": { 264 | "locate-path": "^3.0.0" 265 | } 266 | }, 267 | "flat": { 268 | "version": "4.1.0", 269 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 270 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 271 | "requires": { 272 | "is-buffer": "~2.0.3" 273 | } 274 | }, 275 | "fs.realpath": { 276 | "version": "1.0.0", 277 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 278 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 279 | }, 280 | "fsevents": { 281 | "version": "2.1.2", 282 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 283 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 284 | "optional": true 285 | }, 286 | "function-bind": { 287 | "version": "1.1.1", 288 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 289 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 290 | }, 291 | "get-caller-file": { 292 | "version": "2.0.5", 293 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 294 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 295 | }, 296 | "glob": { 297 | "version": "7.1.3", 298 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 299 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 300 | "requires": { 301 | "fs.realpath": "^1.0.0", 302 | "inflight": "^1.0.4", 303 | "inherits": "2", 304 | "minimatch": "^3.0.4", 305 | "once": "^1.3.0", 306 | "path-is-absolute": "^1.0.0" 307 | } 308 | }, 309 | "glob-parent": { 310 | "version": "5.1.1", 311 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 312 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 313 | "requires": { 314 | "is-glob": "^4.0.1" 315 | } 316 | }, 317 | "growl": { 318 | "version": "1.10.5", 319 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 320 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 321 | }, 322 | "has": { 323 | "version": "1.0.3", 324 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 325 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 326 | "requires": { 327 | "function-bind": "^1.1.1" 328 | } 329 | }, 330 | "has-flag": { 331 | "version": "3.0.0", 332 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 333 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 334 | }, 335 | "has-symbols": { 336 | "version": "1.0.1", 337 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 338 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 339 | }, 340 | "he": { 341 | "version": "1.2.0", 342 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 343 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 344 | }, 345 | "immediate": { 346 | "version": "3.0.6", 347 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 348 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" 349 | }, 350 | "inflight": { 351 | "version": "1.0.6", 352 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 353 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 354 | "requires": { 355 | "once": "^1.3.0", 356 | "wrappy": "1" 357 | } 358 | }, 359 | "inherits": { 360 | "version": "2.0.3", 361 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 362 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 363 | }, 364 | "is-binary-path": { 365 | "version": "2.1.0", 366 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 367 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 368 | "requires": { 369 | "binary-extensions": "^2.0.0" 370 | } 371 | }, 372 | "is-buffer": { 373 | "version": "2.0.4", 374 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 375 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 376 | }, 377 | "is-callable": { 378 | "version": "1.1.5", 379 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 380 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 381 | }, 382 | "is-date-object": { 383 | "version": "1.0.2", 384 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 385 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 386 | }, 387 | "is-extglob": { 388 | "version": "2.1.1", 389 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 390 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 391 | }, 392 | "is-fullwidth-code-point": { 393 | "version": "2.0.0", 394 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 395 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 396 | }, 397 | "is-glob": { 398 | "version": "4.0.1", 399 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 400 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 401 | "requires": { 402 | "is-extglob": "^2.1.1" 403 | } 404 | }, 405 | "is-number": { 406 | "version": "7.0.0", 407 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 408 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 409 | }, 410 | "is-regex": { 411 | "version": "1.0.5", 412 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 413 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 414 | "requires": { 415 | "has": "^1.0.3" 416 | } 417 | }, 418 | "is-symbol": { 419 | "version": "1.0.3", 420 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 421 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 422 | "requires": { 423 | "has-symbols": "^1.0.1" 424 | } 425 | }, 426 | "isarray": { 427 | "version": "1.0.0", 428 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 429 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 430 | }, 431 | "isexe": { 432 | "version": "2.0.0", 433 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 434 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 435 | }, 436 | "js-yaml": { 437 | "version": "3.13.1", 438 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 439 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 440 | "requires": { 441 | "argparse": "^1.0.7", 442 | "esprima": "^4.0.0" 443 | } 444 | }, 445 | "jszip": { 446 | "version": "3.1.5", 447 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", 448 | "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", 449 | "requires": { 450 | "core-js": "~2.3.0", 451 | "es6-promise": "~3.0.2", 452 | "lie": "~3.1.0", 453 | "pako": "~1.0.2", 454 | "readable-stream": "~2.0.6" 455 | } 456 | }, 457 | "lie": { 458 | "version": "3.1.1", 459 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", 460 | "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", 461 | "requires": { 462 | "immediate": "~3.0.5" 463 | } 464 | }, 465 | "locate-path": { 466 | "version": "3.0.0", 467 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 468 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 469 | "requires": { 470 | "p-locate": "^3.0.0", 471 | "path-exists": "^3.0.0" 472 | } 473 | }, 474 | "lodash": { 475 | "version": "4.17.15", 476 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 477 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 478 | }, 479 | "log-symbols": { 480 | "version": "3.0.0", 481 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 482 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 483 | "requires": { 484 | "chalk": "^2.4.2" 485 | } 486 | }, 487 | "minimatch": { 488 | "version": "3.0.4", 489 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 490 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 491 | "requires": { 492 | "brace-expansion": "^1.1.7" 493 | } 494 | }, 495 | "minimist": { 496 | "version": "1.2.5", 497 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 498 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 499 | }, 500 | "mkdirp": { 501 | "version": "0.5.3", 502 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", 503 | "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", 504 | "requires": { 505 | "minimist": "^1.2.5" 506 | } 507 | }, 508 | "mocha": { 509 | "version": "7.1.1", 510 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", 511 | "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", 512 | "requires": { 513 | "ansi-colors": "3.2.3", 514 | "browser-stdout": "1.3.1", 515 | "chokidar": "3.3.0", 516 | "debug": "3.2.6", 517 | "diff": "3.5.0", 518 | "escape-string-regexp": "1.0.5", 519 | "find-up": "3.0.0", 520 | "glob": "7.1.3", 521 | "growl": "1.10.5", 522 | "he": "1.2.0", 523 | "js-yaml": "3.13.1", 524 | "log-symbols": "3.0.0", 525 | "minimatch": "3.0.4", 526 | "mkdirp": "0.5.3", 527 | "ms": "2.1.1", 528 | "node-environment-flags": "1.0.6", 529 | "object.assign": "4.1.0", 530 | "strip-json-comments": "2.0.1", 531 | "supports-color": "6.0.0", 532 | "which": "1.3.1", 533 | "wide-align": "1.1.3", 534 | "yargs": "13.3.2", 535 | "yargs-parser": "13.1.2", 536 | "yargs-unparser": "1.6.0" 537 | } 538 | }, 539 | "ms": { 540 | "version": "2.1.1", 541 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 542 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 543 | }, 544 | "node-environment-flags": { 545 | "version": "1.0.6", 546 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 547 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 548 | "requires": { 549 | "object.getownpropertydescriptors": "^2.0.3", 550 | "semver": "^5.7.0" 551 | } 552 | }, 553 | "normalize-path": { 554 | "version": "3.0.0", 555 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 556 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 557 | }, 558 | "object-inspect": { 559 | "version": "1.7.0", 560 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 561 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 562 | }, 563 | "object-keys": { 564 | "version": "1.1.1", 565 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 566 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 567 | }, 568 | "object.assign": { 569 | "version": "4.1.0", 570 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 571 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 572 | "requires": { 573 | "define-properties": "^1.1.2", 574 | "function-bind": "^1.1.1", 575 | "has-symbols": "^1.0.0", 576 | "object-keys": "^1.0.11" 577 | } 578 | }, 579 | "object.getownpropertydescriptors": { 580 | "version": "2.1.0", 581 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 582 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 583 | "requires": { 584 | "define-properties": "^1.1.3", 585 | "es-abstract": "^1.17.0-next.1" 586 | } 587 | }, 588 | "once": { 589 | "version": "1.4.0", 590 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 591 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 592 | "requires": { 593 | "wrappy": "1" 594 | } 595 | }, 596 | "os-tmpdir": { 597 | "version": "1.0.2", 598 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 599 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 600 | }, 601 | "p-limit": { 602 | "version": "2.3.0", 603 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 604 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 605 | "requires": { 606 | "p-try": "^2.0.0" 607 | } 608 | }, 609 | "p-locate": { 610 | "version": "3.0.0", 611 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 612 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 613 | "requires": { 614 | "p-limit": "^2.0.0" 615 | } 616 | }, 617 | "p-try": { 618 | "version": "2.2.0", 619 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 620 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 621 | }, 622 | "pako": { 623 | "version": "1.0.8", 624 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", 625 | "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==" 626 | }, 627 | "path-exists": { 628 | "version": "3.0.0", 629 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 630 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 631 | }, 632 | "path-is-absolute": { 633 | "version": "1.0.1", 634 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 635 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 636 | }, 637 | "picomatch": { 638 | "version": "2.2.2", 639 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 640 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 641 | }, 642 | "process-nextick-args": { 643 | "version": "1.0.7", 644 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 645 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 646 | }, 647 | "readable-stream": { 648 | "version": "2.0.6", 649 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 650 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 651 | "requires": { 652 | "core-util-is": "~1.0.0", 653 | "inherits": "~2.0.1", 654 | "isarray": "~1.0.0", 655 | "process-nextick-args": "~1.0.6", 656 | "string_decoder": "~0.10.x", 657 | "util-deprecate": "~1.0.1" 658 | } 659 | }, 660 | "readdirp": { 661 | "version": "3.2.0", 662 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 663 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 664 | "requires": { 665 | "picomatch": "^2.0.4" 666 | } 667 | }, 668 | "require-directory": { 669 | "version": "2.1.1", 670 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 671 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 672 | }, 673 | "require-main-filename": { 674 | "version": "2.0.0", 675 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 676 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 677 | }, 678 | "rimraf": { 679 | "version": "2.6.3", 680 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 681 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 682 | "requires": { 683 | "glob": "^7.1.3" 684 | } 685 | }, 686 | "sax": { 687 | "version": "1.2.4", 688 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 689 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 690 | }, 691 | "selenium-webdriver": { 692 | "version": "4.0.0-alpha.1", 693 | "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.1.tgz", 694 | "integrity": "sha512-z88rdjHAv3jmTZ7KSGUkTvo4rGzcDGMq0oXWHNIDK96Gs31JKVdu9+FMtT4KBrVoibg8dUicJDok6GnqqttO5Q==", 695 | "requires": { 696 | "jszip": "^3.1.3", 697 | "rimraf": "^2.5.4", 698 | "tmp": "0.0.30", 699 | "xml2js": "^0.4.17" 700 | } 701 | }, 702 | "semver": { 703 | "version": "5.7.1", 704 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 705 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 706 | }, 707 | "set-blocking": { 708 | "version": "2.0.0", 709 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 710 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 711 | }, 712 | "sprintf-js": { 713 | "version": "1.0.3", 714 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 715 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 716 | }, 717 | "string-width": { 718 | "version": "2.1.1", 719 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 720 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 721 | "requires": { 722 | "is-fullwidth-code-point": "^2.0.0", 723 | "strip-ansi": "^4.0.0" 724 | } 725 | }, 726 | "string.prototype.trimend": { 727 | "version": "1.0.1", 728 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 729 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 730 | "requires": { 731 | "define-properties": "^1.1.3", 732 | "es-abstract": "^1.17.5" 733 | } 734 | }, 735 | "string.prototype.trimleft": { 736 | "version": "2.1.2", 737 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 738 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 739 | "requires": { 740 | "define-properties": "^1.1.3", 741 | "es-abstract": "^1.17.5", 742 | "string.prototype.trimstart": "^1.0.0" 743 | } 744 | }, 745 | "string.prototype.trimright": { 746 | "version": "2.1.2", 747 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 748 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 749 | "requires": { 750 | "define-properties": "^1.1.3", 751 | "es-abstract": "^1.17.5", 752 | "string.prototype.trimend": "^1.0.0" 753 | } 754 | }, 755 | "string.prototype.trimstart": { 756 | "version": "1.0.1", 757 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 758 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 759 | "requires": { 760 | "define-properties": "^1.1.3", 761 | "es-abstract": "^1.17.5" 762 | } 763 | }, 764 | "string_decoder": { 765 | "version": "0.10.31", 766 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 767 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 768 | }, 769 | "strip-ansi": { 770 | "version": "4.0.0", 771 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 772 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 773 | "requires": { 774 | "ansi-regex": "^3.0.0" 775 | } 776 | }, 777 | "strip-json-comments": { 778 | "version": "2.0.1", 779 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 780 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 781 | }, 782 | "supports-color": { 783 | "version": "6.0.0", 784 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 785 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 786 | "requires": { 787 | "has-flag": "^3.0.0" 788 | } 789 | }, 790 | "tmp": { 791 | "version": "0.0.30", 792 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", 793 | "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", 794 | "requires": { 795 | "os-tmpdir": "~1.0.1" 796 | } 797 | }, 798 | "to-regex-range": { 799 | "version": "5.0.1", 800 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 801 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 802 | "requires": { 803 | "is-number": "^7.0.0" 804 | } 805 | }, 806 | "util-deprecate": { 807 | "version": "1.0.2", 808 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 809 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 810 | }, 811 | "which": { 812 | "version": "1.3.1", 813 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 814 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 815 | "requires": { 816 | "isexe": "^2.0.0" 817 | } 818 | }, 819 | "which-module": { 820 | "version": "2.0.0", 821 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 822 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 823 | }, 824 | "wide-align": { 825 | "version": "1.1.3", 826 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 827 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 828 | "requires": { 829 | "string-width": "^1.0.2 || 2" 830 | } 831 | }, 832 | "wrap-ansi": { 833 | "version": "5.1.0", 834 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 835 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 836 | "requires": { 837 | "ansi-styles": "^3.2.0", 838 | "string-width": "^3.0.0", 839 | "strip-ansi": "^5.0.0" 840 | }, 841 | "dependencies": { 842 | "ansi-regex": { 843 | "version": "4.1.0", 844 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 845 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 846 | }, 847 | "string-width": { 848 | "version": "3.1.0", 849 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 850 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 851 | "requires": { 852 | "emoji-regex": "^7.0.1", 853 | "is-fullwidth-code-point": "^2.0.0", 854 | "strip-ansi": "^5.1.0" 855 | } 856 | }, 857 | "strip-ansi": { 858 | "version": "5.2.0", 859 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 860 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 861 | "requires": { 862 | "ansi-regex": "^4.1.0" 863 | } 864 | } 865 | } 866 | }, 867 | "wrappy": { 868 | "version": "1.0.2", 869 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 870 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 871 | }, 872 | "xml2js": { 873 | "version": "0.4.19", 874 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 875 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 876 | "requires": { 877 | "sax": ">=0.6.0", 878 | "xmlbuilder": "~9.0.1" 879 | } 880 | }, 881 | "xmlbuilder": { 882 | "version": "9.0.7", 883 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 884 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" 885 | }, 886 | "y18n": { 887 | "version": "4.0.0", 888 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 889 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 890 | }, 891 | "yargs": { 892 | "version": "13.3.2", 893 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 894 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 895 | "requires": { 896 | "cliui": "^5.0.0", 897 | "find-up": "^3.0.0", 898 | "get-caller-file": "^2.0.1", 899 | "require-directory": "^2.1.1", 900 | "require-main-filename": "^2.0.0", 901 | "set-blocking": "^2.0.0", 902 | "string-width": "^3.0.0", 903 | "which-module": "^2.0.0", 904 | "y18n": "^4.0.0", 905 | "yargs-parser": "^13.1.2" 906 | }, 907 | "dependencies": { 908 | "ansi-regex": { 909 | "version": "4.1.0", 910 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 911 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 912 | }, 913 | "string-width": { 914 | "version": "3.1.0", 915 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 916 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 917 | "requires": { 918 | "emoji-regex": "^7.0.1", 919 | "is-fullwidth-code-point": "^2.0.0", 920 | "strip-ansi": "^5.1.0" 921 | } 922 | }, 923 | "strip-ansi": { 924 | "version": "5.2.0", 925 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 926 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 927 | "requires": { 928 | "ansi-regex": "^4.1.0" 929 | } 930 | } 931 | } 932 | }, 933 | "yargs-parser": { 934 | "version": "13.1.2", 935 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 936 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 937 | "requires": { 938 | "camelcase": "^5.0.0", 939 | "decamelize": "^1.2.0" 940 | } 941 | }, 942 | "yargs-unparser": { 943 | "version": "1.6.0", 944 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 945 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 946 | "requires": { 947 | "flat": "^4.1.0", 948 | "lodash": "^4.17.15", 949 | "yargs": "^13.3.0" 950 | } 951 | } 952 | } 953 | } 954 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "automate-node-samples", 3 | "version": "1.0.0", 4 | "description": "Automate Node Samples ---------------------", 5 | "main": "BrowserStack.js", 6 | "directories": { 7 | "example": "example" 8 | }, 9 | "dependencies": { 10 | "mocha": "^7.1.1", 11 | "selenium-webdriver": "^4.0.0-alpha.1" 12 | }, 13 | "devDependencies": {}, 14 | "scripts": { 15 | "test": "echo \"Error: no test specified\" && exit 1" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/browserstack/automate-node-samples.git" 20 | }, 21 | "author": "", 22 | "license": "ISC", 23 | "bugs": { 24 | "url": "https://github.com/browserstack/automate-node-samples/issues" 25 | }, 26 | "homepage": "https://github.com/browserstack/automate-node-samples#readme" 27 | } 28 | -------------------------------------------------------------------------------- /parallel.js: -------------------------------------------------------------------------------- 1 | const { Builder, By, Key, until } = require('selenium-webdriver'); 2 | const http = require('http'); 3 | 4 | const BROWSERSTACK_USERNAME = process.env.BROWSERSTACK_USERNAME || 'BROWSERSTACK_USERNAME'; 5 | const BROWSERSTACK_ACCESS_KEY = process.env.BROWSERSTACK_ACCESS_KEY || 'BROWSERSTACK_ACCESS_KEY'; 6 | 7 | let HttpAgent = new http.Agent({ 8 | keepAlive: true, 9 | }); 10 | 11 | let capabilities = [ 12 | { 13 | browserName: 'Firefox', 14 | name: 'Firefox Test', 15 | os: 'Windows', 16 | build: 'Test Build 01', 17 | project: 'My Awesome App', 18 | 'browserstack.debug': true 19 | }, 20 | { 21 | browserName: 'Chrome', 22 | name: 'Chrome Test', 23 | os: 'Windows', 24 | build: 'Test Build 01', 25 | project: 'My Awesome App', 26 | 'browserstack.debug': true 27 | } 28 | ] 29 | 30 | for (let index in capabilities) { 31 | let driver = new Builder() 32 | .usingHttpAgent(HttpAgent) 33 | .withCapabilities(capabilities[index]) 34 | .usingServer(`http://${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}@hub.browserstack.com/wd/hub`) 35 | .build(); 36 | 37 | driver.get('http://www.google.com/ncr').then(() => { 38 | driver.findElement(By.name('q')).then((element) => { 39 | element.sendKeys('BrowserStack', Key.RETURN).then(() => { 40 | driver.wait(until.titleContains('BrowserStack')).then(() => driver.getTitle().then((title) => { 41 | console.log(title); 42 | driver.quit(); 43 | })); 44 | }) 45 | }); 46 | }); 47 | } -------------------------------------------------------------------------------- /single.js: -------------------------------------------------------------------------------- 1 | const { Builder, By, Key, until } = require('selenium-webdriver'); 2 | const http = require('http'); 3 | 4 | const BROWSERSTACK_USERNAME = process.env.BROWSERSTACK_USERNAME || 'BROWSERSTACK_USERNAME'; 5 | const BROWSERSTACK_ACCESS_KEY = process.env.BROWSERSTACK_ACCESS_KEY || 'BROWSERSTACK_ACCESS_KEY'; 6 | 7 | let HttpAgent = new http.Agent({ 8 | keepAlive: true, 9 | }); 10 | 11 | let capabilities = { 12 | browserName: 'Firefox', 13 | name: 'Firefox Test', 14 | os: 'Windows', 15 | build: 'Test Build 01', 16 | project: 'My Awesome App', 17 | 'browserstack.debug': true, 18 | }; 19 | 20 | let driver = new Builder() 21 | .usingHttpAgent(HttpAgent) 22 | .withCapabilities(capabilities) 23 | .usingServer(`http://${BROWSERSTACK_USERNAME}:${BROWSERSTACK_ACCESS_KEY}@hub-cloud.browserstack.com/wd/hub`) 24 | .build(); 25 | 26 | driver.get('http://www.google.com/ncr').then(() => { 27 | driver.findElement(By.name('q')).then((element) => { 28 | element.sendKeys('BrowserStack', Key.RETURN).then(() => { 29 | driver.wait(until.titleContains('BrowserStack')).then(() => driver.getTitle().then((title) => { 30 | console.log(title); 31 | driver.quit(); 32 | })); 33 | }) 34 | }); 35 | }); 36 | 37 | --------------------------------------------------------------------------------