{"_id":"hermione","_rev":"457-8a90add5987b1a3c13d8bc409d1bc279","name":"hermione","description":"Tests framework based on mocha and wdio","dist-tags":{"prerelease":"4.0.0-alpha.9","hermione@3":"3.13.0","beta":"8.0.0-beta.1","hermione@6":"6.1.4","hermione@5":"5.6.4","hermione@4":"4.9.2","next":"9.0.0-rc.1","hermione@7":"7.5.7","hermione@7-mocha-fix":"7.5.8-rc.1","latest":"8.9.6"},"versions":{"0.0.1-reserved":{"name":"hermione","version":"0.0.1-reserved","author":{"url":"https://github.com/Flackus","name":"Alexey Rybakov","email":"alexrybakov@yandex.ru"},"license":"MIT","_id":"hermione@0.0.1-reserved","maintainers":[{"name":"flack","email":"alexrybakov@yandex.ru"}],"dist":{"shasum":"478ba9d764e941ba37c6a5b750457b9b92ecc83c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.0.1-reserved.tgz","integrity":"sha512-Fdm0XaejZf/m7TtWjEZehRvJs6+uQFbdA3uKJ1X3Rz3Oarte5OhJetAYLjk3RrildMf/TyAemk4o3Yi5gIL9Cg==","signatures":[{"sig":"MEUCIBpk6Lsf7xYrBOv/T5H7cDWUSRwk4d44uapVjla1YikeAiEA5zy3YUupEZ/sAttwVUtN+nrPESCliJEOLqB/STKd54I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","_from":".","_shasum":"478ba9d764e941ba37c6a5b750457b9b92ecc83c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"_npmVersion":"3.5.3","description":"","directories":{},"_nodeVersion":"4.2.6","_npmOperationalInternal":{"tmp":"tmp/hermione-0.0.1-reserved.tgz_1455275829715_0.41984610981307924","host":"packages-6-west.internal.npmjs.com"}},"0.5.0":{"name":"hermione","version":"0.5.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.5.0","maintainers":[{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"fb5e6cb11735d8150cc77ca5d91c40c0d8319d9a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.5.0.tgz","integrity":"sha512-HFxerIyZJFecJ8KzCDqL161aRTepXHAlSLsQ8CA7QjUDFrxv4PIt28Tx0L4w8IjJvs9Gr6hWVd6P1BMNh4WLRw==","signatures":[{"sig":"MEQCID0SXIkWZCRgToUrQM4MkxwRwOCGqKG/ksTJDSkUU7A/AiA5IwKRWTNy1aiG/y/7EhPE8KpveL9oAudDX3THIW9gZQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"fb5e6cb11735d8150cc77ca5d91c40c0d8319d9a","gitHead":"b5305e3f6ece2a751ca24e95febcc3fed5186e42","scripts":{"lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- --recursive test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.10","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"0.10.40","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","q-debug-mode":"0.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.5.0.tgz_1455717648936_0.5966081416700035","host":"packages-5-east.internal.npmjs.com"}},"0.5.1":{"name":"hermione","version":"0.5.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.5.1","maintainers":[{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3eed655752b6b1eb03db8e15f71a885ebd514286","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.5.1.tgz","integrity":"sha512-3MTT32eACHGae/jYzrNkPPBksAZ0Ltxpb38u25yki9gF55MVzjnt4f0RoifGSwcKtmXeNeFWnttXE5gmomHhIQ==","signatures":[{"sig":"MEUCIQCr1hFArH4vZYitlo9ItqF4efZ9wOWUzDnwyobIOCc73gIgXqB8RISk4uh/dtK6ZjQoIVadFQ71oXied98R92mZecs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"3eed655752b6b1eb03db8e15f71a885ebd514286","gitHead":"a0425c20e1dd1b85f0e7654d62f2e344379e486b","scripts":{"lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- --recursive test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.10","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"0.10.40","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","q-debug-mode":"0.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.5.1.tgz_1455809637555_0.29267922742292285","host":"packages-6-west.internal.npmjs.com"}},"0.5.2":{"name":"hermione","version":"0.5.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.5.2","maintainers":[{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1ed688ffc8fd25ca11858fee157997c09b5288d7","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.5.2.tgz","integrity":"sha512-EiwMYS7s6xjavvMv6iydgweD7KbxOCAEqCVjplRUwtrXGRxiRoBSe3cdxp0XaRGGfieAmU7c0ds8LlAs2Ir/Bw==","signatures":[{"sig":"MEQCIB1RSnjSzjDw7V8H1cL+dQWUrjrHx0cOBSPo6R5a6KEMAiBjJz/e76RU6JFw9O7K5WrThdlfARHkHktrUOgN9C4U/g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"1ed688ffc8fd25ca11858fee157997c09b5288d7","gitHead":"5d74f0fc672636f9b0592beb803eee3bec28b427","scripts":{"lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- --recursive test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.10","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"0.10.40","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","q-debug-mode":"0.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.5.2.tgz_1455948815943_0.6233923335094005","host":"packages-9-west.internal.npmjs.com"}},"0.5.3":{"name":"hermione","version":"0.5.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.5.3","maintainers":[{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"943813b477d2b8284c5afb820d6a181440288cdb","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.5.3.tgz","integrity":"sha512-aMTqk/wq/aEsrdELMZnNryI9fcrbuUqNSY2Zb871sAWGHsiiekmfrHhgief3kE2grKottm3n8ek4gGa5X+2IOg==","signatures":[{"sig":"MEYCIQCrtGF1f5bj24N1jwSfDAACYzjGKIfV0Nn0wgDA968dcQIhAOniSeZclgi0pcbmxWEaOgqGj3RQX1td9c3Gtw2sDZxD","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"943813b477d2b8284c5afb820d6a181440288cdb","gitHead":"a1933145f4de180844afc586a8bbef876ff71a15","scripts":{"lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- --recursive test/"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.12","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.6","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","q-debug-mode":"0.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.5.3.tgz_1457085915112_0.7999071408994496","host":"packages-12-west.internal.npmjs.com"}},"0.6.0":{"name":"hermione","version":"0.6.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.6.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"14867544156683bbb781e16e641293c0de1a416f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.6.0.tgz","integrity":"sha512-jn3CPwThIdNjm4xno5ggN2gkSIvRKO7UYMPUq5xSernTslDHmPg+jCAvW2twiY4kKbStg9mSX05xe8p9HQyc2g==","signatures":[{"sig":"MEYCIQDHz5aDNT69SZnVgEyxf1h40Wh1n/t9MYBLNp8IMWIyiQIhAJuONUMXzoicQWXw1xMIA06CJthFymOpWRUOLdfLuQce","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"14867544156683bbb781e16e641293c0de1a416f","gitHead":"0bbcfbceee1d21d4ee8015bd9ec291aad379fb3d","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- --recursive test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.12","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.6","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.6.0.tgz_1459342661519_0.46014038217253983","host":"packages-12-west.internal.npmjs.com"}},"0.6.1":{"name":"hermione","version":"0.6.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.6.1","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"7a303855f2e7dde8f5be8e0a95338798581e87a0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.6.1.tgz","integrity":"sha512-m9CVUCU3LPshmGuXjd2qyYuHHERtRjAcaGaRYnDlyDsJA+3122DpR3lCIM5kPXfh+BbWlCHkPhtECjVtbw3TVg==","signatures":[{"sig":"MEQCIA85MUyJuQEOwFop3kuMRHz6YNXRGZM4/li/InkiJh+wAiBKNNYho669jfwZ14Lj6qzhMr/B3gWidKvz6sTX2Cb4aA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"7a303855f2e7dde8f5be8e0a95338798581e87a0","gitHead":"6923d1d830303874e79038876feb3738246ec01c","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.12","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.6","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.6.1.tgz_1459526564926_0.7916883234865963","host":"packages-12-west.internal.npmjs.com"}},"0.6.2":{"name":"hermione","version":"0.6.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.6.2","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0d69d8c5461155b27e9124e08b2d7834264be219","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.6.2.tgz","integrity":"sha512-GT7D8kfkUxJZeghj+AabpKD4JsCJP2ga3gowQ+1Ugi6S7JTru5fJmmPpG5qEIq7EJKMaxFJxTXn9nPD9GB0/3w==","signatures":[{"sig":"MEUCIQCWemeFNUuCnqwgstF4oFnw9j8JCRq5wxboAVYI5HopqwIgJU8Ne1GgTiXRES0YoefYZOHXZVCppSR1/uVtO7GAXIs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"0d69d8c5461155b27e9124e08b2d7834264be219","gitHead":"dd64542993f6c821f201c246b92fb211e5cdbafd","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.6.2.tgz_1461756958215_0.16160166496410966","host":"packages-16-east.internal.npmjs.com"}},"0.6.3":{"name":"hermione","version":"0.6.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.6.3","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"08c075ea4446a8987d49d6f50019f8f12fc8f61b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.6.3.tgz","integrity":"sha512-3CvIja2DrDLb4+he5RNg9+B4ksp+UZ4bmFanRCtFoupxXeMy3k+vu6IC2m/4T/pciRS4P7ygrLK5mO6A9xtBJw==","signatures":[{"sig":"MEYCIQCqKgRnQy42bphD9MpuEvKq92iqfTP5A/TBycmEOcoUsgIhAPIYecNfG6xMpVtzcZqfegG5V/nl9+SjgOgYkclBYO1U","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"08c075ea4446a8987d49d6f50019f8f12fc8f61b","gitHead":"b5ad6dde06c8571a68a202a71bbc5b9ffad31065","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.6.3.tgz_1462375484354_0.2586790763307363","host":"packages-16-east.internal.npmjs.com"}},"0.7.0":{"name":"hermione","version":"0.7.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.7.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1be0f1346e54a3c907ebe28e7a95295e9dd7a9f8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.7.0.tgz","integrity":"sha512-sXpu/jduDcT5TAnmDEc4sFV9CHEHrlZp+KACj0sLc5t8scF+vIZkFx6GRaqPp8RbzyTbPxTj1nTdG98EvqZ9Dg==","signatures":[{"sig":"MEUCIQDQmRSIL6fSXStGRHJS6V9rvWpiSq5uTaXl1d+XX86QbAIgVMHu5jA0uq1hSLESVosnX+6rL6y+uOzx6HqXDq+2Srw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"1be0f1346e54a3c907ebe28e7a95295e9dd7a9f8","gitHead":"2517dde75980b17af6ff1c1c547d636b50dffa00","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.0.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.7.0.tgz_1463065600894_0.9599084337241948","host":"packages-12-west.internal.npmjs.com"}},"0.8.0":{"name":"hermione","version":"0.8.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.8.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"230150b07278c5577c74598fcc69e5b09eb08226","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.8.0.tgz","integrity":"sha512-f4FjA2sbPUML2ilEx0XaESbjEJ7hjxtIzAac8tPRa7ua6cWE+SJyDkvA4a1GKXREM/VG2PeI8j1HOlqNx1rU2w==","signatures":[{"sig":"MEYCIQDPOWjGHDHpYMD8IC71o90WUdDUBkjlxfGA1GDxAJxheAIhANPFCdfXEiqNj6b4gHWsjf0gnrGoEnYlk1uXoMXDxhtg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"230150b07278c5577c74598fcc69e5b09eb08226","gitHead":"c36798cd08f7f764e33850cc192e7b5a34d0620a","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.4","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.1.0","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.8.0.tgz_1467289313985_0.7813892629928887","host":"packages-16-east.internal.npmjs.com"}},"0.8.1":{"name":"hermione","version":"0.8.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.8.1","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"01e43cfdd93774852d2fdd9643f22f9bd9394716","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.8.1.tgz","integrity":"sha512-+kJnm296Qm5vW+RpJ9WlnGMEXKDFUmaaOI1mgPkS279LCQJ9ken/ofR6AuVJF0dp1cJQEQHKCCxPszbO7yiAEg==","signatures":[{"sig":"MEQCIC/TlBTSVdRvKHC3InCcfSpbh6GvE6Hq6DzgmnDrm2jTAiAA+QZ5gTTkWN0LwWX7iPcLJGs/LGAjK0DeFzZ3vcXRug==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"01e43cfdd93774852d2fdd9643f22f9bd9394716","gitHead":"a59d381df10db72ad0ccf50f81f487df7c0a574f","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.1.0","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.8.1.tgz_1467652725521_0.9733550364617258","host":"packages-16-east.internal.npmjs.com"}},"0.9.0":{"name":"hermione","version":"0.9.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.9.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"abbbac54b077367b652192820eeb8faed2bc4f8a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.9.0.tgz","integrity":"sha512-ARvCCVkiJ314CTB39L5PDgOTTHybrvG8gRfq+yDCPlGWFp0ls3Y4Kyz2wxCw4qGK0zDZ6xrUXMT1DtmTahXU1g==","signatures":[{"sig":"MEUCIDjnGxAcvZtB0ftAkh4iLIMpCZH4aS51aX/mSK9lpN3rAiEA8hJGH5Le9XUx5KC3QMZVKmdXx5fnJJSJhksfI/XHMds=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"abbbac54b077367b652192820eeb8faed2bc4f8a","gitHead":"f1fa41ae37ff3bcb16a25581a9229a4cc3b1c5f6","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.1.0","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.9.0.tgz_1468321203726_0.48666309262625873","host":"packages-16-east.internal.npmjs.com"}},"0.9.1":{"name":"hermione","version":"0.9.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.9.1","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"eb7944a38eba05aec556d9284cbdbae1b88ac0a8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.9.1.tgz","integrity":"sha512-nhD6G8T72UryQVzhaoCgp6JN36ZNCvvYkFayJwG/do7lFKgfXpMY0/BCduyn7nm0AvVorwcokngTtdPlbush+w==","signatures":[{"sig":"MEUCIA8aK5/lP53m/Y1J3BMfcW1TvaQSSB/zs3u8RZTHals2AiEA/RHe1u9J9hPB1FVAbVCDgcFqco2rpuVIt5dCw4mr990=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"eb7944a38eba05aec556d9284cbdbae1b88ac0a8","gitHead":"a6486bbb32fa78a7c114c089fc2075910338eac4","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"github:j0tunn/webdriverio#test/screenshot.on.reject","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.9.1.tgz_1468352315092_0.7609994343947619","host":"packages-16-east.internal.npmjs.com"}},"0.10.0":{"name":"hermione","version":"0.10.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.10.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"eb2c33b9a89294752c2aad4e5fcf477d3cd9285c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.10.0.tgz","integrity":"sha512-TY8HXP30KwlgS2ozVlf9kvWdb0eiGGZrqkLn+1FdeGmq+VruW3VzavNA85TxusAu6tXPEYCVRSUfVAwP47Ov2g==","signatures":[{"sig":"MEQCIDmssllYMkPu8Lmlq0Lh4Cw5KJZYE38IBMb7RL5WOyusAiAVwruDVP+5YSk7Wyd4dszcfIi6QVQK24WCDDk+cTdZxA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"eb2c33b9a89294752c2aad4e5fcf477d3cd9285c","gitHead":"76dc9e9c93e51e89d5acfa8043f99de94baed799","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"github:j0tunn/webdriverio#test/screenshot.on.reject","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.10.0.tgz_1470047891336_0.31510915281251073","host":"packages-12-west.internal.npmjs.com"}},"0.11.0":{"name":"hermione","version":"0.11.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.11.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e35d2deb718797c263165051208c2804c8fb9714","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.11.0.tgz","integrity":"sha512-KzbgnOb229ZUxWNG/NHWuBUH14a534YIU298Ykrbl8aIWgRLBlRTS1ncNJ9t0vbd0eWLNr99xAU3bBoff9FD/w==","signatures":[{"sig":"MEUCIQChSujK176uRLXUlkQGYrZWEreFbskhWpJCFC670FJJywIgCqV43K2qn8PdfQrFZQIREvCOt+VUs1VjSVnygu25l5M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"e35d2deb718797c263165051208c2804c8fb9714","gitHead":"6ead9cfeba501a0a7a8f25c1e07f19b25155788d","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.8","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.7","dependencies":{"q":"^2.0.0","glob":"^7.0.5","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"github:j0tunn/webdriverio#test/screenshot.on.reject","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.11.0.tgz_1470063289220_0.295488937292248","host":"packages-12-west.internal.npmjs.com"}},"0.11.1":{"name":"hermione","version":"0.11.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.11.1","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6aa22a65b5633aaaf836056e79e2171a12151373","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.11.1.tgz","integrity":"sha512-CQ7Og8mmEXvZN3WCx0pENY5nwP08eSKa/kq9EdfVgsNmp2r8mrj5C2V2tqiv3xVwCUA4cqF8wYoS7llsLv3LVw==","signatures":[{"sig":"MEYCIQDI3Fy9yeBVZGCSyqh09amJB9uok6pH8ve/x38T9960rwIhAI37w8DKHK4fuuFzHkL6GpZggSLcGYymxgb8leY8R1II","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"6aa22a65b5633aaaf836056e79e2171a12151373","gitHead":"47adf7de41fed1e20a9e589c1f6fba643d72e0ed","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","glob":"^7.0.5","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.2.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.11.1.tgz_1470387219458_0.9568457645364106","host":"packages-12-west.internal.npmjs.com"}},"0.11.2":{"name":"hermione","version":"0.11.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.11.2","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8d415f43b014fffd137b5dc747ff3c4aec93b884","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.11.2.tgz","integrity":"sha512-y0aQJLlHQHFCSwXRGKpeQs2vMbcPCFW1oJC4zgxAXky2RKCS9dGvXXmnFpqDX6lsB8IOS7L54o4JI0CK805Sew==","signatures":[{"sig":"MEQCIEVGpJhJugHrr/A55BjGNFgkYN/9ivX8QWR+wLKs402CAiA5udMMkGaoFXcHsfN273KihpEkMw6a0hqj/Sn/EoO7Qw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"8d415f43b014fffd137b5dc747ff3c4aec93b884","gitHead":"d6d9b94ac9a9e33228410d15e1e62890a700260f","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","glob":"^7.0.5","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.2.1","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.11.2.tgz_1470658013331_0.21895615197718143","host":"packages-12-west.internal.npmjs.com"}},"0.11.3":{"name":"hermione","version":"0.11.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.11.3","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"30092dd05cbd4a021c9b049631147cca9825f00e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.11.3.tgz","integrity":"sha512-LnBWtE+EmafNgBTidylN3+cgtI1zzLJz8jwps4XnKaNumEeQOZaJjz3VC4q/lNfjKeM3aWf4dPs3mIBJICAIZw==","signatures":[{"sig":"MEUCIAX17wZUeHfMtJe2+n2F8Y01dHwl2XzyMQr+1TUGWFvVAiEAs2Y2fJeSDqn2R/7Z4+X/NHIIQgQU1tvavZvXekRgZsY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"30092dd05cbd4a021c9b049631147cca9825f00e","gitHead":"4bcbf8704e19c2b04de258ab1bc5472edd827127","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","glob":"^7.0.5","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"github:j0tunn/webdriverio#master.build","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.11.3.tgz_1470919261776_0.5049462916795164","host":"packages-16-east.internal.npmjs.com"}},"0.11.4":{"name":"hermione","version":"0.11.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.11.4","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"433eac69926f046f9e7c37c9eb32360f3e1f9e36","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.11.4.tgz","integrity":"sha512-dbIXHgTcrQohKps6IbqUKnKymnRTxTaBcnU4Lm2zNEx1Zbpl4YqAotSix92Y344HuKDN7YJnepb8ZRZODu8LgQ==","signatures":[{"sig":"MEUCIQDauOaOIq0zsWaxIubYdVS4PA4DtOtls4TCOdJtkffRnAIgNchEc3rpJFyAV32Yzz4WVJqBbyXW/MqEzAz3XLUdYyw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"433eac69926f046f9e7c37c9eb32360f3e1f9e36","gitHead":"a9015df79f7018a1e468991d48e78629873db4bb","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","glob":"^7.0.5","q-io":"^2.0.6","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","webdriverio":"4.2.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.11.4.tgz_1470921158625_0.3817149354144931","host":"packages-12-west.internal.npmjs.com"}},"0.12.0":{"name":"hermione","version":"0.12.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.12.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0c596f9be09c1171379b39bee4aee21a21635f3c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.12.0.tgz","integrity":"sha512-uPfmOiu8GPTnQXDf4I1k8LlSf8SLYRYTTuSH2T3gN/7juRvqi6paqdfJM7zTSb8ne4JTac4v1LeV0TF3EbwAzg==","signatures":[{"sig":"MEUCIQDHAxJNvIWvacy97piYjKAs0E8ygp4J7qSsGNFwHH1Q6AIgeqYSO9Z6ONPeI0TzUzzZVIL+VTj25PsgyXS3EnmEr+4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"0c596f9be09c1171379b39bee4aee21a21635f3c","gitHead":"18939d4e145ff9ba31bd2e9c0872afd947ec7c00","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.1.0","webdriverio":"4.2.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.12.0.tgz_1471888394422_0.18900987203232944","host":"packages-16-east.internal.npmjs.com"}},"0.12.1":{"name":"hermione","version":"0.12.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.12.1","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"768b71bad092d9264a002b82c37e9b6d43664845","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.12.1.tgz","integrity":"sha512-lJW4tRIvMQHZON6LrsL+y49i2iki8vkMo1XwE/73jUmvjSiBtE7XmXaGv59m0xNh6/7mvXYBkcT4JRP6pGOofQ==","signatures":[{"sig":"MEUCIQDkMrKQIxvb1RRlg99UPNiBi7sG9CGfq0kQ/kixx4jykgIgFPyfM4hazt0FTJp+xnYyh4grgMglOAGSLsAWLb4iSmo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"768b71bad092d9264a002b82c37e9b6d43664845","gitHead":"446a7d74cfb908297926a5f55b9a7fac9f0f3595","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.8","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.7","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.1.1","webdriverio":"4.2.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.12.1.tgz_1472057550072_0.8534949140157551","host":"packages-12-west.internal.npmjs.com"}},"0.13.0":{"name":"hermione","version":"0.13.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.13.0","maintainers":[{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"834571aa93cfd98a016d649787e31247b30013e6","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.13.0.tgz","integrity":"sha512-ly1pjZzLQKpxxGB+ni1hhEfAV8XqWCp+GIbqJhd6DdhPOI+3qkXOPQDsTd2urlxtv9LrbihrB0/fk6H5gJTaMw==","signatures":[{"sig":"MEYCIQC9qjzYqkty3GA9H2FOHsHj9anCImWjkI8EPOafl9diGwIhAIoi8jDoOjHsFynn12Z31pmET3kqG3kQ78M+uHiPqmME","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"834571aa93cfd98a016d649787e31247b30013e6","gitHead":"8524559c3c82d707743c566af7f3fefb78dc5977","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.8","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.7","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.2.0","webdriverio":"4.2.4","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.13.0.tgz_1473259195575_0.9763922186102718","host":"packages-16-east.internal.npmjs.com"}},"0.14.0":{"name":"hermione","version":"0.14.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.14.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b81d6af419fc0100671be0db022317e367271625","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.14.0.tgz","integrity":"sha512-fz8j4OKWQo5NFcGpwEe2PwZyj0t0KpZN/s0PsUKdncW2sNCfCNwfte0WcPW/aU5xhpoHtUxOJNHlODkcX3pbCg==","signatures":[{"sig":"MEUCIQD35Hrd6o56RCMK0egToKnWcdHGvW8IdG63l33jwOIkZQIgIW5DCgm8Nn0g1dHtVfvdQEp6xKyHdjsj/sLMvZS6vVg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"b81d6af419fc0100671be0db022317e367271625","gitHead":"ab79841d9c6840b454b26a54e0c74598d22935dd","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.8","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.7","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.14.0.tgz_1475689623902_0.7694267521146685","host":"packages-12-west.internal.npmjs.com"}},"0.15.0":{"name":"hermione","version":"0.15.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.15.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"42ceaedbc5d964f2097c09e6b15ce0a3a28f1e77","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.15.0.tgz","integrity":"sha512-ZxD4/PQhi22foM79/lzKNe435jOvzQp8h2dV+EU+yQwluUue1dPOfqubgUZMp6a+k4oXU+inaJGTiLQFQYeEdg==","signatures":[{"sig":"MEUCIQD2F90Tlj7wl9QxUdBmW3ssfwap7t0Klz88ZQXe+7/yFgIgfIgn+hRFu8JjFRA+oM1+oDM3BoSTHpKGr6gkQMaV6Xw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"42ceaedbc5d964f2097c09e6b15ce0a3a28f1e77","gitHead":"59812e4db5a43e57c97875e83b623e1221929cfd","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.8","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.7","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.15.0.tgz_1476116574007_0.995588052785024","host":"packages-12-west.internal.npmjs.com"}},"0.15.1":{"name":"hermione","version":"0.15.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.15.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"802ebaa73bf7ba8167921ba43704d084d74f6e91","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.15.1.tgz","integrity":"sha512-E23Ax4hGxKivDPcKi23L+nobF0M+5PzZZm4JWXwgAl3bBxc4Vvs7AVBNuu0TxZa6aiRHx+b3Cn4yGHShPpmZhA==","signatures":[{"sig":"MEUCIEWjcTCwJbze4xzsG3iXjJ8WgUP+MsvFLBiLXveGYhv9AiEAhwwL5bsbF3cB4ZsmG1cnVyp9Dklu4aulZZVnmT0qA5M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"802ebaa73bf7ba8167921ba43704d084d74f6e91","gitHead":"be61a614927011d6e302b1792071f90a6d5bda5b","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.15.1.tgz_1477561106084_0.1528314317110926","host":"packages-12-west.internal.npmjs.com"}},"0.15.2":{"name":"hermione","version":"0.15.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.15.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"18b574f6e2232d4aac0145d3402aa782382cf20d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.15.2.tgz","integrity":"sha512-UbSXdcQWNRI01kCrJCeigxDvexbM2J3tHHRyapOSfK6T3HObAdgMv9oiYcjoAOEo84lt/YQDK1d78wUOiXBYkA==","signatures":[{"sig":"MEQCIHkM9sI5TEXjrp9nQmHDJGuT2pZNdGeMDZ1Qiy/qmx5dAiAyN/ADwivEUbCm7ABGT6s00eh8s6Hi5zr+ySfuioV7Wg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"18b574f6e2232d4aac0145d3402aa782382cf20d","gitHead":"6b9cb2b7b7e598a175a522ad80cd25161bd4ab85","scripts":{"toc":"doctoc README.md","lint":"jshint . && jscs .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","jscs":"^2.6.0","sinon":"^1.17.2","doctoc":"^1.0.0","jshint":"^2.8.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.15.2.tgz_1477898983205_0.14739921898581088","host":"packages-12-west.internal.npmjs.com"}},"0.15.3":{"name":"hermione","version":"0.15.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.15.3","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a3bfff4ec0570cbf293c869788a884b81cbd9c53","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.15.3.tgz","integrity":"sha512-BZ0z+OGt2ZLmx/1aItOoCgCWvQDY4aJQ9LlBWDfuUJWH6Zeo6sALyzzSTd3S7VbR62+5+ZVS26LPY6YdAAwfHw==","signatures":[{"sig":"MEYCIQD/tZsntG78TDNvt6rFbDhyA8Ecmo5rw2pycgFRaVRo+AIhAJB44ThNFJ++xBwoJIFz595pO/Y3/BuQ0jOtiexeNrOA","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"a3bfff4ec0570cbf293c869788a884b81cbd9c53","gitHead":"5e59e14211d1f6aa018a04976d3ac0ab16742b50","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.7","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.2","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.15.3.tgz_1478863756006_0.19143795035779476","host":"packages-18-east.internal.npmjs.com"}},"0.15.4":{"name":"hermione","version":"0.15.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.15.4","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"50abd844893db8495d3088143c6b251b7fd56ca1","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.15.4.tgz","integrity":"sha512-sM+Vaipx2B58hDPO54B2gCUTIVl4xfe2YREkkgMKk2Lip8/7+L1FqEhQtl38lYSOLOLl8Uxiq3dbsHb/iAa5GQ==","signatures":[{"sig":"MEUCIBfEh0KR8wAAfeh3SuZ7tmkukNlSmXSJ9gwTaBrahrMdAiEAsSS9IPqV/Di7pg55VAEh2hY5nAOwqEYXqhq5GfuEBNU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"50abd844893db8495d3088143c6b251b7fd56ca1","gitHead":"ee42f53e8dbbe62d573ebf2dd80d46d8cf60b751","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.15.4.tgz_1479306129917_0.5409500747919083","host":"packages-18-east.internal.npmjs.com"}},"0.16.0":{"name":"hermione","version":"0.16.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.16.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"4463a14719ef48f870a55b873ea0d60e00463abe","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.16.0.tgz","integrity":"sha512-+qRF3Z9Q7SYcx03zvYROovPyNLho24+hZN94m9VXaZ2OEkGi2Q8fAcPOnuWII62Uhl7P6M56q6TmhAiti/62JA==","signatures":[{"sig":"MEUCICxrjDmtPc5oPFb2jeSEe7a6Vi31AkPSWIQdqqeQReqyAiEA2SCH+RdFfSwAjg26t6dPMPOG60v/gNK2XHnT3wNjf08=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"4463a14719ef48f870a55b873ea0d60e00463abe","gitHead":"73459ca402c5d9fe2e8fab7bb28c167b15734f1d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.16.0.tgz_1479378470195_0.378500125836581","host":"packages-18-east.internal.npmjs.com"}},"0.17.0":{"name":"hermione","version":"0.17.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.17.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"382c1ce43a08a044a02bea13f9333e909cb2ace8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.17.0.tgz","integrity":"sha512-OfXxHHNY36Zu+O8Jp7vI2s6hNsDu27i14U+uF0raLJW7JT7GQ4jOaqwMtNJhL9TMrpHReJRTycjP36HgzW61zA==","signatures":[{"sig":"MEQCIDBXme3QP54hh9+ijXknA+ZYYRwNLoCshqyLNv60J4KyAiAqpytX2nDa4ONoUs3o4NVcMIYKex0FegHMZPodUAuhIw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"382c1ce43a08a044a02bea13f9333e909cb2ace8","gitHead":"a65f57f43843011dc0ba93af56d6cbcae55c7853","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.4","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.17.0.tgz_1479901448947_0.7485905718058348","host":"packages-18-east.internal.npmjs.com"}},"0.18.0":{"name":"hermione","version":"0.18.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.18.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"391393c483f679bb4ec6fc709ee0e5fda8f0fedb","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.18.0.tgz","integrity":"sha512-/KMofIxDU1DeOcB/5j5OHYVAsWyL7prhdhxNZq3PTfKAYtefIsvmNQ0LRUw2H8AHatED1t2PR3k0QJ/ju7hj1A==","signatures":[{"sig":"MEQCIC6bBv+FINK5mHg1HqziEf7LkQW2AvH/Zp1PHf2QCQBPAiBu1eMCAs3X6Ngl+1/u6cPextauqh7Rdkl64JGdJmpHig==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"391393c483f679bb4ec6fc709ee0e5fda8f0fedb","gitHead":"a788c517f107222933b36455ea2003d58c0d366c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"4.2.15","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.18.0.tgz_1480424697949_0.7625430910848081","host":"packages-12-west.internal.npmjs.com"}},"0.18.1":{"name":"hermione","version":"0.18.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.18.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5e8b9de204d512e3f8ba96e342ec36352eaef5ad","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.18.1.tgz","integrity":"sha512-bL7hZAFIuAXZiy05yLoyMWL/1VR/KW7zhbgP0NB6srlTGq+6PsP6QT6J0gJbihVpEqI4VYimvwtnE/aphgicQQ==","signatures":[{"sig":"MEYCIQD9p4qJC+xCapgi3QqeESgvDgeAuodicqg+xDUvuoSlNwIhAMgRr3RLZz28IdAKwSnuLR3RwqQSvi513NUO4JDqbAMR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"5e8b9de204d512e3f8ba96e342ec36352eaef5ad","gitHead":"f6aa1f16b66133a0d415745043b2f60b3cf47954","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.18.1.tgz_1480711816410_0.45746340579353273","host":"packages-12-west.internal.npmjs.com"}},"0.18.2":{"name":"hermione","version":"0.18.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.18.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"fab49c6e90fb94bdbc55c8b3be8aa9a2836d988e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.18.2.tgz","integrity":"sha512-/bK0KCc7Cq95sOVS9pM+wB2ANvg4yx0250xVc+CDQ9Uq97IGEZpzzK1bpGVIBbQD8srCDBkkKAEgHUmadTXTkA==","signatures":[{"sig":"MEUCIQDtSs30E0wdC/Yj+5iJ7qeNZtka/EVv6rMQltG85Ps5agIgaluoqtkfhCOfhPe1leUgTHPnewlikikJAg9B9A/EcXU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"fab49c6e90fb94bdbc55c8b3be8aa9a2836d988e","gitHead":"c3d1f6ed346ceea25a5606a94118de4be911c6ac","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","test-unit":"istanbul test _mocha -- test/"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.18.2.tgz_1480968423916_0.3638144580181688","host":"packages-12-west.internal.npmjs.com"}},"0.19.0":{"name":"hermione","version":"0.19.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.19.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3a74cc220a656c1a37abbf50f50ad527c0e37746","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.19.0.tgz","integrity":"sha512-Z64hbwJreYLqpFoPwFLU4iux8EMq83UlzAPgN6F/mE892GcmJsQXNWY0HpKLM5us7FhmDJYXQK5joDbyvl3UEA==","signatures":[{"sig":"MEUCIQC03wZtr7Jndc0w79xsS3d44O/wE102fxbLV8JmMhszdAIgIis+/XDdZnOU9wReWe6izJCBlirO8ppbbontNAsdvsM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"3a74cc220a656c1a37abbf50f50ad527c0e37746","gitHead":"da9d48c582eb8fb7c53bd2495608846853d3fcbb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.19.0.tgz_1481525348809_0.13704559719190001","host":"packages-12-west.internal.npmjs.com"}},"0.20.0":{"name":"hermione","version":"0.20.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.20.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c58a88a2151ee33f4c2d07ac8b5c6a0cdf64c700","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.20.0.tgz","integrity":"sha512-uHOgI1BbThwn8F8keDwF6Vkymczb2Qw3ziFQ852VGpNcdQ+3V80csDunficn0UlF7x/A+SRvPj6g13/MQn6g1w==","signatures":[{"sig":"MEQCIE5FmNivMII/nKKfDzKpH6BCqRm2PB1n8aSF504nNWrSAiBa3uOQZga5uTXIkTsMhwnpoqsSQka8LjBjBoke9a53/g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"c58a88a2151ee33f4c2d07ac8b5c6a0cdf64c700","gitHead":"d5c4b498001b756b713c5397df457fad786d4daa","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^1.3.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.20.0.tgz_1482232597091_0.9309676617849618","host":"packages-12-west.internal.npmjs.com"}},"0.21.0":{"name":"hermione","version":"0.21.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.21.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"cad2d6190f02ac3cfaa9959a44384bedbf7e40d3","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.21.0.tgz","integrity":"sha512-G/aX+jkoOKcaXjTxuX/F2CIdDHc7OCDTO7RJf3ueZVwejsvZhtxFn4vSsZiBziQ57BCBJsy7/T5BTNUr/8Q9mA==","signatures":[{"sig":"MEYCIQCypoGjdi3U3ujCdFF8Vo7PiJBBz/Zqnr3RP65QP9mIWAIhAOHHDSee12TSaOPCrRtguR7gQmpKY8HUG8OkeF79DcDX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"cad2d6190f02ac3cfaa9959a44384bedbf7e40d3","gitHead":"5a21c2341aac640d265017e5924c24612cdd547c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.21.0.tgz_1482388918624_0.44748862576670945","host":"packages-18-east.internal.npmjs.com"}},"0.22.0":{"name":"hermione","version":"0.22.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.22.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"efca4b7615fc5859ab27d513dd46df2bfcb16b0e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.22.0.tgz","integrity":"sha512-8x7eskv8E/IkHMipFQQuyb7PDNHG+oOjVp03yr/uJvPe39LBiMlJ7yDphaAXVqXTu3aWSNrKMywHpg089GyPMg==","signatures":[{"sig":"MEUCICK4MizAXKR2LxisR009jWPw0O109LKmrVaFr+OKv7+GAiEAl8C1ZT5OOQbtLHBklJLPVJITAiOx6JM2/FS6Ex0A5tk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"efca4b7615fc5859ab27d513dd46df2bfcb16b0e","gitHead":"122822dd7d678fab134349fc3759f1581098eb59","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.7","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.2","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.22.0.tgz_1482787009024_0.9280383458826691","host":"packages-18-east.internal.npmjs.com"}},"0.23.0":{"name":"hermione","version":"0.23.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.23.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"70dbb67b140383638f3df6e57fa9bc71e4c33fcd","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.23.0.tgz","integrity":"sha512-ksjTHrrXNtBieGrk2UOYB2nNHROcxqLdWUVP6+g6efuWzt2WqUP/4Mg5MuFaJyfnecLc8oxihZ+9KOjj4457Gw==","signatures":[{"sig":"MEQCIFYWzg6IvxHGOGsR6ZhHv4YSFj+s+gyGolFd1D9W1o5zAiBNF5M3LUZr9d1t+p3NaFynS0XScmHZQoibyKsxwoxHrw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"70dbb67b140383638f3df6e57fa9bc71e4c33fcd","gitHead":"ea94dad277b123c6ecec7c7c6752dead2eb68444","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"git+https://github.com/dudagod/webdriverio.git#4.5.0","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.23.0.tgz_1483107829410_0.3234894417691976","host":"packages-12-west.internal.npmjs.com"}},"0.23.1":{"name":"hermione","version":"0.23.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.23.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ed08cd32a722615d5d594e966b4073e4200babdd","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.23.1.tgz","integrity":"sha512-83vUNR1gU2c5Ng+FoxaWVS8hmrxQYpaTEAjU3+wHW2E1+NmDh6nftpOTEJYaas5omjENvZqQDPAUoF7NbkKWpA==","signatures":[{"sig":"MEYCIQCMy+2EXKHWUa1kQNAsnMcotZ+XZiFCfw7H4Ty8BTWGXAIhANcwJMunIaeWcbtmhQM4VcI8D+Ag2Y3GEnWCf5i2QFXA","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"ed08cd32a722615d5d594e966b4073e4200babdd","gitHead":"d59caf0334ce2a3038b07d9d93d84accf4a065fc","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.23.1.tgz_1484517450124_0.8383696228265762","host":"packages-12-west.internal.npmjs.com"}},"0.24.0":{"name":"hermione","version":"0.24.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.24.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"352d433a3840265afc296b7acae09029bcd361cb","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.24.0.tgz","integrity":"sha512-7E/4WBCkU/VDScbwjReG1r37MPI1wC8YgE8S0I0ki1EayObeBKFly62TDpO/NFGJ8N/jpasmWyzVW/xw3H1IfQ==","signatures":[{"sig":"MEYCIQDRZpstNeGsMM+XIRT+QTPQ5LuFfAFf5uylahzACCwDRQIhAMZF/BawL0IdsoSu2L1gNCVLHWKRSRciJHlIH451UwN9","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"352d433a3840265afc296b7acae09029bcd361cb","gitHead":"3179ac4f0da2c3b78586d9b256956d35d3d35ea4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.24.0.tgz_1485333532997_0.10812746710143983","host":"packages-18-east.internal.npmjs.com"}},"0.24.1":{"name":"hermione","version":"0.24.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.24.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3c72ed3097ef5402dc16fa3fb08475f51703ace2","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.24.1.tgz","integrity":"sha512-Zr9nT9ZINfS91CQzRw/k/Cha1OYMckBtvHYQaOUuLwyTjH0aIWp/wMqnNQnB6dfJ8OG/wW1d+SAhh05KZyPFOg==","signatures":[{"sig":"MEQCIHetgGWzn+/q386PvFO3nu7IW8xCVkVIF8TsnjmSiWanAiARlSwtz+MDZyK6mxsTWya2eR1aV50zPoXKDlDGXCzVJw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"3c72ed3097ef5402dc16fa3fb08475f51703ace2","gitHead":"ae18ebe1202c907c5c3a18cbc7feeccfb65ae2a6","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.24.1.tgz_1485344374318_0.01959811756387353","host":"packages-12-west.internal.npmjs.com"}},"0.25.0":{"name":"hermione","version":"0.25.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.25.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"49c056586f0a1dd9becaa7630fdc6eb891fafbe4","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.25.0.tgz","integrity":"sha512-QNHI8iWviWmqr2ZS1VNlK27p6q3IH9d0nyAEYgnhTM0oIO6sSf4b95frKebuYiw1ImliNic8XTLQTqYcWjafSQ==","signatures":[{"sig":"MEUCIBD8lyeLfBe2TIyuNqi2aYxilO8jKd0od8MWWVhdDAZjAiEA1ijGVtzOzkgvOgybXcEZslwzu3AJRKb3AcIXy1OtqY8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"49c056586f0a1dd9becaa7630fdc6eb891fafbe4","gitHead":"8eeb0dff6c68a7b1b57ab93c84b5cbbc82ceb3cf","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.14.7","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.2.2","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.25.0.tgz_1485350237517_0.27113714441657066","host":"packages-18-east.internal.npmjs.com"}},"0.25.1":{"name":"hermione","version":"0.25.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.25.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e8ae69d5299f0fba9dde50310a7189fdd15a309b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.25.1.tgz","integrity":"sha512-z109lZNrtny8nrlYRYEw8tQYEoXn62B57Km01q5P8rCZBFmOxPMpkPssB98vBP7dc6WE9J5O3JNasdA1znaRsA==","signatures":[{"sig":"MEUCIC5uS8wMPq/iONFOC+XfnpX9IIovngPsxeE/rZ1cAmrkAiEAmMDcUD5rcLi7p+7fK5y6rQZLkx4Yvx3LW7s2Y5+sgVs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"e8ae69d5299f0fba9dde50310a7189fdd15a309b","gitHead":"39dd57d276ee1a199d21900ea569f3e68663be55","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.25.1.tgz_1485358136925_0.6517055935692042","host":"packages-12-west.internal.npmjs.com"}},"0.25.2":{"name":"hermione","version":"0.25.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.25.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"534a4164e239688401ee70a2cd9d9c9c2c5aecb9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.25.2.tgz","integrity":"sha512-fRHa6gx6gvyRwoo1/sc1IoyQWVMgKc1IO+mQEtOmiM3JbypHmHuH7zVquXJ9i3nF8IryFBF5yJKLwqwwHbBbww==","signatures":[{"sig":"MEUCIEq5gB/4y9cTxnjIwqzBA4Cw82UE8aUE7dDhmzjivAdsAiEAtaO7xUrSiOSQAteFy8GocMFHFv5VbxVjdwxzY9C21Bs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"534a4164e239688401ee70a2cd9d9c9c2c5aecb9","gitHead":"daa0f567ddd42545de8d0f15de3f3caf285efcf1","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.25.2.tgz_1486466009879_0.3936725144740194","host":"packages-12-west.internal.npmjs.com"}},"0.26.0":{"name":"hermione","version":"0.26.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.26.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e9247a853912db578d9fed7305d5e73b0c6f5a3e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.26.0.tgz","integrity":"sha512-/o0zjotUHdypk4XO5abiZU+hI88VVDk1nxOrdwqsVHlBfhCqYiK6TMbo4mT3b3QmEua4V2tLhteNVg2dXNg9kw==","signatures":[{"sig":"MEYCIQDUjbkVGMlAFVfBmo7KGIA6vZ1G+Kqtvk3pozh+hpzfjgIhAKXg67zDVuz50pn+xi8tMy2UArEZqQSGNL78Mb2vgSP+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"e9247a853912db578d9fed7305d5e73b0c6f5a3e","gitHead":"b5b9be5c61f1c55005f064f9c53297bf9a15b5ea","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"up73k","email":"uptech@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^1.1.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.26.0.tgz_1486551672565_0.8145246049389243","host":"packages-18-east.internal.npmjs.com"}},"0.27.0":{"name":"hermione","version":"0.27.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.27.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"45fcacc78f1041d3ceef193cce0321ed98b88635","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.27.0.tgz","integrity":"sha512-aZ8KOgoVWNPOdJTBZSJLKkEIPxC8ULoLr3patCfjeDy5wLuo8cAspQB3TWG/sf7g/x/vVnoLwxnPkpjN6+CkyA==","signatures":[{"sig":"MEYCIQC4P98fU46COJA+excKWudcA9rphiBSwFcu4QIoDABMHgIhAISeeJFSoGqlj9ZsXynRTx040lmrRBVC8UOR9eBwJg1q","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"45fcacc78f1041d3ceef193cce0321ed98b88635","gitHead":"01e85fdc7a1fb6d9154c816f86b1fb9bf60b1850","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"up73k","email":"uptech@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.27.0.tgz_1486984761739_0.6822335210163146","host":"packages-12-west.internal.npmjs.com"}},"0.28.0":{"name":"hermione","version":"0.28.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.28.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d2bc41847bd554526c7bc37695eee106608220f7","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.28.0.tgz","integrity":"sha512-bwVjcblrEQmisLaGdMkeqKcK9BKEVxHPAjCV+Ziu3Te+CvMQmU51AF7yllXQ81kghIT+uA86GshuD3oIJ5dCHg==","signatures":[{"sig":"MEUCIQCTtCcJX4z4YSOBb+OiDZvsmf713Hvn3t9kT1ot9PBA5gIgVFCBSJMEhz3VfRbE+hNt7mLQ+fkhBarkSlMsjdykQMY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"d2bc41847bd554526c7bc37695eee106608220f7","gitHead":"d514ff1cff45c026bface2270389cab42b8f7d61","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.28.0.tgz_1486994859983_0.6516133060213178","host":"packages-12-west.internal.npmjs.com"}},"0.28.1":{"name":"hermione","version":"0.28.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.28.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"87016a023201c55fbcdf185915a09d8814db246c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.28.1.tgz","integrity":"sha512-vfmndzAvnuGXjRgjOF2VheegIReAOrh2iOQWRTtfkJ7+Yuj/n4olmXRIDiVCya9qdShKSjZwbhau47sz0cFQbw==","signatures":[{"sig":"MEUCIDwB98bxLtZ5bW33mMdalqhVeYE3LfbpQIbnUp6y7CNxAiEAocTNyroUPKP4AL/HCkd9QZSeMfIqhsuFD0k0g4iuEKQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"87016a023201c55fbcdf185915a09d8814db246c","gitHead":"e40df4bbb0f8536f113286520654d09153176711","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"up73k","email":"uptech@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.28.1.tgz_1487770138523_0.5117643114645034","host":"packages-18-east.internal.npmjs.com"}},"0.28.2":{"name":"hermione","version":"0.28.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.28.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8226de6cd375726bc7f4ada2461639b532ad7d61","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.28.2.tgz","integrity":"sha512-l40AznL8LjPduYaHad6Xw76H29pOTa6eflesNBC2xFAC3I8BH3CH0yIpv/dQKhjeMx4waHqkQEcvyCRTDhUDoQ==","signatures":[{"sig":"MEYCIQCHAZt2qKxSO5QN6A+fia+N+sPA+1Ju6cuF/QXn2AXetAIhAOWIb8oPZyZJ9gKLYytIfGdzSmKzP899pdrlPLBYkAQ4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"8226de6cd375726bc7f4ada2461639b532ad7d61","gitHead":"71ba58951fe181888aeca0ce3514e52ad3c9a820","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.28.2.tgz_1487879957197_0.0638640015386045","host":"packages-12-west.internal.npmjs.com"}},"0.28.3":{"name":"hermione","version":"0.28.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.28.3","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"21adb9232d356e432a3f2ed028bed5cf8139d109","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.28.3.tgz","integrity":"sha512-1OZzGahK3FlrbL/kD36RNzCCQMtZL/3NN3pYE38arohiQlD0o+pmOwho+vuhtdTbnY5Y4OT14xDMu9nLjVttWg==","signatures":[{"sig":"MEUCICWTf3zz8jQNvEflqwZM1YxcngamarOSWn7t9FtiA+guAiEAmxhitVzyr1R9ErwGl/ArDTcQi/+hw8ZqkCNpqaCXBEQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"21adb9232d356e432a3f2ed028bed5cf8139d109","gitHead":"403679e21d77a4bf0db7c884a4d221baf9c4aa42","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.28.3.tgz_1488260412572_0.6429954369086772","host":"packages-18-east.internal.npmjs.com"}},"0.28.4":{"name":"hermione","version":"0.28.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.28.4","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3725d6915afa791a4deb45b45e38c1628ea7227d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.28.4.tgz","integrity":"sha512-YHemk+usTjL+0HIPNRS36vlKi21KPZL4cMNzVnnRC+Mp9zZOmCaOBDwWYbWjA2dj9HQ8BSDCn6e1nU86YDRmHA==","signatures":[{"sig":"MEUCIQDsanyn9YdftpSbv73JMtoKcBHRw0CURiTW+YAYsRrGCgIgQVDzatGd5HkSnQARFk2SQIm1qsO5A8RAEqMpuD7il70=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"3725d6915afa791a4deb45b45e38c1628ea7227d","gitHead":"9f0d871cc2052013109af7d0bf40d1f9db76b5dc","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.28.4.tgz_1488437954616_0.25524881947785616","host":"packages-18-east.internal.npmjs.com"}},"0.29.0":{"name":"hermione","version":"0.29.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.29.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"656e9d35c2f5fa7da14cb138b9651fa710a5ff33","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.29.0.tgz","integrity":"sha512-VWzKftiaZpzAIBcHAYPgYLVRVsoehvIRxvojoX/6bpDpAqiA0cIrmd7SQDtNiz+BMXYdKZzmd3/3u2jP62t6AA==","signatures":[{"sig":"MEYCIQCNpkyIfjsNJU3CNbZ+NagKJZCGpoHGeknA/w3+iLUXywIhAOLBcdsh0jYqzubNjyxGQ7NVtSyXVIEHZE8rQ18m0P6N","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"656e9d35c2f5fa7da14cb138b9651fa710a5ff33","gitHead":"6f9ae05ecd85295f5251fac0c0a576bb011be3d8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.11","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.29.0.tgz_1488833019400_0.8199368249624968","host":"packages-12-west.internal.npmjs.com"}},"0.30.0":{"name":"hermione","version":"0.30.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.30.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"166f92af14462965934430bb281eb220f6b22b10","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.30.0.tgz","integrity":"sha512-gs9/aJs9YDofa2B5EM4Uymk1M+hMn7Elo0hRpPnysZZbiymcaqfC/FSNQ6p+HZBhQTm3Pt8BuAK+cYV3sTaQGg==","signatures":[{"sig":"MEQCIHfeoTrt5ZviSf1slj1y4EoNJ2wQkV/gMsIlkXYTLofeAiA4R4QDaLZBqG2+sDAcuc9WFBc40ofpfUkNuJR40Sl8cA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"166f92af14462965934430bb281eb220f6b22b10","gitHead":"2440b025aa520bdc9e042b55ec6398e1f2e33724","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.30.0.tgz_1489566694019_0.7948963586241007","host":"packages-12-west.internal.npmjs.com"}},"0.30.1":{"name":"hermione","version":"0.30.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.30.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c7d67684e8e7ee6dd61aef67645c03e97d90e784","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.30.1.tgz","integrity":"sha512-CH38SCb3XsOHWOtfwlIrQCt8f+73sFVDUApD4xQ31GUqIR8WupNs/nY+aH53KKg8cfb7LIfK2z/GwTCaFOaOug==","signatures":[{"sig":"MEYCIQCLpCpKQ0sQeEJhiimxvLJWLfZZLSJvBnhCHQuqvd2A6gIhALvJ1AFBQT+oY8fFHi6RE3KEj/sANeBt+Comg9qLYApX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"c7d67684e8e7ee6dd61aef67645c03e97d90e784","gitHead":"9848f0fe312f23d2dd651e5548f6de4998c716d0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.30.1.tgz_1489605313881_0.2924316665157676","host":"packages-18-east.internal.npmjs.com"}},"0.30.2":{"name":"hermione","version":"0.30.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.30.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a0af6a46ce2b2bf072714388be10f2b577eeaf10","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.30.2.tgz","integrity":"sha512-gtL6D8JeEsvwmGjFNWfdLoP1k1SKFA2IEeHKnE5luWP2zGHY3o6uVcP7jweg0Y35cbxBx2nhgGe7d0bqqwTk3w==","signatures":[{"sig":"MEQCIHaq7U6oeQMVQSVLguqF1ikPnonJXZUK4frcZV9ZmBSKAiA050Tnd9W6TJdRkgdvxLXKClAe4ENWbWnGg3ew7gFWYw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"a0af6a46ce2b2bf072714388be10f2b577eeaf10","gitHead":"4f49fa3f4d9b549f8cf51d42062324a9ee46f68c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.4.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.30.2.tgz_1489608610389_0.9326961976476014","host":"packages-18-east.internal.npmjs.com"}},"0.31.0":{"name":"hermione","version":"0.31.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.31.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e6d8448a4b519bc679a283c4ce9b654f8fc36642","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.31.0.tgz","integrity":"sha512-Z1curyj/76FsW/7g8jxQySPuvHQAD/z2mXl5dTemsMiloCvLBCIghI+pQ7/2h6LUXs6bWjYCCOgDcjCov0scig==","signatures":[{"sig":"MEYCIQCloV5Bot1Izo0asXzYkby0ZpMmuf9Amw4VkepjGvB20AIhALF9sXWkYo+5ie+lxdN3+TFk//j8sAVbBU7hHUA7g3J2","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"e6d8448a4b519bc679a283c4ce9b654f8fc36642","gitHead":"bbe891127826ff5716e55ee68b51a6fb1310ac05","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.31.0.tgz_1491206314736_0.0661613354459405","host":"packages-12-west.internal.npmjs.com"}},"0.32.0":{"name":"hermione","version":"0.32.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.32.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e0369f735df2031d6232d9b6c815a581e74607d6","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.32.0.tgz","integrity":"sha512-7DA+MaXkY1DMjbQ6RLZpErSiAd4Gmlzja2XF9g6Ws97/YnqkSDEEokrji+tNt5MbF03N8vxyXizfF/U6D/BrGg==","signatures":[{"sig":"MEUCIDImD+KpenciWYn/iiBwPifzNF2yBIPES6/IplwGjoz1AiEAzWKqTM/oH43THtJ27L2FhuZPod5pN9WAAXFpCUyTAGI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"e0369f735df2031d6232d9b6c815a581e74607d6","gitHead":"81509da98c4123020fb2df7db452921d28586893","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.32.0.tgz_1491310073506_0.25028727133758366","host":"packages-12-west.internal.npmjs.com"}},"0.33.0":{"name":"hermione","version":"0.33.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.33.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c0905cec77d3c7f05c25233ba5b765b22449e600","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.33.0.tgz","integrity":"sha512-yTGHOfLIGJsG2JuFNISArMRyuMnT4xLy43fL/x7vUSlJqRprfvHcKb+Kxm5mLGPq5f50xpeUgDKX/es2maXmng==","signatures":[{"sig":"MEYCIQD9O/7pYH/FIU9FUQBM/qLi967arO5G/pqAOE6YRgzTqgIhAN18W/qOf3NzHnRY/p5RzTTSyIiQrgZrBVHF2KH8kwTz","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"c0905cec77d3c7f05c25233ba5b765b22449e600","gitHead":"e84a5f1762cde592c6dd7ce93b9939576cc1d0c4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.33.0.tgz_1491400574034_0.48084551747888327","host":"packages-12-west.internal.npmjs.com"}},"0.34.0":{"name":"hermione","version":"0.34.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.34.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5c58f3e79cef71bfb8de5670ca88d9d3c7dc18f3","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.34.0.tgz","integrity":"sha512-uX8OYLZQJugjYOOXimoNhM5VNvET68z3FkrEZ4scjKZEOk+xB0gfpad6guNqK6a+nH5LRGi1PhugwC1l3xaw7A==","signatures":[{"sig":"MEUCIDzTcxnhQ32IDG5M5jPsn1+nyxSrpO36zggTuAoIfTbeAiEA46uyEGLXtUV1o7Z0951rR1Unr0CkQlPErhXWBcHbCnM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"5c58f3e79cef71bfb8de5670ca88d9d3c7dc18f3","gitHead":"269328e6b1a856227ffc0cc77a644c4981a7e665","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^1.17.2","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.8.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.34.0.tgz_1492868471871_0.459457544144243","host":"packages-18-east.internal.npmjs.com"}},"0.35.0":{"name":"hermione","version":"0.35.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.35.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a81535658d4f8d945c64142657e1212f4b7fd3c0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.35.0.tgz","integrity":"sha512-ajAn5SDt4YNaX7Zt8Do2TChn0u1v4hgt6F7kXMQAstLY0OHfHG8qLkdNb73G9ZuVrWiV6BrF3igpTiTMA2v7kw==","signatures":[{"sig":"MEQCIBxWVRS4ZYgbZSGDhJkZUaVvXmO53qMlWlN0YdE0VTgiAiB9Nx9YiTvXUF8gA0Xc+dgF8gpdUYs0RASoU+MBg3Ek5g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"a81535658d4f8d945c64142657e1212f4b7fd3c0","gitHead":"df6dfeea62a564ceb1e2c85f1f75c0563d889165","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.35.0.tgz_1493127466569_0.564327354542911","host":"packages-12-west.internal.npmjs.com"}},"0.35.1":{"name":"hermione","version":"0.35.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.35.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3fcb33bd6f228f950d4a55bf1247a6e8c54b0119","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.35.1.tgz","integrity":"sha512-kaQ2yIPtyHSWr0KSZKbzT00jCtfhgVPeZpBj1zGk7hnbxjlTCnrv9XMl9V5V0rMvqJjR82ubR9xy9vmulHmKlg==","signatures":[{"sig":"MEUCIQCoiBbqQxwrKTSbmSaNxbTNY4G7mXOYSRbch5Wg5FcsSQIgU68S+bcDRM4vSXYoejf55mG3HU+Vry+mkdpeGRhi3CU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"3fcb33bd6f228f950d4a55bf1247a6e8c54b0119","gitHead":"28415b3c2b4a3fa7aecacb784ec47943d407b8ba","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.35.1.tgz_1493735046739_0.9894720441661775","host":"packages-18-east.internal.npmjs.com"}},"0.36.0":{"name":"hermione","version":"0.36.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.36.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a0a4bf6ef939b09e274c8222d9ffbc1a379c6587","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.36.0.tgz","integrity":"sha512-rCGMCdSxrlPmkYBdCnkHVaU4HsPt+JJFjmeeQqcswK3hX+gCfXgm2aUla8RGjDH0T7+yaNYfaJoWCQE5msmVkg==","signatures":[{"sig":"MEYCIQDjxDenIUyd3DlVximqHIRDglYYL60KYjlb/3rWGiYLkgIhAMEsp2a8LKa5sTciinhtV54XNCP7LJRkSWyQrogLOmjM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"a0a4bf6ef939b09e274c8222d9ffbc1a379c6587","gitHead":"b3f8340cb1485840816fdc1688bd8407ed4d2e63","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","glob-extra":"^2.0.0","gemini-core":"^1.0.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.36.0.tgz_1493922645005_0.6857296149246395","host":"packages-18-east.internal.npmjs.com"}},"0.37.0":{"name":"hermione","version":"0.37.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.37.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5a78e70e0643c93f52f52d36fd312da7dfbe4fe1","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.37.0.tgz","integrity":"sha512-UYc+HeHs9Hra8tGuQov95etklJ8/PtnH7+/le6DnfDw5hv623YBxA+1qu4jDLgHEPo7LJ8PHP+4EtJzUrw8CsQ==","signatures":[{"sig":"MEQCIHzL42UgFkQGPthsUq+0nsnCm3zHLJFHcy6JD+UJvh4qAiA9c5kgqLu+oYFqF2vhF+cbpdy4g2RNzuGLJMz/3aqX2g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"5a78e70e0643c93f52f52d36fd312da7dfbe4fe1","gitHead":"b2edbb1166e76bdafd6d5b25a1599c320a0b5739","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.37.0.tgz_1496928881409_0.14757723454385996","host":"s3://npm-registry-packages"}},"0.37.1":{"name":"hermione","version":"0.37.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.37.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"072035de92f85c7a726ce7789d761b9f646a3510","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.37.1.tgz","integrity":"sha512-eyATcRPn3AUln1yEztcnFD4RInVOo4K9huCHA95F+ytrecEDHZAQYOW+08wlwkyB3ToX4Kj/5u3l0P2nGMZBRg==","signatures":[{"sig":"MEYCIQDSMcDfCWGkERTkeAu2RqwmbC6lwg4IXUnr/HRZ7NaLtQIhANtwQj/xMIYIbrhalRAmcQ0cozVu84w5kwLzdEekg2yP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"072035de92f85c7a726ce7789d761b9f646a3510","gitHead":"329746c4f842838f28c303f0442de06e9ef243a4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.37.1.tgz_1497458822298_0.9221008464228362","host":"s3://npm-registry-packages"}},"0.37.2":{"name":"hermione","version":"0.37.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.37.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d947ba450c7bc7e95c359e87eba7ff7d11eb02e5","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.37.2.tgz","integrity":"sha512-+M4ia7IDN7vQbrV8to6ORl6NQL+8CjOpHEBg2Mq6QMhi+8bzhr2mhduVl4gq66ZY1C+/E2B35qBS3HrdZ0vQIw==","signatures":[{"sig":"MEQCIGyB+zXnQHRCboTXXDmX5xsclKOgUGJr+BeOK2kXRoUBAiBVmCAoxXb6j/Oh7F3P1B56kAJ7GOhTF0mZeG6PHzskRQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"d947ba450c7bc7e95c359e87eba7ff7d11eb02e5","gitHead":"e05042e2d3aa238e52a422e62503ce70f0029544","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.37.2.tgz_1497869572405_0.9373042967636138","host":"s3://npm-registry-packages"}},"0.37.3":{"name":"hermione","version":"0.37.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.37.3","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"aaa050e5f919364da0a9c4fe75fe35a9723a8a82","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.37.3.tgz","integrity":"sha512-94JI6BlKgfmiE7qOG3rL55QIyFtm0zWo3ByefQYsMZw3BqOAsxQP+3L1+n5ZPK+1rWZBuXwJfNJZLtFSX2l2qw==","signatures":[{"sig":"MEQCIHalgZilFsUN0FhEfWClIRrf/Ts1XCr5XAfmbX8UUVvhAiA435kFB8agoR4P8ySDqtu3Z7ZLCghbon47TiPhmrQ4ng==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"aaa050e5f919364da0a9c4fe75fe35a9723a8a82","gitHead":"52213331098419bea5e47db0e6090354396df69c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.37.3.tgz_1497945542426_0.05898933089338243","host":"s3://npm-registry-packages"}},"0.37.4":{"name":"hermione","version":"0.37.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.37.4","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"858302eac600976fc4621715f831157510ad3234","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.37.4.tgz","integrity":"sha512-vDRk2/IoPGYmMdhjOuiJNH2DC2No7jwhh/usjs4fn+GbpM+GuvF/Gs/5/FHHwPnFGQ/GPQa3/hgeIrvqS4N3fA==","signatures":[{"sig":"MEQCID4zHVe9YJl+wO4DeO9M8SxOQJblSJuwCixcZnPQOYY7AiByT7DyV4wtgDAoLOZd7siGLh62oaAtLCX7fpQyRmyOOQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"858302eac600976fc4621715f831157510ad3234","gitHead":"fb8c20f00d5887d9aa93331d30f8180aba667263","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.37.4.tgz_1498253872098_0.42189493332989514","host":"s3://npm-registry-packages"}},"0.38.0":{"name":"hermione","version":"0.38.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.38.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"24c17db820f945daa0cddeb78bf6dbaf26e7f71a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.38.0.tgz","integrity":"sha512-67uvveESkuvjYPG6C0c2wVcBlK6MpZbnZvuYGQNIjdzyQG/Sc+4TBD5N4HMyQkdQQmEEJOzUQQZjsnN64+GXAA==","signatures":[{"sig":"MEUCIBk8gZmEaeSJaB+jMc6ZBM6JBdb9X3xcJ78CRSPqCu1oAiEAoqsaaezQCqZH88Hkfc70sfPGnD9LQ3/mE3DrwhyRlZ4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"24c17db820f945daa0cddeb78bf6dbaf26e7f71a","gitHead":"5aebc775e4618dc5d19df4c9321c5428ca999d53","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.38.0.tgz_1499071844225_0.1008335289079696","host":"s3://npm-registry-packages"}},"0.39.0":{"name":"hermione","version":"0.39.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.39.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2cf83416b601d24e6c7bf249e98cd619c95a37fc","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.39.0.tgz","integrity":"sha512-+rccfjCdNULQJLrw8Yb14PETjEPtStM0ZVOZTGlHRj7MCVHcm6xZKyhDZ6ywSZMLIqifhSPdxhVn+bgF5Ycamg==","signatures":[{"sig":"MEQCIH8mt795lB66zh6MMffbka1Izp3dYYPnRtdtcf8II6o2AiAl0P5LNzVI+c+tbflngmFlKOxBNsQIsRVFpwFLoeP4cA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"2cf83416b601d24e6c7bf249e98cd619c95a37fc","gitHead":"f41cf626e69d5bfda45552c93b1201b6d86a12fc","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.39.0.tgz_1499167381658_0.0020531851332634687","host":"s3://npm-registry-packages"}},"0.39.1":{"name":"hermione","version":"0.39.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.39.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8696a7610c86becdcae848a9b464f6f0a432dbe0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.39.1.tgz","integrity":"sha512-Bkay9hdxAWwuOTgfhRffZr2PLdF+OkPb7hIMtsfmTydcT00LPkNkQffZ8SE0n2lo9xmgHOWQIF6ILVUUjE5pwg==","signatures":[{"sig":"MEQCIF2UtJdG3pFiTXSryPvfhIa08eBNqIo8xYBVb+wCG6m3AiAdvzMgI6c7JVZAWx3FI+cOPvyO25JiaVJWkxrjo/F8ag==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"8696a7610c86becdcae848a9b464f6f0a432dbe0","gitHead":"c9e632c115ec53c32edd6b8b526ba1bb964e7096","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.39.1.tgz_1500979744363_0.8375071112532169","host":"s3://npm-registry-packages"}},"0.40.0":{"name":"hermione","version":"0.40.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.40.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"162a72015d19ae7eb631d5a0a03e6399f264921e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.40.0.tgz","integrity":"sha512-NDuvRT9mOcelGdTHITiejPZMD6o0bV4dt00LwPxvpyPo2mXm797myz9V5mAtL+DLO1u3N6AhNjM3uc9ZfsAHzw==","signatures":[{"sig":"MEUCIQCF+m0m9tslkdNGYQZF5vqlR5jLD7e/bRS5CKK5hbDE9wIgYeSRMZn3JmG6GUzOKVftu9F8Uv5piDENoUV4x7wOvbc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"162a72015d19ae7eb631d5a0a03e6399f264921e","gitHead":"fd83c0c2b7d4f07ec83b07bbbbfb3d99020380c3","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"~3.10.1","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.3.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.40.0.tgz_1501600071925_0.6562118302099407","host":"s3://npm-registry-packages"}},"0.41.0":{"name":"hermione","version":"0.41.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.41.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c25f02f4f07bd07fe0f46e3dcb5ddbbc0da1c7cc","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.41.0.tgz","integrity":"sha512-urroOJB/pGFpVlI29mbm9viVpqeEYnL4x07OBYciRVOquW+WegXs+Yt8lcF/g6l49JVPjco/a3jO7HOwTJH9/w==","signatures":[{"sig":"MEYCIQCOhNtzE6w7YYzKL/lyCLGhn1KSsO2mFnepoa0Orarx1wIhAILR1lYDRT9wOLqok/KomJXFTmymSugzwD24rOVfL6nE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"c25f02f4f07bd07fe0f46e3dcb5ddbbc0da1c7cc","gitHead":"02b3e0cb99adc585709a825c1db13b2d87fb1b9a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.41.0.tgz_1501628685066_0.009312259266152978","host":"s3://npm-registry-packages"}},"0.42.0":{"name":"hermione","version":"0.42.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.42.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2215950583cdebb0560e850c670351450ffaa963","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.42.0.tgz","integrity":"sha512-8ix9CiyaWPLaEy3XWoZ7KjuORfqzxa2bdbu+FgaS5JNNgl/04XWlMUupsAA6pa3Ezud3n3o39wzREXKV2akvQw==","signatures":[{"sig":"MEQCIBGzV3+lzTSnzqSPQuHRvCj2k+YzlyUz7nMoNcsTrTJ5AiAoHDa6YfmNLWm87aRcN2nZo3379UXsoE10YRK0vh514Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"2215950583cdebb0560e850c670351450ffaa963","gitHead":"72cb53c1fe8f7124e6660d76dda80d82b56fcb3c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^3.4.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.9.0","chai-as-promised":"^5.1.0","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.42.0.tgz_1502196690417_0.7360129468142986","host":"s3://npm-registry-packages"}},"0.43.0":{"name":"hermione","version":"0.43.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c85f9140524cc9dd1ee236cc0e1bcf63860294f9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.0.tgz","integrity":"sha512-khf99g6ViTkpY97lVRv9sRNkqICSevw520++JlF1gi1Pp9MqeKki7NG66zX/ByU21/t89S6NiZzUdQQ20u1aHg==","signatures":[{"sig":"MEUCIQCFkoHdmfKvJFh+W9Qkywl496Yhm0LcacRfWoEuW6RB+gIgd/4dL8TJrg6cMY9I2J7G+6j0YazED4Mn7p9hbkLRhRk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"c85f9140524cc9dd1ee236cc0e1bcf63860294f9","gitHead":"05d8f404614a5f0e3771e03d00edeb36da4c22f6","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.0.tgz_1502781134658_0.8962735673412681","host":"s3://npm-registry-packages"}},"0.43.1":{"name":"hermione","version":"0.43.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5704c4aaa800b7add91db2793d19326609657c32","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.1.tgz","integrity":"sha512-MPZ9419KLuiA7qc1cs3WFEEiZyzqOREqWw6dj9jrvRDY0ZpLBidmkdS5pkBI0SyiC9b/zDOZMvK/swc5tm/DvA==","signatures":[{"sig":"MEYCIQCk0yZlLpOsNp4KdeNhif8hIBegMtxBTl0fvbrgJPJ7DwIhAMnpLPvWWOtt8r4VClQ6QxnTehNgBUNZNpamcnarfxlO","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"5704c4aaa800b7add91db2793d19326609657c32","gitHead":"b21a481422b1fd77a2f0c69110cd231029299781","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.1.tgz_1502823974534_0.6341483858413994","host":"s3://npm-registry-packages"}},"0.43.2":{"name":"hermione","version":"0.43.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"516901c2ef2ccfaead4902a1904dad22be2402b9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.2.tgz","integrity":"sha512-W/qUliy7QYGmYC0z1Hs3zp/RYp0mq8vDsAy/sbcsOj6lGz1Djl8ceGUDbtdYTxU/F10SZLhEvIC5nw22nUDayw==","signatures":[{"sig":"MEUCIEAipEhfY0w+paaUb+TJOl/7nJ8nJbsN8l29C2z+JFKsAiEAs2QWLruf0ZaQoJKRvSySi/e5uewi16uqXZhm79cMqqc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"516901c2ef2ccfaead4902a1904dad22be2402b9","gitHead":"19d0ba344780d6ed74ad45a5d38f3a010f4e28aa","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.2.tgz_1502835259477_0.3337100953795016","host":"s3://npm-registry-packages"}},"0.43.3":{"name":"hermione","version":"0.43.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.3","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"84871da105a3ffd2d6b889d9f8ffa86163a198ee","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.3.tgz","integrity":"sha512-AgjA0YDpCKOHJcq9ckMwA+W1ixqfGIHY9THuYvKoWZkY3A33Jk++EAVKtb/0LY/ivjZ/nq4wum/ImBlTooS0JA==","signatures":[{"sig":"MEUCIH5bPbmBv2WV5WN7Q0lTW2fckW7d3ZfcoZd8oGuCGvzvAiEAzw+YWQatwulnMARs+MPCKuOasEqI47YVIFa5EQbSHq4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"84871da105a3ffd2d6b889d9f8ffa86163a198ee","gitHead":"3152ca68aca2116bf2ae0088acb8c4bea91c9d22","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.3.tgz_1502896422002_0.4342696324456483","host":"s3://npm-registry-packages"}},"0.43.4":{"name":"hermione","version":"0.43.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.4","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a6de7d2e0824684d8821b91699f466a674906928","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.4.tgz","integrity":"sha512-nUN+w0ObhJuEwXEugrXX54eZvZue72QIMl+JmH/1RlEAzV2Ouejf/iKhsTBXh/6iwocJPCPCjN0xeAzjqR0PfA==","signatures":[{"sig":"MEUCIBlTv27DIvwWs+6ToRCKwpkBJEPeZULLiqTKfwe4e+Z1AiEAwwSaA5pDIczHe0uB2WaVncCQzM8MxJL6OMiWeH80hco=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"a6de7d2e0824684d8821b91699f466a674906928","gitHead":"cd5b7a5dfee0a9c952ae9c8b191e81d4fe57faf2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.4.tgz_1502972229674_0.4131620384287089","host":"s3://npm-registry-packages"}},"0.43.5":{"name":"hermione","version":"0.43.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.5","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"959f83871782fbd567a3a2296b0aaa11df03b604","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.5.tgz","integrity":"sha512-d1Q82lHAjB+ljQpaGxztBAZJDB/DfFGvaOI4mFdYes1mJD46HidYfi2qG+sKWh0cGxlcqojaMA42UXqVHYEc8A==","signatures":[{"sig":"MEUCIQDm2/iPUAzcPt8PQ5uI13kmqJWGrsoXBtOpFIkU6QBUIwIgLk3vhyCMz3nHG0id4dF+L1UF7ksdM8J6Ia9V62UpMxY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"959f83871782fbd567a3a2296b0aaa11df03b604","gitHead":"8b3701c52ed97186c09e96cd801e25219169595a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.5.tgz_1503086932064_0.8016059042420238","host":"s3://npm-registry-packages"}},"0.43.6":{"name":"hermione","version":"0.43.6","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.6","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"82ea7d881ab4f4693359a78301b549155be2df6f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.6.tgz","integrity":"sha512-1dEHya1ScwM2tfjej7HZjzvoEp+19uAP15hVAneovm8HBnC31NPqpWU40nV4G/3zJBbd+WXW98uVQ/PHUY5rcg==","signatures":[{"sig":"MEUCIQCBLWXoyyO7yFFosh9M0ajngkDv7AOQKmaRf3hd5XyOXgIgBSyrvyEyY4yrI5biakO0MO6yQZGZKfzasV9V5t2V4ro=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"82ea7d881ab4f4693359a78301b549155be2df6f","gitHead":"75c8e137546c8d4f8439555051c66d06dd78340c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.6.tgz_1503658769496_0.191888248315081","host":"s3://npm-registry-packages"}},"0.43.7":{"name":"hermione","version":"0.43.7","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.7","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b62c81fc1595df26778567583bda7f3e22e5da11","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.7.tgz","integrity":"sha512-3W2Ohd4KRYn/kZBOx1/55owiJwsKT+Ze3klPtXuk0We/Ea80APwjejbQlbtSmTDiBa1nPIdRiufnibdiojeCbQ==","signatures":[{"sig":"MEUCICXVUmBT+s/lFVIoklNhLe93Y9uVtYhe7tvqqSX2hhCPAiEA2tr0XINGqGnop9zsN96u6G+HYIuXEez95UOgJoedkKQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"b62c81fc1595df26778567583bda7f3e22e5da11","gitHead":"7da203440ac2b88fc0dd9de0ca53a79997a2fe78","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"3.8.6","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"6.0.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.7.tgz_1504020599150_0.14686085656285286","host":"s3://npm-registry-packages"}},"0.43.8":{"name":"hermione","version":"0.43.8","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.43.8","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"92f0bb7b73aa79673846ff3cdd0a1c7394078753","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.43.8.tgz","integrity":"sha512-WgPn/5WUN9nqnLBNdtrKD/OZorm1nn9Adw3X17kMoXndPZi/DOTZ69Pu41ua3gXz++PXxIhAsq4lYS+tFlRkbg==","signatures":[{"sig":"MEQCIBThAF7LvAoVmAgu19nvDjFXNlbFm5jAsPKMlwb/TjxaAiAROaaJl6LmQFH9GZ9YP8wTk1sN15I4aGE/SKv0fSTVmQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","_from":".","_shasum":"92f0bb7b73aa79673846ff3cdd0a1c7394078753","gitHead":"e99c4680d6c9673df5e32f7dd336bcee06499cc8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"2.15.9","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"4.5.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"^4.6.1","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.43.8.tgz_1504859195171_0.109387629898265","host":"s3://npm-registry-packages"}},"0.44.0":{"name":"hermione","version":"0.44.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.44.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"688e683760d3e54d36c3127cd2d40722d44ae9b5","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.44.0.tgz","integrity":"sha512-/MU5QWD4V4qq1P9I3dfWbrWKyVBH+iA/bNJP7TFYHx3wIwdvhcQsOTlbE0NhORQ8U0YNxIUV8iW/7EtRDyNxxQ==","signatures":[{"sig":"MEUCIQDmpfg7BKwgGx4JxF40WVr2VSwUKihhBaZluPnixEcJEAIgfTdgAQxDQFSWpa7J8PTa+bqT3eTMln8Yo5AQKtW1wI4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","gitHead":"317e6613d0a25a6003c80b5a519cae054e8a70e8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:rostik404/webdriverio#error-handler-fork","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.44.0.tgz_1505040573836_0.150693271541968","host":"s3://npm-registry-packages"}},"0.45.0":{"name":"hermione","version":"0.45.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.45.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2ba976fb9b5a692afb5cd3759ec54694060b6cc5","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.45.0.tgz","integrity":"sha512-ZvrSgvPfEoo8JACMdFOx1dMLQVl7iUbPRZbmTwNASYePjN6xGt8OIQGpsP9+j2c45U/a6RwVPQzZlXONSqFeqw==","signatures":[{"sig":"MEUCIGjPpGGMX6jOW6tJMNZSZiQFeSSUhj5sxg4HUu7pu+/QAiEAgGW+Zg1EF3IvtnG0dVDynJP0ygEXIEwouQSg/FE+80Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"119c402f4b491a139d270749b7b638803246223c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#fixes","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.45.0.tgz_1505285271725_0.7271019192412496","host":"s3://npm-registry-packages"}},"0.45.1":{"name":"hermione","version":"0.45.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.45.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"55dc806ff2dd982f34fb5cbcd98e28c44a1a4b65","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.45.1.tgz","integrity":"sha512-zNy/TsiDryyoPrJIxms8dlnnXcuvDGm4VI94HIpYgxef7/rOym9CjPJQ8Q4lKZLcZRlYEOWlqnKmrV7bdWJLnA==","signatures":[{"sig":"MEQCIBCm1XuCEknyYaaznq+3aIYqPAzKxeQdLM1f85NCaJaDAiAzqeWAT4D4ptb5TXmzItnnvKtlFXUFfRI45l8wLNJdkw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"534e7fa5f8460420ff42480a5921657614df3d72","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dyda06@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#fixes","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.45.1.tgz_1505286815202_0.40302276448346674","host":"s3://npm-registry-packages"}},"0.46.0":{"name":"hermione","version":"0.46.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.46.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d2c7f1b9d86d1c8c92bf52513cb8b40bcf9b77e6","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.46.0.tgz","integrity":"sha512-clwef4crxjNeO1JdRff2LcScQMxBuaE21iFfrgnQWkpJt+hx/CpeyttUjGMGa3a0gtvGu2th7ku73zHUapOhAA==","signatures":[{"sig":"MEUCIQD12ze85mVlkLHZvixFiXu/Uc+ZXpnbTxrJFK53ylDfQgIgFzR68FKEOtOu8nHht9krg21mP/SZQ3yQgAq5rc3vgJs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"d697dd5ac269767cedd2f66a1c68dbb6b3d73c72","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.1.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#fixes","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.46.0.tgz_1505486583012_0.6804969296790659","host":"s3://npm-registry-packages"}},"0.47.0":{"name":"hermione","version":"0.47.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.47.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"cd8fa0510656599e6b8e08893c31e06d70e311e0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.47.0.tgz","integrity":"sha512-lDoHV2FJsi9S1JieJH/J9ZbhPShmwy7bzDfJWoWN50TN5CA9Rka31/U8bgaJDQfe610Z69ahtQZPgSJ7MdUcUQ==","signatures":[{"sig":"MEUCIQDPTEO6OKwFMUJuwFScwIVA4D3Az87YSEAb1lo+nGi34gIgAam6hEMI6x/GNe1bzRn0OwJnGQJd58w8CYmfBPqSFdk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"55151c239fc85b157134c12d2d42782803105668","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.1.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#fixes","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.47.0.tgz_1505831232741_0.8753653094172478","host":"s3://npm-registry-packages"}},"0.48.0":{"name":"hermione","version":"0.48.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.48.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"f66d491778948edf455ec79c6f537933df1703d9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.48.0.tgz","integrity":"sha512-QntmAwDZ1Pub3oiCDUzuiLgSmtEyH8i0u0YY2G//0LVcTyB/BUPE1lOSBrJ8KPvL864gOEHnoD98RO0AB2JIIw==","signatures":[{"sig":"MEUCIQDnhtVYiRuWrlmi+pMd7dzfWBTIdk2+uB3kJPgNfR/+HwIgfpJDQcUjKrPYNKSb2rJwTryaFZ+IFqrNCtjfPTSC+P0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"d30c16bd7b2b9cd6ca2035b566990eb67d6c027e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#fixes","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.48.0.tgz_1505924993243_0.9880725364200771","host":"s3://npm-registry-packages"}},"0.48.1":{"name":"hermione","version":"0.48.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.48.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"88c578110f9156881581da51d102eb31991ae81b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.48.1.tgz","integrity":"sha512-r2HIztlQkgQyGsEFS21lfoz1xPXxlK6rSQt3YAgsUt/JphDTFQG1LMtM8LUy/QQRI0Y5pilwmetf9V9FEWaYyg==","signatures":[{"sig":"MEUCIQDjsRghAbvI31qGQJtCW23SAbwnOU8BumNfkIg8C7fD6wIgTbnqJPic1NVJ153uRfJekQHB7O4n1MKLeyRYOJrUers=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"e6c5c4cfc6b2fe05b4ae9d285faaaa3ccf38bc76","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.48.1.tgz_1506682265799_0.9505577606614679","host":"s3://npm-registry-packages"}},"0.49.0":{"name":"hermione","version":"0.49.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.49.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5e0dd2f661c6dc03ecb6f0bc7cd468f06a5654f5","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.49.0.tgz","integrity":"sha512-e09ZW6PHnvoGiG5vgalEup5AscWbFmjO8d1sReeTMtawykCbs2Ca6dk+k5oW5vCkcjrYktwSHq2GZNOywyCkUQ==","signatures":[{"sig":"MEQCIAwJvuchepyt0Yl1z/wq1soNmVOchVFUvomGOa+0GqpeAiAz4x6iQOaE9Nr2tOdHo6ZvSz2woFd1JrOi7AZ9Z5GCSA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"1109b87bfbadf51977adc64ed7d9dfc6153fcede","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.49.0.tgz_1507192535838_0.6054735975340009","host":"s3://npm-registry-packages"}},"0.50.0":{"name":"hermione","version":"0.50.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.50.0","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6e714f55f4493950a205e287a5c63d72f4d01209","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.50.0.tgz","integrity":"sha512-8NZl4I2P27zz/us4lL8RvyBKBy12KMemH9fbsE/xybiKZ0vV23WF+23XMFY3pdQ65ZDk3FzJVBTStEzSxJf5fA==","signatures":[{"sig":"MEQCID8YVi7UYUdO9/b9xWE7Y9KPm/ZHWaYDQXfgD3O30j4LAiAWXHDtUHyxih6Yzr/HbrHdf5JM0F5nRUice7PeardimQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"79dd31adf6b6c11312a0e169fbbe85e46c6d78f6","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^1.3.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^0.4.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.50.0.tgz_1508253600945_0.6961069938261062","host":"s3://npm-registry-packages"}},"0.50.1":{"name":"hermione","version":"0.50.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.50.1","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"aa6669a5a75c91b11ae950af148e39bb4db937c8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.50.1.tgz","integrity":"sha512-lMdzZdv9WRQLmqSdfVkOKXT3y6dXwId54pD0xZmQcOKylD8bb23c3ofS9pBAVpEHasiQBVCrQou7Ft6d0u3kjw==","signatures":[{"sig":"MEQCIGjMIqSeVzA9gJlsqXqpiJcw9MqlGNlAjZyb4mQqPOX4AiBfwQ1TMd33Ct8m9M79J0gRiGsgDNtHY89WKkTh0wsF1A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"eefe3cb425ef0d1761e59ce6370751a69b7e4cc4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.7.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.0.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.50.1.tgz_1508397141537_0.6586265459191054","host":"s3://npm-registry-packages"}},"0.50.2":{"name":"hermione","version":"0.50.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.50.2","maintainers":[{"name":"dudagod","email":"dyda06@mail.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"swinx","email":"ilia.isupov@gmail.com"},{"name":"tormozz48","email":"andrey.kuznetsov48@yandex.ua"},{"name":"up73k","email":"uptech@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5804e4faba6b4953d71c9115b2f2b9821be54794","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.50.2.tgz","integrity":"sha512-zYPKt6Ld/m7k/bJCf0aulAdtBnDEg6KCwmTY+JvTkmxMmfKh0gZzmppRRBrpahkenJ2wvOJwmKsJp+Hm7i3Ydw==","signatures":[{"sig":"MEUCIQCcvpuYgSaN9AOcs4Kmzov5/Ex3CejI/A9hc8bXsZgfOwIgfzfzhKe3eU2Iu0P5c4S5Irzpz+5jmDZhr8nFJ0WWzs8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"fd5c30f0c31509a3f1103328f4f6dc9696eec85e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","qemitter":"^2.0.0","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.0.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.50.2.tgz_1508430432012_0.1790452830027789","host":"s3://npm-registry-packages"}},"0.50.3":{"name":"hermione","version":"0.50.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.50.3","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6d22c1c1643abe4a4563a7be1ace5de4faba4440","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.50.3.tgz","integrity":"sha512-rykQW1YrdmjVtMLEDpJhcgftYLHUlHA6aN3Wnd8RUKsB8da5zbtkrtZeRo1m1ZIUd/gwnDjjZyLJ9J8EbNfelQ==","signatures":[{"sig":"MEQCIEeVRAq7daOVsm3y4osC8aUhNM0dDDeqxedZZO+pvu6iAiBehc1VoWbQGfMUQJw9nENEvNx+FPxQdU2Zs876RxYV9w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"61acc9b7a59f080231c12954999c2e142769ef90","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.7.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"1.0.1","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.50.3.tgz_1509451182987_0.16909631877206266","host":"s3://npm-registry-packages"}},"0.51.0":{"name":"hermione","version":"0.51.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.51.0","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c67a82903b46773bdb8681683fe1fa3cb3179692","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.51.0.tgz","integrity":"sha512-NT6vHVHki/rHgOOLuuw91M5vtVJPK7KJk/Qtq0qkK0sHyGkRgULfHtM0kVPZbEBdRjPIPnFP8+23td1cNQ3LBw==","signatures":[{"sig":"MEYCIQDuS/xmgZPoh/fz5pUQZENWDxetWYcka3Yhou55ZlUIRQIhAN0sZ2TiM3ZpmJF550yn28dIKeo/wgHWNZeh2DxvNf8h","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"c9b4f923186aa5061628fbd9a90eb2fba99b8102","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.51.0.tgz_1509544739365_0.35677455156110227","host":"s3://npm-registry-packages"}},"0.52.0":{"name":"hermione","version":"0.52.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.52.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"9681d7d6bd1e08dcbff10067df7d53e362b82860","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.52.0.tgz","integrity":"sha512-fb4fuVvMGYwEjRAeu1bXzX7W1XamOt/1K1V+p50mNJxtZIl5fhP0CgvCaFxd9l8gqJNdtgdEd6Jql45cY6o9Mw==","signatures":[{"sig":"MEQCIHRl04wtoc5YgVsH2kmT2j+N3LwTNjOZNUHpz76h5oeMAiAjnhEaIzmivWWOV+W5eqDjTctQ+Tv0OgUXguAmd0AS/w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"8abc868765c8af35f5ce6f37d775e8286626b904","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"mcheshkov","email":"mcheshkov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.52.0.tgz_1510318008051_0.002862919820472598","host":"s3://npm-registry-packages"}},"0.52.1":{"name":"hermione","version":"0.52.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.52.1","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0f9859a19c8b33717f830f3c5a31aeee44d6009c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.52.1.tgz","integrity":"sha512-kAnrPYbdyiKhnmXhzqdmyl76axOzUIfgYSpo2b3RVdqEQYJvs/+UmfoEV0kqu+RIP3J0V3PDqziB8G20n4kCnA==","signatures":[{"sig":"MEQCIAwplAH+JbP8p/QMd8UJCwNfrvAZs7ndvVYC8HAqniHtAiAgFOuxQyfO9iJeuCy9wALf2tgiqqP4SJAEd0G2sZGhCg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"656540a1af1fc3f94f20ff9ba1c101939c22f25b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.7.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.52.1.tgz_1511360529955_0.09311429830268025","host":"s3://npm-registry-packages"}},"0.53.0":{"name":"hermione","version":"0.53.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.53.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a55c92bcdb6cd9f749b1a536250a8915d22de81f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.53.0.tgz","integrity":"sha512-Nv+qEaL+2kJDMXXIM1Ol85mr0DjMHHPgaFIhnI5r0leQX3PSJpYbv3v0SMC5MT7YlQJvWZNdtKq6F4VquA6FFw==","signatures":[{"sig":"MEUCIQCTrp76SEItyawcrY+n1idJTeiffhcXdmglu3jCmtIV3wIgRxr5bQH6V1i/p4sUgJpSBxDehR6ri5A2ZkjSSvxqwhs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"95bb228c367ecd75caceab5ceebd5b84f5df896d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.53.0.tgz_1512115688000_0.5995333171449602","host":"s3://npm-registry-packages"}},"0.54.0":{"name":"hermione","version":"0.54.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.54.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"9a391b1de498acf5bc485df440d7780a1d630b40","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.54.0.tgz","integrity":"sha512-nAReuFNBL7RD4MYnlRt5YTNbHQ53rMznbU5N/fEuhPHqNSraUhbqd2uvtr8hDzdQQhyDWK6kLWQ3Bv2hP8TyNA==","signatures":[{"sig":"MEYCIQDY5hoVkPeb+hZHNEV2p7qgOypKUxoSnp0vMOoHCtCKzwIhAKL6b4FJfHW+445kZzcnK9ZwC2wSzcnxnUyiGP5kGlXm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"09825c259351b9993c4663035adc5ffa0efe6199","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.9.0","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.54.0.tgz_1512630493987_0.4999820429366082","host":"s3://npm-registry-packages"}},"0.54.1":{"name":"hermione","version":"0.54.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.54.1","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c15b3b68dce260f9d61b957a213655119e53ada2","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.54.1.tgz","integrity":"sha512-4zxmnUBtiA0kti10Gpzg99QegF0OZ7p0cS1uK//LZT0Re1W2G8H8HGp8riOVAoO+jGq1h7Z+1qxA9hwSu2BWzg==","signatures":[{"sig":"MEUCIQD9vNa8P/Bx7kyaTtffwnQM/rDPolRhKdA2ZUUT8WMxDwIgBVWqoemuSWgcn4C/jdE5UXTNaArquldT8q9LNvHo7ZY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"af30aad3e2befba8249ffcd82e91d35076dd7425","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.54.1.tgz_1512637630086_0.09155265567824244","host":"s3://npm-registry-packages"}},"0.54.2":{"name":"hermione","version":"0.54.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.54.2","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8485b7c9feeaba69917c23a73e4338aedd81c01a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.54.2.tgz","integrity":"sha512-Bd9UXjFky5XXuBE9hyXY3XD4lOCWj7DeG2YP7YvviLzi5/Gw963stMM85Rdj04pOGYYuUm5wQyS3UFrrYFx+qw==","signatures":[{"sig":"MEUCIQCrVkI2SiuPKnp2hEn3aFaa4ETnBPcly8wLke7lsgkBmwIgWe/HCtKoA0Q9ruy47VrW84QcVOZHIeUAoDGHx8589aM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"fe54e6ed2422687e8add016aa7418b3143b20646","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.54.2.tgz_1512676231835_0.5520987783093005","host":"s3://npm-registry-packages"}},"0.54.3":{"name":"hermione","version":"0.54.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.54.3","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"82071e60d5de41812a581614ca18e023ecb79e8c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.54.3.tgz","integrity":"sha512-oE72WSH76+AXn6xKQ8pzcM92kqpyEKI8QzgIY4h6AzsYLudYdyyBNJ6ZPBpKOdNameAiV3urIUlv154a1+k9Zw==","signatures":[{"sig":"MEQCIBO1VSsQ8V4ZyGFG/9Kly/3xqan8dCGhs1XcFqZ4cR0DAiAjOBCYFQSvS6IIWhJhDCTtwJaFUxAk/K9Wq30xTDZxkQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"db5fda298c5896e035098373d90627d78f680bcb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.1.0","webdriverio":"github:gemini-testing/webdriverio#master","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.54.3.tgz_1512732989036_0.4279338519554585","host":"s3://npm-registry-packages"}},"0.55.0":{"name":"hermione","version":"0.55.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.55.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b5e4a0284adb7291467710d0ec29c7fa391aae00","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.55.0.tgz","integrity":"sha512-L/BWMZcTirWmJKWsIy1YfL+xqlHPsHsGEaoWD3eLTFi84DiKoBYvOGg7tivbUOG2Ev1tGd2U/nisco+JIbIdpA==","signatures":[{"sig":"MEQCIDg6n8GjQoQF+U9G2b+d6ErrrYiG3JCMNIkIPDNvVm4sAiAaX2t2fL9udYRzIR085+PqZPA/DQ4ps4M1oODNbRyJkg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"9d79001f1a2e1bdd41f60421b5f111a224dc7609","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^2.0.0","gemini-core":"^2.3.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.55.0.tgz_1515770886049_0.38258010358549654","host":"s3://npm-registry-packages"}},"0.56.0":{"name":"hermione","version":"0.56.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.56.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d2b4170fa349112dc18a475ed2c7f7b19325e7a4","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.56.0.tgz","integrity":"sha512-jn+cW3SHoJibx6cXh87likISuSXvL4Smcus74aQHabC5zkTavKnaz7HV0sJeuwS31z7KOFWi0+2mpYOHtkV4iw==","signatures":[{"sig":"MEQCIGWLuEcaqDqMdQsda75VHulAqRFWD7dya1q6SGMeYWsXAiAXh3Y/mLFhNOWXUYi8bwreuuXnnqsEMgKS70eRgASSsA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"d88330e4ee3dd1fb812eb879c0af203dd9bf4f8d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.3.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.56.0.tgz_1516200779669_0.5560777047649026","host":"s3://npm-registry-packages"}},"0.56.1":{"name":"hermione","version":"0.56.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.56.1","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"fa12d9419a0cdcdb3e4ec045f1fab210a39ec9d7","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.56.1.tgz","integrity":"sha512-TPftm01M6/RH5SxGhGUnrQ3DIVSLr4JuzCXtl4VJ2mLr7JqZTnyD5c4sjjkqioLWx7nbjVgN8FM1Q5ww1BI6bQ==","signatures":[{"sig":"MEQCIE3hS83opCd2mw4oZygxdaB9KiF+nzmB6BWXdKKeq0ojAiBmWcTtgQ4Z73BEqdZ1PYRx5W7o0uAaAoqIeJnjo8T5XQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"4135340dd4bb2a358515c6e86e700a85358fed41","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.3.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.56.1.tgz_1517079736423_0.5446062639821321","host":"s3://npm-registry-packages"}},"0.56.2":{"name":"hermione","version":"0.56.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.56.2","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a01c563ed185ae9130cade3a77acb3f0879a822e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.56.2.tgz","integrity":"sha512-bkwuCRUmtAORtl1mVV5m7k5w7gqgUjN1oy1hrlw7RgYKL8BTtuPM4+FeKMQQOnkCZWM9j5IOquy4PEiN4yylTA==","signatures":[{"sig":"MEYCIQDZheiDSd6ahEmMfkCBeVIbiIK9hHNWirfo+ijhPbIVIwIhAPwpq1KQK4vvbNiGvDH2RSTopMuKmtW1ESwmdvI2nJwC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"07b07ea723d04b2bbca2978c5b677990279b0b6c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.3.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.56.2.tgz_1517324184426_0.0008410690352320671","host":"s3://npm-registry-packages"}},"0.57.0":{"name":"hermione","version":"0.57.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.57.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"bc23ada3e1a3b5bd57b1debccc31004741743e6d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.57.0.tgz","integrity":"sha512-ewfEdIW7ZZLrPzpTR8PcAGvdB3LDAJw+Kr4+Q84WgC/L0V9F3JXRATVvrdoXc8dOHKNsRQ2MB5o0slde44zxew==","signatures":[{"sig":"MEYCIQDwm2RNtbtOvLhJUQJEiBq5RKNjNQiy+JltZCEqC9fGFAIhAJgYlzqEai+cpd+4ha6dok0sdj/Obp8cspfDEESZ9vSt","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"7314340795422b36f03f719a1b9e06751661984d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.9.3","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.3.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.57.0.tgz_1517767699831_0.9441772815771401","host":"s3://npm-registry-packages"}},"0.58.0":{"name":"hermione","version":"0.58.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.58.0","maintainers":[{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8e3591b1e293135794c7ed80c7c76e3603186e0e","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.58.0.tgz","integrity":"sha512-lfX3SofSg5dpR/k2ufhI8NQHHwS+XH5I+vEli4FJRsuCwEmesPW6uNwmLzCs5AoUtYM1kFK5eBP7oVXDgQnR4g==","signatures":[{"sig":"MEUCIDQDMmaL784rJLapO85J1tKEugrn5M1kvLGTjKrAN1+yAiEA2DBRR+B+vDgP/7QGTG8MvE75/hnRmMZwsIkiyo0xFFY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"7ecaa8d9cae5a7e8653f5f3c06392e47bd9fc748","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione-0.58.0.tgz_1517780275467_0.21648897998966277","host":"s3://npm-registry-packages"}},"0.58.1":{"name":"hermione","version":"0.58.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.58.1","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d761b56bfc7c63986c559d4d30b08f62e2ea9486","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.58.1.tgz","fileCount":74,"integrity":"sha512-Atw0vIgV4Dxx7e3Yo2vMIbe1rlu+jlNgzhuZVs3L0jyMsaPoL9dE/qUEqJ8eTKKWatbnRBuWZZ2gzuD/gNR0Ew==","signatures":[{"sig":"MEUCIEehMaH7EzfLvPzNcLfa5s04QI3DGh2Vu+omJIDuPD7GAiEAocufX4vEWYo9yqbGzMOAzepnJjGcrz3/TVKW3KO2zk8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":158248},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [assertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta(key)\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)); // prints '/foo/bar?baz=qux'\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 6.4.0"},"gitHead":"ffff74562988023aa808a6ba27c2a4b07da4006a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/broadcast","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.58.1_1518000473791_0.8109645718435088","host":"s3://npm-registry-packages"}},"0.59.0":{"name":"hermione","version":"0.59.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.59.0","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1fa4d382f1821b80e542469eec8e51a81b839e61","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.59.0.tgz","fileCount":76,"integrity":"sha512-U9oZcY1PC9Nek2vjRIM/DZjLh0698/IGOAh9etXJ/EWaWjawcGHY9tax4xVQ/dw5L1EyWS1ic0veEGsHbVBIXA==","signatures":[{"sig":"MEUCIAY6is/WSs8CS86eLdgLo+MLGSPRoK73RCrOmN8Dxo0DAiEA30ADIN8dtNHXyRXClp4r/4Wqow4cflGSdL5DjFatfec=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161333},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [assertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta(key)\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)); // prints '/foo/bar?baz=qux'\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 6.4.0"},"gitHead":"6406d09463ef56d61a088248201c2e5a5804ecf5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.59.0_1518077206638_0.503475370370869","host":"s3://npm-registry-packages"}},"0.60.0":{"name":"hermione","version":"0.60.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.60.0","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"17ff280d55f899244bf9ae5317cab37e363e36f2","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.60.0.tgz","fileCount":76,"integrity":"sha512-+NEj0lnw2AZE4IUu2uoJEjcge5yXrqygHEnSR6K0ydpY+fosQCkK+CrZmYRbVXUHEYKmtAzsBTq6S1tG03zbGg==","signatures":[{"sig":"MEUCIC3u0kFFoy0oO1MYAa0w6rPyxdUk1Bd6qG4c/8r15Sy/AiEAkkJmPgCtu2eLGOGwS86I6fucAfnO38VgkrvymiCsFWY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":161912},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta(key)\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)); // prints '/foo/bar?baz=qux'\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 6.4.0"},"gitHead":"f389bf18658fbec29e0cdb82ee77a7076a161b80","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.60.0_1518099681510_0.5423874738557104","host":"s3://npm-registry-packages"}},"0.60.1":{"name":"hermione","version":"0.60.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.60.1","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"63ef3d1d89e922c92e60f8eac3dd89992b6755c6","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.60.1.tgz","fileCount":73,"integrity":"sha512-HcyzGfYbx6y7mZ0vT3jof4Pl3DORkJbgquZa9N+usIpaVD2VN58jlgrMEkmubwaAxsFVtjdcgIwXHZo78X7lLA==","signatures":[{"sig":"MEQCIAtaGGLeal8QEd53lWvgNjeuca0yClQUlm9kkWWORH2iAiBF4RBkhs+Z+Dv0n8B9zAawjPse6Tnb9e0JW5VDUCitNQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":158089},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta(key)\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)); // prints '/foo/bar?baz=qux'\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 6.4.0"},"gitHead":"d7bd1e4194c018670501771473d6e03b174d5dda","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.4.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.60.1_1518160942957_0.971003277094572","host":"s3://npm-registry-packages"}},"0.61.0":{"name":"hermione","version":"0.61.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.61.0","maintainers":[{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6399dcac8555eed8e6644d69068df34c0acef668","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.61.0.tgz","fileCount":81,"integrity":"sha512-8CMb6oiU8xCsfZM+y8zh2U8WH6StLlaWk02/T2E8MTWF7+ND1JBaGRaG05lPwkB8rmkk2OAA3ZcZeRmCFv1yWA==","signatures":[{"sig":"MEQCIFnIYsjVSdPVV9bTj4adthbofG5r1wxycsZIFa0nADtNAiA6wHncfjyqn0D1MzCb0g0QTbtuGzUJYjPwGpBVWo88TQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":184756},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"3623b00ee0a0f9c9b8fe2945212d1ee6da58463c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"miripiruni","email":"miripiruni@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.61.0_1518621519615_0.8333607707215662","host":"s3://npm-registry-packages"}},"0.62.0":{"name":"hermione","version":"0.62.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.62.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0faacfc796afcca762605834128af07d97704e97","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.62.0.tgz","fileCount":83,"integrity":"sha512-eFBLvK+f/+w/bhTP8wKYs11Yz0MDzBxy/KCXrNBrZGJ54OtzET2+4m9eLa3lgIlE1F00CIhHxXcRjhtqmkP50w==","signatures":[{"sig":"MEQCIAehpQkEmryCVBerlN/bL1Eg9v4xG84pQ9Yd5WEWFAlGAiBOZJ9eKVnj8XCZur9RWO/AOhRp3a8YW42hF+TSz/rmWw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":215410},"main":"lib/hermione.js","engines":{"node":">= 6.4.0"},"gitHead":"32ab0d92577bde307006b881a5b831355890cc89","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run lint && npm run test-unit","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.5.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.62.0_1519117717536_0.6995696138935437","host":"s3://npm-registry-packages"}},"0.63.0":{"name":"hermione","version":"0.63.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.63.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"60089557c8161f9be3cbeccd1747b771c4556d97","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.63.0.tgz","fileCount":73,"integrity":"sha512-AEUkL9y6U562n+DMaHkRdrIBI2LC2k9a1lKVToME3TVRX5KgAAqsMyuSVhIxA0nZErJJg/YIZSayWTv2f+SaoQ==","signatures":[{"sig":"MEYCIQCTngE/u72+cozXcEcc1yPowtrOp83talu94DjqEhxRAwIhANC1ZuTLhuyYkRsFhxJSghYJtIfH7n+A7Bss/run5o23","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":162703},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldRetry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta(key)\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)); // prints '/foo/bar?baz=qux'\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`. \n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n## shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n  \n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"0b75dde7b3ccc5a80c980e799c53c9ae8422ed76","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.12.2","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.6.2","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.63.0_1519999114961_0.789094014738835","host":"s3://npm-registry-packages"}},"0.64.0":{"name":"hermione","version":"0.64.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.64.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"087d9ac3ae5137c7e1d0162949b46f22d86c8a0b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.64.0.tgz","fileCount":72,"integrity":"sha512-aJFD6/8ur3/J31Kh7Kxw0BKnCt7/14CNVg3reGqm200QeD+ZPhYZwsDtILRLkWSnqt2KCCIZfVu11Zl9PYS5Ag==","signatures":[{"sig":"MEQCIA18OUhLO5p6UFOx/tJa+bJhtSmWaqbfxbUJxMpLCk0CAiBJvb6miJaMCZtrgUCISnpobNS45egJG16zjw4YFPzX6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":163209},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0b8481a699ecd418d6f4fac2c8e8f072cd298d6b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^2.1.0","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.64.0_1521144055559_0.1763245965652196","host":"s3://npm-registry-packages"}},"0.65.0":{"name":"hermione","version":"0.65.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.65.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"f6bbbc84760887320f29a43f78f78fe9f1084cb0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.65.0.tgz","fileCount":73,"integrity":"sha512-CLJ4tf4ET0zS687/KWz6aBEGQyr3A8X6DLmlpmaA6tEGx3lcaAYfeNXQ6gKy88gLfP4zmDTCcykJafMhf9OwhA==","signatures":[{"sig":"MEYCIQDuVcMZPKdWwozCixEQ1QSEUwFhCrHJTYJrGxKaQTYvWAIhANVvNZ9mhYFinfbqDNnOMrqr/wPc9Ii3NsIl7YaflUE/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":163767},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"db4056e890e475872051bbf0a0b7161c359172d7","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.65.0_1521151523583_0.1130411554398576","host":"s3://npm-registry-packages"}},"0.65.1":{"name":"hermione","version":"0.65.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.65.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"cee8b166d1c5233e7def9fa3e7c5a5348eca2f9c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.65.1.tgz","fileCount":73,"integrity":"sha512-afoMCChWJ1C2qYxKuJF+m8rDxEcYo2UQgJ7kYVaVhm7G0ocZSSjnnnou6CYt5BZSBqY7TsslPgOLcllmla73kA==","signatures":[{"sig":"MEQCIGCFfKwASfPCYtjT3cjxOJUnJvZvvsyGpJKlX9tCGsZWAiAFHNt+iozrN2QV9duVUxIKRHiYqHmXm4lCPDyWigVztg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":164164},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"b5fc128671b30bf1178e905a48c5978256f3af9f","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.65.1_1521207796706_0.34090063150386163","host":"s3://npm-registry-packages"}},"0.65.2":{"name":"hermione","version":"0.65.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.65.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b97b405796472292df4d1d7d5823ea2c111af68d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.65.2.tgz","fileCount":73,"integrity":"sha512-pBSwegLSL5ZCp6QJSd+TN0T2HkCL4TMOYwAvSPlCT5G08yyCK+SHj3GsWzunD+vNyfbjXnXX6IYaQZTgbtX9Ew==","signatures":[{"sig":"MEQCIGxcT3EvpZl5+4LfAtR05xgIMfEdv9R1ut9s0UnhET1QAiBeSvfrb3Q9876puBW8hCSM29pFbsYntNBrkFKsOZtM6w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":164284},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"ed21b7f2f6d36dc1d5d999c6c87c3a19d42a76d0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.65.2_1521453578068_0.7675142988689327","host":"s3://npm-registry-packages"}},"0.66.0":{"name":"hermione","version":"0.66.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.66.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6349d357e3df1158dd133113c36820278a369f39","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.66.0.tgz","fileCount":73,"integrity":"sha512-BjR8VSFoJONeoChB/37urh5csvSehEqMt6hkKwUoAihNYOytKPgHGN6ohvPljHDXE0L6QyeqtS6LOO6Ua+m1sQ==","signatures":[{"sig":"MEUCIQDAB9aO5wAR9MKn1xaU4p47Ph7GEdcyG5Tzd6ovCOpisQIgYlMIDxLPPdwY8Xd3/j40qJfee8kw/WSA/NJmWNmJyNU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":164671},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldRetry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--conf` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n## shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"6740034cdb726175faf5785fcdaf88e34dd987cb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.66.0_1523355010899_0.199133468590738","host":"s3://npm-registry-packages"}},"0.66.1":{"name":"hermione","version":"0.66.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.66.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c06b22823a3184e8d71e79f3f8ddf4aba3d3edda","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.66.1.tgz","fileCount":73,"integrity":"sha512-dhzTts+gnwPgLFr1/LSDl0nvql4T7vsYdRDDHajdMATJHrxoadBiOrHd4nLETJlLSc6X5kzTK+MZk2zgvpw2hw==","signatures":[{"sig":"MEQCIFvFdBIF4nhBFap3HdiPwhH/vy4eb815CYRW0FGZC9BuAiBkNUzMz6rwfxZUpOn0nqGJ8g2VwNbdgI3bmesEP/6i+Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":165144,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4Y+5CRA9TVsSAnZWagAAVrsQAJMyiAb2l9FZ2QmKCCSF\nWsAqs4e3pBjyO/eB5KV6g8v7LTepRrfnKVSZcXG/HJobaObCBYHvxQ6aYXi4\nbv2w2NQfljNJyTcw11Ably26nWDSMEKfPXRuCZ0742RuShguabexaW+csQSd\ni+hq0HpLOJ4wQzuvftYIudsx13P43FpOp83jdbXUXsT2q53ps4XFgJ48EZMA\niPfi+m/obHY1rw7I2nlx6jReYWhmFiUsC2qYjd+nxvI2+pTyW8tRedJcY3gF\n3VbpHElfSEW8TJRwUZuZWYOaDjM4TdkrChrdO2l8yR4hXyRpI+KPTM67XllX\ntf8q53HODJLPjgAAulg4FXQxp6r+9j2s4wqpAUDid9t5Anazxm8QFGXWVvyg\n2QWm++VOB108h15DwRQF0X1/5GVVAMktf1hKO7T8TAlRnZlH2wD/pJ3Tnclf\nlEkZ0msajXgREtpg8cOmKm9sHpbuhr2n1opFOOzfwX9AIymRA52/gcLDVXdq\nU9D6ChZz2FqOLmKQwXj71EANWaFTYCgKINqeLvJa4sUfMayKFwAWGvszU6bv\nBbpp+S0cVjzTcMqa3uVS5w5R5vJqeFyhB/z15M09DAf4CPObf+CaggmATIEW\n2J1Txf4Ej5c64YLKO9bWdBZhogA3R37JATi/5JI0KjHFVvaLhV53kFlTGV5R\nQOcx\r\n=OOG7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"08162fa582ec21b61119da74acd5af8d62b5e5e3","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.66.1_1524731831300_0.4551243139817791","host":"s3://npm-registry-packages"}},"0.67.0":{"name":"hermione","version":"0.67.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.67.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d7beaca1d6fedf6e9e21205f809ce87c01a9c66b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.67.0.tgz","fileCount":73,"integrity":"sha512-2BM/VRqz+iy3ExEGGrdzFC//lXR18TB+mvfrAQFne5upminykv94HYH41xuBPe8U7ZkK9+BsxZ+u+XBf3bHH0w==","signatures":[{"sig":"MEQCIGTP8IAsNmkG1/nD26h6dR5QhNTFKTWvStMFTMndn6HgAiBILa4xzvZB5aA4Jz/AT5hSZ9WdhjTk+v9sLpOOtfbKCw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166323,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8Fp6CRA9TVsSAnZWagAAaBsP/R1+owjUuTkOA2IID9Yz\nPFxnGXpkOCMir2u15RgFZwwFwnZxfvmXHuaXBOlwhTjb/E5h1CCtfaI4r4Fe\nO+H1tSeMAj/AUAWR4LfMFe8EVyM18xMw5ehmqo3HxS494uDNwFu97V9CTsj4\nV5QslBYPMVImUsEm2um1yDBZpMp8vCVzwMmSRcK8gwKZT1Eon0NVzGrP93NW\nv/5Y/EYL9qELMh7FKPLjlzpHSyPRdKuu1NR4O+88BihRqMejMY6NIv8QV25i\n0dyklx/RPG52YK6k8WlJIJL1gjGOz9joJ8uVbxFlytRsPhtnfrjG79UOUlTE\n5DSxKAW2yoJq401WbDq9bdwiI3UqGHZCnNB81EmoubM4ZWa+kygmrOUURlmO\n4eckklIXanVnZw1svWA5VcLq+SHwuEmfHS+ReKagqX9kNBVpCzQY++2jl/nz\nh+7aC19gssCPlc9tDY03rfJiTvvVSiTd/uvijp6bZ82eY43S9KoENwA6tgcA\n+YmRAVUOrwns+vXLiS56C3cg+S2hLg+2BF2sbzLqJE+pI5x0BrhsG8ikawIH\ncELFTp/sYqIF5CXOWrbj7m7Wlv+QW/owO3NUtmXPNQH9D6DOoCfmB3BlOQKj\n4QYqlIglcfTeIFtlQAqJHs11A5oPvEpq2qp8IYGUrJjA/kOIrduPaxQOKNOI\ny+4U\r\n=yUK8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"818cddc7df2b951b8ecdd5f67dc514a5508d4410","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.67.0_1525701239950_0.7653557771295711","host":"s3://npm-registry-packages"}},"0.68.0":{"name":"hermione","version":"0.68.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.68.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"f2fdc5a6a7b80e6d0a5d7e1a553330ee14a033ff","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.68.0.tgz","fileCount":75,"integrity":"sha512-PBEBCcgCiubuublH4pA7zy1z8NwfgTbt20kfQa3tAx4T1MHr27jwvReEabCv1LK/g14D2NPQGc+0midQwfsSZw==","signatures":[{"sig":"MEQCIAlndakZPUCh9GY9vNG8gb/4SpCtQpjyS4l9GEOxAHq1AiBgGDbk8u85RKnVBN+MAp8F0HUT/MqHBk0j/hPPRIeE0w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":169435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/ZZmCRA9TVsSAnZWagAAs5kP/2Zbsqeh0De+U+aMk3nP\ng9d6eDAdtyCTERlwNCPdXW6ZO3mnHJwbZGDcjVFDsRr7CVFRM4KZnJQc72L3\nFuJ9knDdFQ0HOZL5bxWjTWSZemCPVxwrLihsF5g2feEGWi+SIvcdvtgCVAz1\n8PyDFuj5xFljLHUQGI1CPjuhsXMb6Dxxx7Pvbx2Pw3B7HPz/np1xLXTPgk4c\nElD7gvLyol4S09fXfJdGwTYsOrilcU3Njojs3atLeroOXttzlreXqJ1n8C2w\npKuF6TUg+jAtO7HBUDtanHFmcPyOLZzL6W3fxoYdlfyD4OHd0/d0rRUp5clC\nqiaOAm14cDikfAc3DMf2pxtbJu5Ahf3B5ZpyQHId/A8q5+izskY79UuJgM0X\nhOqpRELiX2ikwDAtTMaQtS/PpQCZqoen38y2o3PVWLGHuAKmFMHbE2KjwNuW\nRTdyDx1t4IvJ6sJc407G1z/196Ct0x/bB4NO2iaP4v3XTGE60bWLrHSfg952\nWUTeES4c3/IO1fGpoI0aqVT20AWlxxiPdo6qX1XqwW68nvjOisLpY1S16+Ei\nM75PNtIk1aCTbFr8r+FnPzGGKPz+OB0m5AGQf9v/ECF7AHws5VB063vD7d18\nkECj2gdBwRhRHr3W0Qp7wm7+t72p1e/49HtG2COqQ7TaKGvuA3qUVLwcoX4O\noW/6\r\n=S9lr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldRetry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, browsers, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n* **options** (optional) `Object`:\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"876ec9f1c7d0c627c58f933fd9b82e1e5ca4ce97","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.0","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.68.0_1526568548013_0.17944056555235832","host":"s3://npm-registry-packages"}},"0.69.0":{"name":"hermione","version":"0.69.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.69.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"01e796e67b63213b38c234fb5e7ec442654f098a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.69.0.tgz","fileCount":75,"integrity":"sha512-4VbQL7on02QKkhNWcEk1dTo0MmbplSfNx+7mt1u/IqKWJWh7L1mgV8dFrvd39d0fNAkLDdQz3SEWEVNB1OHfbg==","signatures":[{"sig":"MEYCIQCSYt7f9NjsYAHSWwlq7KVi1B6ezTVfCaaFdW316UP6wQIhAKfQz79T3AKouk5GCCmHVvHJd7ox5X2x9VOV2nmhOb8r","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/aKcCRA9TVsSAnZWagAArRgP/2c6qOVSxTE935x3UR6X\nz4SEcbfNQfhjz2JfcCB/A1bvmp9++SToZfhozF8VwZ3CyrpF8eCyU7Qv8hFI\n6kYcnScW12ovXJt8T9CeOhiDjkc4Wmpih22/OkyOA3IB+ELdYOb26JXmZp9U\ncFgFF72Kx5pVRppq3tRU45CGIn/+J6u48DFdAPDxxWgn6FxNN1rovpdVPSI4\ngGQrPMv08qpj6IsoQCu8Egx7YH2GTj0I5QFQN/t8JEPiFCTyImbE4vNcVLit\nOSsvSb7jg40n/ms/nQ4p2Armi/9F5pkPK0LbdQswMuGA1jU9Nn6xio7C/iXE\nWGZpFPGS2kvH8Aw6S4GK9Cvxq2GYNXl2uGndOIzS/gtIs51xVNXKkYkjGsKF\nb8J6urSwFh8mJbiGIzAezmiOlrNBw4dOBUNa3GL8OTEuMYYrBK+uXLagphfa\nhxifht9LemFfnHVb1IlyuSh9XVScKUP4CQ8l8gsna/BslpS7Uqi5sEQ4jpHh\n2reeWrhM1b0gLGbnbP2UStkfSToyiUIBPP2U4M8FktMFpKOseXhgow6r4qBl\nwz5CfZqQ1ZONFggbpxnT0vnaa69ofY9Zwsl9bvCXzo5KfIHW+SB/Rla+vPD4\n+yOU1SM9+1fDxSVDavZ7eFKaeBvJ4/Fpjr4cqqLI7rL8cS59lNPk7EvXk9va\nmthv\r\n=n4uJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"7681d4121f45e109d5f43c210faa2b3819eaa41a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.69.0_1526571673949_0.40435934204840907","host":"s3://npm-registry-packages"}},"0.70.0":{"name":"hermione","version":"0.70.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.70.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e1af15839ffaa8baed20b8f142dace1249c94ca9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.70.0.tgz","fileCount":75,"integrity":"sha512-iwUKOUR5jKh+ptJ9JCGvTaaacmXZx6Yp2Ok9xPBG7cwdNqDBFtZ1QP372z0DEXhUdzWSMNNJvfetPzxloyR7CQ==","signatures":[{"sig":"MEUCIQCtFk3pv0QJ3iQP95cgxHbnV16JsP7afwDJ7xmTrvJwpwIgKxgrab3sdgBtihusSOmVDNKaYnH8VKizViT4/F5sBeA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbFRUlCRA9TVsSAnZWagAAGfUQAJuahiWTZAU3QHeEfldN\nunF2DWlBE7xHAJ2MhYtkeACB8ICjrCDJfibLqZuw8YPJ7ekjJ/YZIR82C+M9\ngQuikTolBO/w1F4jjwdv57VAPx3D0ksenqnu6rVM+UzWCxFG7twtm/8FREy2\nPqdSY+xwGgbfDKOLBphDILL2vsIi8Bd32bGMv7L6dsPO1OkIPMmHCJz+/y+l\nc/maq8aaC6etRVI3XtnsXG/knE6ly+1txBLNFZ+BTb2bNZ56qAHkjbsvbmnD\nHX2Vczx9yo5K8feQLsmDaeO8FqKrdJ6IpjJKLmXPPk8+sasVryqWDeVbJLt+\nD6vkH/UqrBCYyIEOl6G78wiKVLniusE2DchMqrAGqPF4AOnghqvpOLZneT8K\nCtoeKoGUMOzqST4nnBuYuy8uOBUgNNHiWw1kbaJd35hsK7nqIffisl2feVKf\nf/vq8vtBqQsj0WbmEpdtx7nxW2ZdQTz+fsrBlu+g7QYS1J3Bftx5D2ryiP67\ns8/Uf9VpHBDgMt+RICTGzThsIuBhyGdQCq05V4MBABVOaIFw4UuiBSfAPYow\nyPiatALqapdGFST0JX/AwG5h5lfbYFUuNnH9tiOPdl06KMuZonN1eeVG+kRQ\nRhcccFjwcVpM1ijgsGsq7vYIUOVB2J3OcmBniQb8b4N7KGrsEpDpH9Mnt6b+\n0JUd\r\n=qRqg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"4a4e3e80ce65dc25cc112dc08c30c45e6e916668","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.70.0_1528108322748_0.8845277793645565","host":"s3://npm-registry-packages"}},"0.71.0":{"name":"hermione","version":"0.71.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.71.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3c530619ed565f9998cd2ad70994f5b014bd7084","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.71.0.tgz","fileCount":75,"integrity":"sha512-Io8RrxsIwuDVGVVoxsfeCZcl3ZO8XMm2O3QFOK5utd7IX25v5V+LCLjJDhjclcxcJBgUP7gESmgHKqply8B3GQ==","signatures":[{"sig":"MEYCIQCj+j+n3Gy5wUYcyRNzpTHi3nd0rlmwpUVz5g44KLoKogIhAJlQxXH9CT/YWYy6Z5n3noHlQrgjDnqoIg9VgH+B4PKq","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170850,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGok+CRA9TVsSAnZWagAAE7gP/1qeDBHZpVUy5jhiv4ZY\nmDEHAGVIszDDKGcNQ0FBonOrAKi2ruWv6pYCbhl9960qLajlnfbI/L9n3Kcy\nXe+OGF0pJ530cnxCIhTWV0R1nfpRGbh9bE150D8o1PEDjS7ICnHcWDVIyL16\n6rceFBIJ2uAsGgltvbU+DuYQAbpdmg60QwprAfxqSCa9/mGmvKmz1xgPJH7b\nLMWtCxUt1d5oEp7E5ZTV94JGV6hzFbT+zhSYWjlmkPil35IpKHtPUJJRzbdW\nG9sjUqx+OK1TSmw+A/kGbUd/rVdtKFbReB66jKn+aH16c6JtxgqxU4yUacLg\nV4EO5LoLHzriRW3VUpjbQaRf08U9gyyb074xQ1iH/MXrruleCq/i8RtiH7io\nUcawhd9YqvFtiZzVrUqP6K5QRzuCRaSDB4P+tHB5t2iw5118r96sipzkohoG\nPMQWaKXOdaUgU7FF/l0S7HGF7RwggDNurFmyXM0CFAXRGlqb6DufcARZwlNj\neszmMM05yyotnZrmoXM0wcOoZHfSmVwq+7U3SC9bc12klKp+UBv4ZmvD3XoN\nyeVxREgFPEBp4ebeyKg+xJo0XQdGC5p3WcAqUmvH6C5B1S/qNzQi0/87uYmT\nTzvy8ZKwNHah6Oas3yaeblTNvvMnbadU05VglhFrVVdrxlU5ooF0kLkH4ytd\n76PY\r\n=W/at\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0450805bba762515745d63ea52a2bdb4c7eafcc1","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.71.0_1528465723396_0.9138662295751285","host":"s3://npm-registry-packages"}},"0.72.0":{"name":"hermione","version":"0.72.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.72.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5662151764ee60138e32b593e262ef147e1d6c42","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.72.0.tgz","fileCount":80,"integrity":"sha512-P8vzksL6kM4SZVruT3Vbsuvjk7JtPHHyj46HnZoNz5zNRbFeHrysJGEWuiasC8v8QQDR1bGHc8LdTCSpuVTD+w==","signatures":[{"sig":"MEQCID6IQl1qaWbQboV6afiz3yubHmutfLthNuOEaC8k4bDRAiAwdJXrkR82rqExcAdqrMBMuZTziCwtIwkVLGvcsVOTyg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":177090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMVZCCRA9TVsSAnZWagAAA+UP/i3BDjun0I10KHZOvEGd\n88NuuUhrThEmh8KHiJ1zj8p+XR5MiTTrn+1ySQtDtv/dDjRzMO3w7M0K1AXL\naTXoFz0aJohYhBqgMoK+jwD0bP3J8H9Uii8aUffXJo4DUqOwQRRv8jZDxAWP\n1OVl9mj/Go0H2MfevUjCZjb+r8zjXh1I/Y2XlkoMIjZQj3j2KmPWVDD3bO1n\nRZXoY5RXuuHVFKWaxYjvDQE25Wg5wFUDDh/0I6+k7NEDJFLEgmTpYUXPcYNz\nAPPtYLlb53RYY74waGLRl2U8LOTiWVtLpxHYkzBmo9OfSN3lGLgHVwzCrkNY\nodpTF1Uje24JZ9PhBKrLQPzjD8p19zzW0QfCt+RJN9FqXny9bgSJUWHkeAdZ\nbUIdVYNz4VzWCgG2l5SNHtH3SvcDpRWVUpc3a9jR74KaXPQshqXiKATSw1ac\nNOxp6iwjUGWiVaxic5rfSaZV/Qyo4PhJFakpIp3WTf2/FUOrBmQ/Cr4gpM2v\n+ZNRoD7/HK9hUZFNmaomNSEW9MS+spLwjbjm+pLT+vZGicGnoOrsNYLMjVeT\nTpARmX/9eG8h4TLByFZLAlRNKWoWeKpifAdmewIlNBpzExL1zW7QSJOyJGqt\need1VdrT6LJ5/aLE5QvXnw8J19tHLQrZ0WW7Bn7+T06ed16bj34zn2ewfobT\n9+SL\r\n=LbMp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n","engines":{"node":">= 8.0.0"},"gitHead":"c51ac45613c87a4fd2dd8d5c95dcc6a154a44373","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.72.0_1529960002647_0.9915452892948664","host":"s3://npm-registry-packages"}},"0.73.0":{"name":"hermione","version":"0.73.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.73.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"42d59790dd274f69fe35ba2a083f652a485905f5","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.73.0.tgz","fileCount":80,"integrity":"sha512-Nexdwe7VT3AQawL0JBvlNl9aV1lpC6InA/HXFk9xN89pIpqvRXC57+SEe3KGjFg+EzqrDuPNYwTCd7nNoCAs1w==","signatures":[{"sig":"MEUCICVXpCDqcwo2zf3puR1tuRPlW20rQlcKDYAVj10MRQT+AiEA2WRe7feoV85MZuhqWEayQnNWv+hDSQkkEcw0NkOTaRM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":178360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMjMhCRA9TVsSAnZWagAAP88P/2LGwjLigUtK+jFr3CUW\nRPu+kikSlmZ1VkbWSSTzGv3slccgyiWxGCa7bSCXZfRaPvhuu8zboJWMTMZD\n8YReGK6ohjsorQPC+LYP9hEaVwhxWw15Eviby+jhLoRqzrLEi2OGqKfHtWxk\n3oz8y5UvG6eKEIvPsajtLYprjV4nNdoQpU9T3IZmuyUvs5mKMmvy6MjUWAnP\nFigT8F7nZt3vLm4kvfQ2HlCMN0diFUGLtVkQN4O6DL4xhZk3QwUDZz4dx0QT\noRiMsxt+z5pn/esYneQ3VjWAskyGmU1VPISg8RFJYujxpKpC07xlL7wVHNUI\nser96ltbrmgcwviGeJ9n0tsR09REtjxVpnjGTqA7tqY48Bl3Kw2uInHhfEHs\nEOgkawnpub9WLegXtr1YIIL1PqQIqfCyLCERw14a2xEzhh+G/5x1a3aSXAv5\nww65l49O54nrfeDQN4941hnK2T4a/YIEzKCT1PWpce8UVVLlfL20JXFK/gES\nfUEE6wNh1dc0s2PHW+t+gYT33mfOKNf7G8oRH2TpJNH6SjRW6uQ8ak/mteW1\nvRNYs2ArcWVNAeq/CLZUApF/6KG7CECbrVDKXg5DDD8CNrjImyR13UlzZ9gd\nO+KdbSFGSeADdaxziHfL8B000Ak7z//wADOSjBdKt3oT38m8BhNLBuVW6LFQ\nG0+v\r\n=3Qql\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n","engines":{"node":">= 8.0.0"},"gitHead":"18c57310b23d5fdb562b565e09d4fda070b70fec","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.73.0_1530016544937_0.5351947007853655","host":"s3://npm-registry-packages"}},"0.74.0":{"name":"hermione","version":"0.74.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.74.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"78a0c76bda899d08af5038e488f5fa742002345f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.74.0.tgz","fileCount":80,"integrity":"sha512-MBu//b+rUhkWKA1fKcXX8lzZ8OSBjNy0JMxBa40eR25kBczd4GM5dDXZSUiL5LBag1QnCXsK9L6v0W861v9+Xg==","signatures":[{"sig":"MEUCIQDN4don4MQpC+1Lv9bzjxRKsf82Qy2tAovKxSU4bpceGAIgLi4MQ+KNwG54WuFnsZGGRI7EJpqqeK8lJ/ksu5rb0EM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMqFrCRA9TVsSAnZWagAAcBMP/1HkL9pfuJnK1yiERTqO\nkPQbfFNFwznW55tVckHcySUzuhu6cnEjwTF3PL7egNmo0MW6WT849EM5dMZV\npxuvD+TW9TjDfjfcctnONC5tiU/yJCWYiaYbSx1bepmbCiLfk9RAidmA15b6\nQbEACJjRdIsyHlu9gwnkTjayTplTHQwWuDKlNGFAO1o8gtwuXhxy+HZdTOEJ\nhxPgmzt/gBzumkyp3ACZkaJjG65FcQ6XaT5JgueLjXb1qgbzy/LJH54M7kaf\nkWLXfGj9WgYTS8+n+O4ID5CkJ0E8wJ2BwYGad+t7ihqzfWc7oVAtji0jbU5K\nhTaXDOVMkFbYouFDLLExoh9Pzrcip3LmVMD5hXYfWZQr5inDjYzrYyEOgiqM\nET+SM/O4P5ylApx4tbUhU2ouv/RJFavqHmSb+oG9MqzTSi3FBX07v3RCUNv1\nXdo6XwxZpWn7YZIQM7TKyMwTIG2HaQowewIukq2ln+BTJKhkvprjn2Yu3O+i\naPQLPVBpn6mY3F6MMJBzIJ2fg/woo9NVL2TpeJByPHKv0iZOu7rE42Kopi0B\nK9yhdQgrZvNiVDXp+ernXc6uMRdZ7OD5qYlAIAEXCDK25Bvvww2PI+6OwjXJ\nQsiGeBgdN+qU/z1q+ukz+ygpB0EeHJSvrmt5rc/7ckEwK/Pp7MsJtPalsKq0\nBNQs\r\n=KQJc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n","engines":{"node":">= 8.0.0"},"gitHead":"4038fe901d2b8dbe430af6c6c7ec03b09c89ce94","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.74.0_1530044778944_0.22217322453932775","host":"s3://npm-registry-packages"}},"0.75.0":{"name":"hermione","version":"0.75.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.75.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a0ade9c09576b50d26054b293bff399e9d57ea2d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.75.0.tgz","fileCount":80,"integrity":"sha512-Wyf379EKnjFyGTWqYYjaFwXJJ88p2AeoErFM9pwg5JgQqUhdVsrvG7jpvJY8Bz4FDfp4xMPSJ3pqsp31IH3Mtg==","signatures":[{"sig":"MEUCIQCLRBfkZONjAYNgo9k7OlefJeYKLMVyWgyolldvY4JZAgIgBX3AH0zpbp5G4qz6YkFZWIG1uRWeXJxAh1rVEE7nRlY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180151,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNjv/CRA9TVsSAnZWagAAKN8P/i1MVl5NncXL0ic1LnNT\nu3RtsbMt4U2adkEE3rrHJAGadQ30gU9J22hlMnWZ1uxTh3tZtb/2Z5k84Kga\n90saywnPcdG6ONaYLgAY66UKLbf33EdLxzaUMnKMC+atdApjyLKyHvTzA6ui\nRhI+UFGDeD9twdvy7Hrt3JzM/7LGj21+qz7Pz4XX2hz9mIn0r/McdXoyXvGz\nfJUmfDDN0c+1LFNZGRFaWVboUqYwHqESodfr6d+gRr6Mg9BMkwfsYGzaoWxf\nCIQgGYKeT3cbgxTxDc9+dKs1s8fJGJT+wNtoAR3JajrVoJOBLN/Oa3+7z49C\nbb6HEwHtGcMVJziGj2fbuzQC4A/ngp5gDOffTI5ytZYknwzX1RzA6eDrsq9u\nsW0NBj5wqQa+AZnZyC53LQsAYFiwrtSiCCtv4jHspNgFmFE1cI4uX3moSbO2\nuqf3W6YuQw3yqCr9ynbPnFC7YI3pFS2GmDB9bOFmtLsy4MyG+69DoLJOrThx\ngMGqJ0jtmnXM1o3RDmhoWZYEiyloZ/aj/VGnedE99ILnqJRgPYj8QF/IavCZ\n1wZNB/0wQJ+DJGQ7IWYwKyzffP6w4y9w5czfhCFWbbOyCpgZ0zxFr7uX8vg4\neIaBgpVM6qzFsUmhz2clu8Eq8TDhYY6zJVqjUcUTDN4ZmG+G5wkexgesH/Ch\n2Iz0\r\n=ZRCi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"8d089a686a53b992d84197b952bd2564373f9884","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.4.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.75.0_1530280959816_0.3138345337988615","host":"s3://npm-registry-packages"}},"0.76.0":{"name":"hermione","version":"0.76.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.76.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"afb209a385677f767e4f7af60a6295a1c400604b","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.76.0.tgz","fileCount":82,"integrity":"sha512-w0qHwZbiXuc1GJCCch/rsbccYGqTz0tVrcrk/qXx0Y1No42u24Zt0asx+4eMLpU5ZTO/NO8MRNn1ka626OIrjw==","signatures":[{"sig":"MEYCIQCDXDlvfaDSy9jqSeNTH/DFICylgeizay9Fm01Bt3zeawIhALGrSkp7cUpnwZBaHVBPQkwXCfw5UDjI6V9QbEeBi5rM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":183914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbOgcgCRA9TVsSAnZWagAAbiAQAJVO+Kcpg6ke6I4cBJe7\nqd8EflGrVskO7l5xm7t2cHM5gcrypQ0mvTBR5T0FFMPsO2Je+n2Df1rcVEPo\nw77s3xsNUvcf3lEYzBrRJW/EJkVBRs9GmOaWr94Z72D3jNy6djhLMfFOSP86\nobZoyc4bk3EMzZ5bMMMAzl0fBtxiNCjN1fhfeYztPNqIVIk0dgGO/t3WQ2qC\n6sEYjEam9c/DMDGI59gmta/sGkfNKwFQVPXwaNXN83vhWNfxtqJgUe/Hvv+H\nPIUrGlFy8jB40oy2Xme2EN5KLOzoKRE6RQBwU3kUElkwqJf33l523vwGy2Rj\nQj/v3uDQfAhMurq7BTYrn8K2gOw2G1Wm1ILo5y1EWKNzd3E2EKpIEZhQgfSs\nrLL/QH1fmtvWX1EoiUvQFnGj01QKxavz90FY+DWE6Ph+mKwZuHXPk57DkqGT\nhSsru7ZNQmE5/I0m84F4UqqgqmihyrBVwItk22xL/+BKB39dwdMv6rCM8a06\nRlaX982Ko2v6ezC3tdoG5IX3N/ecaOeO8vDWdP5AZHJmJ6MLHiFmG152GTeu\n7HGa4ALYEidW9ntpTDGZHioSN1EOxP7E7zpiVg/L+7kXl9XboiSElng0iEE2\naPeM7wqXIG4i90PVU4C1GDjvA9NGyvfUBUeYO/FIGi5NDOKR03zUrejVAdKH\nc8Bh\r\n=vYqA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"40d2ad04daa12857972390aeb5d484a4dac0af15","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.76.0_1530529568133_0.1745473261807211","host":"s3://npm-registry-packages"}},"0.76.1":{"name":"hermione","version":"0.76.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.76.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6241bd112917c955211598717ddce914fc2a19b2","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.76.1.tgz","fileCount":82,"integrity":"sha512-o9SPZ884rzgWCkCTv8AOqAz1gVPTvTXxAS3TFDrY/CbV+qf+G79vikb+qeRd6N8dPwrghV2G3LX6fLUdw9JXWQ==","signatures":[{"sig":"MEUCIQC6rP2sN3eBqiysjEORObf22kZ+1eee7LHWmSv8U3y2kQIgGAbALH+sXNIk6lGyjRS9rUuV3WBU/2d2qU1y0rVHrYY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":184156,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPJzjCRA9TVsSAnZWagAAsjQQAKGQC9OxFMt8bhwCOqA8\nlIajJ8rrsQ9nxlm7ZKqgwXZFg17JKdPsUD5j2j3rWSGG49kkvfTAco3X/bCi\ngGCgT0Y+DgreV/0nZSJKGDE6NWIrDgDw+BLK0kQIYMkgGR2vFFvgh6H69W5n\n5zih1KdRprJXyONM0MzlZwhMiv6Lw5XqTjZdUnlQqMX/bfiyf6E3YEeRfrfu\nZ6z9eapy+r/9I7dzM93Fq4dz8TDjfluc4NLeaoqgKtZ0RwuPLI3CNvMZyKCn\n6iQFSJTC8NbqspFcnKrE1Evrbyr3cdGT1o+gVSOMeDs0IAyfzKVfN3dABznQ\nPffXpBzookIr6C7MSAALFAKdRazk8sXJXFHaGZsvGrGTmCb/sdk1j5D0AQEl\nWs6bplj73ahsUiCSp3sX3kGN46YZsO6kZ1Nmjs30M2ZHjnJYIggakOBp68lE\n1xRZm6E442tkgHuVc8+hlR6yyKY7FZHIoRL/Xkhg/TvwuZ+QH+PW5snUUl7s\n7J2S/bACsUKPwfwyG4krWJbdDjwKWhvb07CGbk0b0E2P/+ecE5hXQ3QndZV5\n4cynJcqVVqqPzuNw6PXbChXJvrx6TD7c04Kk9GdpAmOtKQIUUkICbrUnOHIL\naxPEUMPU73qbzbF7Qg7hgfvdA8vGzZ0IrNWV49TbF6xHEn6iCFtADlc48it/\nJzU0\r\n=bxvI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"481387fb1bf106acd970f3437d68e6d751556cf9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.76.1_1530698979854_0.6753365083319629","host":"s3://npm-registry-packages"}},"0.77.0":{"name":"hermione","version":"0.77.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.77.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"247878e895133cf5f2606de1a3b6dbfaf3a3ba39","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.77.0.tgz","fileCount":82,"integrity":"sha512-IfcNhWzOojg7CXBuXpNaqJHhFW2CxU9s1v7W09caJkFyeaDLUbV/UWNr1rTlnHdC6vTUwHqmN1mSS9P+kZ7aJA==","signatures":[{"sig":"MEQCIB0CFZWVB98FCXl0sjQ9ODwt6wIFGRcjPYJUwb+mz2dwAiArvfDleLlJDczlYugM7nZrGUbB0wn9Q/04hWZmoUDC+w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":184386,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbP3QLCRA9TVsSAnZWagAAVZgP/2rubgvpTj3IxzirXkQH\nMALj1r7O7bEqD+WlUXLr6dKpzLpCo/qWzQb2xbmQFu6b1uCL1+01JT9MGtej\nG/KvHh9qF4aCIWAgF1uEFiEXC0/rhzE8JlmoxKgDE2r35Wq9nfPfJ6A8KXK5\nf2BO29IjeyUUwg2eL6nhYtJDosqkBOsM/ZewJpBPeoxIdrc7T7xMmAofPpJM\no9DVancmT3tb+MWTityPIo7fiAaZpdzixrY5f6KSECJy7aS0xLzaTVjKzt7x\nxjtaNHNlHgug8+xuagIr9nRcAR2btKV5d6UHehiW+9TPtSmHBbc+UOXX4MTh\nYtRS0hnRvgjl+xpABynnkSB4Q1JLiI6SA0vxe4VOon4RauVjY6S7+rljvUM4\nXNjHAHTBu8cjSka1500z9Nk3Lf6lpnuPjmSyVRsCAUamIdZw2rIWT83UApNI\nebG80HDKkQ3POAkf1q5giHPJ6D/MiRIXa8bbgy0Wb3DXaxgc3oodV4wgoXel\nZb58xggo9II4N37YkqszLOP5MoX3zeqvHIQYQC/X2Coav5id9snoW79Ja1fI\nqOLZSnDlnvVBU8WvPR90JN2NiyEFg3sxjrffEXGTKa9dUmkxnJNOCqvoozxO\nTdP2s96Tpjk7A8MSzxR9WOQt1YPMRB3JninQ85fBjL7Hb5Dw1UcprsvshMOu\nrJn7\r\n=3G57\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"34204ee17de02ce225289190c893338abd4005be","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.77.0_1530885130809_0.9191883705759631","host":"s3://npm-registry-packages"}},"0.78.0":{"name":"hermione","version":"0.78.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.78.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b1b5dd0886b825142418c9d68dd1e674103e81e8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.78.0.tgz","fileCount":85,"integrity":"sha512-KiwnYgzXVzXvMA+uzYnOQbDFkiPaATm29Iic54AHdt/jC26+IYELkcq5jOMH8+VaCp0Nnt4nWpn2o0KIMKNMjg==","signatures":[{"sig":"MEQCIA/tET5t+KRXmodp9KWRGQudHUk3uVCmOI5wy5D+w+wqAiBswumjtJiB3CtB3yghD1U20WxQJyFe9wB2bDOD/GMjXA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbS60TCRA9TVsSAnZWagAAh/sP/j1aa90qqQOw/w8TxDwF\neT03Y9TdxOAWitFSD+Aw58eSX/korS4e9gV94LjhrLuaWtri/wI+L4zKuspY\nJnx4r8NCYQ/ecqxoCl0ud7PVuqjK7u1B/gyFI2dX6VTWlLT1gmbu1mFP2/G1\nmdWXqa0D5kIbdi76Bo8kDp+Eh/lnIPYPGRg7kuDxuloam1yC4D2HKy864+hU\np/lm5dP30sw2my2dQTG1poxNmhJykYd0gkxJSjPgC4RLW4yukTvMFMLqH1gX\nREQAxXpjT5D5ljoO1WYvDaYbSz7XyCg3xnvnefbs/lCA0QMLM9ber4mvAfOU\njk+fJTr6J1Pry7KIFgyxTsDjlCVWShV5HrfPv5EPM8+E7u9JMqPojY7nrX5p\nvuZo/aEyyH0ZVnULUcctRcbwa2MXAwQ3H2GzTXpslGYjOgxHO9evVPYxkzBg\nyhN1jmurUfWJzx8bM6VICg8dbsVDyCPIaCAloQsWrA4Np6V2D66EJuZp+A4T\nzM6wtYK1kkrPrYOY6av2RCI9L3RsYrvndwH9LW5f7bvnz6fPiW4SaN3WMevh\nndgtFUPfSjxAgOQO1mlsAtxfWJRfXxvmo4j5gZfHTJah+o0cqpRrMS6zznL9\nrtvak/JbSg8hvVVKMxz7ZUWNMTVzpSpgNeZK/aqCwnWQG5huolRHLiQGgefA\nXbn1\r\n=5+zO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"7d0704edd4f896e78535d752614e97931bc051da","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.78.0_1531686163441_0.5211566886726964","host":"s3://npm-registry-packages"}},"0.78.1":{"name":"hermione","version":"0.78.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.78.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"740af9e3e1af8e81a02fe92ba52d7afac1c13614","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.78.1.tgz","fileCount":85,"integrity":"sha512-FkYpdhaPta6W1Rx+Q1QhP6tKmg3nBeVfUzoNe0I7LP1hkyL5zxEaO5y6WrDGBexm2FkRbHx4kOawwhAwh7HPVQ==","signatures":[{"sig":"MEUCIE/sAbh/oKk9+jhwT316t21X0+UCa6kr7VeIIcoPKDwlAiEA/S5hZgDlBWl/xaKYKY2mtbrlFiNkaqJ/rp8tPjfZ+E4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbTdcYCRA9TVsSAnZWagAAsJcP/Rq6LFCZb4QyQoKjz7Ek\nK2qAnlfE27rB9BICEqzn8aGi5TK5VWVxCNKto2Y02KPzxcbUjeLPZdArgrf4\nKxiIpCcegJWzkrnbGGjOEr+A7AIsJg/VZmyMaeHDGZUMMyyUps/SdMQxSza+\nbM0qhpWOxotw2RWXU2Jt+ngC1aL2evSiRdyNhQSSY7sIcQ1JBIAcMd0mDR3b\nj+CcBjG1Kq4BUC219Uw9sNR7Z31g6pH6P0GrwVT509qwxQmC7JyivqVFVh2Q\nY+9wNwW96rb+25HIEdPnX2Wj34FyunnBwPzNmYTAyHfXx5IltCnwwEIc9C9S\nmNzZuFIzf59XaGWKGN033B9OtwmexYbsblfjLYHixYjpUDDpnU41MbHs+OeX\nvz7e7m/QfaK8lp9BJYW1ST+OrzBI2xRNCX1bUIPc8MB56sowc0YSMA453jBi\nVCy92x8TnAoRplou66ybDxvcTj1KNkAUBeKz6F3ahQp5f7b1MSkypU7K1sHX\nJsPjbvCTSwJ+EbSBJE6TkKg5VuA/GEW6nhNeHn/RgU1rJ2JxpuRsZF7xIK8R\n3SVQKz4oo/mfzNlHfFuMGYPhh8TFaNSlg0V+snINry+Xlq6clONqa5meJPUC\nsE6uvwFARuiq4xs4BlJKCzvqBY84kFqSlWUZ35tnFKBqCx71VVawEqWnvnjg\nT+vK\r\n=AQsX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"d360f0aa930fd0b7ac966265ea5d9e2306281d45","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.78.1_1531827992478_0.8431715864479223","host":"s3://npm-registry-packages"}},"0.78.2":{"name":"hermione","version":"0.78.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.78.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6e75f95c2357f9565261abebbdab63e09d988a75","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.78.2.tgz","fileCount":85,"integrity":"sha512-UbZxryI9D6yu8ICofjVY9H5G90OsqNsewI9BfzXoE1APPd4Iy+MsHsXMZdjok/fug/yur3GQEzz6ptYyai+2PA==","signatures":[{"sig":"MEYCIQCE0s0AvwdwAyLRyE65Yf5fYcQK1fLWH7FDDzE49Ztb6AIhAKMcs4sbxZuYLNyq8jd5a4Gp9JlDvhFoZ69vGD1DidfL","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180001,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbT4aMCRA9TVsSAnZWagAAjFMP/0n2gMmgSrfuhqrUosdO\nQ3OKht6+rJXT0B81Kip1G9fyAOwxu74rDJqBySiNXLAFHAS4kTdOOPEnPSVH\nqcw0GUunNNkDW0MeQeMIXoCF5AJiFKQ3Fh+zbMf37nHeQe7HJbF8/kSyR5jo\nZAA7XJueB0B9TXgylOeq9BKljgFcMC5vdv6Rk8CqHtwXhpIjn8FZppUaaxAS\nvEykfayf6Vcn0SqzNqR7GEw8egLEMlnI9Pju4eNmZbSttDuBjrsjDkEJrhBg\nO9Nl3DYYaoQl/HjpD6xBR8SiAmK/pmvVcF31qKs0vMqW4HDfS9K8rly5RTgC\n298+lgkt3cAVFlCCbZFSlrXHUMeJW5sHM25JlQukgr2F3mcy+WqDmoZr1Vv8\nryz+8m5k1BTbOsSP9LqIIs/S10ePZkKXr1iXmNMRWOwgpolVJCWiBvas61ZN\nGNVgOmyZ9T39v4X+L+xBVv7n+0Y7WcVSgthJy5Y77qXJHl0RkrEd1f93YcCi\nE5RTBNSLf9LjrVCSvUkMsq6G2po5VOYJ+DxfKUv4H6jVoX/lyiYW3NuZ6HEQ\not/NgV1SwaIqafS3RfDl/qUm7gNm2Ewq/TTaplidv8kovbecTCUVHxaZEtFL\ncmvccP5h+0QwcOqqtJsNhBrL3Wg8RoyUW+2QLS1J3vhFwqwYJRYUNjS/KAjH\nnztY\r\n=dg6c\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"7971e5a090791a8266d0c0bd4acb2821f377b1f4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.78.2_1531938444458_0.26516721804505083","host":"s3://npm-registry-packages"}},"0.78.3":{"name":"hermione","version":"0.78.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.78.3","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"7ebac9a887aedba2668067dc00ff19412b336767","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.78.3.tgz","fileCount":85,"integrity":"sha512-T7Kx0dktTvXhsqRTLd+18GhPEGrLfP6YBSAp8aDW23UQC9BhJhfZxeJ7qzpPq94AuMogXZKyOaaf8HEhePQvPg==","signatures":[{"sig":"MEQCICHhGx68zIT2urZ1GGbqQAUkX75PbKdAbDUok8iQm8flAiAjJAsvFa2JtQn+QP0rt1gG1OS1SbwY2bfaI4Ig/jFQWw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbUKsFCRA9TVsSAnZWagAApacP/3uDqEKb72kS6bd2BNfk\nl9+It8HEtWWADaaNNyZgx/G6p0/fvf/7ISYmibwR/engRbVv8NctzUjqrCXU\nS2JWTZsDBYgp96V7zwh+5xpi7k862AHw3IyglHEniMru3SZ935jLWJaMo880\nzAyFE4uod3NJOKpMv+KI7l6Sm5iw1URpA70dyqH6mUX7LHqSzFbz9CkFSuTY\nUHleA1TS+PLDLiW26qGjdWf6eDq4rwd00jO+vydHCuoLQmmGgvHf9pACF4oI\nRFSFrVG0ZBcLMQZwqrSzm/RrxJk8YzTgtMUVjn/UhpjX0CSjR3bnBY/ej2ao\n0rnbkYETVPgQhWeEVindZsjq2obJrJMWgMK84hwIigH2ljHYcJtflfezscRh\nJmLTBUORnl+jX4Stul/keeS6GwnTR3jxiOj4avnygaa5j2xrZukSuzCD/OuM\nAymzhmbi1+Fddf0CFNwOt8NyRMfy9qJnke3oy4B1iEbFHhTFT8bh/pHWmRcX\nBH/x3Q/tIGeNY5tTzUGHR9doTz59vJM1SZZ43utOiXphyQHA/ApDi3ATTz81\nlzC4aVeKa07nSKO9k27anrrm3d4iTPCbqbLuPwZd98l19YDJRHOdnc+QPT2M\nUhjmMQJjoCO2DR9hVOKN8XQQ13xQ9UR9V/usc7HUEiOUZ3kSZ5hQ+H5nV/Ze\nogLh\r\n=+7M7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"7cff2b33eafd2f0a74884603b580e9ad467752f9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.78.3_1532013308873_0.2966582699128735","host":"s3://npm-registry-packages"}},"0.78.4":{"name":"hermione","version":"0.78.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.78.4","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"551c58ec65ab18dc2ce55af270991a2227c42c36","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.78.4.tgz","fileCount":85,"integrity":"sha512-K6CMvY43k0WFKxgbKwZYPsk71qxigPWHT/yFQkIVuUuDry7KyxbSPWVxp2wkpQFmJFw0zRqg45DNjUpAHdZdmQ==","signatures":[{"sig":"MEQCIGnGVgOx0nwnDGzTeTpFYoL0x38wWudI5LceJh5avV/nAiACh9graxnHMBxyfnn8MwcIgCeUDxZE9xfVIFpElxAcwg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180578,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbUMoRCRA9TVsSAnZWagAAMVMP/2CyvG7N4uGxHE0dTpSu\n7g+gEej2rDrV9OmBjpc5biNkYHps0jhdaAVa9Q+OGcbr+GnGBAoqT7Q3eOx3\nlyvbAlWn84fmQfTFmAtIs48DBhOFITyDIUp6ExLskPS4kvSUsJOjIvQbxc33\nSyfjWXJ+aVaitdEODJevUQtLsQGu9av9fs/ak5zXlHJXqB5cz5i2PuD3zQU5\nkvtwIOGo7zavgtp87cg44AeO6WuwlMDwmQRXeJuQ/JSHbxlPXXqv+g8FtJRB\n1vuu3z+QhQC4vYgaHnJJsLWXuqQXxCwMxpmVfZS30k1qsFYF7Fty93dPPyjo\nHoPqCN0bt//vSVf1W4ejNqajUzcN5CcOPs4RWH9bo8qUYGTgmwOXbvtYHYEY\nKurBoKCNTT135Pyv1XUT1IXrY0XUXVZubq9XwlS7lFg3rjvV6eiB4c+WUcxW\nRoD6UDIo4lOHwlEOdwUFYFWrq7x8dFAaf9AwpEAHzKseMtsUpAYDcDqcbBN1\nJDpD8MeTC2GIG1lz+TCQwnXl5EBzc/2Z1Q4Qztxrs1S1LEqFbzvK8Uox59jM\nAKylRVVaW8BN34JpSLLkMEYzvSVpZ+MwGj2R0qbvxT/Di9AppYrvIl2cSGop\n+n1p8XWU3D+eNFfuBgVS+AZOeoySoSmRs8WBtXvl3/xlsBixy6/YQbRniTEn\n+dCU\r\n=yfHc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and !!DEPRECATED!! `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file), `testParser` (`TestParserAPI` object) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `suite` (collection of tests in a file; provides the ability to subscribe on `test` and `suite` events) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"4857ebff16a4eafedbd5fd23b088ff8602eab2e4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"5.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.78.4_1532021265737_0.5890712653360086","host":"s3://npm-registry-packages"}},"0.79.0":{"name":"hermione","version":"0.79.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a6e407489ede0a2264d36fc3bf82da4149bb0f78","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.0.tgz","fileCount":85,"integrity":"sha512-nyE668p9VO9FtlPxCbw8x+uO7x/KqrdDI7IriNdIqMiU6kPYJ9/iOCgNSCAOWl112FUdz4mD2IrztV/L7UEpHg==","signatures":[{"sig":"MEUCIH5D9UX0j22GpNV20LRRNBuQ9M9B8gX0d4wwNzHbh1BJAiEAjBv5fYGxEcWI2Iaf/1SANmOcTRExlFrc69clMy3FtfE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWNgMCRA9TVsSAnZWagAAoXgQAKIHCRue8IWqWeakXTdz\nYeioUyyp7AC9qiIL+0dSl7cl2R0ntsCVZ4vlfNKzRO0ytvBBNEZxFm+O2qaZ\nMIkLSXo/S2JRf3n8cTt0vVpgA5p1ZHK0q6RNao91VFLDFlLmkny2I2lFaNUz\nbg5PZXAK4K0dr8UXolgT5FcLyTTc0RxI7yVNfLd7bokuiotx/Y+gVBxKCo0y\nk8RjUiNbpUH72TLVKbCuah9qyWcTjZ5K1GfEWXwtnrNgA90JEJ1XXXQiGXvS\nItzeNdKvhiDC128D0rjuOd6ZEulWo3MHvjQI7mikuCLJAkh/6KGUyEnGvuYm\nEejmsJauVgPM2h9LxNkiC+mCWiKQsm9LEfjXZxOupnSpdwh3WoTd+wihyRV5\nfYgHL3oV8LKwbItvbU4BBH+6xUvNlxiNn7D5kYDxz5RHZy/sbuuA7E8OR+QH\nOrxeN4mCBaf3E31purbMpjdXYW4FTUiMz12PhEGY+jHQc09ywu/jUNKZ7kPf\nywm4J59I4jixykik6hcg92ALpZ1O2ZO6w7d54wX7tfyw0nbHbPMeZejYC8SQ\nTBjWRjTq7xSZH00lDjrWEufP/5fWf1vnY+Xb9EmRks0ec+I6G1sYeicPtOBj\nitCaUR5Bl0kCioY4o+EXuJWNT0JWdCU7yn83wk448aW4N87cH0AbFbcuMYVA\nkcrW\r\n=pc4t\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"26e07960724e3a4cb65c62011fc73fa239a9095e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"github:gemini-testing/webdriverio#fix.opera","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#release/feat/on.child.start","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.0_1532549122489_0.37975786534467093","host":"s3://npm-registry-packages"}},"0.79.1":{"name":"hermione","version":"0.79.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"607c8112ed66329f660b4e42b4aeade52451905f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.1.tgz","fileCount":85,"integrity":"sha512-twO29dFmfdyspFQFa2NOA5a/xqmNM+k8Pb1oYO4bD/Ipz2KRDNNNpdfb1uM8bp2t4EUq+1/gCUjZ9R19jt6jkQ==","signatures":[{"sig":"MEYCIQDbV0MXfOnWbwVcTzc6pTgsz0+cqWhIcaCUwcj/WNEVEAIhANt1j8GEG2kRWsGC9eUY9Q3c/peTAgDPvmr/nB2j+gc1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWc94CRA9TVsSAnZWagAAbq0P/i3PAqpGfzU4pp8/N9QH\nfeZ4sPZDOSECJX2acyOTq/M6IhI7SGhkOlBrn1ogJNN1noNzUfK6NwWv1N1i\neld9rs71oI402BZ1BSD/k9kbMwpheIb1P9j2PhwN74DwVHaaDUcHGXFOEhIE\nnAm2q4TczOIxhl7K3tCGWPgn8WSRoAV3KuMYBU/YH79/Y67NgRMzJIW31I7e\n+P9sPTY4qMI4oJqaaftLNdBP9PcVjCaHULEO7BIRWAmQTmcd4HIzOqdfUgcu\nzZsqy9XzhvW0VOy/0NHQvJC1EoC9D9yUsPtmnqsTxIN6bIRc2YL838DAv6Tb\nwoAmXyqhH1uVOE2BdQiQ8pA06tHJaNVAAJkVW6w6X4mMoCw88A2nT07I82JM\n2fziI5qVxH4TE+3nV/CtnAwlOkJp8dgr2iO+wOpYFi7kBNanEh8dKf58sh26\n7hsLCu3qpfp90/HSRRZ24y1IkCi9LTMw3lTVCL1QiywrwvpAtI0mEbASgAnn\n27C4d/zWXarhQtEX9heWfRVOjaeBsVjWGK6O0xKJNSoBFCB3klrX86fI9iF0\n3nOHcxXiGpkOcHKapn78V8kJhHj0WdL49xhI+glHkZbJwPERFMRxmoHw9Kbc\ntbh1+kIqyGssjNfFeSZ3C1irAE0MgNb0BByZwqdkmK807hozZDTWX0xdJlpT\nH8s1\r\n=mo3V\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"1070baccb5782f0c333190cb743eb6868228fc31","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"^2.16.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"4.9.11","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#642da108e7d937fb02f5edfc9e04261ba9936eef","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.1_1532612472221_0.03768564011677089","host":"s3://npm-registry-packages"}},"0.79.2":{"name":"hermione","version":"0.79.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"998eb8722b1ea8f904b123b027def73383b0717c","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.2.tgz","fileCount":84,"integrity":"sha512-IDmPRghmQd/JcJjv9wptyPrE9pFLjyhw3Pn66LDxzE1HqBS1xVu5UdsDWbv9sx2nyxgwmMW/shQ3zM6FbCFi0A==","signatures":[{"sig":"MEUCIQC5F1EM/xhGzaWq1sv5en917Xo9y+SYpMYUk7NVEgtFUQIgXHs5B8xFrJTlSadaNr8PDyDm7vWKtkOGS9Gn+LiNzAc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179795,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWtrPCRA9TVsSAnZWagAAFCgQAJbsfG7woEC+aogogp6M\nGsJBnL4xSnDpEVvLRrcldorJt8dJqGeei4Hyreewco2EZqcpE6G9ktDnfgth\nOke5hrVe632q8yOKEYNXaoKnL4yycQm2TFOtQvwvxcymktrbGclTkdjXTCwg\nAmmjzkvsp55iiiqay8wYYJ9ePOPlCQRJhQY++8OZXL1xIymRD+6dY61WgWnv\n9mnb76d3J9Tod8V446z7j5Zom1EoCR++/1SWYcocX821R4X8f5de6RHZADfE\n00wNK2OWk8RH5re5TWx1dIBFK7Luasxs5IUBv17Y9l0in/87+3NqLoUcIKLA\ndobHJajQGo2+Ww6PZrBJMTuxvGVRiY74ryL/nc8KTvAI/v/eobI9+YKLaOS2\nrDrIUKKKyxgHJhO/bfQ8XAurVZgdUoTjEp2HxF+xhmYI5WQNR+MK8zqhTwqi\n16HGiK/5/Mfl/LR3PASt1+oda6DXsujSjjdLN2yrLOxz9h5iIPcX6Pu/WkpH\nLZM02rNwaYgy+asGGp580x9YG+mkUIAghwxRcmuMZB9G77gz7Fcu5efcs0O8\nb+lhEJfSmmIsFpGWArRJIxvVCqgOofnynaGlmCwzWk/7EFnCcumVSFYLLrpU\n5WIWrP0gwpjCtQEWilwaMEJCAwdK1gmcuU0UoqHNpY1BG7/Qx/jYpkt5+jTY\nDRXJ\r\n=skVS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"9dd5db807400859ff36ce1a1f0d02d48226e9e09","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"4.9.11","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#642da108e7d937fb02f5edfc9e04261ba9936eef","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.2_1532680911324_0.15025173293231342","host":"s3://npm-registry-packages"}},"0.79.3":{"name":"hermione","version":"0.79.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.3","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ce7bdf744db43d970d21db675a1b17bbda8934a7","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.3.tgz","fileCount":85,"integrity":"sha512-Ihu0J2H5aEvqTWafX5+nDI057DJBB3712se9/nBd068ZiM1K1gZiWdwm4+mjVospzzA5bMme+yZ6K2+QQ8hBbA==","signatures":[{"sig":"MEUCIQD/hLmTTFl8aBSM7n4F2RSkE9pOb//vTCQQmwgTwwO+EgIgaA9BxA5GWX909ssvwfFHJ46BzbkdjmXZVrZcnzQbHgs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":181169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWuVJCRA9TVsSAnZWagAAhj4P/2HubV2dXNqJO2tPlwkQ\nYqxKrc4o0mJMo0QXBD3EX4MUD4qV/gnbfHe18btfHoXVeYAifULPqAisvp5H\n5DEe7LJVgPFmgypANLdQay+NbT7GlHNqmHxp9SBtwDRKJexh/CjZDKgnkmJa\na4J1IoBbIx+PtShP7dKMVlpxpG0zQpX0M0KAnTwVTCnreFNxfyfy6Z06RnDr\neUJbyqJriRh1Aps8Cjm9ZPZkayQRUudRToKyuDn3Vj4/DbBNtuHSJy85I7Xd\nYpe+nd25OvnRtIz83S0jRnTQI9x37nPZl3w62wxZ2hSDxXpZsCSn5EQTln5s\nb0jVr2OCTqX14jHCHZMk4lKYqH+/6BR21D8RBkqgZNYW9jYHnPDu51OEv4TW\nrgFZ0ZqUzSKXO9rTpR3zdrPdOEfkCFU3S7H56LUc5RWK1GIOMJpOUxDb3KRe\neVrtFgS6iaaba1+4Dbz38Al9FcCUCd+5H8lJWDtbLJHJtrWAHHWkkjg7OSaS\noC/O1AckBlCghG60Qd6z/czC4u0+gWVV6CldZzbkXx0cs86QvxHCnQDksTNZ\nyojOfJUSVZlQSt0EL969oc2rgthpAXGlK7WQ335W1vyRrVJ9w+403Sp603MP\nC5dO0vJk/s0L3vgLmwQ8WiSXgWfBY0TusTMPVWHyp+S4ZJoibVhWdYB0Kwfx\nK2Ty\r\n=tY0q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"fd8a17e6ad4e2d81b72c169b1ab26fafe04ed1d0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","webdriverio":"git://github.com/gemini-testing/webdriverio.git#580414f09c54eb2e1dcd5079c5223d4f08bc492c","worker-farm":"git://github.com/gemini-testing/node-worker-farm.git#642da108e7d937fb02f5edfc9e04261ba9936eef","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.3_1532683593394_0.5778512562205897","host":"s3://npm-registry-packages"}},"0.79.4":{"name":"hermione","version":"0.79.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.4","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"56abc6f5534a6d19914d6a533d27280be2125c0a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.4.tgz","fileCount":85,"integrity":"sha512-shyZKHEfRA5C2zOHBeP7AswcTX+f8rgjlj3ISsUzYI7bzP81Oi1uHhCHSe9uqWhDcS1vTsHSps+OOPfVSM8SoQ==","signatures":[{"sig":"MEQCIGyySOWt4vNMBx7/PbkbkIKrXWiPwieLYKZidC37DR68AiBXmDCGmZG7gcMeGY1+7uZFklAKYc3CjPAvZOHuY+HlTg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":181174,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbWuukCRA9TVsSAnZWagAAEdgP/1BGNnXK3H6NdAfHyT5D\novixziC2pf7IaSBmvbdART/KTOTTwyyHfCCjYM7eLzMHAVGrz3i9zRKdKYh7\navadscHntN4Ja/wvjZL7FDbBgYM+9/8z2IkX8kw17koLuHuYOBak5/4mbwn5\nfG0opJlstyL8mvVbZ4R+jGYalrcppJSguOTVRwX35XYCkWEs+5xDBGktax2E\nbC0n1WWFzGOIn7UtdYLFOf8z5Uwx+7B06rYQMdftVBJdoy32GO5Ci0VqavQc\nO7iHS6ErJq1DNBulL3vw07f69F6NnM6bMIEwsDNWEFnES6PX1C2TbtnAAn5p\n2WXBbWa2n7LcJzb0OsqWZYgN231/JXot9Tc8FkZ5utkJwiMLGpta0IFvmvDX\nvOTSpKntotGG9ck+0xOFzIAO7z4ECEEdcc2Ht/mYRua+JA+FL5shkEqs7zNW\n0k8QBvTZP+AwwJ8UCb29O4t/OzYuXb3198GRII6/wssfV9PVbIwMJix1Pnk7\nMLWeB1/Z9d9p2Z2HS2VNGi3cDoA+NzhIYL/qpC27xKdE/ZN23TUi/yj343gG\nW+iATHiQWiu1rAVXZI6Cx30WUUC3zsmzPvrXVkT5cI2sgv8sct1NylyOzJ2Y\nfsFrfmX3AOcAOVuOMqoLQm/L7CTM3wDBFjeSVikh2VOGfBpIQ0HkbHQrkCAb\n566U\r\n=gUU/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1154149cdd6257fcbeb55a2b5da7bc35ce7a07ab","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","commander":"github:gemini-testing/commander.js#fix-general-command","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","forker-farm":"1.6.0","gemini-core":"^2.9.1","webdriverio":"git://github.com/gemini-testing/webdriverio.git#fix.opera","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.4_1532685220556_0.12922113229374554","host":"s3://npm-registry-packages"}},"0.79.5":{"name":"hermione","version":"0.79.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.79.5","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"573ee6909444aa35dec529f1f3494a92ef19c8b6","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.79.5.tgz","fileCount":85,"integrity":"sha512-k0WHErDjBTQDBe+vSM8U1u6vUUpQwyUaIVMP/o27R9B6OHYYHkGtB6a35qlXg8ov6Q0IfGoChVZyU2vJM5dgGg==","signatures":[{"sig":"MEQCICX5/l0QI5O/DlYnO7ZuKiYjfHlCWMBDqwYM3Sg4MiM5AiAk89adVOqWOziyP86PZ9Q4uhF21nAKzAK0a8RuAIuT1A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":181302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbYDE4CRA9TVsSAnZWagAAd/8P/Aj1GSkpPdj3W+Q5d/LI\nDclDOsTqACkwcgua9iV8Q5PPYbEAFPljn0QrdQu+rLeesmu/QPoUSSjYo/vn\n16ewF6B5MfqD5OxLkBRHEcKd6/g8wXHGOnXOIPKpJwDxubtlipfw5FEV7lXo\nFAIMYtndjMluBw6ALp2nxeLFYaV+KCSVXqasYDKaqBjWv19+4GeOHzM1gdrU\ngLcH9oW4kEk8jjF84Fy3qKyJgg6pxb2HujDEcu8FsZMqmBqulNoI96phkZPI\nSy0dfzQ2cQA2lIhRbC5q19lx/zZ/ShVxMQ8srpzQsU+Uf7teLkHK9544DZjl\nWq5Y9qTVjtLA3BbbFG+Jt7u8M8XeksErHPyBa8/hXgG2J1sCAv078N1bKads\npKfLlZMiMVeYgjdLSKAu1MBGacKWQspiPA2xhdeFjujsCDajT0LfdNR+QJQ7\nXBm1+knUDbeJuxV0y1OUHzxi2vd7vHYZnqzWpeOrsZWYIDZW4UXWWBU2+BF7\nm9VT0MidDo17TKv9ilUvRPmoLHgwgJALhhw2E2In3JM246CEXylp2v+iW+3U\nJGFT5ME4R47mUWtaeqaDkOYtPgD9TFLoS6dcxdbqldj5sJVSn4j3/wtceejV\nO7sXJjPs6rdZMn+uf3ul4ohEly0KWScR9EDwne2iltQgGYK2CjXrQTBppTFs\n/uPe\r\n=Rj75\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0f8e5d3ea1e7885780eb8a23c8e35baf70c983c9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.79.5_1533030711872_0.28767466702053524","host":"s3://npm-registry-packages"}},"0.80.0":{"name":"hermione","version":"0.80.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.80.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"31ca67e940c49322bf8a0b33510242f99a38bda3","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.80.0.tgz","fileCount":85,"integrity":"sha512-xQFpDK6fNDChqkPCPurA2niObw4yrmhzG0Yat/jzkwASplVYEbZJTVTlT5TLZmAR/FKfaryN2xLSHVq1AN7Vrg==","signatures":[{"sig":"MEYCIQCpFRKcAPiMTYN5/uM2Rz4IE65wxurKeQWkVIYLoDfnpAIhAKxe8PDg12fBLBHJd+qqdlz2J9Z5xBYuuBplpAnxZHwh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":182321,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbaoQHCRA9TVsSAnZWagAAPGgP/j38NIYZuLdtH8bSHq42\nWQtRHp6d5OwM+QTGxZVtxDe9Bf38Km2+seJP+3knoJ+0JmaQVfn/aY1PdSWq\nQIAHfXWLdw9KNXI4T5CWCstqAooG0+87QYLtB4Q82eFfckvEtf8LdUuB8Cj1\nRMCzLUGmWqXUPh1XtBSdF559f8X7P1tUBq+4SWVwL1uoFHsQE2QzbNr9V5Zr\nNtLC6ZamHvUDqUIldOovQDg9gWFkw3yasqBFcr/TZ3MTWoPke48maNnVhcRc\nl8M9r5QP1jckHnUgwNYPb9vlckyGD3HDIW1MuJhqVBUWfUBDmPtHMWdWCKxo\nmvzasbzOqzeWNyLYNzne7p575y1+gflDsaydGIixEtn2gTSBYZdsrEqU70NK\n5GF2TNxBDUl7xVaJr0Vs6ogAMEj/+wd7uBuP8jOvA0laFlmjouYcMDtvM4v+\nYa1Dr/EhXV+oWE44nPLhApeERdFfhkpEn7onTC+nT0lTsCDEjTWB/otk1nUO\nDXeVk0kbL5P2Y9N0dbYBUCDM6tnPmul+zyS1yH5JvKAU20DQg89Et1Fe2Bjr\nGMl5oCu3Usp4IhaEmZIonGoViUvB80CIdM5Yx9Qf+6u35x01BNvkB0MIw/J8\nT/QMbXB6rBeOTEV8cfe4n050hs0SyTIOShgunbWzHuTii3hyD51AdjzIEmZ1\nDGMv\r\n=FdFC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nUnder development.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"927dd01d458c0dde19e4d44dc3f2f9094101a019","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.80.0_1533707271530_0.8912418738103085","host":"s3://npm-registry-packages"}},"0.81.0":{"name":"hermione","version":"0.81.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.81.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"47261d72639749488612e26c19fcf49a237117f9","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.81.0.tgz","fileCount":84,"integrity":"sha512-EIsKxEfuQuOvVSVzged4S4m8LOSi43AyNGNPMveDxbXUqfOKXrcgpJTIlC2RjQjBH2D7Dk4gDzhj0CyrK0aILA==","signatures":[{"sig":"MEUCIQCfpbwZQ8XEpup5mwQCKYiBqo7gCK+WZH5ZnSrOspjxLgIgYCCwFgROPDI+6fypvALYJpQ2ChtApxN1pe/WQtuEmIw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":181360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJba/2YCRA9TVsSAnZWagAAo8wP/0fowTcqnn6SNasLH2/U\nqjhITMp8ywz1mhFQIOsJh6tI3stCwzmwbwJOTB4B5qvfwMURstQyqgu3FH0y\nPg4Nqh2BKsBY5E4tNTjX1/JqhWVGiMVOLV3LEX67KBorz5gAiYS88bSx2WgG\nFvMhKKdswAg2d1AB38PyVJKvXuUVkZ54FSly6qBAlGp5KqxgO2OWji8ejHgu\nVmapEUcOA10/ewNb+nnTza2Ht8pD1bzWGfDu5whlLtM0Yp8YMa0uMknG4ksz\nbJVGmeH4n26R/sSXBMDMoExE379sidjIaPG0YfFVWil2XjZD/XEQcJJ2Pk8m\nwmZQ9C4/j5M4mqjtgF3rEa42zxWI2xjJP1VRRDgzA54KspfGhk9eeK3ovvNc\nI5tKYCykT7RalBWrzwUqVJbTXx89PHI7oeD6h/3mVk3xq4C6sFT7302zolR1\ncDsTrIHJFcXBm3asTWaIWTKAQZfPWBCoV5oGp+ZuCDMvrh8vPM3ewxhaoARF\n6A4g2WTQjXiLYhmZdsjSH2wVg+cAhF6aNK2rFQOvLAAY/F6ZGujMh8nEb4d5\nR7Pehcq6sAcngVXhv7rcaEIwuOocTDEAr+7HrH+5S4l6unSyc/FsFW3VWxRp\nBfntGrNz0ikKoav/oq+n/0WUKIla+AKA1TKqSQpYC8Er8QB259LMcwgEjs23\n+a9K\r\n=ibgb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"44c813f8a39c7d7070cecc7ff5bfb207bcb763fc","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.81.0_1533803927582_0.4157793792734581","host":"s3://npm-registry-packages"}},"0.81.1":{"name":"hermione","version":"0.81.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.81.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3d13cd3e9a404596c70a60540b8484d04e5655f8","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.81.1.tgz","fileCount":84,"integrity":"sha512-l/pcBoCUQ3a8B6USN+ugyFdAO8A1+M3MZLpgarmpkcIL3gtXhaFAPBPgWKBMQy+eBBiil48eEEsHLTQHVB6ZHA==","signatures":[{"sig":"MEUCIGa5xqBuvhdxDN8/v+fNO/bGrdFmr3EIOwbqPBe71oxmAiEA7cf0FH583EN/5fNWMOYVZH4RqYcSHtHKoAUDwT4zKnY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180941,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbbAm/CRA9TVsSAnZWagAAqmwP/jph43VZN072HLqRpxjO\nuAgj8Jm/34zPyU5/JUal7z+tsPBJ9aVNgs6zRrEopTvh6PB6YtE+LZPMdB6d\nX7vpq/+VzoVVFvalHzSOAht8OqkQA64jqe3L/bV3RwRwxd5s2EKVpX2Apx+Q\nDd7XRbXGQhY8zHSX6v06qejRvxT/9ZwlSripLPN6RDCHdGE4JtF+3K9oXr2X\n1BIN2h0KfW7bxJW7FBVWcJnGtWoUkrxGH0GHicVnDIdqmsmQE9fS2h3C2AzD\nCH/iGM1QJzp+YrQKdIsGKYPjeu7r1fo7XPYOkHFN/RFy8vGKnMeVHgs81MSU\nZr2pheklaXXVlxkohKtkHoHr1XSwGKiesF8tZUMGjG4f9jDePF9YiP3Iy3na\nP5ECo+3lhoxDh/72BP5efv6LhjtfDoph1x/NRM/kq+jUSsMv0fLwAOYjrwWa\nAlDl3mCUkXQCWBhxe9HML2gwxs8EPkNZj6kWptWP3l8VUTWN5UbPWD7KKTtK\n8KKJ7xCYh4Htccz74TAuogFH72vHbHMnzweJmAEMUFAy6RkjVoFbzB+7i0Jn\nayonAL+7J6IW1c5AI0NJrlx+C+h5FNKiigbtXLPbnUDOa1dyTXkndkrEYxpz\nyAgKPobQ75YuxrGhaMYJGPq8qUykTdVWsS3TJS//54yHVGmHpJfjyz60Sgtq\n51Ji\r\n=P6D6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6e63d87bd4851b375dc4059c8525fdb47d2c22e4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.81.1_1533807038315_0.34645362088478215","host":"s3://npm-registry-packages"}},"0.81.2":{"name":"hermione","version":"0.81.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.81.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"aff45baaca7f922e8a83008871dfead4e1d89d4a","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.81.2.tgz","fileCount":84,"integrity":"sha512-Q0K+HiFRjnfqnQnC/M8M3No+8cRvpRQJMWRS6zF1XAyWvfS+ASwmk9lY6nhEFg1uL0kO4/mJB+/3ez+wxBZ80A==","signatures":[{"sig":"MEUCIQCwZmxuDXLaJ5iz6ctNDEhhrIY/0bqIY/6gpkIpU216awIgOs2yK1vyVlWaMLKSwUXz+++VLYB4SdN6JDIVihMT80o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":181851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcaBaCRA9TVsSAnZWagAA7WIP/3Ee7eYfaUGAAnwyHjKH\nspANjcLdj1oEhiOetTjItcjLMyEJbdlC4XlC2COgcX0Tc0aukZBl8SVuKMZL\n5jFlcOzoqr9h/lKQUottpo1II/lcX6ombtAgfASrjof6XzQByRJ3nOEDrEn4\nsVcPRCOuqqQxnsR6T0tor43DmJ5mh+I3HqTMaWXU7Df3007aQ9wFUpI09WNN\n/ul0Hpj9wM29ZIQIMxQ7TFuy7MOSu+yfJFXh4dcwbGre10aOEFoBkM99cZWR\nhKBeyvUDsvFnPQiMVzyiijsapaBq0pS8Q5LXk/TVPDRDCMYbvVQsWbMwwpsB\n2IXuZT4nSNceXX2QmvxRMbVuMl5MY6uAU0inb767e0kp66EScQ6lHoIWYMbb\ngYzgfTvCHahc+Paes5D9K+qSHyDaHLEtgxRtHVPu2v3kwUAz3mfzE4EVvWzl\n8gBE9k0VgvoQF7tSEay+oMJSQSev5VKHMkn6X6mGLF0RjKgue5s2NZf1vOsZ\nSkMglmKTXjEYmno5JiuTyi6dyTFrB35diy1+Hw4b0FgI/TFP+SO9uafIu45/\nW08dQBpJRPOHONbZF4EyFyOCbfpolhFrAQJcbqcBOJ2RB/sqZsrVHnVIe2wI\nb6xd+8gZI6RHES1j/YVbQZgbyoC45JSun4gaBAqKfw0Vmd0qpkfAy9sa0tEw\nHnxW\r\n=wQ0k\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"39fae851a1a73341c378bf7b2fdb24b6e0d411cd","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.9.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.81.2_1534173274010_0.8475948795946402","host":"s3://npm-registry-packages"}},"0.82.0":{"name":"hermione","version":"0.82.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.82.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"16d0d1a5adb8a8b938cec6306c2212818f2c866d","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.82.0.tgz","fileCount":85,"integrity":"sha512-Czz11aI96cpokNvYwgKrZ5jz9a6PghMkDHP3gTJitfgqPS84YkNNKOp6mPP4BAdDydF4YRq1BZbdvLRo1l6XRA==","signatures":[{"sig":"MEUCIQCTbW0W/NDV8UDFoJvejsteakKnqR5opM4pp7S91v9XbAIgD+9DhMhTKNJulG+WeoSS71VvbM4Qfqc/9VDEWywDQoE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":182697,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeW0CCRA9TVsSAnZWagAAvBYP/2jTDVPwiDf0kZCgk9Vo\nlzyzkGBevM8XFvXBeYxCwUtvgrpW8dSGxxMr8KZicc1TqjEIqfWwoW8AnaT0\n95ij+Gz7kK8y8pVHATgeuuxjzD/KAUhz+ya70y4Cg0GIuElTzFN5Rqwo+zpo\nN1Z7D1JrVPuDikMz4O7gSTk6+p+Il89SIVBSAV1QnDtKEX5wue4P/truVI7B\np8w0cP0I8HfOceZqk44gQEBwMdQ2L5SFE0hAh4vrxb+TSOkPi/iOP9H7KFlV\njnxGXUeQAUEi/p8MKMkPWeuFImwLKXgIVobkwXfaMJl+N+wjp3gwNJViR+/f\neggXEqQ889ca+6eNs05r9V866By25X5eHGktO0c+Sz9jhZo8YGQgDNv6ih5i\nNlVicaS/ZgBD/08W0joHlbzMQM/z1v7xAY4/JlmyMp6CcLI50QmdrLusAP1l\nUP0EtZnow2L5lCt/PyX9f+AVwC9OV6+EkZKX935OFfDtDTATLxWapASf/WYK\nxPVAP7DI1zk+ksdVA3SaeoYSlbRsXVBL4Gn5YJ0VqEkLu0MHjrhSeneToUck\n7XVuB5Bf87ON9tNCIXvsQP6dicc4xaBLlNHIURGADOtPy/cdpkNA8f5TzKNp\nbdb80JaUr6LTBcehE+vgifvFkpbaHesXlFUiY5MFOwXXquQbBXTo47E3wLQS\nxXmi\r\n=kLDt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"740bad688e59245e22b0dd8de4a15b7f5f5986d4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.10.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.82.0_1534684418026_0.5225834303089834","host":"s3://npm-registry-packages"}},"0.83.0":{"name":"hermione","version":"0.83.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.83.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b7f04bc7c09c0f6b2ca0cf587a5b335339bcf602","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.83.0.tgz","fileCount":86,"integrity":"sha512-/wjSK3lEY3Oooop6L7G10GffYjNO76ujHxXEvhzt8S6Ad63ekNxfjgvTKvurGKkSn06D3rSrDNDt2aTyqLES+w==","signatures":[{"sig":"MEUCIFRqg1gV/8fS64dx8BaLXE6sEeAftiZFDrckDYWsnYDiAiEA28qlxyKZ3tEJE+ELKCLiaFTKJ232B3gt+sdM8wYL9CA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":184789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhXi4CRA9TVsSAnZWagAAMe4P/3KBnIjhyU1ELNsrGVmi\nKQuxZH+cF3PgflCEoPf9FOrOWmmRnwDweqqzm4MPUQB1oPsJ5fJ4TysZ0qoX\n9osJDCfkD52ahl2SOq0E72j0psRNHATXZI8SVm/7MkVgPhR2gO9DQqODbT9I\nfQ2+gbb+UAswgCAnM7yx+06Bf5+k0IA6CEekoBSZC7V//JGoXlZk30a/qCJl\nynUHrA2OQabF1JQB6txCk7Das+gvAZM7hu/aKUbbR4VITQX7cVxPiDAlMCOf\nfwsRCTprqE8fg2cHFZdsHg4SNxUwDTWtqoc5TJHV2Nlnr6c2YKCrmyWYepSu\nddPAxYlIPbJDQKvxbasAD12aBb9mty+6jv+lvZhwYuDmVXm50vaBS9J+7hwh\nD+OqM6EYa/qk25Pin0G6jUret63MMqjBNOUj9SxTstKg+7OOrw1TWvgFOijt\nYuNUMcWKJ6g32I84F4HJ4H0S+1V02Ku8dUsmpPPafB/pOUAY86uDpkf5183s\nYa4l6FN95woJbnvWytp1kESaoMeRrXgayHIzoLxtV/Dee2epjqpWaY1Zptx9\nVTapHT0mU/ZzRdkaAKQAB0Vg1KZI4hMYi11uqHxbLACci7ezvUI0M5Cx4VIy\neEWQ9zP34phb61z42OojfJoytXV0JaO9EUsZ6lyCpSZB71RmGD2HgQ2sIwOd\nsMVO\r\n=EtmN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"dff1241379635d92f87916fd560cbc74c7eda99e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.10.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.83.0_1535473847524_0.2729927113325703","host":"s3://npm-registry-packages"}},"0.84.0":{"name":"hermione","version":"0.84.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.84.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e7fecb3f9309ef28e05f366575136de4161c8cb7","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.84.0.tgz","fileCount":86,"integrity":"sha512-XtAdMkmnmwfp7lDvVdgoMqChfwBSJdMJaGlTOImqWkg9tvU6PECvhr4KT2AHIV0RKi53EbBvbxbAeOG7XLJ9Eg==","signatures":[{"sig":"MEUCIQCb6OtUasJjZIs8FA54+ACR6R7a+/n46ij9uGzmMz+iZAIgOB3Jb/eWJpn/FLmloAGzqwKGkAOgDddRzfH6R0k7vgE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":186314,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbjmHECRA9TVsSAnZWagAAhfgP/30784b5tMS8wLfKSV4h\nya/vo0N11nTTSEY+3b+QaWiEWWt202VSgmPhMl3FxjGkcc1KWKFeZXuf/M3E\nbrajKzW9m8RB6//diNahfO6AYVtTwU+/IwXzdumcUS41Ub5Rh/zp3UE5MCKE\n+brazL9KXJ4KXDm20xSk/XbGU5pK1G9cHXOKjlXp1M1W7bfOiO208HzYFBO6\nEoBlTImpaFzDOSWV3IVxOYTFCs8/p159Ek6V2YNjaZ3rAKXAv3qjd1841lXR\nnpBNU2tPWRQKLvcoPMbyc/X+mhswBI7nSsQWcTU4UresYK0WtZzmnQBtUwpk\noCf/8i1EVKyTikC2QIWaIRJP6iXkefmtGhLNdn8LSkoUihcvSNQ/tJf7I/ME\nyky0IZtFZPAZDrMsluN2g5prT1HFnHJGKP5YIQl8goY8dZznFL2S7AuI8DEN\n6bd1of1XZvgDVOvP86cvYza9ry5FzmPGZ2M0ZJUpe+Nk1SJi5HiU9p6GzlUP\nJpo2LARqOjOZZ+7uJh3OgwpvBAgEAxnJPHsaR/Qd5bPXvMGkI/ywwatD1gN3\nQCjLuCwmK/b7jDLwXCAmhe9b3sLcJUDhxztAbqWS0zxbFa80ntv4KtB3NjKH\n5FP2S+jMEFBphAtWkPh5qUxNqyTFjSSxiY2gqBNY7Sl+VdjJxSszu03K7yjB\nSl98\r\n=Tu+Q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [resetCursor](#resetcursor)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` after each `url` command.\n\n### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n### meta\nAdditional data that can be obtained via .getMeta() method\n\n### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` after each `url` command. This can be useful to escape cases when a default position of a cursor affects your tests. We recomend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"1d58fbdaf89c7a22f97eb1b917ad617c53b90c17","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.10.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.84.0_1536057795944_0.9751025394432538","host":"s3://npm-registry-packages"}},"0.85.0":{"name":"hermione","version":"0.85.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.85.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"300f7bc486987772576f2eb8b621127e56a5a37f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.85.0.tgz","fileCount":87,"integrity":"sha512-aIkumAMYajBp9+/f+dwCCEvdG7rrVKG0hhGzEaRFk79fuwkpUBDq5TfJmVoM0fbhKnu3RjWF+315Aec7W38/4g==","signatures":[{"sig":"MEUCICKzu3czjqedmgAZPyYvRoGRaPpSvA2U3lXM4q3394k1AiEAri+bHdrhZuGmsmxgitK6zsdFkqS/pn8b6BGvFrqW1Jg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":188266,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbjo4oCRA9TVsSAnZWagAAU4QP/iV+HeHHNVJLy0imEw+K\nUkJ8Kal1CIrg+u6OAZTSJ9RpD/Nou8/I190qxUoksB/N+43LzFhqh8120XaK\njqglWe74YUMpn7YEK8auAzvDhj1dFSrFor42tEHfddw7qUrbdBrmjRpUOfUP\nFVJ2KyqAzbNJC1hgI1l+0kno6Dr3QzroKi3KwBrc1Jni9pN5+ZJOwQqT27U7\nrswTR4uWrSPMpRTXx/TJr72ZZF+mf9t+zoTm2nGhyvIcgBpfwhTX1t1WRrWw\nNwv6FDo2jSwdX3X+z9VAQn98G9PcD16NoFYIxt48Py4mpV7BCaOKWgcRfH69\nHAZNeJG34qItHggrvsaxIv73dNggZTxttP6bghPRIrFRMtN/sXyaFezXQCBa\nKolLOERvfVj1sBDxhRS+wr2hZUR7vZbzLl27+pdgkcNTWvzBJhk58CLqXtKT\nUuXL0X0s9j3JIh5Bb9nWLT3l3lz7k9Kb3Mgn7ad2lmb46S1rwQ+NMFFEHv/2\nsx1ZszAQ4hSGn6t5YM4+ZdBc8FPAWPj/qdjrBh1ylX0K3RpFIXkg4maPLiDE\ngRTZi10Bcok/GXnsyQbQFHwCElknlDTnpGYzabaCZzGL4Xt0DunKaHzttq4n\nZAfAzwiullseVyEOQ/pKBbJtB1tFSEU9JeDrh+Lr20hv64gEIcTNP5j/a3K8\nr6xX\r\n=yVvD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"a87456e834fa794aed8cf187c2f9697a23b79869","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.10.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.85.0_1536069159105_0.45203469696471377","host":"s3://npm-registry-packages"}},"0.86.0":{"name":"hermione","version":"0.86.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.86.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"e89cacea8525b3d186cf8b31059ad02dc7aa489f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.86.0.tgz","fileCount":87,"integrity":"sha512-BPBBjtWCPfgyD44R2X+KnTZcZXt0CeBBmGRFURVx3z41vnJI98hVsRkU3C6GNmtNHlQmpyASQlSjvelfRfi7kg==","signatures":[{"sig":"MEUCIEpxAvIc0ArQfkgB4gXcbR3eAGOvaj7+M49l2hKKgt8MAiEA009oI5WXWEpXcsvKIKO9ccCcuylQpzi/DLGgnttqLcU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":189738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbl3l9CRA9TVsSAnZWagAAfGUQAIqrz5aCogDB6eTiEQ+V\nGbs7K5WlihcSl0bQqi3IsVCz/inDODX09X65I1zplVFAgWhN3mW/GqgwU5Ui\n8NJnnr+ZXmdoJH2yLNp/uRGhFzVh0eZ6QmxVfkXGJvVNMWfi48RnJnV0g+HA\nzMydXPV1lQH9r5wYqGmvI+LN2Elm9CJ6xiNZORlSJLLVLXzS9UZUBF+29+CJ\nTvAPwsM0NOEpuSLs96ayG/A3pmRNIO71Xz//UduQCK2hK4n7enEb7GI2dAHE\ndplnpxbSIh0Ez/8NAwDC1AdmmTQmZOIZjMzeOGRwzy/HXaHzBxNbcMaLVHQD\nehGUMqJ484z9WhqTae5mshknXioPzRVL5yAhsjdoKVvvEc3el8P+6m9HO5CM\nkMl94tWM6FZkC890NIDTVCTm2phw3mzrsmNf8aQc6YXacBAFb5p2kkIzYr52\nVmM+MrGpAyZe5bxBA3AdQzG9QGFBFjXQ2z+4fNT3QNNkeNUjDWd0GeLrSEsR\n7HhAXvhOwjrsfCFfX2GnihL8c8Rl1TYMGTs+XKRjioX5++u4izUqL0MZ4ajA\niXi5DG777qEbKipjQ7OxBKugPdaLx7uugHArF9pT/9vFhCfVJvac+GOyHt42\ngVFHN4ELZZg6VHuiDyXEAFfpi7Q63uu2xe0EG9qYUGZVzeufIw0JThBrp6Py\nQTTD\r\n=zHpa\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"b02d92db4f23a501e75e4ec8cc389d98220e1302","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.86.0_1536653692146_0.6995217693912898","host":"s3://npm-registry-packages"}},"0.87.0":{"name":"hermione","version":"0.87.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.87.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8664aabdaf1a1e9fc8c74d55998f85da477df093","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.87.0.tgz","fileCount":86,"integrity":"sha512-u0QAhGGWqwOUVFdkF1JjaQ0uajuEF+TgAGb93sa7FGWKupfvUwkurdCff1gbY51Exqd5dq4E/dDH/t0xMXkAwA==","signatures":[{"sig":"MEUCIBUj8yqna40Zq3hvbrLKeTVCKWk3EFf0hjLKFqsuVyTvAiEAlxeKVQdJeRocEEeS9YgUy1xXod6AS6an7lVGVOci41g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":188887,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmMvqCRA9TVsSAnZWagAAYYEP/iB4m0rBq7RYm2lvUTSx\nnmDVSZrG5g2nPDAjQVde7XLbRG0kn3VR5N6JnbnT20Hn94tN0yUomDBoMOwo\nI0liHbNE0Ea847Q83R06+a5BG9afCehHNe+KbM2u8JfAWZav2xC0ahJDn6jQ\n2epFIYYPElJ6zWMl59bXSr0aSpZitdOEhFZwEaykBYENB+65VeAMBA0SR5SY\nE9JLwh8CXkkkzfn+l+HBAtPZF0tf4mkcIlikkaqg1ImDIv+5L2/EnaDt/08w\n3PsNqvFf0sITbMmxIqJ9lKSCLnPtCj41BAKFydyILRW1VNqKYUJEDNRNIfUv\nEuKg8CWoU3UYyhuBdygg1YU10SbsuC2LiH6jPERw0/we7hoDHT9n3DZZNpu3\nBDcolXMYa07iHmiMjjYEACzMbvamrPWvuPrtxRbY73H4rjpzIs93vf4fEJK4\nJurOWojltn/4fMUvVs91WA9pl71IRU4bBfrx0zIRY+H/W9TdTt0snzOOVepk\n8A/NLxBhDlwpUomSZQhVc/UyiHd8Vf+Rb9/Flmq//pp/twG9vwUa66QiD63U\nXpWURN5tR4iz+tEUtrJvWYez+8tBMdPEbqWpKaea3U6IGcgz7QoR4cdQKr9o\nChDRck2ArmeXU5x48U4xe5xnu/0IiQqrF3uTNk+K1IxfARr1z9YGLr7z3laN\nZNkw\r\n=AEYG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [resetCursor](#resetcursor)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"18343013668d0290455534345978bc0d38f65daf","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.87.0_1536740329255_0.08874929443024704","host":"s3://npm-registry-packages"}},"0.88.0":{"name":"hermione","version":"0.88.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.88.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a45594654c8bb1ea613ab7895428ade633578ba0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.88.0.tgz","fileCount":88,"integrity":"sha512-77PlSALdLh70j0egd0U0fTavNIeELe22DbjZgWLRqOVWEFEMkHi+ceVwm+Q8BCoAtC+lUpc11oetmL9oQJ5jpA==","signatures":[{"sig":"MEQCIEj9Unz7hIcrK5hBO6l+M65pCfQXypOnNaDKNxiqRJcJAiBMKabQBiTXjNnhphK1z2ed4BF5eTg00pl3qd9sQ+BUpg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":191525,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmeBOCRA9TVsSAnZWagAAbgcP/jlqEfVFPP8hpmp9lm8+\nOt5jXKs2t7BJR/yxeGL86T4bLOUcODu0uK6xDpLqownm9KwlwjC6ReJAPZiT\nu+d8cbJaDsBTLdvbwaKQwDoGHqhoOfF+HG90CBLQ5nhn/Zwzj1u+LzLxiwmd\nVHvpdHAh6S2K0iYX5UdANP73whVp3VK+xRNVGZNfXcB5rDsnZHXfYJHK29OO\nQ7f3z0rarOl3CbG350NaXzr1Jna1Yoe9qU4bSpKz4306vi7bWncqI/M9IBmA\nA4nVlZhbdvHFm8ikuhxFrwCCsXCV3pxu5OBoXze+BW6aBX/xA09kN1zchzT3\nQ1pIjVkcGt6g0H0ZTUnVTy7VP42yvwhhTMhhQt5s/UlPeN8PduS0VGaw+c39\nQTcL+Y0ylWZtBzFPIhpRewA1p9aMgJ3RHz/8tU2awL0w4glYgtQl8naNq6JB\nC0eddylwwRAF7FBifSXvaVaEdrukMIYw2HZgQkBrvQvsleavFH0r9N+T5dm5\nhKkPA1hme3pnSY9e8QJ9iNjr6cByIswSpJ6rEx/6RFeKBnCA2puKUc9uzEJ/\n4YRH3UFo/uwQ/NLjhgQRbZzn1jviHWSRgJOGljgn2cg0HcZM5A4Ft4Y8WihG\nQCUX6Lf9fbdykOs53niSFavXOhectgknN9JeghWyJXQGCRb7dtuOuPq/b4il\nHmTA\r\n=CRtS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n  - [gridUrl](#gridurl)\n  - [baseUrl](#baseurl)\n  - [httpTimeout](#httptimeout)\n  - [sessionRequestTimeout](#sessionrequesttimeout)\n  - [sessionQuitTimeout](#sessionquittimeout)\n  - [waitTimeout](#waittimeout)\n  - [sessionsPerBrowser](#sessionsperbrowser)\n  - [screenshotOnReject](#screenshotonreject)\n  - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n  - [testsPerSession](#testspersession)\n  - [retry](#retry)\n  - [shouldRetry](#shouldretry)\n  - [calibrate](#calibrate)\n  - [meta](#meta)\n  - [windowSize](#windowsize)\n  - [screenshotDelay](#screenshotdelay)\n  - [orientation](#orientation)\n  - [resetCursor](#resetcursor)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"9e01f8cb563ad29c9d72aeb6e7bda32539e4595b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.88.0_1536811085173_0.40365498577759795","host":"s3://npm-registry-packages"}},"0.89.0":{"name":"hermione","version":"0.89.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.89.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d03852cd4d789545845f847658f1369ffa8249b0","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.89.0.tgz","fileCount":87,"integrity":"sha512-8P/hqClWLqqaNF3TsxE+I5SiI8mU2k9gQyTBdYrolxwvj2clPuu6pAl+lSX31xYw5RmTzoI9hu+oAeuYk9l2uw==","signatures":[{"sig":"MEUCIQDGh0NadfwiM5dbDO7pNOPRAdd7Y0V9l1fmYTHlcDQ90wIgBAiq/HZ7UflHmOb7hMpynAdpbRLEWRabzhBNYFn1Ttg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":191169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmr7mCRA9TVsSAnZWagAAkW0P/RZm7JuyGUDSdShB7iSS\nfOXHUIuFAWKGK3Ji2f1BukDb/YhQRvI5eyqtyclCj5jZeZDnommsgsN9iZMM\nvWPVP5xoEnXUkaAs1987Eg1+P0OVBLre5wT9qBsVHtg1C4S5RvckpVT2FzzK\nlJWOjHZ9P6WXVvgqxROpaqb+/rsrj1oyc1S7pgwrxwgTtjDgCyzwYewHgqkB\nJIHFPiWGCuLvLs8JkohzUDcFDw4ik59MmjmNDSs2ZOFgTesYy1lPue75W3Li\n9OYYElGfW/ROpEkNDClfEmZJvwEMfXrbdEHxYWRV64uud6g4CEA0Bnb9fOaj\noPmsM37l9W+kfcvDP5Lfi4ikAUaNONIHQu8eXmy+/1oeeSoU1CIJHjmdhY3m\ntUa/H+U6RaG/Q7Pb5Fj3jpzh492/O0wuiTK1xa3WOgYx43PSMSApbPWSBkdV\niUl3frNqiI2yZyEGvHxQoxgJz1k72i/O2pHXq3tiAx307fH+C68AyEqA8MzE\nGpAmV/cKUAmx7k4vVirwXuDadO2UZZIv4l0gwloMdc1unh8VZwGDfDDI1hs7\nXIwf9wnlbvjfGYcUGMVTso037R/bCQV8Bl8ZnU6kegh6LkImOZFR83Avny8a\npxDHB+bnh0GcCKUK4oXiQayAUCTz/4NNPC4/U0BVv+bdC1zbaEcGTt8p2xdW\n+jws\r\n=xGEZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"9fecc456483f14c7930c9fb6e2f24ce74642ac04","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.89.0_1536868069824_0.28468571959441435","host":"s3://npm-registry-packages"}},"0.89.1":{"name":"hermione","version":"0.89.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.89.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"76b735de680e7f3e27ccab51252f3f55ed1a0293","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.89.1.tgz","fileCount":88,"integrity":"sha512-MT2LK305PQwJ4fhyUc2yO/KiqCSywvcm+kmXw90Onm5HsOya8r7zP95Mii+Miv1tBAPHM2as3flE9KB0OSU1uw==","signatures":[{"sig":"MEUCIEncVb15g7LR9rqFB4BbVX436KeTp364Fc6AC8lp03WcAiEA3KkGJDhZEP9fJ/CmMQXTMY23429lzFINZUxq3F3vXMY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":192845,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbm1APCRA9TVsSAnZWagAAvvAP/REOsxHlK7gMF4LhRv3C\naylTQn6vJxR8Cb9FQAhyC1WZIETSlvmrMBjfoADGXaQSSu1B+nXYLcsVDj2i\n1cz1lvBpt4RAvWOa85luxcF37g/+C62Z/zJ4Y27Aeo7pv45SK75b+NFWh+pu\nxMIW0lO894niF1qjf+xtMXOHhhEb7zQ2hocF1XncwFxPxMx6gLFmRF3VT8Rb\nfXJ/R0SfdNnryWpHrUYSeGKSUevjF466iZw/lkDU0b4iLQRtkn0Ft1gOtc3n\nl7JI05PUoUoGXSvZOJg2bbAQGV62dldXQwhnNTPQ8x21hvHss/VM+zOxi2Yo\nSvm8rJQaOn1WQCJ6jYmzXf6XT/E8UW1Xi9YzkNIA3sfbEvV8ALp/v9SN4LGl\nan8cvxVcUJUF5UQmOGk7SrBCscxnWsa8n47VHmPNZuagFNFHIFkCDklvNHPN\n/VJLJ+m/Fs/xZ0dmeutJZmTuAW5a0tryji14+1Q9MmZcwHh9xBjpCxrLC9zs\nm2OI0iOJxgkv0DE2nwB9v7Eibaxr8xJob0iA+JJl+EERHGnvpzpSz3cjuE7b\naWfkTbVZc4yHhb+3ehZqTlY0vK4K/dEXDblgWGmZ2jZQG44FKAW0HF+LicMT\nkbXNcL1z1M81ITzjgNSAoguhdUB8BCuzCwLnNkFRZKBqOA3WlUfwPeEUw/Th\nc903\r\n=5FEE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 8.0.0"},"gitHead":"cbc48419443c8a421d19d659fea659dde0cd66cb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.89.1_1536905231043_0.6321458997433986","host":"s3://npm-registry-packages"}},"0.90.0":{"name":"hermione","version":"0.90.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.90.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"508a6578782438e3ff6deb19fa3f5472b86441ad","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.90.0.tgz","fileCount":89,"integrity":"sha512-SwpULsaIVWGUgqVGTeXRdpyNNgbdCNp+UjiQJoYsQr0qdXILpPDLnhn6oZ6r1s4fZbC29TYwVJ3jUPjcafNWBA==","signatures":[{"sig":"MEYCIQD8RmNo3iMoVipiFjHABcKI2wDm3b1NfK8gwHJyjfApxgIhAOfTYEIxnIRshpI9ldcL7qnqvtfVWV7wVuGD35DGew2V","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":195209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJboBGWCRA9TVsSAnZWagAAdGIP/A/iV+/uXSBUGKjGKhJ0\nGRanFiPLxNCWI4RXPE6mYEhq4uj2JLfMhsw46qk8HFwAbgiTNdTeO/tzgRzF\nkI4bzqSJOfXINlxS7Pr27b0HgPHwsyASWq9BeqobHGk0qMouC4eeKeyCQFmA\nKpRFyVfUfYTxoM61MTOn3VWbDQc/cG09+vDVg/OXXBnpQtuVPNHyyJvYXiK4\njbbBlV/JkMybHsBsz5gfc4JSRZ10aRNSOBmnO1UGsCwxQx8hVfo8ovMyWGJ0\nCAp1qq8jGchT/++J5uhGUl/rmMVAQJK+v7rw+0GCg1E/5NvqlvKuZakhQEzW\nwOhkkFqjxTQjNeWLSq0UI/401Bi/S5fXF/PQAy6rUtHA23vhTLQB0HLjJQEM\n9q4K9QUDbJjbyqen3K0nFDvETHQd5AJChumb4Xfl58HzHle4iGhLWvHtuvT8\nhDiBsgFxsws3o6yQp4DDfrXGj74T2ceyeAFErmUYqTyhuVAtR1vwgiJsU2sz\n2io+MDlg1TLspqLr5rVhn6lBWtU3o25AohCgIYsu28OIvKzPfSvjhPIE9t6z\nRuOjpeVfK5QzkJkCod+6e9xR8U23Ul4sxw/ec1Sb4MAhc32lJhmYVdlSMwbo\njfUteT1g71tXlqwlSL3AiWN20to7vn0JsiDo03bUz0FFGHRilvQAbPQegBar\n7fGG\r\n=h8hr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    // do setup here\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n```\n  Usage: hermione [options]\n\n  Options:\n\n    -h, --help                 Output usage information\n    -c, --config <path>        Path to configuration file\n    -r, --reporter <reporter>  Test reporter\n    -b, --browser <browser>    Run tests only in specified browser\n    --grep <grep>              Run only tests matching string or regexp\n    --inspect[=[host:]port]    Run tests in debug mode\n    --inspect-brk[=[host:]port]    Run tests in debug mode with break at the start\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"053b324e972596d2bfa34274c349c08b51b4425d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","glob-extra":"^3.0.0","gemini-core":"^2.11.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.90.0_1537216917421_0.04441868228709778","host":"s3://npm-registry-packages"}},"0.90.1":{"name":"hermione","version":"0.90.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.90.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"990dbf09c777a4925cf6a1f806f7a22c41478452","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.90.1.tgz","fileCount":88,"integrity":"sha512-tauHvqRSTGjM/Q5XrSd65vc5qxjB8wT4yGXWrM9XXoxrgQGMtjVIxm7/fXbNTLyo4utGw6Qxcj7vDH/WdLcR3A==","signatures":[{"sig":"MEQCIFEBJL8Ezn3bnbw9AJng4xGqtZ2ZKAwkm2uX8vVEqtG0AiA/K9RsLNivcNoxKSwiWycJxUkl9dB288ZoUGGODpcLyw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196268,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbs4cyCRA9TVsSAnZWagAAkWAP/24utXUb2ci+rJl/bB8S\ndHZadP8mK+CovlZU3SFsO0TA2DL30y+6nsGax9fCSB7IeKNQbUs6WetkmQ1c\n/WpFRSJuGco5Ra/VZZQM5UcLpVKsRlfmHCtIRpWzLUmy9eyR7SfuND/Z9I0e\nQ4nhKNw72L7pEMsxDmvR9aWDmzZOGQzd6C8zHO1VX7acX7/sY41qdUcxqmBH\nUudvUSSnHaZOfe6SK7n5/SJWIRzyuRvp6xyV0DVlBPiew9okmz4sTNAdjQhH\nv0+PtivoDJ8w4AtrtUVf91PDCwDKhmgYbLcCk73qai2VQObg8OVgw5UjuVyB\n3X0OBUxSwiBbTbEvVR6RKRDNlrtdtaBntVKpXL65aZPt+iuQ5JryKhTxEq/4\n8dnP0VyCaMaz+D83Sv6u3qjp2FIsLVxG570wqDuv2TiFEmzE8Yx403l68d+p\nOGAaPmHPfD0HGiGKiiYApG373C2MoKlbMPKrnnm0TMn5XEv3PsNwiQN/v6rF\nbr+/pkNhfUVOT9bL47B5vjlnc3jJO0of8H5ZUijp+sx7DY0RHmS6fuipHhdy\n7S7eBFODVOY38Smwq0/uvAGLkrbpvG+gvmwhQ60BB6URyIKWbMYoPeZu0PHT\ns3xAgpPNrF4EmYJPDRa2/sGSsC9OAh/ib5tdwWZ20wNSKPXBkEgdZW8keGrM\nAEXt\r\n=ENOw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"62de26b97adac898e152751b4a22dbea6c266cea","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.90.1_1538492209600_0.38152633829533045","host":"s3://npm-registry-packages"}},"0.90.2":{"name":"hermione","version":"0.90.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.90.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5e822271b16ec9819c1b54dd9df1983105113e70","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.90.2.tgz","fileCount":87,"integrity":"sha512-ppd2z6wC/K5jPJS7H1jz+FwFnza8dBOlqRzaNMdNqTWm1UAYSh8L60S8mKO843O1t+07cvlc3zu7bnGEU1LLRQ==","signatures":[{"sig":"MEUCIQD3sLy0boe1oRfyXqIuMc5Q+Vk93LDGUzDq3n8j5eOrGgIgVlLZ+bKK6OGINExauALtuUtwoyRhLWhnnl6laEdWhWQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":195553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb1Eg+CRA9TVsSAnZWagAA4FkP/jZPEiCLCNhxN92UiK/Q\n/doN6D5vAKd8HMaBeh6IxVA5j+7divtEqt2MA119ksgn0yUMvzJBsfpIVTna\nE7fspOlPvF1YcmPR8zXaev3cHMfDyrJUxmsqUMvtMFyYNaOiQwBT4gf/e88s\nvU5rxfibq1XB01XalerXv6M3gpAzZhRcc72ZPBg/NRHajqH+RP8e26o0iT/X\nqn1Vs2pxY25JK7uy/HVNI8cFNgp3eVx1WAY8LFqh4bJKSFdCUXj8hOr8yLHC\nFZD6EKMAJjAEI+c8j7U7kVP6gYnoTO3Z5LD3ML4Pumw+P8Yd8PoHbjpVn9Y9\nLhnuqcuDGJZVaUNqo9TYGhOqcWjyiO/gExeSnsE7QBzSXgNaxLcfSic2gflX\nijEtOCgN+ym65AXmnpFrV/DzBc2EGc0vjSHtZcHEI0An4+TgwkptL+miUjCw\nY180+SlK9mmrI8YQ0CyvcIX2FUH7aSoQtgG4DB6Lbk95RsqTBvx1kgf1BngI\n0qIyZ0ygEBWXemax1bjVARp9cxeYatqaMbxsGmTdWR9Ap6cCMrjJKu2XKyBy\nE2AXoiMlkjzc6F4Pl+4EdPi0xzXbs75oytjHX7pMp3xvMUGBj6VUxgnHk+8L\najvvN0FrM+l4k0nW68gWxW4ZBkhxYrVWhYgjQTMEfbdp7OCga7QzkYJ3C1lv\nBdhD\r\n=Fc/w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"2d2e055da9d3a58296f9d0983e855eacd3be7a1f","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.90.2_1540638781649_0.8709829316027267","host":"s3://npm-registry-packages"}},"0.91.0":{"name":"hermione","version":"0.91.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.91.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"7f00cfefd94ea03baab3262cd1cfd0007590b853","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.91.0.tgz","fileCount":87,"integrity":"sha512-Guu8c0jW/wuVhX46HgEFo0DxKqawYsr/poyosQ+W63P7uHWOginYTdGMFPVeBlhv229jEVuMYd4raDK/fsL1Aw==","signatures":[{"sig":"MEQCIAnoiQVRNG3IqZMUtPAdreNTpfjfQy/fgJP13pRU9uNpAiB111O3ZXU6zJ08qynFEBRE99CgEHDoLUV69HjRSvJQfg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":194392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3AvZCRA9TVsSAnZWagAAIu0P/izflCbGG2MgCsVd7Dk3\nh96TsRQV+4E5Uwrvygh0rrQgpHlFZC8PtOmkQ64JIm/Mtq2bt4aiMG1hjelr\nwlWseR2Bb/NRBgjkwefZrC/fQYsoVJqv1tPqPXD0D+Pp0wDAxdj5muU+xqRm\nlVX0RFJyjGCqKNZQHScn49fgmUIbZEOWaIfxo0ni+u3n2xMSDCrZ1n97EsqC\ndpcuM3mTXNZ80LJX4dEvO6q/vWibbUU4BI7RAdWMEvtdstKbik345vdxOkv9\nL9WnglXPrgnTJX6/3GHLMmbwIxkbUCh4W8stoBs3ij7Pd6x5K9XTqXv1T98/\nhZZVFvD/iq9NMVMQDjc5sz/4ZTzsP5WrkxmgO8SR/obXJ/v3O9CZu4Y+Kj4z\nU75iU9YK4KaWq83pxX+pNshWjROBP+23SKZu6jh830CR0QddtxCbZ5gNVp3Z\nX6RAn7zcrJVcQPpplyPDLansQOO6NhYkyQdGqFLbsbHqlV4WxsaCqmAGQAO+\nuYzXBAI4VlQ+G1In5PatJ7PJ42KuIjwA5JXcwZD+jDOCbbUtwu1lThvY4sq2\n2/tyLOFMQpD4+xx1+3rSn7n6yJVIanqRSAqWMJrrTCKsSsb8uN/jUYBHcIP2\n8R1eqYAMi3rTem+hAoQgsNA+ZqysvaoWc3Ldipl5tst/Slyf6OQPGi8+IR/q\nM7DU\r\n=Z6r2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"7b50b1d4709d9b45d30923a8917e4ec829f2153d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.91.0_1541147608185_0.763729351633037","host":"s3://npm-registry-packages"}},"0.92.0":{"name":"hermione","version":"0.92.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.92.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1f5badf22ff353a6f0136412674702661930562f","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.92.0.tgz","fileCount":87,"integrity":"sha512-n1oO3HSOoCt04lGeh6JYIjLFH9yblEYEZxXY0VyU9FF18DN6YDFZ0a7/raSYIH4abbdLfYnmNCBJPmQKPi+UwQ==","signatures":[{"sig":"MEUCIQCnoZNuqN446+GTVd02Swz0fm74xiXKO3B0lEC2pT+eKwIgB1GCHlyl4NXJDgLvs/NMYU8Z0XoaKUCVBkFdE3k5D6g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":194833,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb5ENcCRA9TVsSAnZWagAAhX0P/0JW/Y8mM57vzNqoiJuT\n22tbrq9Unnm5xU7p0Vm3tqLnn9z1xIeBviD0K1s0r8cO2JwaYWmZWHPpR5jC\nW1+Zww4VMt8dPK+grGH79X2r344C5Hg0guPfkI2phCUgMjhrAIrQckmJxWKH\nh34WezVeulYjbnLIXXr4N16aTBH0TQu2OZkQhCtUkO+WlqoTWS/FrZ2ggP3Z\nl/YCz19SopboMcQ+v6vw3IH7LX40R+lHcEPQLGW3bZSdXVeO9FRanRkDcHOg\n3tSM5YxN9McUTy0gGiZNEGsYc9IgnvQrX5Prtu/U4y6vtSoB8mV2nJngVBBu\nKntKCNth9DcMiYawmd0iOa8WRBq9yzGmAFHWFjUBnoVX+w7rT4rYMh7IjuZt\nyJRlPTnTy/AVKb4X3NBuz2ZccDokSh+Ms1bo3Acgwo4Ojjp0PWkMTxc0WM8j\nXIGTIF4hwOImbb6WMvf3a73d3Zpn6qB9mkjXcIlMn7DFkCQx1HmemFyBcz4V\nAJTqFG2+foO4nk0wCQW0elSgenP71Rcl2RT6K1kFEkrtf5121Hfw00gm1ds0\n/RRU4K/hOn/eTXu4NBsXd7kR+RXppJQ344cby60gkP8s2OUUThXh8R/mTab+\nAk8UZiUNnWlV97xOiG7LpCGo367QyBK3nHTLm455A4q+JqaXNhIyXKyIIVxl\nTb4a\r\n=mijn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"79ac0fcec6532399d5f0e2f15df2e12736418703","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.92.0_1541686107345_0.38830185807164996","host":"s3://npm-registry-packages"}},"0.93.0":{"name":"hermione","version":"0.93.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.93.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"61c4e4947ee235930f21d5b2a5927041802a6221","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.93.0.tgz","fileCount":87,"integrity":"sha512-uvShPrylX7sziRK+NKLRK4A6Q3SFantN72JbiJQNXJ2gGOjj7aKUl4YfjW+L6boi8SpQS7uj1rMmS8Ry+1PjUg==","signatures":[{"sig":"MEQCIHB4Vp7uv8+UxJTEJFD9sPjNJ6+WqSVN9z9jtncdATOwAiBGzCYHKnU/vluwEPrfjOJuCXg4UvgbRkiPhTT3zK5MxA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":198202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb/Bo3CRA9TVsSAnZWagAAIxYQAJpHPgUtOmd41ZQerl56\nQdaUD1grVgb4qCkSuI+USfiPm/p/pQNKUgIcaBUAJHcgJDKAS/muJEgvftKJ\naw/86CwupjiQ1WaDgxQOCrf/0WKN3z2i8Ad0FNU+wdppcnMwUvIX31FRE9+T\nVxsIrZTqo/yuoSOMJyt/JFUIT1zR+22bkTq4raCC9jyAqhckp1c6uSoBTcbC\nPDAkTqu26Uo4FroKJ9WJ8vxTsjGtcy5TjmfLLbbBf99gzpAiC5lP5LKyc6RQ\nrh3oYuwzTMPGCLDeaDs4oj30WYlfYbDdOR4ki9ZlMIv1n+Wke59Mlo2A2u8O\nFvpv/yaNhvGpjcpE2rCRcrvA3zr7Pp50WpZ483bv94Wn3HLfZ+/Xj+KJ5+Dc\nHQibP1DeD7SuUggErB4pyeVa8vgwIwI44RQRWKkDL7YOlTxEy/Z6XgFU0BPU\nEtKqoHSF/QMGH7sqcqspqsykEeTD7EGBIgHeyU4qREh39/uXWBQQvELb9TvM\nYI7bSEJcrzkeea/jrYgoHKcHjn1FYnVfuZxEt30+u0DXbsxltoTe78lr++YZ\nNVjxbi31neD8u9ues0keA2AsptJWXH7naPCscUjzWqKNEsfhJj4wMI5W+DDX\nnEbuwiaCqP0R4TWyJJm3Gre/I3MFqDpWUhooDUCGqgXAknxlJUZC5XghqG1D\n/moC\r\n=Ucb7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can run your server by executing:\n```\nselenium-standalone start\n```\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install -g hermione\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test.\n```javascript\nvar assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests.\n```\nhermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"a292ab0987848a9c85042c3ba9eb960f6cbc9961","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.93.0_1543248438180_0.6595659029286749","host":"s3://npm-registry-packages"}},"0.94.0":{"name":"hermione","version":"0.94.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@0.94.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"34d9a8fd6af97d2722508220427c084f9a7ad583","tarball":"https://registry.npmjs.org/hermione/-/hermione-0.94.0.tgz","fileCount":88,"integrity":"sha512-fWRciplchj4QiO1z9j7JN5zsJFVYpTaqW7sfEcvqaep/1qWauHH03XvUOIbd6GseD2vKgKg90TXZXf9xKZVEyw==","signatures":[{"sig":"MEQCIBboorP5vfwTVhKo1BXZiSg3dToCpWkJPGzJ2MkB8E6WAiAkvA2pKbdghs2ToFAhWJdDSttmyA6CjaSR29OTAgaGyA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":201702,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb/+3MCRA9TVsSAnZWagAAB9UP/j3m5hZRoUQpeJ/zpla+\nds2brQriIOuek/zTJ9qUy9MHuh9ozwwSJiL5E+DMPMHgDriqc8grt/2NZwD/\nggFdahFX4glsAjMz93/5E8XC55NBE8VeaMNiyh0qyirQ862/+FPQI8S48VWn\nX1QNSEzKpK5DF3hU3eeuVzmAeql4sGlE41cYOWAc/732hfaYEF+khCdupozh\nd+Rad9L9CjUke03wg6NAk428/jVOC+6w4Gdb0g4qvZclpozW/LtHomaiRkOe\nRIqhb60OO668FOcyWg+lqNqZ1wPMzf/VDKi8frMnsc+FwlTLf/yglOa5lzvs\nRTIEtKT0beiRSEP2vYCkcx5vWdb4JJhlqGwf6IZSkvSqkZzWXTcOuXqZLCuA\nKMTxpio43x8kVjuOvyWzJ+kCbADoWScQVtroUCiIBcMxfvEG+1QwChFYA0J+\nU4foDV4JRkSK21Yij7EOgr5HgFvNarFd0WRVBMgG0aa+mr618NdysizY0d09\nN7BDP10Wu1FsgCAYhc4xVeS6Pe+eLNsJtVCKKXZ6rWGsFjRtQ/j2J2YYHClp\nfN7enGHHdJEriewiObhBnw+CezvoZIAg0+KjMhcKmQMsV4irT3+7J4m3cC+G\nxLrwZYW3XRvNKK0t3oY+4Q1aoSlmqOqNQPGvWkJh2HI5OvJ95QwuebwEkrSj\nzkDW\r\n=Lc2P\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [allure report](https://github.com/gemini-testing/hermione-allure-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link']});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"a6e47a0e4485ad6dc76a3cfbcbd0d8fdac7b12fa","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_0.94.0_1543499211618_0.36125490217157963","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"hermione","version":"1.0.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.0.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"cb1b8fad3f34e18632ebe668138f7539fb5f7d71","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.0.0.tgz","fileCount":89,"integrity":"sha512-epGSfpAvsR2tnhP+7uIsyhHYgraLn0d/gHMZZdsTS65LgmLv7TLzUG6YJzaUw+AxSykXBpq893f7TG7GJkHnkw==","signatures":[{"sig":"MEYCIQDmMB8mjLfjhf2TsrwLMluWxMV994KHs79B7Rw6ItBIKgIhAJ0BQz8f38xxfmIZ+d4sAcLF12dGz1++45Pyd/4GWBjI","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203516,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcABbSCRA9TVsSAnZWagAAG5cP/1P1DgHPKbsKJVvLVdhm\nMQ64zS4PB9rvYlJDTGCvOyc/7BpBPjn0DQjEYEPfkRCvKdj6MPg1gQT9MhRA\nV6VWVyij5HcDuDg0H2fEERlfvQ8TqjyROLClS1Bf8ki4BR2Ipoka3qM7PndY\nWK0F8xNG1JoA2X2IeL9Dxm25W49a+KW2H34nbcCjTi46/Bji7dozfnK+sgIS\n+l9ka72V3OppzskqWCzP+1YYrBqBjuNSGC6saQA9Ib86VHjR8b4PYFbhsXay\nUbIqC1TeNKd5+ohyDEjyJjlgXMmR2fWjeFJZ3ZVrzNFdezf8XtgXbqxJ3h4n\n0HQ7fEYwHM9S7+sCx01MjJJI8RRSzRt6Jq1Z1hZ1DoNjF0yf5QNamVntRnBq\nB5r41Zv7Phrg86wOCF1f41KTKoUJrHkRoilqreQOE+uyLUVMx6hoCAfTFamu\nguXmoCrALLYL8ieZ+EpeP4bVBG1C8Dfqa+ISRwv08Hy89yNFNo0D+F5r46yo\nBjuFAtGFTsNpHwn2UoM2j3P7RS8X/crHJ3OqcTdblH7YaUYVJ55Kmsl5CrL2\nb9baR+LK6sCt8lhuCr9m87PxSoRVpSMxbWfNlGCVciDsUF0Y6jy2D+j5Clvk\n3EnKP+UxsZXtkJ3Uzthj5f6vifDITlA8SibU6gYTdYWDSY8YwREGPpA7AMRZ\ndvXN\r\n=ofwb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"fa2242eeaf2cd64d3e40706381adc84687218d85","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^2.11.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^3.0.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.0.0_1543509712851_0.6553860438657209","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"hermione","version":"1.0.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.0.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0e499a0897b79491535569ab0ae5d4a79b0508a3","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.0.1.tgz","fileCount":89,"integrity":"sha512-PngnTkhaqGRZQyutzsU3WUxnLDBNrZbilHYK3juZMnMJIzPJz4+Smi8SGiJcCBhFCuBgBj3YX/qYFNfeuZ+bJg==","signatures":[{"sig":"MEYCIQDeUMz6FD6bTVEV8A6FuNyixieT7oeKB+K4OJGPQPwhVwIhAOhRZ65OgBZaZ5a9yZaZi8SLxwnDfDpA80cg+6YERCq1","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcEkK0CRA9TVsSAnZWagAAmVoP/3UaPV1GAd3Defub5MNn\nagZ7CvoyBlKoz1LlDtVXMw9WUJmya31STmGXVwcYpvTu/c6FK5sluGYbPqkW\ncfEdvOIHAhgnkG7L5LMBX3vM8i3EjwRcN/QfW6o8fLD1rKTBZhSukYHokquR\nRwhHis5aH6zggXB2cMYypGjKVHspHjyamYfCyprf3iM5izexxombGU4n0c3T\ndGa+vwXzo5NpUHhKiq4IEGUZIZrR4X52PDivkzHCHRMOcGBaj8/KTHQBbPfc\nj75qlt2tsWbKTXrR70ME5Y084f8aAZPCiXnVwGVgW/AKZL1J1M/lXCEwLOp3\nGF8txqsn+BVSKlVgowaFMfwm5K6Deqi0UeHhLxR1Heg+BG0+5VvlRC7qeV6L\nQexHAU31qDts7Y9Esl5JWOSicO5r+fkKV5sn26DOUz7OhEz5SEgzMEO7FEk+\nXz5GXlbbyOd8eUnxqkkr4jl5EBjATDgWlZ7niud1hrwANvSToWHZAdGGtupJ\nYeryOIyQ/o9qMahhpX/ig/BGOioPxfrUL2Ux2qK2OpffyztiH1uJNIcZaZXn\n14EKuBilDQTpwodBS/i2REnBmNM0jRJeLseNG7wqRXDeLSgv08HitjsOxx2I\nZ55DoMCig6u7VSe72UK/lvk1oHLlXCkPSXR7dPNQQjwwjhuu8KeazOExEUJb\nOpXm\r\n=YMR6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"4cdb2066d348b84657ab15a79c1f2f952919b111","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.0.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.0.1_1544700595544_0.3660499103188335","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"hermione","version":"1.0.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.0.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a18f8902a8c90d51a469acaa0dadc26ae102b2e2","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.0.2.tgz","fileCount":89,"integrity":"sha512-I9i0upk08KqUFNSHjfYXgR0+DnrgNMn15tUdNkdG6mlqZCH7XUYRO6vjI0xmY1rortBFTvJFGaKDZ1aMO5Seiw==","signatures":[{"sig":"MEUCIAcPeRo/oh7DiTIe76JJA9EgTHDbNBgMbYE4NTsldYZlAiEAjpTojBt00l1JM8S/CgghafAweXl22tPHOFm3TDJ7FaQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203885,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcFBaCCRA9TVsSAnZWagAAvRYQAJGHysVN3B/orzVDN86R\nalipLfe5jhyn/7McWR7flkorl3SNXSH/JB2jDimQPK52//9zKEI/px0vXPAc\n+cN5kL24pdh2kqPv2dmqkEWhOGDw+aTnV72TP4TAr424ZyxW0CqN9Q8HgAhn\nzIn2ZB3stUXr4qxr8geYIKaYFlLIO/yKD8Sm6NYiNgQsCJKSqYnlVbibDTPq\n7JE+egiz2p1VvKH9Z1Ge2n4vtEIKGIOjTnY9jOn3Ee/leksJJBrEoA93eW1G\nWdsBDLJIhy1lfgxw3w0omJkGG7Ikc1+sTkJtkS4KWRzsE7nfLg5ozihT9kAk\nIYQlVxahH+cnSXMzxRTDDMGO3huhRg0N6nEWfMDq+kU+N1j3kJPUeRFcYWjc\n60/65mxKftCklVX5hqiIiVmkceJWTDi4g2YQXydU/euBlgOPw/HzumVRFy9p\nJqQ+yz5Js+G8RPF9egkjJMGgfLA2FssxVDIC9caa5hyFy+5/gEsk1QWdhoMq\nyctJnfwC1qBFdXpmaiy1IKJAeq5vHzUg2rHSBofHT1Amp8tFUq3WoY3EhUql\ngOHzH09wF6IFghC8PlaiS9PaqOexFuUu5kmiUMjAWCjDxT0dq+Ed00s1Hya4\nBVVq5IFqH8NfIn3upsfIxULZxNbbFXSZ280qgY3Dx1Gj8t7dpjy7jS5Gs4pw\npjJ0\r\n=QDvo\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"50b3a61b05981a789f9385ad999739d91c4310e0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.0.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.0.2_1544820352989_0.31420245196228214","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"hermione","version":"1.0.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.0.3","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"6fa3f5ba6fea555c383c29f7fcc99032509d81a5","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.0.3.tgz","fileCount":89,"integrity":"sha512-r8dwNbG9i+S/jKA9Yue5M5C0gQ6g+p2ZdmzxaftnbwCe/RhYR7H4ZdqhIP2lsugpTWTk/RGer77qClBk0rxSgA==","signatures":[{"sig":"MEYCIQCKwmXdfQYG2sQXPH0gpy6bNXlD+VS+rNAM0uejyy7UwgIhAPFU+cuVCf92Yjodl02dmMZ8TrWRZbOMcYEVFKb3xmn8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":202664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGPrwCRA9TVsSAnZWagAA3G0P/RmuH2+y3lAgGWCrfIFR\nFIyc3axV6qS5rj2wUNIPReJBPz2SnRWin6W+2JpASMw0qk9ZKJajV2HeW+jo\npT1GWx7bmNLQSv3iv7E3Abs+Tzmk9FlaqQyx2F7maXwSW94MCOZvo5tJvDAw\nJHYN1oUVqOLB2JkjTpxMYYI09h38F+dBfHCQobLerq63B2bQulFfdq5JK2SW\njxj59dDItIFWaTzhmUxP7w8MswBKCeplNWkhWW3I5bfo7Fl5sCl14GvF9OfW\nsYA4ek3q7bmmvE56ijre1G4n2eGl68eVoHwmyJPtvZYVFrW4f9BxI8fN8pJP\nX1b98RnWbWMkLQsRXEzoGuQPd1m01iJtd64kjK5w2h1TkHdymXPBIwcHgln7\nUS67u30dfyLOhIkM17rmfAKiUJSkBSnRDic0tOaffnItIbJrjdXXJ9H3a/xs\n1KlMBPwqRJ+o4P6a/McIMtw0XpPOcCDzre3CNoBr/quLqcmHzqwDymPZL7L0\nLnw34nQxvjPGOtdxaR9UENjqvEVVfXmSyg5GoSWRcHacoBsgyA7azv8bo/oc\nJMk5GPYWw4Oi2LvJB99wGhqJmcJn+xKBTQdywhKwobxX5acn0Iz7mN3CgU7C\nD7aUx8gYO1VOtG69OKOy043JXOj89DzlX6cqgivYpqdw0zENRaS21tRIMXU1\ncLJE\r\n=WFkk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"2a4307d5b845df1ae70e6e3a3fb98769942d1009","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.0.3","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.0.3_1545140975819_0.8659843788088972","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"hermione","version":"1.1.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.1.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"21c2c31367e05a98eed1e755f20e39afc18b40eb","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.1.0.tgz","fileCount":88,"integrity":"sha512-1dL0My9ZEQjw979gwnf/T/W/v4IkuMkC0biiJFEe7wo2UDFKNwtvDg8IAgetSUVKsC7Sz4EkynrK0W2X8/EDMQ==","signatures":[{"sig":"MEYCIQCBCPlNyjhXxCVPQhEIMm2VWovhD+Ofxy0KCiHz5f2m0QIhALYyw5nvrUVGyyMjA+aldK5m4ddMVeDhIr3Heb0RMwPQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcIek6CRA9TVsSAnZWagAA550P/1vhJr1ZLj6XTLxY33Qi\nijNDd86bWKoNp89r6g7o7jzYZjGrXFfLIdP/TqrJU9QHvBl09YBUttckpDh5\nKx/+/eshIhCp2TsUQZTu5NtUCM7nlTklSShUTUxSpPSSXpBREcaItE9exswG\nNafZkyZ21CPe5Od50bxfivLARsBlYVGxwgpNNwvTPjBYIJ11mECqcL0EK64A\ne5TRI1MmpBMaXUX5iMTk9rD+6HWUTJRV+7Ntv5oMIKvEofdpI6ZvCAkzOpSP\nSkCaRoEaya6qmYC2NAoLnrO2mL1n4vMySOIo6IRyerJL7iZw5/rr7DONbmyy\nzQu9RviplsO+sBn28Txm2Hqj+QbP0d76jI6bh/1zDT4VjuMPCJdkgor/aPJO\nOJmYfai9XsYytCEAcW5K3dYCaHiKENlVT7fMmI0eQ2rz/PSbX69F68nJkbVe\nsHCFJboudiT0FAkQ+XJ32MqdfUpkMnG150o2ucPRXwvrzHpe5CBcNhoCHT9g\nHPpcka0UWXdFC0TztoWjFUJVjQFN8t99wYlVlQiSktH1pnfxh6tnWhYitXeD\nnDHjkQ7NhSkNiVwu1bW7Y+RhysfE9eLKqlrJn/lEhIAWx1uDabcVpKtjLbri\nFKRdf+bkgeDGVjJ6CkSEcuZEXQB26ZN6Dl9GYWJND7k/jv5Ltfwo2sW4vWw3\nvrv3\r\n=5+KM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1355b142d96fe3d8e2aa52cca6cb8926bf9b4704","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.0.3","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.1.0_1545726265185_0.8391502767611527","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"hermione","version":"1.2.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.2.0","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ec8d758f575b8d0ec10f9958c0ced8bf912d8bb2","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.2.0.tgz","fileCount":88,"integrity":"sha512-S7VwVn+FVKBwwho7iMl6Dk82nwYY3GxzNarZd7taOiCZlW8QnJJ0xkO2Ij8A5n3xWFT2vMjxHQSu/GZuJJ0hOA==","signatures":[{"sig":"MEQCIB4qMgJi4T0nRnAMxYh0kzFLAWrFvLDhqqXt7/yMHnZHAiBsyvFwmKIwn7Hq1NZQfznUjMTyONtiAj1+EUBONEz0uw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":204153,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcI2AlCRA9TVsSAnZWagAABpcP/jAK8iWDcU1X7BmnbuwE\nd3IPmkiDs78OsqD/9yFc6aq8eZAFTTPWgz0FqNRjbceNIEUX3WNo4TDt4Dev\nv3Wu2eDClD04+7RFI/BbRrHpPZzoqQUZ9j1Dlilt4SqHfpy9RLcEhxFbTXji\nEtWROFD6Zm8H280BABUNFzh/SITgchk3LiXu+Dgn7J4yrn/BE4r7P8fikhKg\nC1YGo8ioAgKtTLM7uGD4+pQk089dbZIu8lrm2MYPLHYnENUFaZ/vlD34g0f2\n8OsIFD72khwegWNMCkTpYpKn7fKFf+8OVB7SD3kzafGbk8Aezrs4UtB2NkgZ\nxUemYBzTY+bR47s7uaJALoW892NB52cLD93Cqp2WRwStGOkPbCdb7QgE7gkA\ndUJJIgv9/gWLbkz42ANg4lQl3Zm4ZV5QhlfS9ESEY9+VeQkXtXaI4B/LYrtV\nMjLoxmQYgQU8bPMjQN8hCf0jLBz5NLxToBp/1/txgccclP+Ed4JnD7nFKtZ5\nuZOR04s5U6qZLtXWFMkgMtuidnezHy5hJoNP2ntnwq+y8nU1uK8FBK1J8mTH\nOVy8UXGcQSOAgzdrvFF1EU+aZeMwY4p49EHB2yEeAtOv9Ovf41d1a/ThPxdI\nm00DyLZNKbPneIjM27MYu3Qf4POUDDk6KoZX7ZoiuEAzcNi6rKE06WGSk9Gm\nfSqX\r\n=X3Rn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0ea3eafb540865c51f51883c486ba1ef2ee695e4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.1.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.2.0_1545822244861_0.5729149415129451","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"hermione","version":"1.2.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.2.1","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5a69b4e436be94ce0c80d889e37bab10b85bf618","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.2.1.tgz","fileCount":88,"integrity":"sha512-0bUeeSJ+DLLGVPipZ5RYBbjoqL6v/zqqwMTf8nJAKVXnB52F2VwOTYXEegf0Xs7PYt8Rjffrej2ilWFnOGrO6A==","signatures":[{"sig":"MEUCIDq73vpkyy0Kj9ajMZ5OEVlXlS7bnF4btibZb2s/bHsgAiEAzwqq+ewGLslTqnQ8q1+5mWDOf/O6ENtzq1XoVESbG7s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":204398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcI6yPCRA9TVsSAnZWagAA664P/iMwJOHQ5lt/Otpm1LVt\nMl7Iw1qsOxka9Z8Jxoi82+AWSOKlOWZHHBo2nUdp+UhoBnDYnyPR2WxnJ5wL\nDiQRn4hDnu98VwOXpVSKQJJ9RCKVXC251La6s9hJ0oY5+9izOXqqUYHIphLB\nObxbJQeYWQwFI8Kbi09PuJCmBzx7ipvy+sV4OuQk1TGlzEl7Q0pkw8TB07VI\nqmxN8SXUSupN9IIcFbJLZqy1oUnZYH9jqL9IsumQgtoHdvaV7b0oKkgLLIj5\nrBGPEe8fEmCTnd3hH1A59B2EwI3VpvVrTLL3ho3VhUHWGVE8YjImImsKj+G1\nhryOP0Ho7PqSlkk/zE+/4UC+ccpnLYmt7mJO7bxgfR6q3j5YTjlB5Hw9/DD2\njaMUIPxmofUegbFsyv2GsYxa2j3FPmiLsygRkSH83NU3sGsq7m+HTrVALoCI\n9UKTnsTCcrLvaoNtz1tRlwkd4Ntfu0EEZosiIN2M+23xXF+JRVTzk2GG5xFb\nQh5owPvwlshRhHVGkmpAamdkmoo12dXI2AllxQ7+84b1KxSAA5kfbExvxKP5\nzjLGJ+eM2qQa4wDVhfKvPD7IW4fOzkjrVULIR5lswQGzyglnfvAVrGsXduv8\n5hv4mCVmboapfxXjXtBGcqUbGlsxyWZkMJ1tga9XgF643qB5k2LcOX/pVMCt\nSGoq\r\n=oVb/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"a319ff80a2543bc865dd3318f10081420e57667c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.1.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.2.1_1545841806664_0.9311581240939322","host":"s3://npm-registry-packages"}},"1.2.2":{"name":"hermione","version":"1.2.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.2.2","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"95fad19bc9ec81fe264ef6d7b215d396a69bc798","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.2.2.tgz","fileCount":89,"integrity":"sha512-lCDbSl2oDvrTId0KcOUMI4/D1TZjhb7dKog8+i7YU6wY6T5fdLKxjzyHZFrwg634RcIZkpqRrmhJwYM3wtDb6g==","signatures":[{"sig":"MEUCIQDVadp9g6zRzUxj7U4k3SOEz50ppvs4Y4XcMctvgpm8lAIgT7QIOnQKfpmu3uSs2/5YiljYNEPYJxW0wtNkDhrGBfg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":679422,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcNvmJCRA9TVsSAnZWagAAbmMP/iwwMzKP/666glSyDoSj\nmAlus//FYWabl/R0j6oqx/ifTGs2Ctfs/cLyG/I3zVkjP7eMZ3EyPqqIY+u3\nIlAxfMhmix/jjTT0aODXib9dHqQmVE24BVw4/21Vb5L7C+Sc6IKDc5r+BG8Z\nzZ5r2k7qQKqgjevZD8rDP8RwuvZnKS+6F5FQW6ajYESpTzRNQq6ooXB+VPGU\nkwhdc+xZH8X5ollqcrYPNFHRLvN9erYcawtyAbgceyDP6cLJHmMcG5DqGF6q\n2S3+u27v9Z7P+CbAcHP4C1Rl5fnLkWDMYPJmimtLqvAaSy6uqW2qgCY7M5dy\nhG2zt9zA9GWR81ofjt80RTr0Mr2l8A+hD7ChDrMvXpRJ+yc6RoGjvr9JH8zI\nv0w0ebmxLE2fJhvIQ+TPW8eleSEFB6a13pk3C2rNnL8HGd7BLoCSJqsYdjCi\nUvXJ8xQxJYw0/EzgjMPpAr0BUjNHKK+f2sHgF/1wQWWvLdLijJVm+YMXEmpg\nMbMUUooZjXFCWff5qSZp97CtV5nVaa8LfkJdtnKQbG4fLXMUYQOrozIBMvCM\n33xD3vuQhPhiP4o0UTZri+oc1+gRBtSru/poAhl9MRhwsl9ecKBnQkoMnNpR\nGDEV7sSW56DjQJJ9zF12ar+CP3Bx3caPZeixmg4yCcZc2WTlhhkjAwp2dRhs\nEFEU\r\n=PR1U\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"5ad321c48042b9ec938fa5ac83342d160d1fa8d2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.1.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.2.2_1547106696937_0.7932622021861826","host":"s3://npm-registry-packages"}},"1.2.3":{"name":"hermione","version":"1.2.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.2.3","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ed841e1beedc2554a971313f33999131efe67d07","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.2.3.tgz","fileCount":88,"integrity":"sha512-jxIbb2MMVMETOJL0k0IFwfF/CyNVbntSk7EriVVQlfEuFYyiqZAmXBXLfkNkEVWopVwryY9+I1TNtQCrS740fw==","signatures":[{"sig":"MEQCIDrTXsa/ybvEwHI6kX3LRd50nfRzhHlHDqQn5/NO011RAiAdaLicWs5YUsGHYbowMVcTQsrWlvNLx7a4iNcKbamP+w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205083,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcPwVnCRA9TVsSAnZWagAAyfIQAJaWJz5s2CITci36DaU5\nnF8aNHwrKKwT/x1N1ZD++U+/CF90nsKAHnmJnEDF1lYgSIyZe0j8YHZVE0fZ\nNDm5gsUbakl9nzBwIqtEoCnHFnNUZVkX6bABEXei+Ozte5TFyX53LL6SmwLq\ntbXse9160GXvD/UhwJIAh3UdjrzJvnN/2ZfQpWvswwwTPeCQHFNb5FfhzAxg\nXn+k4RXweWbGmFgXwqCxmxfqgfmHmoJQxmg4/rZInjVXu72zl54rAb7bWfI7\no1wDmJxoFKHe+ZH1rnRGSpqklwwzuatxVqI/4HStip0r+YNru3oxBvRIs1+F\nOxSW2f7J28xB+krFOK1+iWW9UDPg4kVq/eMXlvBcY4gGF9t2kr36DqVd7OQs\ntACq7eTypkjuCWihBXpWtho4j8ljbzfFX3NseyP+9AEG7qgFGIF6w27TPPVk\nJRvkO3lbxXWoVlrX35Iza7E0dt4iSKwN9gwj1zh4jLG9pnLKnyfiOt426gi6\nWAP2LEtrGx5mnrCPL0utY6q+G1qJZfRDzKwfyiE0RGUu5vjlY4yAfrXQ/Wr/\nof8HuYfwu6sJW2JK+RK+qfUkcefqP+sd0fvBhkDwnFd4iq5kf5jdhE58F2yN\n+wk8XbOMA7U2obT3qJ0j3Wom52PnuyNQGy7B0O3hzt+lYCEJh3QZkesHQpMn\njEsD\r\n=Ps3l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"bdc1d727a760c3a7d01832e6b939f27817387f08","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.1.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.2.3_1547634022912_0.7026101816887396","host":"s3://npm-registry-packages"}},"1.2.4":{"name":"hermione","version":"1.2.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.2.4","maintainers":[{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"4205e90fd534fe19db413124635c45331147e98c","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.2.4.tgz","fileCount":88,"integrity":"sha512-Mi/W4MVmvesi1kDTaqvYrOUtd3bSX9en6DWD6qg76iwvIxAHxju+Sx1hPYI1iczoUj4xoF6KxwVkeO9GEycxhQ==","signatures":[{"sig":"MEQCIHbzClHVDlv5xbGAiigVkPjwjRIeGZ3YCiOseAEGT3CLAiAkVHtHQi8RRj1EbVaq/Y06tOke2cyWxKr0f9XSKNzxkw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcQc3ECRA9TVsSAnZWagAAS9kP/j/ZpWYeHnqHkWQO9nGU\n5sEToRVIT1DbKaMPRyJolFaDyJFFFtqCiS1kVlVRLZ9DPaW5chrXkMYXXsp3\nmnLT5zJHvhIrp1WFjRnUPQia56Tv6zRy5ak8spaC3+FX2MpkHF6ZrzrYSzgc\n/+RP/V3tihyk67BPb33FPwQil29w1Y0BElbLrnJsc1FV3EOxkLVYJqfR+sUg\nR8yngINHzPyo4/x8YHNdtKrO+7zg3aTwiK5ECoRF8y3RvDPj6pdeNHpgW0v5\navEZwLHEjM3D4R9nWBK9jEk8HETSUxexGeAMtgrnAcDyU8/0NDglB/tXkkzZ\nOfQEdvbWtavS/toLNE8LbugHXrSlDPuQ9WXRbM38NbtO1zih9GKkaefTHzIS\nXfzgneWUwu+0sSIVB1nNKtPRZOZ71ls/ENNv/JUQ7Q4HEuf5lN21hBb2B9Tc\nuEmmEd8kMlyGOY8D8fjw3l1PYAxr6NAU+lHFuJc97be3Rk6JvNU2cRadrWIu\nvCggTVTiNXquAuYC3IvytA14gWsASlDe0HjRr5dfHLtLNNtpPxJOtJtlUld2\nEHVu+wHHmCAwl+C+I9+SY8OkJc9jT6mLrdHBJaW9Vqar6haPwQSajiAS0pYE\nMa/X/5vY6wYbP7ydW2yutp+lsEHyYguSPPJzC+mDwztuL2KSmS4glzWnhsWk\npvWi\r\n=r42L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"c5845f5fdbedcd1e457c5da3cae0551e902ccfc5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.1.2","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.2.4_1547816387317_0.67670889085703","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"hermione","version":"1.3.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.3.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0d0d68e8b72fc845e4e630a3263d4a8bd1e1fb78","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.3.0.tgz","fileCount":88,"integrity":"sha512-TVKcZ4kkScZKt/5nLzo1IChk0GyCjNfLeRRjr9NuMluPhrsGeTmKlj+nXDndQNRjtP6ylz1rqF3nP229QVrJjg==","signatures":[{"sig":"MEUCIQCOZPius4fMB3qYNOg+8Ovuq4HIyDaJ5vzrab3E30wdhwIgbJzNpHrMnX7VjKHnPw9PnuMNRYnZHyVgOZBjBT3WK2s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcSXp7CRA9TVsSAnZWagAAmy4P/AwHNH+68UZXrdEZvcvB\nrokSWajvmUSUgNKDmXc1C8U4X8XS2s/0X8gZB0ZaY3NtGdjED2AN2UBVUtzb\nU6HA73ik0X4RrdF/ijcnAgVrrL08IyBPakpsaxG/FromIVVObdwwz+g+yMGf\n5vsJbrHe+2cqFL+GViMf7u06YPeVh4CO0TS0sMV9cHFe1bS2QkuhjMzdbPA2\n7ExL2trP3AQ055I7qR/aFShOJpc6PnB4Qju9IXBiobeHnEOgdqMQApMbNdHH\nKcUD4NkY54nAPP2HM7Sha/Gm1PpdH0DPWADg98bnAt0DO7/NGhGswq/3D4zh\nwW6dsYXwR6PdFsbwfM3RtDxMt8u0ag0/MLMy4IVfxfrvz9JncOtHiRjeBKhm\nmh3O31w7wt3EhcHuEYWVozSftgGoYc/i6dYRT5fgRTKRXfAcFY9Nikld6n6S\nH2UnPh1sqZuEYE0Yk+AfXQcvL5x5Yxv1HjMmcqiTo+0vq7dqy1iA2PCMJuz9\n2xmyiOoaEPHsR9+m4IVjE4B+fJhvg1IifYhkkK/t6JpXITWhRWvd69hiNBF4\ngd3hhF3m2gkGf69jYA2kOiq5DUW7j6i3Wf6zGT8X9FguDIvtBfi2FL7LSOKw\nS/eSKGJv/yVrrS0tNkP6V72qFu1EG+I8Kr7GO3w2AFVnPb+t5fRfB65EUm9e\nHpnn\r\n=j5+Q\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1b3adf05d0de6ad5ecb61c5ebcb8aad48950a997","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.2.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.3.0_1548319354866_0.09274222670105181","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"hermione","version":"1.3.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.3.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"402a2212ba3dd412abc0fe14394f3c766f8e394f","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.3.1.tgz","fileCount":88,"integrity":"sha512-PdPXqmNCwxGPMSheJHTCNfAxPdfsnMvR7L3hNO5vvRspRGCc2RLERfN3LDFRIaAyJ3hoVHCvy410ncwrYISfVw==","signatures":[{"sig":"MEUCIQDlp7khOJczSzVBGX2tNm57qAXo7STR5YRLR9BM0sVfrAIgdIPl5TFOa+tW2eRK8XeiM8rg/xRFBbc0Zy4nUKCFU0o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205802,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTy/3CRA9TVsSAnZWagAAacIQAI74NGuec+h30aJTygBr\n/mXYM9LFvi8YodLQgBM/cIQa+LIK3ipu/86/hs4xuRDNZ0lOTjivDBgJbUI+\nBYxJxbuYHHAMQQOqqP22G8gJ7m1wMY70TrmpAVnoj8DskjV5f/QzHS48eCGY\nvmFfVpII7qwy7qoFfC934V7BYX3qU5UANtKPcyfBCRFBd4lMJ2WKlkLFH9xH\nu2w4ee3Pw7eCkKDKQgYLC/RJHyNGyZkhLtGjkaNqGpil3K+0+fiZTBn7Ss5h\nP1blGkfpn2bQOqFiDk7pBtMRGgtoCQatdm5lhHOQJUdr0OmqtnrLb7gkoWll\n8c7B1Lfj33lc9/XBmdz0VQFGlj2FCee2eR7ncAfVMJjcvVfQkBEBhTPsowDM\nwJtGPcOuMeW5S9lbBfDGggpohxefKZAGCKNay04zy2kLbHDyPb81S1Rf9RdT\nxYcKFIdsb9aV7yZIreFmf79OeCB4rRyVL3FuH4indGkrEr9cDkqC1HzT6gs9\nBKAoAKda2FVXE0Zn53ekOs9lurtrWJ1zk27DiHkfICEYFIGJjW4SNzQupBFo\nMSU7hlquUFFjqsVYKLLBpNwogn0Odz9oPZ9s82BbLuyepJ3iiuE8dkcyrqHa\nP0RwYjLxCTSl3baZKW4/cH95DWQQ4OFf33J/hhA73RdsLlB2Wm1//cGZu+Je\nNZda\r\n=NcTF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"54e476d3762c7f274976e58229d434bed510ce6f","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.2.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.3.1_1548693493831_0.45411749521399347","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"hermione","version":"1.4.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.4.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"436fd8e46ab6cad73f5755e3d2ba9a294a357b90","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.4.0.tgz","fileCount":88,"integrity":"sha512-KWWlwfVrAlezLh8iPTZxQGZNyvOJrnimW/OPVCH0xobK4v4mVS7Pp3OhxBHP4dW/ANabtoXUblv4GesITJ3ffg==","signatures":[{"sig":"MEUCIQDVYfDpZF428oUAakWedCzg0FJa4ecuU1T318VQCDw9AgIgWgXTGlK0cj4AjOLt04o9/B/A2l7Dic2LzFAbFMdZzgE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206913,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUBAaCRA9TVsSAnZWagAAh3cP/04Mgt9a9/Eu5YYZJYPE\npkML53nYlgOFtauLYdRvdmqVZMC3d8kcUCwJhAkp5U4Q0P/3AJP/o3ijcmcJ\nP3+Lt5+vwd1WIJhGGNlX9iAu3D3M+F4vbXWO/Nz5ubOYr16wU3pK37G3nr9l\ngCCGesuoN03gahTG7BvHzUsrLfF0Z7sh0Y4Ic+i+QP3QQXvThHqSy2NqBEVl\ng77YeL+XWfPI+VHoLOXr8ArOf6EWjgb8PrH8JpGtOgxf1RtNm+HhireMJld4\nrAfzpDjHvDcZfM7y58Vv8T5jF6If5LS7ZukUltxmH92eBLlxcTiExLuq91Fm\nZjUDDldrpkOKIQUmRRmfFnw521d9ma0BT9b9XyQF4islV3cPHCLQQCtoy5+n\njmhR74rwoWydWg/SUlKWO9/lWFvGaKmQ03fqlcDSNgVkUwAALJqIO7ivGOrd\nDiea7o4M6eoRbVLZ5fpgm73yYkXTIea8mJL5aMM8IY7taMqM430JeqIR/eke\nOg7KlAhhT5axW0S/Zp2Vbx8/rNDTxGDdDRSFkkeJV5lHvg1oDg67GdwGfqVs\nSK+0CHkiPZqhdozJrZ/uF+2qXQ6b4ixyRZQbplxpRoey8uz/eByNMr8O5Fnd\nMV6z2/lnJIdv4gaZPqid7xRqFk2DoWR5BtHncwrsqf0/7viqQLfxHmC8ZGFM\nURdW\r\n=47x8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"d8fff2f39c087cefd7845c63da2ced418e9f3383","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.2.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.4.0_1548750873229_0.613855490031681","host":"s3://npm-registry-packages"}},"1.5.0":{"name":"hermione","version":"1.5.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.5.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"f093f687d928aecb73cc02b721fdbb64e8e51728","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.5.0.tgz","fileCount":89,"integrity":"sha512-ESx2V/E1EafWYW6OYytTFstsolcmOJ4wVguBqbVlxH0jgOa121lN4ZfuVbYt9RWDNA4RLq5PzLIUf0qMeeMS0Q==","signatures":[{"sig":"MEUCIQD2YClTlC3xrF3PCmyCIFT53k+xq/kR+mJmwklQG53UNgIgLYpQb8N8GXTKEvUeKmysEVVIeqvmTeCtsptSGemkZb0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":209232,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUNTaCRA9TVsSAnZWagAA9NQP+wedj/RuZGlIR+xAvzX0\nYepKgylOwOM75BAlBYNJ88lJizJM7VsL4ei44VvWD9J4WW4dzykm69sUAWVH\nx4Q9pXlCyxbtncZA2G+XFHsnxYfn5S8Ue/zsWpAXJgKPwwbwaL0+2dR6e2c0\nB7HQMj3GgHqa7+5QaR7CANvc3yVb4lS2PJhC31U6EUILFGw9GHu/v6uvAKyl\nPZ7yD2XHOdP0Y8zB7luYL+HRdfAHOi5C93kw+dS4vUHJ1J/RFr7pbfoS0ud8\nw9n9h/GSHG9HOeP0olUXxx+P6d2avgOi0EfiYUCAqqPMXZx2ZIuiGJg5+Ttv\nuQfm4hXsXb+vyOnnaflFen0NYk6L/T1pJvHsEw61ZRVgGsvfQpH2OVhWuWfT\nkJcjekUKob3rXgoZWE9Z9Yh8+2F0D8DDp5DcWDhZZumfZ2uf5VU0w5kw2yi2\nKR0C6WoKpC8pP1bpjArUplk1Y2r/ncYx8NlaIdkaDRSD3s/awyRQx6AwIzbS\nfLVH8R9ORatsly5VNfux643ib/xmv9HQppcZ1eB+0Y48BZXeG7DK7Wp9VqI8\npJA//v0C0G7eG1+bBFroHj3N99uyw1mc7PYOislJQDAWeZ2IULa09DyS2Jof\nA0kA+OoCP4W+ngN4VVKm531LHRaJkZrJWXI4wBowWs0rh6NMdvkLePS+2Azr\nmXwe\r\n=uy21\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6cd422dd6786537222ffae0628cf50c06b641208","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.3.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.5.0_1548801241221_0.7456353185446869","host":"s3://npm-registry-packages"}},"1.5.1":{"name":"hermione","version":"1.5.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.5.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"df86329064d7b3bee8fa67cd4355dbd64b4ca28a","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.5.1.tgz","fileCount":88,"integrity":"sha512-TPsNgxV8TZdfubS3xec881nMSDpVl/11ZpQasqjmGVgEn5mLShkgxwc+4xYSPLN+2Sn3UE0N1suJ4wHE/ohylg==","signatures":[{"sig":"MEUCIF2SHc7xrfEMrG15cWrA0uJQYUThsiPXKNMq1G7W3vEpAiEA2G1oZV5LmdY3qj0WXX/sObq9Dy8mmU/sBFZ6I3LsIRA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":208063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcVBdKCRA9TVsSAnZWagAAN4AP/2nePZ21HYUC9/eSXu4h\n/N9f1fR7Np1+2O+ZiPjM05rVdhWMXa/tCAu21zIVi1SoY683wzTHyk85/6F6\n06dozkdDBEgLgsvxlteOvRDG62sO/6YSBbCDE6SRBx/T3e+To/0GLsrOWQkL\nlVnw5lQMafpWCsJzpK03mVlIPbCz2hgIClHh4rlhGQ7vOH/KytEBbgbDlx+q\n6AcciPt+7sp+wIcr/a1ChfpnpnMkqlCA+tbTUiWyzOHPKoGUS3s16vI9waCk\nLPX3NaqvoNplPozuZTMk2jJX7IyHG8n8qK7MqraEq7wKkgoSLjvnUJwfz6Us\nNM+6MluRWwxZEXeW1AE0rPcpoiyk5qaqGeKJ6FzYAji2yBXufjXbpdHr87jE\n5X7vokY6g15OO4/unoKiwOhAsGjS+hIg1F3BgPNiILTJkAuTERvUlLZWZWUb\n/vfvNGufxER6Nygcm7jtuxLhuHi68BeHOlkOLzpr8N4237abdVjvOvULwIe3\nShDgJxQKAov+aloKF4Xb9RKP2fIcKGgiv137Gj+cPJAoRUmBILo0blIRmjha\nDegd+e4XApJQ1RqtOgG8O8opjQ/VPc7y5c+UpyVgc4zQkTeayZMetAMwH68O\nExIRvck8z6gy8wrAfXojaDJ3/3MVfzFwne+p2jrCKSAd1UqdTob8FMYtDY3b\n7e1t\r\n=o0Sk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"077309c934c6785d43747d4e0974f71b8bb3eb58","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.3.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.5.1_1549014856898_0.40597473199064904","host":"s3://npm-registry-packages"}},"1.6.0":{"name":"hermione","version":"1.6.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.6.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"bc9ea8f6f90bf178a08e0d28511024b0951ceff9","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.6.0.tgz","fileCount":88,"integrity":"sha512-xRPmC4/lNTgf0PDbyTtxRoxeJJL+4d0o2jWaAZwJ+14UkU4xCt+KaswfhYZ1/RAMgB95qqTE57/SATQU/Oh2NA==","signatures":[{"sig":"MEUCIFb63nGYqZYr+2qN4eNF9AkqJ+scDdlGhcOigezQ1sCGAiEAnNybdzeyLYE7G3T6zCuBWnwWEQZSkkB44F+v/6wzyJA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":208649,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWdruCRA9TVsSAnZWagAAsUAP/1tNAlSaXRCD8WeN+DYg\nfttRi58sjuprxuOBp08uPgM39/b0PYDxYkkRa8ni3rZuK8TgiMPaC3mnNjZS\n61l57YoqJEu9RlM//Bc+w90uJQ27bLcHvduoDeM4I+oTLChPRHBdJFBI4zk0\ndAMFHBswoZlIanmrhV14SzqaxA+EzbYoDZSs8oXWcQSHDLZQgdZP6epBt49Y\nsWDiAN2YwZZ9OWEo+1aKL8JkaqrmdBQPsGr3Is96zrB5+13uBqlkBQe3b7Os\n1ylkGU3p4Dkbc1jaoYnSilpIgqD4jmMTaQpVqGHbHRSZcAyXVOzGlU6FsMjM\nw2w5ilUM91XM1JY27QFyHhI4UZOOYr82EzmMPOaf/J+JEoM1mmViTvCxw6qJ\nZVaHWrl9QQEchUxjL9NuRZdqiXwaKv+HdlSuEumq2UPyL2IDzCU3DO1V9nP5\ni/kP5Wl9kK5uvdyP2u0cdrJeNzZrtE6LaLgM9NvunFlSxbcMPVaMhnh5hBHQ\nWxd2VS94S10d2MOGJV6J8AHyW+ULBhB5O0xWa/nv0We7Zq3htGsRvUgetV+I\ncju0965+khApryYuH+3iH2uoYISS07j5RRag+rG0EWGtT38HyoyIWU/XdW2S\nocbU84X4DvF03ZS1nBJRgyTYDsoEAWmt28bUaOFWlfPLoMlTOfiPGdBfYwDY\nuAjF\r\n=fJNN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"9edd9dd42ac208f40f1b0085c2da8d2bea1842b4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.3.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.6.0_1549392621953_0.35645035981535633","host":"s3://npm-registry-packages"}},"1.6.1":{"name":"hermione","version":"1.6.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.6.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"407848d879ab11ba57abffeffe64be7a45d2ea70","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.6.1.tgz","fileCount":88,"integrity":"sha512-Bsf9sf/iyJ/dbZunvvKMJus5BZa4n9c2RN5S+4KE2AJL9kfYWqu0sKa0jxmG+8RpaZkYTc2rdM3zWKej/fjCHA==","signatures":[{"sig":"MEUCIQCS8PsTQzdV7nzhWTrQfCgE6pob8q1bEeHaU+9E8JrqrQIgeH8ggWaeKMjeVAx9nXKta4v5N97vWZkGJDMCLNtU1wQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":208927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWguTCRA9TVsSAnZWagAAIOUP/1O0JvFKzKtDd/6snE1b\npts43F5jIq4nKGdyaluKo0h6is2j4m+ojEmWhw+g1nsgh9PU6yPaU5ES/HL+\nRpenqDiZYdRii5cQxyDNrYIKJFvPxjs+k0RseiObjhdGj58jQCX1FJ68R9AE\nmR3THd2jAka3+dpPwh47mLqaEkD/e6pQdMm2AOwlCTZ/alOtLAsTMUvTwlix\nULe3m4lnutnTiTuA/XuNbufCPNWF4t9GXgmcGFn4CCqSOAnSThIqz8NWLVm0\nzshLq1WI7rifdZgReVFsKRqJzK8JCPMk23QIJ/oaqgZmlikeJN3xWj1T5ojB\nw12gfvIwRqPwyKMvFICdDiU7hqJOU0v891BbkLqPiZRw//VlHwepd/6g2jbL\nd3JHkYUaDQrUKjj/kz8Ya9Rta23PBGzOkNVSYvhGlRfF94Ave4rWjkelHfqo\nFupFDxOyB4Mye6JbZ7Cq10msZotIuXze6C0+UrHtkjfTwXgl/qT6e2bC5oaQ\n8S/dlsiVcvLgTEgbNdXmAZOUuMsAxkaWLpyRh4lsFYd67tMTeyWwlrobT9Gq\n6+BuyheuHNN/RhbpvUhyVfEpvGXD/0RDbtaq0FPLFVBHQPeBsG8O/zb2Q8Mf\nGFRWOofRb9FIzG+saipVDm3pG6kLJO4aZXlOr4Kh0a5/QCY2t/7lhAFsvHvZ\nn8ML\r\n=eJi8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"d0994ed7d257a612a2ef2e28878d53d4d5872fa7","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.3.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.6.1_1549405074568_0.741297149910652","host":"s3://npm-registry-packages"}},"1.7.0":{"name":"hermione","version":"1.7.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.7.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"dffa9e612583431d756ff2f92df8e1b8dd2f183a","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.7.0.tgz","fileCount":88,"integrity":"sha512-v3ta8ZUNN16DdsNxiz3Mk8xZE7QcTWXSJmljrx6bxxXFo+J2A5CI5HkfimurFJZAAbDpqdfzDlApY3hfjQpF4w==","signatures":[{"sig":"MEQCIFX4lHJDuV0x88y4aRBkqGTrkzx5exttFpEI9iu8jD/aAiAgB5wL7QCnf+q9neqEZ1l1r+Jv0Y2xSQ/mOXFWphdjMg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcWvUWCRA9TVsSAnZWagAAOogQAJZPdY2MPU1jIOtD/kSE\nBXk/S+A+WKLAuxTwjVXMXWXqt4IPSmSYKmN2FAVP4WHpVzGIJrtv85dgH/77\nNxa5jc2ZoNpnlt+o5HBRYjEptC8X7CjBAIXyk0bYSTR2C2y8NWCnnREctqKj\nQTxwn0k06cax71j/DaTFq0cMmRPaqjrbexWsbhehP9WoiAdW9WWYiZNYKD/1\nBytGxYePtDGwDOf7eBTCgyLShVNoSGWapJbRKUxQW0x5f3WmyUNwO3kbK9MF\nWMjhF67aE4T7rwrmrqRmbHtBAmwfixphoaj8kRu444c/gsepxiDMPirYUiR+\nTOfI8uH3eef7Wddh0yLaLpohUA5IMrLwYwUlIfob91WfBj1YLQvHsB3nwPsW\nXBVFSUe7ZdGwr+S2ef8z1hzRsFKQKIjb4VL6rmfgRKKRiqUM2fbqVKxayL0M\nioWpt1NRDwdVWvgIA/BR/KAeedjHgeAjF7SZdiGdJjw9FoD+9Ey7atHZlCqZ\nPAWUy9zkd1esGL00EiHrIwLxLDMeAdpHB52sWqM4FZ6cTWVcvT1NhQuteqaO\njkzZTpLtvJs19DMR7IHSrrnR8kh4YywXrIn1tD6w9xATt3goN3bPmgLWXG30\nQjPJRA4HtkMTAYSKcebdYAP8w4rR6CKZOv+F9CKSyQHGIg5nfh+YweViBCAQ\nP5VD\r\n=v5WG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"35a43523844932361dc06683438397fb080ba34c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.7.0_1549464853823_0.2964412022029317","host":"s3://npm-registry-packages"}},"1.7.1":{"name":"hermione","version":"1.7.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.7.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"207a798222e1096e48bc2a2c2427c11765ff5b71","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.7.1.tgz","fileCount":88,"integrity":"sha512-qSHnUXajVs7bsY/a6w4GY0ZLcW4YWsajBYodSXwndTUT4ouD9W/FfNJ9FCFMPlV8mOvCt2f6QtIq0ks8aB+jVA==","signatures":[{"sig":"MEUCIQCzBWWPa9jBig74r3jUCOgwunb87POw9DaACwKxBHW3RAIgZOTBue2UQdYhkLPnloOGIREHwDBM3mepQU6mRSfuvvs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210531,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcXDxdCRA9TVsSAnZWagAAZB4P+gOBZZYGVMfEIOyqXSq9\ni9DtD6dXApMRka6SV+C9jM/zyX5iblpW+qLF/ipr0mbqKpACs8PCN4VYb2pO\nmks79kB9bx6pCmUKG9YgL3912islKPIZeptUi8OufVV9/u92mRjPEZzsuahM\nD3/kQR/qBV7I+0iNf0sxjKcJbJphDyYysQXUaIQx/oCoHZ/kg/5OFiKuZ+T/\nprBTg4BN1vPa8c6FfRnOa9As7EmAEdjEEF+NWTPOiNqOQKX9VmXFSvF+hF7R\nGiz0wBBPGLNE3BCBZCrDnXRYNTgQh03aa56aTrzae6QzRju2C6M368VfW5/x\nFBNXzsNooswA5KgxGFcTAQaE8bAbfRFFNpkVA0n9OBsl6JiNJs5YFGZccsxM\nxt919ti99Mnq8t+0SNHrbjOqR44CiQLk/wIDCOX/Tm0YMH4jjhvFqr0AdRuh\ngvN8T5qFagIp0Pb6EaI1i7c9tcO9/OxdncchT3/KQMLzih2Li+rGwdrnGqIF\n9lnFTmQjf7RA7cwTT9UGSh3vDVukSyRjuncBqPqxuocJGShnZ2atiyB9nzfc\nxfCT5xFoWpmzojBQwmuQ+zg6mo1HV3AJ5SU+Xmy7Q8lqszJHrTWktr6Bi1EK\nU4TXkeRSxd0i21k3DJt5GFamxkJIlZyTwkCkJ5PSu/iNbWc7y8aVwvFXeV8J\n44qP\r\n=vHcr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1d35cda6a063c4a55e5a0128394b76bb42e4e147","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.7.1_1549548636823_0.7205086661351194","host":"s3://npm-registry-packages"}},"1.7.2":{"name":"hermione","version":"1.7.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.7.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d66570cf23af9a7c1e34548c37305753b9d6e332","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.7.2.tgz","fileCount":88,"integrity":"sha512-bI+gQ2lHcNAM3m2lOX/sU0hUY+FNouPl8wZAswVxfHa1B77h7VBGpokMKZZZfAcJlj7IYwDnk33dp1ddyC5iQA==","signatures":[{"sig":"MEQCIHkWSMjSMzC7WCzDoSXZXCnVZ3t4KSxAD94JEaJF1EmdAiAOIBiZxF/+OmvIFhE4hsWzrkh8Gj5/D9RcCk5lZlD+wQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210901,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYrS2CRA9TVsSAnZWagAA9yMP/0HnWcwsrru+WAoksuCF\njheKUUVyygYn1Xsa3fzQPfxqxjNh9Bz3/yZ3cOoPl6nB4ZT6o3k9X1DIzsQb\nTy/gQgR1kAag4ksXN5yN78PcuVEx3kwsAD9qFtn2EfKkLFh5t1taGEv4GhV0\n9InukYyF+KZKd6G+eIdSss6r4CZ2/Bn33eZoa++M+jHjLGcyjEOCvwu4cRFu\nEb5ClLtcoPrsf8g7KLX72+Dz/FvBHzA1W9WDIhyw+Pp5G/PkorxxeTCCDIva\nj4H5/mqsVXR9Ir1A6T/+OkXofOU/f9ZPNi8Ipt/w/L1p7tXGUy5LD6X2rVPm\nqaSigA8pZZa0eweu4aWQTKX2znSpchG6gjZsGSWGvzDaC4BRE5Q6cBSpKQgg\n4E7DivF8M6q2E0cJTvW3LyJ6KSaLyFIEZqbUzqbQvQ5LPpAQyyw72IcC6WWn\npiPbwswjZ/5Fy7PqQP5tn/I4YpvnuZ+4NsKIY6xBhQnpuo/pSJ8mJOCcKmix\nu5TheNoQEpcGjFR3MTFyy3KK7ZtCdmIFfCmI22IitYeqThmWPVeWK6DdR579\nTXHhHnwQbZRzg7VKJlRNVLM+SJlu9U4xirKGPaRit7DzxZfGiW7ZOw19KPPl\nSKjCWWBHHH469MHH7MaXiQKYXsPDKvwLYthwe3OdS93njDVZDGhCOaO8Pzi1\nrkud\r\n=VTuI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1eb3ffd8610c0dfbf70e19749a5fc623778a0a5d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"catwithapple","email":"alexeybegunov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.5.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.7.2_1549972661839_0.24952832165073313","host":"s3://npm-registry-packages"}},"1.8.0":{"name":"hermione","version":"1.8.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.8.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5462a22b409a3ef9b2b565e82a42f08b57bf1960","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.8.0.tgz","fileCount":88,"integrity":"sha512-lyRBUvcjpkpJjjHsr6wCDUYpTKXHpnotF0+BjLyDdHIFh7RWPL3Y4zUSY6Mb2OoxGB9+XLkePsNWW/9/3qLI+w==","signatures":[{"sig":"MEUCIQC36mDJP4iEAZbU+alllBD4vJ3aza/qFwN2oJV8/cfNbAIgZ1kv8ewxny5lswPvYwa5gwAyN6ZAKz/kY6C81Pj9KaE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":212355,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcZtzGCRA9TVsSAnZWagAA9r4QAJHpAzSnEfLOoKrBMsb5\nM+mMv1c+GZNlj6quUVB7Au1IBigBV71cobWBbB5KrHvlaP00zhbowfiMQbKw\nft33S2NN2HkI8aD4sZcQbMZGYRJyk9PKIC3cXKHVDNaCNmMkdkE5AjDczKBN\naWXvhaLR/ioKwLZ0K7ltpa2ho5HYlYdDHYqZy/zrBxN1QJZjY6bZZt0p9yGa\nGy1EhYv5bbwoH+jTrgrSw9ud6u9h/zwOA7JbFruyfHFeXJH474iNlKwTjm7p\nuuxk+c+9peDI+f5r2nTMz2g6yBtKmkfVHW07lUrLIaEaUQWmNL5LPt6j4cAP\nTk0ny16MBb+EpPLif8OMl202S5+z/LclbH7TTEucFSX1/IY0CPy+hNCK4yQp\nBgjtN7NodhLRsBkwANqZUvA2O9I1eT/q1RQfreVSUrXO4D0lyMZ1EqKRzJEo\nxvN/FYGNHR/BjJcOnDraNV19BpuCzEDV8KKDfA5FCQoyfvnKdHISA4u7ySBB\nkP/IDUMx79jSJe/I3ROSsCttB1RKszeFD6lL1cZ/8m1QuFSeT0d9rAfJFv91\nGCSfpJwIvGt+cqvLem/VGyDTc4R9GsuvSpGUv8y+TQXyLLVKxXpk+8iUcMs3\n7ATuw9QyRzG2Ss09VvF0iEedhwGwnF1xAm7pguF9LyX9nFRKaYgiSjySnwhP\nHTdS\r\n=ntIV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"764750463db1c030e6eee491e592e9ac1d7576aa","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"catwithapple","email":"alexeybegunov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.5.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.8.0_1550245061931_0.705248517684185","host":"s3://npm-registry-packages"}},"1.9.0":{"name":"hermione","version":"1.9.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.9.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8eceeacbde41f99cf1c2f18cece8f301cd71ad46","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.9.0.tgz","fileCount":88,"integrity":"sha512-lFLYKAb94+HIO92YOPXrteobreBY1XWUHf61nGzZi0LooGnOCrHvvY+2qgqtAEdLoChzVjxE5toTjKdgOmWwiw==","signatures":[{"sig":"MEYCIQD6IdhlpO66DiGVAHmhZ1u4mqR3Ow9KbLqCJG3i0a6xgQIhALOgwlxujp+blaxfjtiXO5ubGeP760nWu9+9Mvh1b5LF","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":212589,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcbAe9CRA9TVsSAnZWagAArC0QAKFz7lbG0rx9wW5yxBT5\nLrI4Et2/nsznmTLfEw0mhkh4FsZbDJjWtz84eS2Jzib2PRpifiiR3JU+5IoL\nsMZFvTwt0dypQ0vny3ry+8iFUhypxtknUWnRkDJ+qpClOXbIJvXJsLLHJxWH\nvwqa+yLNy4DUuzSwLt1WyggKQGGy8P71h+X/OvkSFqATqEq991J0d+WKSX6C\nhp+rSHmdfkS3ae/W1s6kEAGEj3ARxdC2HwXT4qwkFwbeVE3KZGroXuG8Ktdp\nKRMJNUCS0WVFmCnOriMxzN3EJpm/bfXBaBCrTnqSCvXT6MPpaDGWVxrVYP+t\nWLD3zibv7AYZZqmuMSQM0Ai+2lwYTHK39uvbtrEVvdZirmND8XG3jRa89oj4\nJh5N8wJ8yKXFp5Xat8nLrf5PtZYqh0HY8p4mPhlfK5KoPbI5iW4unZz9bOz7\ngxLADAT9ZSBuOarPj3JQMRqRHqwQy09x2cExYaghxX3Ayri4oL2UbWL0u02v\n0XLjX7vouc2la2S2z7jdCC9cN/MKsfdph9fUSvSYdpqR4bqb1D+XjUMtEFX3\nA8SsnaMhv0EskS2ZgcCjSwb+8jiaAl9BOo9qMF589S+War5HvO3NPGTfzx4L\nQwBlzYL2EoY2V/g1UWxl8NYPhmjvbimNyXrM/aVkbf530zToLl25Mmzo0JqU\ngphi\r\n=sQi2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"ffdd30f7f36bc467ac1df5e950e02866b42d9955","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.9.0_1550583740585_0.6581704636224726","host":"s3://npm-registry-packages"}},"1.10.0":{"name":"hermione","version":"1.10.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@1.10.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"54c554c503f3e82ed8bab3f938456763b8a90cdd","tarball":"https://registry.npmjs.org/hermione/-/hermione-1.10.0.tgz","fileCount":88,"integrity":"sha512-hY5jxl5+lF8lqvZWY2k5X/cnsMWZIJdWEkTEpVDi3YBt5e5r5m+94l6zS3oeP/NJGLmR/9Jcy/a8Pu95optX9g==","signatures":[{"sig":"MEQCIGt0jF1LSPeo9A1R+ADciuYYPiuPCWKxIb5gnTszQFfgAiAizJ1sxiRasjUWNw35JgcsHVgjWOuC4fNG/NbnVmsW1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":213275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcc+YjCRA9TVsSAnZWagAA66EP/jK4U6E1rth2CHxQMNvY\neR+tCvh8cQ8J0cpG8DCCj75ODpBtBSqcvdTr/pJAmks5upKHErPCnQkiCQkZ\nAKQbUV/jEDyWNyqN/5Tg+0G+6d6WoTk/XRDhAUZQbM9r5XiUvKpS0i8aY+dH\nwrEnJAa6s9hCyWxOklJx8yndaxlkZ+emmtmvthRGpCADk/r2MvIXL9kae2hr\nR/ON+LRHQNkTyS6bVOla4m8Z2LoReiGjb9Bg3/GD/gdtszG/BfEamngx0ETQ\nyoGKkrFmZ4Ir6OXAz0+9uLyFxIPX4E68gVUC5IYyi63Dl9nxRXzgEJw+m/ZP\nQYVMX5Xr/yu645QZA+pAQvQdMaSh0kkCkVOdh2iHk4YAp9d4zKp+fPpr3cdP\n1yAxKx3iYk1daIvRxuzlUV5pmtyDW9R6znszUhNjoJFCOHYr2qLB3FgIkegy\n1eUYjtP7EtJBCij2Zs8bKsb+ZAsgBRZAMO0N4uTfxartbm+s9Cjw0wQF8WqB\nCBGoxtGDRc9ShCs+Hid538U6Q5O46MIfUQqfMKgAZz1hYtFS0wvI58tr1Rdg\nzcqGlfVp0Kl7s1FvtmkVc/zfv5nfnd39Xe89m9umzx+QgBD9EyL37TDSTXcw\nuEUPQIUbBs5Na5J/Oz8RSUmfPZV7BwGiihE8nQvPnuz0QFINmqvxzapyz7FP\nUxSd\r\n=wplK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"97ba7d3dcc6fc4229fb28ace9c90bd34c00fccee","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_1.10.0_1551099426429_0.8272371657782445","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"hermione","version":"2.0.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.0.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"39d4bd38615336ec75a666daee2ed50345ac4407","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.0.0.tgz","fileCount":88,"integrity":"sha512-x4nFofdK0QA9ICBDlnW+uvf/l/jjBgArSQTuh9dCrL+sd4CzpPqxyNdIexiVPNfscWx0Yf3U2ff/6baQIKZdrQ==","signatures":[{"sig":"MEUCIQCvLwUqXbizXA2rQvrneoeSOKgQutJwAexDXjyx3ub7JAIgUHoDVne6rrDyhYEqRlgdq9e07AncEyFf+Y+Ya+1g65k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214239,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdu7TCRA9TVsSAnZWagAArqMQAIG6231/Qie2PaIm+7IC\nqtlpkz5S6bZXsSEkk+AKzGGgaTLikW2pGQzuNVj4TCJBpcblJU+aNbhkedET\nqoxdaR0SaKW3YT02hUQ3xExSF2stXNqgingH6efAb1RlK4ArYrLzEpnavIea\naddQiQKmKQzcL6+vDY93krZ2hsZH96z3cG9vX5fck8MDlofgYFpjlRp4snhe\nu3UyJFLd+Mh7EkT7Zx1a5E/D5wwLFg9gXoUKxyIuDdapdz9vxyMQS51VKrJN\nEKzIJUUlCETihGOayAKbuuqQIe3Pr4bp7UkKwzP1HfkbEQOY2x47FvE/X1+0\nNN+mcn8zGAb5agFQwY9vZPfNNfthZa1RdQJa7D92quL9AeH2Js6fxdjNHysr\no4CvbuI6OpJhK7E8ZAliE6n65Vf9guDQY3dIry48vr+7BschJ88MioQ51trD\nCohLLHnsKr7f9S8HVARM8Ehx/jRBM7uHzWOt5mxgiZmwx2XNtK1lwkZ/92Jq\nbpCe0+Vae4lmxbsjU3/BeeVMZLg0Thef3HioTz37AhyrvExYYkrbp1q/BLpU\nI73NUToGf7ahmN8HIP49VlxJGMtU0VsNzw9AX2yW/+2l2KCzJubxbECBb+MR\nkdVtxPQukqwl1kodaocmtcdhBGANd1vUesnkxEE3aeHQQpH4qPUB8TIZt542\nJZmd\r\n=9/74\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"88aed9aa997921bb256f1361aab95688554f5cda","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.0.0_1551298257853_0.18980165564887663","host":"s3://npm-registry-packages"}},"2.1.0-alpha.0":{"name":"hermione","version":"2.1.0-alpha.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.1.0-alpha.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"240ee2703d8ff7a19bfef656de960905d3492484","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.1.0-alpha.0.tgz","fileCount":88,"integrity":"sha512-Av6ZRDx3HbJbTHVd0Or87YsEopDZs7B+tkh7m3FUvj70UN1DNti8Z67/aNIa10Csvf8xEw3oC2AR8ZJr51wSew==","signatures":[{"sig":"MEQCIEUC6rAroAYymeXt/Fh+vO/Xm41FDx2EMQUsDJtRjYvjAiBhhZKLqmcpgxGGwZR25nyaQIO/YmyCT/v1O8p2g+wkiQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJch5wLCRA9TVsSAnZWagAAwAsQAJYWXl6eslLk+DYU1gAV\nA2ZtSw439ktCf946KHwnOcncH0GCPNj327nUrwiLmz1L3Nxf5ZTfqCWLa0uB\n2C3f/Frp37cDUg6Umkv6orNlHu1FBBv9oJIfAorA5+5WyI6sBySp3uFmzAXM\nfPcdg2S5ZetCAp/R87RyX3I6VFQ/RP4BHMXoD0+c4dF/7iu9T38L6oIne8PO\nXt9RkLbQLB1Px51UcFimwyMYI2P3Hs2uN+NfRGg5GyU3N+HmgXP4AUCBBEbT\nCXdO11wZFXp1auX25x5sryT17iiJBY07tZFbdHXXMzvAL+IbeTgOp29xlwFg\nRhZ5Jb4ZrtCq2Gcn9Uv/8FwQjs5uufBI/eTo++EpeP0hnQL1XNSY0EXFtmBI\ngLCFaSw+iJPZj0Er0pVCj8FdELJZwnfCGFB35+6ivC85QWM37mpdbuUUc0JZ\n+pMG2yZwgvFo9L3FpSat8yQTP4oib6alkC/mJzwiQEAnj7Jf1Md8q9PPK40s\nnRKRHnCS3b/w5O0sFeN7t6topPAzfN7vz6ul56RYZ7Hr6sc0z9FbQYFhQCvQ\nuR6I3V+S7naOHgzcXLflLsAFZVUMNGU9hd0EFHt7Czt/t9MdN7xDbnBNf0Gt\nkLDKSY3DZaVbPPeXujFr8MqlAEAj5yRgJjR4Gzx5qfjjnN+j9USJkjdypD5K\nS4pc\r\n=J1pg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"d7778f4f28f7a83d189b0bea4aa71769e5a7ca41","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.4.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.1.0-alpha.0_1552391178244_0.9114728437600961","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"hermione","version":"2.1.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.1.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"9152c6c503f90a4dfd94d12c1be2bb64303051f7","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.1.0.tgz","fileCount":88,"integrity":"sha512-mEkatgSv16fPIfqbBwSThzrc8ZzfkMqIoNUqa0mpw5aH1eF71dP3RLKSRc6h6JmY4TCaE/NDyowNmvBTEzExbA==","signatures":[{"sig":"MEUCIB3UiDOFW3DrNi8GYbDsCCBkt4o3dwSLqnCxAG0BxkDYAiEAhQ9jmWjG30XeINlBCN0NZxMdHX+1U/mBMZSwGWQASAs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214723,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciSzCCRA9TVsSAnZWagAAMhYP/3INWSz5kuIDJLhimEXT\nU9C8MpDojvxXwYZGYFeoJuXpfioCUkYi0ilfBpGxhqagGOw30IwBzIZgjdjT\nPxKNTyOBo+0lT62t9yv4bB+GGkLKoMUqouS3P5+OnrStyCCyq+cdbs/FZd73\nCYtX70SG0C/smDbH7OL08C5ll4oLjI64tBjBD/AWtvjmqO0P9zBd1g5cdLZB\n1W9DaJELxnSVUWWR3+zplqgMUrXOt+hIbXdHP5rwJpCd2sFSsLXlrrjq2xRQ\ndetf/8+/YVdMDMxQQYEg+oumOd5U6feaCcoS+7DxcIMW0r52Pufyr70H537o\nvAkXFCjNU4iag5lrFHoUKtABTAgtYcKAJwvZ59DfREh/ORuj4Fb7nI2sg6+6\nlSa+TMTciDKAPBcq/BzDrl9wsbmzufQ5bC7QajdiB3rGj/SZCp3811EBFXw5\nxktckINBF6agTc50xYdJ+aPlsrORjt6YCEllCWbGdKKTr8fx95zIfnUL2GUC\nYtEdrIA2atzdslfyB1FAVHJw6xw0vc53buug9W5Z+OIxrEDTSpkmjdyPmdcc\nVnY370HDZ1Th4/D7u9WJYPSTFoXQnYsCgLiHaf8h4+gYgLSztlVZAaQvGdPL\nNqaOarNK8uYey7aiEt7E6X/d5hyR05CMvzrfkmSKKAhzEWmszSKdXRDDUDjH\nwKBL\r\n=BN3Y\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1b513405b682936584b101218bb48db752c0f345","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.5.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.1.0_1552493761034_0.6788868768387439","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"hermione","version":"2.2.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.2.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"89e24e20d883a5efe5bcf9d42094b0c6a60c87ac","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.2.0.tgz","fileCount":88,"integrity":"sha512-0ADVwwAOXpIlklSm9ekGA+mPOVw0v3EgGe5Ekf7JPgGlH2Bi17rbEUOaoDqQURyR7Oj3L+HHegnyWkFmNbaEQg==","signatures":[{"sig":"MEUCIQDyKLgVyj4eASc8RuTdWOR8lj2/h5QE1PhYR3+2ocvmZwIgAwX2Dga9seU6x0CXw1j107j1r77flRgaXSrqVPlQao0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":215315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJci9tBCRA9TVsSAnZWagAAiHwP/jfbWo7qy60DJ1ZWGAyG\nElowk0sQ3uoimDKePnNT/lKaqo8k5WeO929XTptJ0AApZoapTN5BZZ+bOJeH\nl510AKCH+bG1o/AZKWXJ/b6tqNIgoB65c+VJVpz/4KtqqIuGCXu9R2hSwVCA\nDdhDNGHU1DqTKgwzQSlXXOScOIalLovPs5j7oXyjpML5hM7+pQ6JmHeicVsc\nYvyHKahZ0c6yZzRIOLoXPJ3uCMk1XbEhKGDOqIq1B0VtqovRjDL+KFfOL7Hz\nXZLzYnal/NBXSHukGXKWbn3q1JGu3rcmslF/RjFYC7Qktj3qiDNDmqxQRH67\neM2Ge0reKDN0Y0StQu/8QizQi44gn3XbucDuWi6P2WzzRoimTvXIpDJpyW/9\n/NcXzlzs0gCO4/9IEdW71hItBi2HwRULClZu9WemiMAg4+6Va9HlnUXJtXBm\n+2uKrn35INQL3X0htE67goso+QrXZihtfcYyRjMwqVStA/Lx9R9iyJbsLHWM\ntV4L5mTCG60HEK5VvgY7ipEX8VXcM2PWQIXrWrppZF08LF6tJvCo5AMD3UZu\nEOR6hAAkyX1/lvmfj7eVwWKDQRh94ZONSsyKgZnXYaDzVpY60x/YG98FqGsA\nz1APIKXdL7U3b/8jDR5JpVYclGfgtCGZYNn5AKBVFxNMED3dAbTJiWc4MlhX\nlKpd\r\n=GB1E\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6d6d5486d0543b4c63e8f255d56bff4b5695eccd","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"flack","email":"alexrybakov@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.6.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.2.0_1552669504755_0.14228860909455654","host":"s3://npm-registry-packages"}},"2.2.1":{"name":"hermione","version":"2.2.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.2.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"9322be8ece40dc43ea3b0fdc0f4b162188e37636","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.2.1.tgz","fileCount":88,"integrity":"sha512-lhbuV4wgFy96YlQPEcuxtzDZhYvR9h8s//oyukflQ+XAP0zZNTqI36ayjfzT/zjPKFJxH0AHEb5Qos4BBQxUXQ==","signatures":[{"sig":"MEUCIEGyrrS/0EeD8ENnW3O/vRJWoc7bAqjUGGhY2maeTE2AAiEA9se4ZNpvyn2d0gfx2NT/sfr7pOa21O3AmeXLMSUBZ6g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":215549,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckjjACRA9TVsSAnZWagAATPEP/iTEl/st0Fej4lk7Url6\nO5D/g+33IhJdL68GzKWaeByTGi5Y/LqSH/ORGYGNLAqBCKZDfhmmbysKxGZF\nlkgbLRV2jpHcCbsXFUYFJxJAzcEoeOorPlGMc1usm7CHy24pjyMzvLtvYqUy\nsybcT0dQwhLP0siXhri229iuLLsZ2IMcfemokP4CaSk2CQ5oGYt1hwliP2YI\nh8GGebpd/JkPtLcI0LRw9xWJ+Ml+LY5JnybokC++4TmIKI6Dub42qx8NuVUF\nx6eEMIod3XRbF9NBrzqCXj1oh2vrCuQmvt1/vHSNTyB4ihSNMubmEANZrQBv\ngG+eLOLKvc2m546ozID3wnxbmXwV+SygB4A8Xbas1tCXw+der+GC/Se+ui2J\nCTzteJ6B0hYiXTnwvbeP9C2d+XuxwBXDUV9MdcXNlwh61+syAY/bb/n/bb5P\nVVL/YFTuoRxC3jf0e/ekAR9+c47SfEwM3nhKip9sFf7wXvv2033EjpGT1frT\nlkDgZSWyABs/6BrRPW6/DCsMp0qh+KLTTshRGAcEPBkfmDsY4SAXAYP9qZRl\n0N7wCZVWyMBcbaXEks9k4tYMLv6houkTziTSyNG2m8yqn8epNnePL8epacLx\nVBOnMDYNaNhA8EFYeWtyDU6PJ9RO82Lq98CYmmmdAuVnYiu0t70XzWIhykEa\nJOZ7\r\n=gzrV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"4f3efce23344a9b8e60c6ffad025f994e0afc659","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"catwithapple","email":"alexeybegunov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.5.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.6.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.2.1_1553086655106_0.5351756812175488","host":"s3://npm-registry-packages"}},"2.3.0":{"name":"hermione","version":"2.3.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.3.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"b1316718e0b938393817dd6d8cf81409b695d016","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.3.0.tgz","fileCount":89,"integrity":"sha512-7yrAhjXUoKQsTzF3DcpxWOkVjZaguwk5hR1F3GiE0ogtL0+q/X++IPaRQRtOrmtK0kYdLaf/v/V2KGKMXlEBhA==","signatures":[{"sig":"MEQCIAoT7+/73LEexa4geIQ4S8akUBFDTY0u4FzPCebfiGe7AiBa0paLOVHU7a2drk7BOzl0Rd1dfuYxm7prux9dpEeeIQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":217923,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcm5XtCRA9TVsSAnZWagAAxh0P/iIbIBVuVxaNLtTCGTxq\nDGwfwzIDrFDd2jaJv2Qs0KqrTaQ4qL2aiOboiwlvQNQ87qOuuUzIVhgKGv7r\nhwBQzzCuN5lWZYOqfrZWuvgkll4n7ysw7C/T9L+fFjnrdC3GaFEaarR2XipA\nPC46BuMFCms7KEqthgoA2QIOarrp5dCOre01MZvqbGVELTlqb34q25eiISKV\nlg61yNDLfuOHfNhNW48W4o6XfSqNWftVgw+Z8J2cxBKMe1sN2a85A2Q/p/vE\nnz/Ahk3ggLcobZO/3sw7tDctdbLrk2AF3nJEMP1rZVcsGhRD4TAgVVzEWnfk\nlFA+y+qgRyD+S3Lt/BDM8cviUTatncB6pW7KB8w3M/CmYad06vDRD9qi6Dea\nPQD6BeD/zW5UGS7B+v2prPlF+NEPkLXAuTiAL1zNUt+P1NqbT9juBDasknir\nLHqxVTc7RT1dI7Laovv45lx+3ba4jB3vWf71DRbnCSCIS22xiEsM25NK3L+d\nwCR3f5GCHl6LX/lXcLpiqcisCpwPGYMpeiTSRVxxUsqNVahX6Z2NLDSHU5dj\nebH/8S1tfrVAUrWJovmxtXXdIgcBisPOgCZvqx50cmkE+euPrruvEjUh1GDN\nweUonWFFiFFTpOsjTYHhH5IYd84ADRsjrb7IW1xMZ7shGTyBf2uoi2eaBzAJ\n0Wco\r\n=xdjH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"29c31f6468101a14f6175d28593836dcad147fd0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"istanbul test _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.6.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","istanbul":"^0.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.3.0_1553700330866_0.47567881013999425","host":"s3://npm-registry-packages"}},"2.3.1":{"name":"hermione","version":"2.3.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.3.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"a92171d8da06490d5a5c35602cdb98ed58cbbd1e","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.3.1.tgz","fileCount":97,"integrity":"sha512-gEecX0Lgpr995fTDYCsqFis8/+TaRPF9IiRPbd1pOHD3Eqa9XKsSAiafGIcqEkSoz+RTmScSmzaRfleVUkFb3Q==","signatures":[{"sig":"MEQCICHN5MaTuc3eikyGtW3x8wdBff+FQL0d1Tv2mL6+SE8aAiBsJuWWU0MZ2PHm/J9/DmJIdjT8OChpiWwsRM86Na9VqA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":246582,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpKPcCRA9TVsSAnZWagAA85sP/iZBbYcUyC9K4mCfKaKQ\nw2rBDoqGGq1EGmS2q8FGEBRViL3KqlgvlK/h/wDn4AsW0Bdsk1EeufR/05Z+\n6fLPaCoTBR9B4j2N5REcFjVPxMG1Li72218Ap3PxH07tXpjWuN7VdEwYxyL5\niltMgj1witd9HZtW0umDt13uldHA+AhFhlCAI4q4FKMfWlAXvyAIF4iKf5Af\nL+ctdW29G67VrJfg6KbU5SP/9MCXGCWjKJ36SoP+enm5z6p2ydwmEWbehdSx\nXxE31gJw3Eg8RWG+w1S2wWAjlKT//Tg/SxWFVjqqRZCANrkfE3BnKQu5vbv8\ng95fBZ7+E6xnK948aQnufM5mFMB5Hp/1LtT9/f1b2it68BsB5NcXhRJPh27K\n1kKxATUJocEd9TlxdYYSyoRA0xp9IUYARFMwjUkVfXfqz+mBwEYZsuxqvoJR\nb7SyYt35AmUyXJlZmTY6oq27CWOPhZjQkOeMtcOHxCOp41zF+tRcmwxCeaxk\n0NMRfxoTd/31RxoLtdj35eT6yqCL/bXze08nqiZJQSz1liTw6zvNAu4rZZZq\nXMrMUZpDRbZbf02QwkDBqwf5S6jibOqUAb1EQreEr99tHO6rVpZ49uYB4/x+\nTggG+Mkdr1vObMBI8ucYtFbGer7r8ztjeQsEdlYKu46DneZkgdGAuSp62if/\n6Cm/\r\n=ZOLj\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"e1d8131b00c3d628d785c80d1eb8758d596a1b46","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kvmamich","email":"kvmamich@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.6.1","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.3.1_1554293723522_0.5521850059737319","host":"s3://npm-registry-packages"}},"2.4.0":{"name":"hermione","version":"2.4.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.4.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"c59c83740232b743d244ba2ef7b6363201fd178d","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.4.0.tgz","fileCount":88,"integrity":"sha512-mUgNBkYFQyFgk1hPyNfaGptckUn0O8nCGaocvNf+DlDyUu3/VKykpKOx2Q4ts7/sXwOZ1GiapZPBeh5O5WhVlw==","signatures":[{"sig":"MEUCIQDOOtGiFbXxv5lag0oZrpyoiekxiTJcAr+1uAFlvu7YXQIgASviXNkfepa9jLAZqoAB5g6Sj1BCBjQTHfGz6VHTKss=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":217837,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcphb9CRA9TVsSAnZWagAAgioQAInXa+O+52NvmGAwjyqN\nCDGhZmDGCSzwK6Zk6o7zObCGFx2uZ4JuNrBQox3swyTzHYYoSb3KrIukasnD\nNGthl8NAlEk/S8JuXFjrcuzPt6ecIZuy8gCKCNKFJO7UZMcwJDXScS0d8WHU\nTJNV7JBxSOoL+6X0L0J0YXGh21fQ3jhyZcWOQJF8bWg7Ohg+5SjNGAKMAdCC\nbAvSSpSw8A9rjeCmsQ8qx2lWVse0xDEFQupM10Ay1eCL1cPnvjMNJSdJsIra\nYTkHZyTJsmRsv0mZPP+GVu+mXs1oRMR32qymt+tExC0VVfJN7CnyMRFGVEgz\nAEVjdSPlbKglsLl/temkjwTGah9wW4nAMM9r2E29wy7OLqT1tm1+jhuQEUXa\nCw5MG5bW0yTUwqRUZJwO8YgFgkr+GcAvJaOK+3kNaq+hxwkdEqgjuC8l7Lbe\nsmHUvKBb4bxLsVkujzbNx0rSYA1knu5fBcEYRtAiCBbYUf9VSlFmSOmuUnjc\n8ezuvf3LIJwHfMoCSTUiV5/m4EeG1B+8l2KrZiqbD/wBP/ZHGXgh+3jIXjvr\n+vfNZfQWzTTOH5hvrHKVd2/C6dxHoYv4ihPCwLOyCPTQhcUiqp8lGnykLThy\nBmzqYMwP00yeCq80+0sIUd91v1MGrdZQ2+rJ9fGNcKaNLZVlwn35pmImkke9\nnM8h\r\n=h3yK\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0d0e65a4c7a2f4fc22051d64b278c25b3de9d405","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.4.0_1554388732316_0.8581509979957398","host":"s3://npm-registry-packages"}},"2.5.0":{"name":"hermione","version":"2.5.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.5.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"747115778d1c3ba89143778b16d1bc9887523f59","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.5.0.tgz","fileCount":89,"integrity":"sha512-6fWWRrvMaRPZCVcclJsiQ26mJrr4MeuysZpz6F3voTzuydRIJZE7qjE00PsShpXMagkCSkGcC6YWsodDlMTeCg==","signatures":[{"sig":"MEYCIQDLzr2wStIBy3zc8NiNzqEmIoPhX/zpBGzDvnV+OxRlUAIhAMdzlT9I6qVJhA6OVO3KiowAIJObObj+qPyxsIHl9aa4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":220102,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcuQ9/CRA9TVsSAnZWagAAWlMP/jvVWdk90OM3K700EN6q\nVkvaURfbJIKv8sXjH4rIdbcBVkixzcqQTEdVIGDS5gHCBQcEVfpymlhVHa+u\nZ9nKG7QIykFRFzMzY5w0SH+s4xUJZfk0fMPDWd2CcH0HXUMvB8Z1HzmX6H3/\nf9f+FXoFk4jhYRWPH46G91YvRXmhWvE245B3Q8kKD1j2ayqWtsp9W2NvqKv2\nJnGSfGo4alsHWYMxJc2QLg5Q1oCsBRhy8mNeSU4yqUyA76J4+W+PASD49531\n3WnNeOsXdocWus31vRGroRZXziuSlSvhXn3tAo3wPfyTIhHDuD/rSvpP3TIY\nzPB3iwo44uncni7lwt3pJxQKB7RIvL/Xd6f0Doikzdfc9OJ3T1B8nRVpb/iN\ni5xJPzsUPmRP9Q2Gxoq4CBGwlb3NzcugFw9b1ZGNfx5Pf77FVT901N0t8YfI\n0BUD9phXJo0/6EgXbRJe7ylngJ1ZHwM6bVK17Y0Fbz3833EfPJ23Lu/TxbcD\n5ULsxw1QgEOiJf517cHNAkFGZLfyfVDvy1awFp3J1ttZ5sQRbmL2YUkuzSZq\nYWmM9BbR6bbevtNVGjBvKcw+6vqY610vmenSv4EOMj9ErqavSKGa5KaObpo5\n+ZBsvhzAJ0rQw2jyfNUxqI6/ObETHa0fPUkLv4SybMVsy9dBfFklLPL7M7YN\n+ZhN\r\n=gRzu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6082aa5174ca0ed8fa5a78b2f04476f5512e01b7","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.9.11","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.5.0_1555631998259_0.17809886107500028","host":"s3://npm-registry-packages"}},"2.6.0":{"name":"hermione","version":"2.6.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.6.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2a765f23ed039d040757bde16a377d3880a387cb","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.6.0.tgz","fileCount":90,"integrity":"sha512-SYxlvY1pfCz3J4+cz2W8P6T2i2ML+suqpmYDRGkuD1i5v+bZ/kQhVyBRLrOE4D7e5Kj32bK6hEE34Ayy+kGTfw==","signatures":[{"sig":"MEUCIQCNeGonQyZYtXA8U5995zcrFVkJeVCZkpqzL4tOxIaUfgIgV+CwhRmjlOqXf+eVH6swWDdDYkQakf6rcJKiv5rfn4Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":244214,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyEkdCRA9TVsSAnZWagAAbaQP/1F5pwy9PXjryoAMzt7+\ngwUHsMMZD+hvtZb/xDiAB32+0cSDxNsS9TuLn/i1iai0A3CpwX/ypxeN+MNz\nW43xBB6EDM0H/rtdRxh+/IKZ6hHdVPpfrumj25xAC2QWWuiwQ6yBkmS6Wu5e\nfTVEJrfYB31ScZ3T5i3bi0U/D6TGSx0A7zvog13Ix5iGzxV9Ub8n5Xivo0tV\npP57cHBAkDl3vIyk2bGRn3D+9W9P9+I3VKc/F4x1BHGfAzM9nfl3Tgv4mhiL\nBkRn0H9s6yjdjkWZsGdgpRF74SvvvKmo4wM0XNuJ+gLUcSp9/9Zdgdq+h8Au\n7GbOXTIPxUCTxYBha9ju1Tx3E7UxiQWocQACddyU5d2edMgEn/+9OUME5/Vh\ner5TwjVlnhuph+e5FLRp/UQUNI77/8s57QhvabtzCaFh4CCHkWAurFExcwCC\nLvVK0dZZ0h1QbFRWRmeGzH0GjlxXjh+zQUBX8AAasvEP1BoVQGLvSsXwnUBE\nLj32CqUOwkqbXSwQA5Ih01c4e68ehJmZbj3Xkw0ldoMgZhhoLmQ8CmaWgkX1\ncZhFUcHoWcZ23Ni954qpGAouKCAL3RF9Xi5Ot7ZkXAK2sMjyg5ZPWnLsBRtk\n1w+TZNEZe6fDgYvAUaAjz8Q6GDQc3tddD3OLwtvn5u76XyqqdEVJPNt38R5J\n9fyw\r\n=lXcI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6debaae61e591f6b5791ddb8286f17c524559ec8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kvmamich","email":"kvmamich@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.6.0_1556629788087_0.7612152624051423","host":"s3://npm-registry-packages"}},"2.6.1":{"name":"hermione","version":"2.6.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.6.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3831983c0446dee850b6e7efbbd2f1da4cfe6fdf","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.6.1.tgz","fileCount":88,"integrity":"sha512-ybW6EI3vOcPL8vMyo1da3WRb+FvWgVaRY4ST5vzMsJyJNJNQ0Gh6NEzn9K7o1Ps1NILb4Q7tyfJTR/uLZSiTAQ==","signatures":[{"sig":"MEYCIQCmiIgVv0GFdq0S9buTVjakhE1aIV8lSoKC0GnHUDtttQIhAMWRod+RdrI7qI/qQuR9BO8gwTkXC290XyJzfzHzN1gn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":219288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0BN3CRA9TVsSAnZWagAAaj4P/2H78Crh1gnwR4vf+wlE\n9kUoloqAZuKy9M5jiA2uBDcrMTTKfISUqMQZe2QVBlnK3v1j97vJJLiWdS6z\nIsVoH7jQJVaxcnJv7r6Zyu8Q3Iu29HroqKmd0xq9vxdRhg62adhE+sVYVaKA\nvwUtb276aORwV5EEAaJ7dWSf1ltpdNdmS7fp5RC3veECuNu1rnxGeQY4J/vz\nPsyvq3Yp4Q5dy6Vix+3geA937u4PoCfWGG0w8VKjPSvMlddRzCd/W6OkbjSn\nCh4EDyphbvQkzcWZzEwTUrmofAFg0jJE4YaRbefVcwbnHxBOcY7084sg5K2d\nEg12BYoelEhKAalU+gVJty8NsoVRVzf+2plY0Mz3bI7MdLbPWUw6hpsqtI6s\nfinGi122OCU6AQqFmoLS90aeaZCJ3ots2k/l/4avWyTOwdyjvaYaXRVtAQU5\nmU+MKWkLNwU86qBD60ufjNjxNPqPo1x8jbTJJ1lctWa1/FXhox+g61lYr12P\n6KWBCYWN+ZHJf+tfIkNYmNgCuhvkeGmD2/bCKCXaB8SVB1N65US6gdfnIOFa\nK2zczXoXKPDCDmhMfyrpflQlYHqgS8QGBZFQImkICIVQYuYTzw5nY1d0tJQR\nXr3m0ZGzY+ZB20tWp1OHt/cBGPMf8E0pLE26syDhERg7WyVP22XbjKv+nuCh\nmaz5\r\n=uWpB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts a stats of tests execution.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport's bounds, this option disables such check and makes command to screenshot the visible part of the element\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5, allowViewportOverflow: true});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"b214467a4094d586d88d745f03d2897257be399e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.15.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0","@gemini-testing/worker-farm":"1.6.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.6.1_1557140342830_0.7165623351681325","host":"s3://npm-registry-packages"}},"2.7.0":{"name":"hermione","version":"2.7.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.7.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"50bddf1721c91a74a8a0a775e6d75d26c966fbd9","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.7.0.tgz","fileCount":89,"integrity":"sha512-Wze71d34WrhXY2W79ETaOWr476yXdIkwHIhmpVKZEZLuHcpRZNPC/sDnW2YyLJD+QkcdQBKPKUV3hakZonDK2Q==","signatures":[{"sig":"MEQCIBubEX4T3a3Q8AvwoG8oMvFGjiTu8eT1Kiu/3qTeA009AiBa9eBezPJxS8VEcOdhzKTt+OaCFzEiThqziuAJFnrj1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":221640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7DV6CRA9TVsSAnZWagAAsDgQAJh3gVBaiVF08Kekr7uj\ncql2Kyipe5ZvhaM76Q9lnACYOqiiN8JrZdSzbSHYRf3hx1y2hUyw0abZKoPV\nkt25jExme38fy+yl17PjDsMMvFXcdIJDcsaTBX1CffuAqkxBrylU0XpVrnVn\nF0DOIMrBh1K62t4UI1XppNEw0vak3bE5XQOTE8ZKRhs6l8I2lBhSmlNtX0mt\nxEbEUMrN1haT/bUKzaXRUn5A4+WS01EZHg8g3vkpwyL4v4ppy61jtdvsxtQW\nQh0zzVDCXup3O21Uc1xmG9DpbsUMOVJx/I6W8Q6Ea499uZ8QQVicPMAfxpsz\n75GmL1s8ebMlezLjf8Q3TIZXKseXrzNu8vHsNzyhZYrfgjG5UEwnjv9b57pr\ncKlVBU05U1eSEGNuXXbZ5DwQPpmbPtc8LHFfCXcHp5PZ0BK90ft4FMeDSTjl\nDWBHt9xn/N2NRQl7vYXICPbaUZjGR0lniUQP1P8OVDFGq3c6YMf0x4vx2z9Z\nBC/HMZOBHBchSawBdIIxd/CtzZY0ejYVIFmJeSfiQgf6XDFdl5XMpOqwuELJ\n+OiuRF03CImC2cb8poe5UWICXce8NUInuxhGsAsSIiQAHgzgzWS0fOPUmZjE\nogPnmTlSbS8OvkmebNhMrBsSxOmXZWeI7TOMLU1Q1Dm6UGC7ruopp8jmJaB7\nl68a\r\n=VwaX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"f9ebb57e6dc8f2cd7bfe6277aa6534e14d0951ab","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"catwithapple","email":"alexeybegunov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.5.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.7.0_1558984057241_0.867216060157205","host":"s3://npm-registry-packages"}},"2.7.1":{"name":"hermione","version":"2.7.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.7.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"8c0cb3185df6ab013e6cd86e60e39815c6f85784","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.7.1.tgz","fileCount":90,"integrity":"sha512-wRpy9c7I6mxE2I4YX/62xn1KEjpYntadgodIjH6NqBugNcggg9dwOYe7IGq66TM6gcuUWKCQBQtPA168bS4LSQ==","signatures":[{"sig":"MEQCIHsFBdigbv7kvNv1LDtM1mG15oKqyfjxUMfuK/wsZs46AiBSlycE42obnBqtBZ/6oQ1pbiZTwcUzfKAEajD3300mXQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":223409,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+OpnCRA9TVsSAnZWagAAGnQQAIVlBgVK9g/A7oyQuYdf\nl9UjyJmy2uaYFN4g9SPuP4H3nNcl0zF4v7K6u2ZX8KluapSNN5QPvqKX2MZD\nGxzaggLrMV9GMnzfWPu8/XxoANuZZqUTzfV28ACJXeK6uMq82TqmABX4F6k1\n9Na2xqe0ISTTQ8odw7F67Sy+OPNMozDmRO5bIsItBJDwS0g3H8rD8h6BB3+8\nMEooA2uv8yCJ8bPKrLcd75ncDehvyZsp71k++C5u7eRtQwB9ni/jwZDX3oNe\nOA2nbjPkX6r8ticnqttiv+NTVbnPGvQuQbl00MgfURAuUf7ScFQzZPxLsxPV\nFxMq7+/h6l6nhlPsteW8rnUSrlcmrLOHQhh891Wq6vw5S0VqcZ1X2jIuiSrw\nsDhRRYoaEHKVMt/HDxxfhDFzqfNmwT+F76QaLUuu1yMsvPoVuhpm2cinLgZd\nMDzl7RgPy6TPk5bHwY+xl7fvECXMXIY+MSn6T81A68fTURnthO1WCwVgCjsK\nAHfhB+yK78yPK71uvS9gKUKNmGvDt7ZUh9h989NYIRLSynts85liWh/7Uqv6\npXLtKGIuCdXOyw/kda+dosObuqt8P6SVUxi6dIGv58F5njfGAS1xxvJUq/s5\n9D/IBTEzGn5ONixcrPjsE0rMDERY87ixPseX6EMqEGmhg2jd/ETauJgcBq8T\nJ+DO\r\n=TfMm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"5ca49c1c6bfc9398499f666d961e2434ca61c4a6","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.7.1_1559816806289_0.5294805035790264","host":"s3://npm-registry-packages"}},"2.8.0":{"name":"hermione","version":"2.8.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.8.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"bb5eea7f0ed28890a218d19e80dea5dd30f7cd3d","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.8.0.tgz","fileCount":90,"integrity":"sha512-fR903TxqZRvGlnMuXKEodSZ+4OjKWUUMdG2R/vYqgPSjLBHXxUW9FDPDPvdG/aQbrMjLYOXqOlQyteggMHPCMg==","signatures":[{"sig":"MEQCIDpx6fkNTSP0w4JJCxX9J7xk2gY7z14QeRqTQFvVY1PIAiBvDqZExtFeqjbRbqpLi7QiwWT/XsGR/doFCbHGE2XY7g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":223212,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdE2/gCRA9TVsSAnZWagAA4BwP+QFE7cB/P272gUiXYFGS\nWbJXMr6iV2sD9wU48NsFqEJ+BI0AINqjeveRqX4oC1eMlg6bfjkJxUI+Ge2L\nymVfp0LRjwc7rjflQzJEdWrxZj8yTo8EAfAHCFVrNhB6xdBg5Xw2XU35LV6m\n7heZMmCXb3zRiIwmFKUGFr7asgxsp30+rejNfavqVzh38Pgsq5NBPgiCsL1U\n6IZrOMvgc1fvQSIIraVmfA1RyzCdbrJdSpum4rc4F4Wb7gZNNl4I7z0Z7OYD\n3E/G9wpn2rcLfPB6eegXrF83aeGNxar0ZMDk+m7AeOs/i5KYzGvKLpYkAykg\nCJvxqg099UhZ4zA+3GUH4UONBsyE7zV4wsMFJaWK0Kzb0DcqNXhlOWYmdu6U\nqd1GLryBbXXwY1cxUjZAnMdtXNKuIezLakUDHX1sWu134q1rC3pDcKcsOXX3\nb42zw7+RZ3Ld8dgsA8Um8Qc/zwmVqydfgTZvJ2rPd2U/LBKRhQa6MAz9Tctg\n0TFk9VsDDOIUtdbrkybPMAkpPSL2mb5p+NApPprta+sSwmb/3uP99oIGWVul\nQJGhrN1Ue9Dy9QcTjQfKpj4ItHA8aavd25okGpbcbpbiWjeqntICMsDYOdCf\nwoKQ760f04cr6sZO8yn/Z3e5bopnHgneOyeAPERJtgcfUZh3qMweiQHbiiQ+\nQZPu\r\n=78qO\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"f3aca5f19592ed0b83622ac14a068aed4759f32e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.8.0_1561554911623_0.06360449056966488","host":"s3://npm-registry-packages"}},"2.8.1":{"name":"hermione","version":"2.8.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.8.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3e81d48150a81f5208e7358f884eb5ca61b57442","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.8.1.tgz","fileCount":90,"integrity":"sha512-AEzAUWLT1j//0kQOfJ6wV0llJX3q7psvnPNNNUol45zE3sjeiQpeIU3yebttXtI+WOztDlJ0hDpvjnKdVsQWyg==","signatures":[{"sig":"MEUCIQDYhsbKNrhNsyfRKtOTupmQWEtTelf+yZm+yjS1EqKv6QIgJtZ6gTkkYuz8PTIb5fi9zPCfSQ8lh8JBu2jdQTzGWh4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":223808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFI5aCRA9TVsSAnZWagAABM8P/A81Z8S755GV7LXGcySk\nj4Nm2pyf3ridzY0wUy+5NpGJwazir3DC/u8pEG6AZS4btaua0XpzohI//lot\n4hY+qmIbrD+N0Xg2CG4FGDIQCWHMckT3venNMHjkOMXTlbEwVp2fBWNuLpqW\nuuyd2VpKL2pLF8flJ7LsTlsDl7xyy1/vg5QGqDvEF813PtyzMbER3VyZTADZ\ndcMHTFj4gwKA/865GAAeSBcWTxnzFhtTadqj88HFQLMo5bWP7Xa46jHAKNag\nL0Q39xEFtv+xltEeCzwIwTavw9Zf6yQJbmLcZcIlXBtdVz4o4SqFab42bpdC\ncS19RA6AkJc917BM++oewUBN9fu4MJoGSBXrEIIgFOqTEb/wMo45ZXTSgG0J\ncDnxu8PxkNmeEIw3xwSjoLo00DQAgHYwdZVuI94vwVgv2HQaw1ts7gmBQMQv\nd5rVgl3dJ5rm2KmDraiq6tC9tvJWeMgDzGMsrsiiSzDPM3pjqiBaORl0EAME\nWknBsSYyg58PwGE2QQPh1s62qoU5tqlANr4f5+sz8vqOWsJRTRCtS/1wP3rI\n8GZHthbA99DY0SdxMRIao+l16Rz/d89rAe/j3I5R4x3I8Eu8r3YxtB2tXrhK\nfvik5gr4pf/Nz/g7FloFObntSfzcC2JNjtnLd+LVKcujszwaGU1NYLrhrEAI\n5CNE\r\n=IftP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"bcb131f4599c6b82f817b64985a61d1e3730b0e6","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.3.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.8.1_1561628249663_0.668680506400779","host":"s3://npm-registry-packages"}},"2.9.0":{"name":"hermione","version":"2.9.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.9.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1a9da844fa0d2b87d96d0c08153bfbbcea54f6a0","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.9.0.tgz","fileCount":90,"integrity":"sha512-CgDOIreGAG1hAQM6B01Sot4BB23ltYPQ17fBf58n5sHiHFBWxNsxldss6WpgSF8B3PG1Pv4VDXI4e8IB4NLCiQ==","signatures":[{"sig":"MEUCIQDPJR64NqlCUkSQuyGSv38iwasOwqac3Ei7UlxJPiM9+AIgZ0Of+5Ge+VAA2ZqBb1pcWxH91NWCnbEbqA+/n3jHvV4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":224084,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIceyCRA9TVsSAnZWagAAYqkQAJMsH+m6u4w5gwDoJueb\nxTcgdN6VRttTvEZWYl/33BMWe0/+Y/CWD1ynIkJa54FH1ILENLJiT0+S4qcQ\n2y/aXwRibA/S/d1ds6u6lt/tUELRIOuDU3zTkoQVKlofzqIeVwCBYUJvVczH\neP89K50KpU1ZJQd1w4LLvGbKH+H4c9a+Hyy9FV0THh/Tczn8Ikid9Lx6o766\nfdNjvtkBm5hjzv2DBUejbj6aEtkcwUE0lJQ+P+wkvyjcuRnRRS54B2mOLZ84\nHcg0RaJOJky1oHsvBDJuFF9O0aNYdR3MHogudumT970c9Qmjd/N2FK56Xdc2\ne99g5lv0m6EZ2hmjISHfXS+FibEif3Oq+nyvv8qo0EUpvQ/q9E+YXy3deVm1\ndx6kmNAgYm4z2LxEcntaISQRzsJs5+ANGM8pm8Z0n30qK8rqaz8goEaYEbTK\nAUhsCj42hYcMR+0cw2bLCGy5uiAI7jpJTqi04aR4i3xUn99fLwnmWW+Ujfn0\nhxFPfi5A26ga2wJXqHP6H+OTrSO8JXBonxRJGnLbBqA2dvvEKwUCxSkbbd3G\nmizKhxqAsB+7MUR8foioe5bFHhuIJBOKxR+fFsZ4Yb8sSYevgIHSbpMvEdZi\nCLKCfAdNchqrMrN+FFgtp6u+Zsy0axUM8AYb1qG4on4xCp2TQrfdjEn/yNhF\n4bmc\r\n=fret\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n    - [parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ]\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n        \n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event; \n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport's bounds, this option disables such check and makes command to screenshot the visible part of the element\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5, allowViewportOverflow: true});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"370e3b86b73c87b9a8e2825c2ca396965412c5b9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.7.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.9.0_1562494897664_0.9212287430454962","host":"s3://npm-registry-packages"}},"2.10.0":{"name":"hermione","version":"2.10.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.10.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"53880fc63940e69c274013ecd418c4bd6f277a63","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.10.0.tgz","fileCount":90,"integrity":"sha512-Qdj3MPbD8p0g7wLfcjDn+R3NZ31Eln3EA5tjfznFbIy6XnV7i0qUL2+lVgwEkajeVBGefSHBFipYTa1Ygj7M/w==","signatures":[{"sig":"MEQCIEyTw6XSuZOCozDGU4JDQYOgOHvbSvBm8+VB7onY/Do/AiBecAFDaNq4hvCWWCmZ6/er+Wjnu++UxsJxXp6V7MWXuA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":224752,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJKBlCRA9TVsSAnZWagAAzKQP/3xkUu6t6rkKoXjTXQ3C\n9LJ+a5vKBwZG5t0Q2x/M79yeNsbuOyYnqHbw8OmEsfa7KbNbKp1dXMrFMUuV\n5nz9RrYdBFH3YmXWmq9aOWdaTU0ZLf+lkycKpT7GTHp1QLRFQnpjS3lNH/m8\nX4QyuJzMqFt4jEnQ9gjsIFVwEObeGV04w011YjDq0Ne79X8DdzRCvTNDSniS\nn9/CDZ1ZIjtcY3qh4tltWt7wf42H8TL5+RjyJROY7mDB7uYSuTS4KpxtLxbi\nY+HJ0O/gmuH2NghMO3hQAuO532a/7tnLhKtyehT5lc7LERjyx4wIcawbGp0i\n4zBYXnEaUV14TlPoE8i2Y9Epb3+PdOj/0KSqmCvs+odltV6/UGD26doqTAEE\nOPyl5Ao9mKq39arnMpZ4TrSWD8L44Q03HgsdOop6OxPNZftYU1En1KTROPjy\nZ7oEx9xBzyYriv+cFhXGsgWF0vjjmkak/YFNpxRkE//dLD9K+TDmVeMWWXox\nygb/Qg8ZwBEBqDYYdMMAomi6lUXMHe2iK8UyYaQL9hWq7JYKxRy8jcKRCz8O\nnxwhcmStv0rS92LuTh8krATd4LFFctdWksF/hnfpgW/WO3gQJSFvmycuAURD\nniLmLxbtIEtBo49lAVHPyZUpEK2emykX8yR14nyE9+ewUxU1xR/EUKRFyRBK\n9aIg\r\n=FBkY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"e0927f116947c5cc00de546d85c6b32d4ca5a78a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.10.0_1562681444284_0.12669113786198327","host":"s3://npm-registry-packages"}},"2.10.1":{"name":"hermione","version":"2.10.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.10.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"50c47cebda0ba121fc5cc513cf42f123a4a721f8","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.10.1.tgz","fileCount":90,"integrity":"sha512-ZoZ+8LHWiTQCnxCbQ85rBQLHm4EYzJ2FcWCcSWtQB4t0+IEXH0HzWrAtVAhjiy1mF4lypptrur4ljAI04Y8NBg==","signatures":[{"sig":"MEYCIQDMlRPgzN7Q1BIYy+kAGFCWlCtsMQRP50XjYX6j5t/DzgIhAKgDRhcVTVCW1upitdBzJ6EMx8khK559oeE182+KAE4c","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":225056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLQfYCRA9TVsSAnZWagAAcAoQAIfw4T0pn4o3M7QQmqM9\nWj///eGnV1KGyXn+4Km3u6SkbxY+SUKN/DAxrLGQWxtsCqB8LhYZHPpIhIk+\nI4JRHNA8uIVaszqpwBdve7hKnytcaNMM0vWoAp5BP12N4VUtdaEBGqfxcGXW\nID+VbANnuhetiyRbUS1OENzXM9W/o28quxL8TQj6Wi24RicFExgzB3QwfL6m\n+hc5sn4jhatuCUbB3uLBcVavSvhRxegGa3HPzVUyld4rQYexa2/TUlXgMASl\nyG9rA1lxs6nHH9VWh7/kEByA2O8+Io4LrsDXRAaA9POZlRCl12oAUIcvSPQg\nL/6yBVgXB94w4y1nJcJjdCWbWJL78jjs0eCYkuB58CY+ddCDuLWGNO6mU9hd\noHHAE3rosWCr5Zk8blx14kWF282Cy/V3B7Xv5JKHYlWW9nK9j1hg/9YjpE4+\nbIzEyw5ua3Nz2qigqU5GORymw/2jSvVo885wJTSAJ/gqWfIULM9Q9ItYrSrE\nPlVJamH/7jPaBIV10AAxQQ79TFktpaQZejSIxPWQP3GHDutTIrj+CYlCdkES\nMMhdt+edMbTGwVKKyPat9nCGQbzp2re+mU7RA7uq4m2vJspQ7u960jzLRGhC\nxxn4jWpVs2brtJaBcZ5hKB8YfmDiHoWM5Jhwk8pZjSB9YiShZkxh3q/IoU1v\no2Ei\r\n=z3Re\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"3861248dff40db89c37e731f300c9b9292a83c67","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kvmamich","email":"kvmamich@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.10.1_1563232214777_0.5529994322384948","host":"s3://npm-registry-packages"}},"2.11.0":{"name":"hermione","version":"2.11.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.11.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"26058da67f1f18aae388c91756767f8343d20cdd","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.11.0.tgz","fileCount":90,"integrity":"sha512-nSf2aBiWnrGv5GegYH3FwTQKo+uGyAHYdyTT93VTaP0PBRQD/pFT03qWE5mK9x8BIMYDujKV3xgDJ8eG7y2h+g==","signatures":[{"sig":"MEQCIFGQ3U8j6ZoMK6uPtm1eKITo/oLKrToo97PRNwuSsyUJAiBqJZneiqdnoFnjDQsDB7lpuGUwAiz7MKqtwlw1dzEqbQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":225751,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMIfbCRA9TVsSAnZWagAAVFMP/RZFtBi3SL8QPn2eJ7Zf\nTZPzadAGoXyNXZEVcD3U0jw0/jDD4yI+ef27QUFk6XVVroiuN2f3RapQi2np\n9jP0dBfYPXHFGxnzwwfAdP+ba7UuE0ZZNRJxWok7R+wD+KxFbKSyHX2C6OO4\ng1TXxc5XuCFTW4Q/UOR22EMEtZP7wHxdd/hYQaD7WWY8gRkYQcwAHdhQw/OM\nA2Quc0leYjvPHse9koe/j026COdpoMdMJwX+v+fU9Ciq326iD+QuS6cWNekf\nyyHl+NdK0BWrpJDCI2L/bzgwy7UXg0h/Ent2z+d+xwiIxYUgC2+LChs7EpYM\nsPE4hnwkLYx2rvJ433L1c/rQxjafR9x4yQx25fePnuhAFMh2SOXIiBi+RgzS\nZaUpOruhxZ8MWUofev8bYO2hMzmJGS9ked9aRxTefMMZZAHlk76w92X2SHFo\nrNr3+ZpZqvEsug29NbcTEFpjVslE2EX3ncZDWCAdP2Ca95FC2alZDShCUWS1\nSd8VyNFK5fsHAZ/k8Hhu6XGtDANq49bzGdqgejhrRCCfnFhiLc5N3DiM8om6\nLa6W7ROgXmc8vil7NBz1kPszardIWJMjpBaBebVoHrFP0V3UhdUceDoq+6H1\nMEbUskTTrFDWBBzoYJcCfrSfhQGKgYyMEkLkbIDgbKt1LuqtdqXR0+ITCxhN\nkyte\r\n=dmk8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n    - [parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport's bounds, this option disables such check and makes command to screenshot the visible part of the element\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5, allowViewportOverflow: true});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"9bb1422d21af523cd3f7e1d92d5c6b81d931d06f","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.11.0_1563461594045_0.05662622795728156","host":"s3://npm-registry-packages"}},"2.11.1":{"name":"hermione","version":"2.11.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.11.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ccc9beb34303040a7d25c3654705b3b9cd132948","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.11.1.tgz","fileCount":90,"integrity":"sha512-rZgdCuDhfT5z7byeS/JhpypVbbshZWW+drU1nkmw6qx8fLL2S24E/pLVtSGVo4yTKG9K8NHUWBLy9Z2j5nuvTQ==","signatures":[{"sig":"MEYCIQCpD6HRegunySRY1lkYETH7MD/6S7qaqKWpS98dDBSN3AIhAJLPpXK5vX1DnSxPeoR3eqaQoc4UkpkD0i7hK+HG/6z6","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":225751,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMJpQCRA9TVsSAnZWagAAOoAQAIv7Fr7YhaPg76C00mCS\noYMKW/6nUvBsIirUcUkFSRbhCllOwLZwAIIR0sCwpo8hhCfjYLrEkX12tst/\nGJLb7RHM/+IDZeJ68XPCk7/HHUI1t3oBp8EjW+OT9VnIRIKcZ/DHBjbN0Uuw\nOq2yCkz0lK+JLcVTWujFvA8Sudp9UcBWwuQxI7t+c0G6JBF9uBKFTa9sjfOn\nplTZb3PtGjRFsF2rvW1u/WSdbV8tBbBGzYxE19uvTYIFNLgp3Al6owfMMVHu\n6H9duxO/kVdfzBjsecX0T+dw2Hf+w+0clyDDFWSZE07x3OLwWA//fBYJwot/\njouC9HzhDdTu6Zvtjio8aAXWENzvgera0sdQzjs0C6rG40sUHKJWruG9x2lQ\nXGbCF6Jhgob3tA8ll9nruvGwbWznt7XXE7r2rm1RS+m2M/lc2QKkqZNScJR4\nE6kOLeOadiVNQRIqt8ltrLuvwPNcuGj4O7fHx5Vdjfmdqvun3BI419i9x3aj\nZTPIOyOGmjH+A9PsG8NWLTiv1+cxFAHHldHqRVjPuwsKaO1V6vQL97Ra7RRr\nYL5VokTnSWbjgAR/wGmlvLOWAmL/QlVqPGdGJAPPfDUrR/M4Bk9ByDeMMKM1\ncAjxaAOPwEBkyFKJp+TNLUn/+XBN95yBQi+sqxCTDxeGPxAuWVhgJe9GIYGo\ncaPm\r\n=Uonl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"cbc9e4059dae906220190e367c6b49e62d5e0d55","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"miripiruni","email":"miripiruni@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.11.1_1563466319177_0.2869892951766231","host":"s3://npm-registry-packages"}},"2.11.2":{"name":"hermione","version":"2.11.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.11.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5b035e7fa25f5b702b36725465ad6d9592e98b96","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.11.2.tgz","fileCount":91,"integrity":"sha512-SyJz8KEgKYY8978yf8RcR9x54+R7W2qf1olm1VjjDO+xt3NbHHp9Y2eZoYb620nOyv6LrXDs7+1Ku3eSQir3QA==","signatures":[{"sig":"MEUCIQCH8c3Oq5nlOip8SRdLIE8rFMP4X5+VpXcYblqygJoWtwIgVO+hoazaQYu2yxNDB1/QXBS+VgY0HQ7u/1P5ZKyVk+o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":227284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdN4BMCRA9TVsSAnZWagAAGBQP/ROZMvRst7C1d/QMl+B9\n6eUhbbz+m6g8HJNr+mKHoRTCnDkM7vCM4/yTpSeZa21TSuJTI1gvJQMo9G+L\nIBwh9JcjC3Jqc9mBctGeugu2FUg6Gz6i4xv3YpOKBaUPiYC/ZrilhNIyO6kg\nJ+znMfdCatQJUgbjpTLRLIl95K5jjpuGgfEH3XDNbAdj9gHqRl/oYtFkv9WF\nFStYZIiYKXrpPWu+y56DmjXUNlkvOmrNhn59DEcMtrGK8QgK/YdifEThjYtM\nNoMKoYqNY0jAprlxvc0qfrqJWwOl7E/dIhD/Qa1OBMqjvG3gupk7HQvVn05O\nsY9mqwV1llIhPtjIy9Bm2PKZtrZmy21qoKV3ebnn2NiibNYU3f6Ni4EKgRtw\nZO14x3SfYGsKFBXrzdB1XO90knpQUr4ZFbqvXlcmC2Q0hNAAIRXOvo1TSGzJ\n/Nuim/cu1zp3oOyLof+R9LV/0Ihqpm74Par2g4PU2tu05qj7Aqb96DF6BCjq\nfBOxqW+270cfBMO1HCnDkbiipi6YXiXg7TDzBIuE7gWKx29hyuQJM1WGbCOM\nLl2r8XsTY/l9+8L0woY9m64ktc1MGgMrSTwmNSN1eYxhpFeqWMAZ0dZ2kZR1\nSFmAu+epGm3ua6xlcEfTu7YeLR32iA56iqJUYwANnLNEJnUYCI3B7cGaSYwe\nA1yl\r\n=JQKn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"d1867f3fe65420f064478c2a151d1ce6705a2ee8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.11.2_1563918411655_0.9470631928254514","host":"s3://npm-registry-packages"}},"2.12.0":{"name":"hermione","version":"2.12.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2d1766854b64db84be6a513821d116ba08999a6e","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.0.tgz","fileCount":90,"integrity":"sha512-pr566zCMHNoMyYYbwpLLbafkrE5/8TKIR+nouH0NZlQ1QeG1iNCqGR1FZUA62tb6wzN8CYBs0tAdmQC8QbAgDw==","signatures":[{"sig":"MEYCIQDF6iKNtaXlxL75g9G79g8D8K/EAcFh0B9D0ZtCTpAoHwIhAJWGIvS4tDe10y8yp45Zy/fbSkcSw5rZOh6paFzew8IQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":226760,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOHihCRA9TVsSAnZWagAAJb8P/3Xg655mqylJTnCMrTCT\nBevFZ/c8gOBF1Ymmq74jeHzVPB8/6bg3O8mwnzPyjn2b1wUP23v91UKKFQB4\n2/ZTzEFNszjuT3K4dL8JFjo08xfE1BAagqe6pvAJGdS5O5tZ+W4THmp9CLra\nW21mzS4R7NKV+n97YfYINmIOw9txC5LlDQQrT6m3kq1uW0OvpZ7AjA50pyBJ\n2pjF3CjTNoT1ejbnayzUJqJ6wBwxztZ06gWNAEiZfYpUTrarZmgoJ6ECEEwq\nilXbT2GlrnPFjb2bp4hWo/BD+ipIqNzPdD3kjhr2Ci0kQX548zmeSY4vaknO\nwwzqOsPfVHrO7lA4Q+11436JmMRIrgJbKIPorBxya3mEjcqkYTpCXCC6fVaY\nj2DWwMjo4pL0I9guOMefl6fe+wUGtLB6wFyKDwKN30Tzw9BJm93gl2bgzpCn\nwyrfrpTc3Z6Dan4qW9WVVl8D44bJQivkA1LkGE82XRnOAf0hjf8JlhvFohp8\nc2zpHwCEbdi988Nhgd6xch1VK3Wxnd4YKzpaohFM7w+RfM5UJml7q+HjYqLP\nJru2wELfFUNOzUW3PIy2bKMYX6/ueOhMgF8uLp1xbnkHYIIBX68cwDQVwrO9\nmM9Wz1KUbLOX6hBpMM+ISH8gcm/ezPxZz8UlE8scSOA00IhLygblUtGitIVA\nEcSV\r\n=C9aV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n    - [parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport's bounds, this option disables such check and makes command to screenshot the visible part of the element\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5, allowViewportOverflow: true});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"29fab15bcd14ca91f80ba3b4fd4f706e4c6ade72","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.0_1563981984513_0.8499949800651581","host":"s3://npm-registry-packages"}},"2.12.1":{"name":"hermione","version":"2.12.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"51aec620712a031e7c21b3da24d539009aa8e7df","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.1.tgz","fileCount":90,"integrity":"sha512-u6MnkEnLBQSfv6eoDWmeRALLybjJLTQgSYkvb9yj22iMc/1s8Mk4IvrvP57uKXsuTRYS9WYlDxdei7470MTmPw==","signatures":[{"sig":"MEUCIQDFAViZIJNjVj7lfFFBPpdS4fj5PG1r2bA7qWdstK2sJQIgLkEDRbTD6LCDrJeSdqULfoP8FJi8krDaFxWcB5FnzCU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":227044,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOXYWCRA9TVsSAnZWagAAszcP+QA4hHFfNkEbmvRPKUzt\n2ZvwNxXCcbjlB9HRHqOBeg508szbNu8JtMwQK6X3Uu2bWmHt67FT6ym7ciCD\nHY2QjUMA+F1IiQ0HHYIouasflZG7kPXMKjMO+9qO2hzLugrO2yxkQMB/hT5I\nTT3ivML41i1/kP13GTq9+Q5R/fTJQHviz04lduDYzCJTNyWmF05EKrNseZBn\nWfC5UZGl6vbQWeGYq7xuuqd4ffswyYza3RPEUXmwzzdYrwKggu+OsY7svL8s\nqDf69FIOnOHXpkwEq6BewtzkEBfXJAhju0Jn0BT1hmw5UI0fLuB2lxZkeRzd\nq/ouNCqWCeIpMdhCtNKgAoeZWi68G6orJh6RoJiSwUKAmqKQ1u4btBaNOcOt\nE9sVgaEjRy+u+3k6odYeoQZz/qkgHpXpLrV9JwGhA2CV46R0bcjSgMGICjDL\n46FY9rmwksq47mH4gAodAAbCH3BOo/wGAk9AePLSftIiuj96Y/KOfg+LkJGf\njh42/aG7X15TXVCIGNP45QHEERUG/7X9m7fOLcFjRKgeLOhzWeTyySJ23xB9\nrfKhLFYJAyMtBo2bB6TM87klgqwxkfK3EIp2wUHuk6oXfzAAJsglUPvW8Wt+\nef7E5Izi0QYRCTZn632qxPbLmWk/f/Dj2c9WUCsiBdL0u++rZZKKyJW9kbHt\nSedh\r\n=hMT7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","readme":"Hermione\n========\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Hooks](#hooks)\n- [Skip](#skip)\n- [Only](#only)\n- [WebdriverIO extensions](#webdriverio-extensions)\n  - [Sharable meta info](#sharable-meta-info)\n  - [Execution context](#execution-context)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [screenshotsDir](#screenshotsdir)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n  - [plugins](#plugins)\n    - [parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n- [Reporters](#reporters)\n- [Overriding settings](#overriding-settings)\n- [Tests API](#tests-api)\n  - [AssertView](#assertview)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n- [Environment variables](#environment-variables)\n  - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n- [Test Collection](#test-collection)\n- [Test Parser API](#test-parser-api)\n  - [setController(name, methods)](#setcontrollername-methods)\n- [Debug mode](#debug-mode)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n## Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n## Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n## WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n### Sharable meta info\nImplemented via two commands:\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n## Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n## Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n## Tests API\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport's bounds, this option disables such check and makes command to screenshot the visible part of the element\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.form', {ignoreElements: ['.link'], tolerance: 5, allowViewportOverflow: true});\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n## Environment variables\n\n### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n## Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted than method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted than method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted than method will iterate over tests for all browsers.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n## Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n### setController(name, methods)\nAdds controller to `hermione` object in test files.\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n## Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n","engines":{"node":">= 8.0.0"},"gitHead":"683614788634f9843009cbb8e1fae7d6f07221f5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.1_1564046869455_0.020675664394911086","host":"s3://npm-registry-packages"}},"2.12.2":{"name":"hermione","version":"2.12.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d81ebff975352bc7828fb3381435f3b3d1b14a55","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.2.tgz","fileCount":90,"integrity":"sha512-QWxQXfCgF6gNz1wQmy75RvmcexnjJFERW1EnPfrOOrDT+TGm4tkSQ1iKhYcSotHsXekoLAC9/LVwgB33InE/ug==","signatures":[{"sig":"MEUCIANWRNIPX0vKo4hdR9Ym21aC0hbW3bVFSl5O0z8F9zRKAiEAuUHnO9BituRboqTX3MupFzZdHZdXIuJgtbxvZU3D/Zo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":227392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOZ41CRA9TVsSAnZWagAAQigQAIx7JM09s71MSsN6e0iS\n9g0UxQjy4RyFp5b/9ZOlq/fmuma9ZPC7+ZyEL3oJfb7b8dlsPlbvWH4p+GV8\ndOB+VjWjiGuFx3kAUwwz6sBEgQmFXnWF5G2CfX+Z/XiWJP0E/TeQTj1BuVEF\nc2ItnQ+TlNQf0dshW68QLhVb3zGlWxPf3AJMz41DKtOtkz415Hd1HKGHAw8J\ndIHXFA4eDI8POe8+k5u6R2ym+tT+fx+oNPTdfOD96qdrBKxFFwNzca/GzTKh\nTyS5Do9szE9oChBThkItGywIwsBUWA/g+NY0iE+RxICz9urmCdbVJMMKM6kh\n3wqLXPIVrsEQbAoUM6LBHJJGNPJH1amyIRWNl794XV6KJp5fwWbdyqyCImnE\nX5zTcOaFgAf3LBQFz3FHJpxCyqN1K5ipoPXSK/g5ZHuQIi7xDGWiESFkLCjN\nG/bilQ0I+Ll8+8Ziye1BTNmytyuRIo6LWUpUB205ZdWTArPl52JG7cEvlC6M\nSfJ+nX0xtkhAI7aA3SPZj9aqamZ0xBXi2IQ1ZaiLy7O9t+C0JjYq080qMNRr\nXadKSHka0ubqRWCn49KVaIGU8Q8dE7f+Fq8v4N1sFnhJkDcqN3D6zbxXp3iZ\nizpO0wUMG0XaIwbt+aknrh2uE/zNb8iVDPWp4UnQE0im4s6mJu/wdZv9WP1k\nMTB8\r\n=+/VM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"fef44efa7b03769c1b8c3e89557c60b1ab026ee3","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.2_1564057140442_0.9726328604847889","host":"s3://npm-registry-packages"}},"2.12.3":{"name":"hermione","version":"2.12.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.3","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"4a972f3fadcc643e962026df484b977388e361a7","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.3.tgz","fileCount":90,"integrity":"sha512-3CX7iXVEfqxiQ64Ul0JBN97lWfeov1qOtT51UjinfaRn843qI5kkoRbpLrYDPrxnEusab/qqk2MvD236Zt6klw==","signatures":[{"sig":"MEYCIQCx6+y/QwNS3EnDSL1/Zha6T+cpQc7kYtPpBFeTZxaKUwIhANB9WwPyLNX3Nv/miBK+FEZbmKF/49Fj97iDxq/QexPl","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":227713,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQA7PCRA9TVsSAnZWagAAbDEQAIvEDXpVeCRXVvY7Bw/y\nHEfTjt/HLnJAUkG3YA4eWCEPQp72AWmevcmdgymd4MpviBcu4+jRzNl0FN0G\nig6xe1CqBP8gJ5esR4v187Epv0mk+wrASGP2oVGl78MFFlh9v19IYiMjEE5e\nMxgso5qALPVIS5aAQekc25xxWBYQP4bW/BOW6rInxIhxeuoMpDwhXG/4s9Fv\nYdy0C76RI6khYZho7KBpRnzejIor2iTOAehtc+DRe2G7PnderMmSgyKVNlrc\n08PuPhDcx1Lrj4lRIM5XZ5SUvpoVsM2yu8rO9c0+ZSPv+o3Qn/2gRj20mG3W\nPtWYq0kS+LFiLwf+OecykZenK7OLW1C2sISDUXWVhK/5pOpZUEXjktVhTk3f\nigwaVOwiNoC5vTiYMSby5fH/Bq5PpDj2tz+h5LXFdPdNG5rMgKigz5l5sJ+5\nwNoJXbHiTpFMv9f562Of/tsusC1cXNUQKfJVT5xpwedA9aD94e1AyQeZhleV\nUZQxf7cOizDfKoRC/akWqQ7DSRZ2lrLXEpI4HIKp+dcj41IA0fH5HdboSU/1\npVTibHcD7CEzHc3avY2kn0TAnja3HG/jU5ReVHVXZu84/wzRYWe0T599CfUi\nxYrFzyr3ACuCsPdCVlTz+xB0Y8wSuyUEI1AQdJulC40MtJw5QoSKyukZew5U\ny62R\r\n=eG6k\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"06aade3f1f62989355c66149299798861d924599","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.3_1564479181865_0.8289720186917813","host":"s3://npm-registry-packages"}},"2.12.4":{"name":"hermione","version":"2.12.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.4","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dmitriy96","email":"dmitriy.penetrator@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"ac89940042e603438d885a83088ea573ba3123a9","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.4.tgz","fileCount":90,"integrity":"sha512-ruq42Fs7WVMDZ9wGmr20+x5LNRmYRAyM3NwKb7PmaRVAtHiSoQd3ky9bmyZB9MoRRDxyI3wV/pjKos5TIF1Aow==","signatures":[{"sig":"MEYCIQCSG8z75FnBKIGHZe7+G8LmHfL1gVkqQW0vXfh1BRFQCAIhAJHDMMlh40mrRujdTmmG/IAzGfXC58MzwCvKeNkbsUTS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":227984,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTEQhCRA9TVsSAnZWagAAJlkP/ilfkHK2fkK/8msyUa6Z\nP/vf0eAJaeowo9b5AEzBjdBhQmU2XNDmMoYRkYbwVk2pFf4Xn1yHMTyrsOK9\ntTpMhaH4DdjHvAMrFOisDklughz2FJW3gQU15Z3JNs2wHDU/AdYBpAP/dlfr\nrJUoidIkTswmfQBxOLiOmRNJ5/vSo4+XsO9oQoBw8FTOey83GuuABQoLaMbr\n9DMxB3w0FkIIGs7dO3hCu/XY0Ws5mmy323N+euB92EG0iB6BkHnbvHQQ0xCd\nApyaPjaYpUfg6cjI1hJLgJTsZYg5Hye8+K6eFND/Xgk5XM+XbDxqTNpCEGqt\nFfJdTM6f44UhVFKMyrfMGqwcr0cgYdys+TabcQhTO0OXe2Db6nS8wCdGIEzp\n4JNt40D4SkQxscTgmiA/Z2GG1nx55kmsiT7NR8JFqQT0u56j7m5t9gcrH8dJ\na6difiVEgRJDPGnE085Yhz9HSaljrXnC0pZ172dhHCYf0GCGzq5VaiDwq3HF\nQ0v/2GVjepEdtoSqDsrwvKfk4nQ5Je7rAveWFkbWR5Au4TAWunYvqJlVTeDX\n1AD+XpBZpfwGHHXaP3GbXxROYT6nrSwnktY0IJCD+mT6Qo9sOsNyOLURqD9l\n42tmRW5rPZCUrDkFW+3miZgdhcjY8Bg9ZPfF2/cyRTDtZ6xs17coRXl/Q4zJ\n9eJD\r\n=BmDo\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"be934a2fe4107072a86b8522304e0817843f930a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.15.4"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.4_1565279264072_0.9715812921951519","host":"s3://npm-registry-packages"}},"2.12.5":{"name":"hermione","version":"2.12.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.5","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"043ae15e433304060d433c1849f228021cbb73e6","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.5.tgz","fileCount":90,"integrity":"sha512-+izT4Wa2aTbF1Pu/ktnKZxCaTnw27VKU65dO3oNm7Chok0WIoW1Rj4M6Jp/n7IIUX8B93HJwfmH0MTrEBtCqfw==","signatures":[{"sig":"MEQCIDrm2g7Zw1zKSkE9IzUzlS/8QOdFtIl6eD9xaMEki4qmAiABgTHSdGOGH5bHj0BIZHZrG56TDahVQ/XTRHDVgOZP6Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":228104,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWmt0CRA9TVsSAnZWagAA/38P/3lwKSuhDI4OHfgLL4Xm\n2OehRqZO1RlqioND6Yej/BXS2FqE9302DFSgD3EsieD0GChvqVqProVFpUlC\nidcFEKm1c7bX7lnkC9PoKHx+2B0kRo0kLG/jEAwiXtbUj4C1nk8nQ7Sy/F6B\n0+ZFNS36sVMjcUTJOLL+32cY//nuvouspozxyMSk9sTJaCbbzBMkQy2ds5QK\nWlPhHSi+G7dT+IMQUebShxpeAn6SLE+bzdgTccsvSed4MniXDtvGq+iK8wpS\nWXed0sXXDmXllA080MT9VAnFYivwm3D23+5nTJQFf5iAMnJ3GVBegpiTSYCI\nwrmNOzWHGG3dL0Q6vOx1aumiUn8oLVqNfheH1kLyf0HP0NFMtNxUGkN2/SDi\nmffE4Yg1zSYqALG4pCUB8EE0Bl9u3MMeBAqiicucIMU4NMhkqRcgYcgwRC/R\nV1Z37V65kKVkfnc6MF5w61PuOzpoey2oz5RBbTl2lDb2p4Hz65ISwq0zF6uJ\n15eGV20pNpffYVGpv+NYNrfopGm78GWM7noHtFJ47rflzX+iIdDP8IPh2A/7\n8klIDiLpQ/bmk69/BFExnbSQlsxUqHRU9IDa8swwTI1uiVCDWA0V0c4OnTfm\nXED3m3oJEs6WiJI6XiqKZSGkmvoWJM8Qic6hXIRUflL/+nd8S/yReMmSGz8M\nV2c4\r\n=5EyM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"7068aed573be8ba0ab19668d5cc40818713926e8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.5_1566206835331_0.06672424645431185","host":"s3://npm-registry-packages"}},"2.12.6-rc1":{"name":"hermione","version":"2.12.6-rc1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.6-rc1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"7c4ece61f22ed48a0b3bb1394576ab33ade35f18","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.6-rc1.tgz","fileCount":90,"integrity":"sha512-vDglF5oQT72ZDN3W8S+0llPe2oCoTkYy9x8l9SdIIs5CyiqCJITjhGfREAB4udDIcGAukC87OBNSr6DL6L9X5A==","signatures":[{"sig":"MEUCIQCe+WRugD9Eq6V8fmyq/lEbAR1l8O5CLEjzOtiHr7HYlgIgBzhwtREX/65K8y1N/CJgfy4dah1stCcRkA851IEzM8Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":228112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWsh2CRA9TVsSAnZWagAAIkwP/j21G+funkUJ3S5UZwRt\nJKx7n4rLJD7okUgu0CsFnhVpcWnIjuLNk6crz142oA9m/5Yo0/74lysKfDxV\nofm7s/zzzxVnb4luAGc8dEIxce6B6seBzFOmJ5Dn6YBnKXQg2xUenT4D6FsO\nRLWN5/jyWC/Z7HFBN5yBqNuKMQKUkMdWcsPkmrwXcnotoptotSh5wG1DMAOP\nA3F+VxNe1fXSn59ls2IRY39rXcQ3N9UfLZlN0wk9KlUsFZzwIcVP8LtHoZZT\ne3dEePNVGjB7hrc4UwHiQbR7gym+nF8HgWh5fae9GPw8+9tvyLWOfYA8PVEs\n+s3UAjdu4PXxxNEZ3t67Hp0/kZXPvwriK07EwP2lCOfdPEMMz3HmvM6+cjqg\nvT/9CxLXZhRdtJi3D0r/SSWqzWTAbs7tSmE+TlMwJroPtNPTinQjDXaHH6nI\nWafhENHovcZtig0DkeJ27rNaVDNm+rayq4+EUf/rlI9KEjMZixhLZrRxhhP4\nMsKGPahGDMawGcHiTkJ6piC8OqpjIqNGniu5PPl4lzSIH++EOXK7r7LLcg3L\nnlQJGc6ED/BlvCyraH2E4QbS2PzVt4o/sM8cCfRY6v9fFZjMBN3QcgBohHEx\nOzg/zZH4gkmyvR/MF5Xsj4t0SJhmc1Zj2cQxC30TUQePa+OEwPtGdTrLOu7c\n9viK\r\n=mkFb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"f10f53285c5840525e37a09cf34dfd25ea7c6bbb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"miripiruni","email":"miripiruni@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2-rc1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.6-rc1_1566230644931_0.7962271552508342","host":"s3://npm-registry-packages"}},"2.12.6-rc2":{"name":"hermione","version":"2.12.6-rc2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.6-rc2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"48ffec40a9a1ddb72feeb710e5df8e3e6047db53","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.6-rc2.tgz","fileCount":90,"integrity":"sha512-he9ihPZqIS1Mlt/wIGiMdIjBRY5sd0OEtVFbBEXzOvbirT9pUdZL9KlUfW//v0wUD27yPvb4jQcZWcQR1zSBIg==","signatures":[{"sig":"MEYCIQCmZVXNHGB+TtaM/sCxxKgM+QvrYCjmfVLRT3NlIhLFkAIhAM+l//OlTCGaPDhLMHAd0SZxey9mFMzBJN+qjUBGKIQU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":228112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWsjLCRA9TVsSAnZWagAAffEP/2/GrRrK3NmzZSF9QQ4B\ny5tmMEcJK3DAx02ijcBE6cRItEXUavEUzRgeFAUyiG8xkrRM/7oG9Qxb1ab8\njdq9w6/o+VFaqYMYS+I34CmtyIKIP9PlaNilREU5YdJfWdNLeFqeawd0vzOz\n4OjxGUW8IGTCzYtHdpJzbrvI9gCJlf/56KmTBRQ1b3EsN4fm7smdaL8pdARy\nVWp7tdIuJ94UE54gwBlALRDF+5KPq1zFPtJGpU52j2Vt6ryeoV8Qz5vSWcoI\nv4fntj3pSK4m3taHElbEHIqDhZUc8qa8uECmIHY870PKjRUeBdDTq33g3Krr\nnyL5+0VHuH4jj7D28w9X/xznAQsIA89scg/5fPanw3k54L8sE0imuvsycqXr\nh28TRjPtXDlya3p6mTOlQMUfmu4qa76k/iEh0jQol0ZEtatCFZOPS+iAOFV8\nXEE3SKtdFRH9L2NhUWSx5R9aiwhnQ5vShepJFCJeuX4/h81pfo/DwjIzOwQ1\nL0/XDFRerOsM+zTxI8zLsO0XruqBJqKXvlU3K1eZVQqgzOVr5Q5JfEEUACk8\nbaCrtWs1PL0PS8fgMCINzGmo9FVmB8mveBuUe6BC8D8n/rZ19c1MFkT9U/tn\nbyX7FOukmw4oXYCXgEQbBlSL5ItJdyMdQVhdPFh1mfud3C1Cxe8UTc2DIuaf\nCUgL\r\n=yMxL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"1c02602d68f90b710ed91da0d1c4c5e689e6c721","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"miripiruni","email":"miripiruni@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2-rc1"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.6-rc2_1566230730057_0.23453868719626803","host":"s3://npm-registry-packages"}},"2.12.6":{"name":"hermione","version":"2.12.6","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.12.6","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"eecc54c40fee0d8ab59070a4790dcfaba620ac44","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.12.6.tgz","fileCount":90,"integrity":"sha512-OFqq6/U5LR16xFpxHFd/soGhBb24qL4J4OCDN9W0ztvmS1QoT59ucCi2DpSxx/ad5grMJqNrhWfG/4ML1O1spQ==","signatures":[{"sig":"MEQCIBFAgM2Xjt2hwcCxzXwL1lj+n69S6WzxkfcR1hveRWQ0AiANg5kzIiKvlmVcC8sgJ3fMqY4lEogRF+RUofhcsGfCTQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":228224,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdW+GnCRA9TVsSAnZWagAAEJsP/0KjMXTFJQWgGmQuq+2Y\n6JyC2vBbwX73laMeRaCXYf18Z4MDDG5NyWOliuZr2XN6LOrgxCtimKXkL+Vk\nvDKEMe8OsFuTn2Jpl/n0ESwzdzG8Doo+2FvrvEeDg8gviID+wy5IU26hlBHi\nf9ClhnUPpL5WomTbnPIRjOtQCyI2IH+mDO9IAeJIlU9eX9m7DmT3+8BMJYAI\nXzCE4YJmh3QCkUqMSI9t3/gBm606N++jvHFO5DPA3CDWlPUWE+6uEJKhIW1r\nERwodg99qtgI9cFcH0ieaT1W1HGO2p35gGOOZcgqrsGxNbjAeSllQGgrncbm\nuK+ndMH7YQrbQcQtZ5IvCMLePr3o8NHk5K5QVZA/e1bzYIBWyuhsOi7U2/tq\nxS/rSOoELVjBJm7/vQ2WWXkGZM4evqBsoMqC1swv+kkaFzFNc8RWI1QGlcfD\n2pP8QsmL2m3Jgpl9vjJrKQ2oKtqV+F5X8+ScGi8JFC7xYX2T/V4lLtO++RTO\nixNoHHsSfvl7AgM1/OALC4h32YOpOmnlBWQIZD7hoFN7D+jMO2x6OzBeST8z\n+TleZVy04MN2p/UelfjKCVzbfR3CcGIgEPPrMh5hn9DRzw1DP1OVH6tv9tcY\n9DgTGBLTYlw5mrjut4F2xo7XzjFRMbnDFgGtJTEQ4C/coJP1PQuOcByGKdeE\n/qxl\r\n=IZiN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"999d6fe9b1fbac5bd8198233ef9775d98383c70d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"miripiruni","email":"miripiruni@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.12.6_1566302630071_0.5265058203727533","host":"s3://npm-registry-packages"}},"2.13.0":{"name":"hermione","version":"2.13.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"13ecb52a1ad8515acd88ad5f403002f724677f66","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.0.tgz","fileCount":91,"integrity":"sha512-HI41Vugj4xO8+LultQT+L8uKj54cBQatKSrGS5rMTdwTKykssb+vMCHnSurjy/Pzh857aOI4a7OtjLr/xfFYmw==","signatures":[{"sig":"MEQCIA7TnVCQ+LfzMa/i0Hd1i+xJcjGln3xcHRQrQQ4xtQZvAiAAqQEr2TtUABMpHaIg+GIw0DH7uvE0Vd+C9LFarSZE+A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":229657,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdn0dPCRA9TVsSAnZWagAAv0AP/AnpJNUlkYBy5XcBQ2aN\n21iiahsaERziCuebI58dWDmwr/Sh6f1Rz1ez4mBgkZr1t5YxIItmB1OPWEgZ\nsaHh7ruytKoaDi/sZUk4B5MRefOOAvRmesEugC12AXxU8tLEkR63d2YM99+D\nW3co+g8UjiRjn3hIgQkyDBcutcgN0C1ec7KgDk5TEa3TSUA2UX137hi2IKwI\n+qx3IByX3IYAx1LQJ3Skx0aN0FDcj3WXJIRlF9UobyPh+A8qBmJvI3VXw0Oj\nCzLqMh4O90BksRNE01cmwhbS2OsTwzI/qO2rjU1m9xpQO7XN4UyKBguQXrZ5\n453EM6JyPZxA52PuDYG9XWkyw9moC/3cfo/tVXzkxUVCvCdzyvJoxOEamY6g\nqhLbXG3XxML5rcuPCd1PpNGxRouAF0JirOZRaZETf6Myp3fkkGr3MtBCv39y\nYj7Dsp19Q5Z9EmaY5qKSiCsloeDd0AcbE9newx+UlBa+t75zvLpcUqc5BJF9\nWnEwj/WdzojBukxVGFdRjKnJCQ6Eq/IcIrLdxBElcZ5kVi5U8IOPKa+ROIXK\nDElAhpUo3y0j/efssQxg0nvJBP44kOo2Y4TY4l6W2fDhdexfZ11mmsl8J63h\niR0ENOTPIVgun4k1ovR2XdJE1X4h+Udpo2RQ3YcyHrbp5F4ywDgd9r4ul2u6\nKdev\r\n=puBM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"62ab60c4d1d4262ebcf24577d66179c42d3b19cd","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.0_1570719566584_0.7160460755862654","host":"s3://npm-registry-packages"}},"2.13.1":{"name":"hermione","version":"2.13.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"4f0b419d5e12f71b9342d8095b1bbe30428ae78b","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.1.tgz","fileCount":91,"integrity":"sha512-3MfwDuBLUi7W9aIpM8Ysu5bcq37IfUlr3PpA1V5R7eOTGOmZlrkqe6pefrsxP36SUDfkxfwGGS2Sl4wkXRbeUA==","signatures":[{"sig":"MEQCIHmNsnUoTLwf9RZ1IMFlkzpn35PII23ji5gFBQVmYmNrAiA7ykjJjIKRNztvvbx9KRhLAMTXQ77nTmAUNvXmC3cGqQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":229958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdpfG7CRA9TVsSAnZWagAA38gQAJ0rzhb8ha1HEHwrHT1i\nRPMOkmFYAGEy9l+b6C+SE+UVgfSJbdzPlq1CnUbqrMFmlKSOxTjvQ/wuyy75\nPCUajLRazOCaLl1h0DAtdDdoQG+yefqciIAlXePr0+HbAZenq0AD22SVSxbY\nEqOQhOURXgflusW2xSpQLNOuYLm5srMN5Mqr+UrdxYwwLluuv1QmwPy4eLsN\nneOU10ihCc1kJhJW6WAuOl6weGX1lj7AiRQoVd2w7ysLH72WtUvN0xLQuiA/\nLVqB4BURQ/hMArOihqCEFWwby0WlrxzFzJaNcehCTRGdjFHm5wllRlEELkVt\nw/HS9vfqiKCjNGDZnvI6QQrDDAABGqQGjNrkbltCc3pToaCjHtibhIEvSFGD\nkTlTAFHzrF4HwmC6qsLphxaisBIIegWiFoxm5mw4GybCkyankeGxdxE5UXyG\n0UeYJjjTxjgcup7UTSFsZb//r5Py+ebaAz4lQr5+cKPnBm23L1SHEhDlPfm/\n9j8vDp5D1ICbWVpe8PxaTjMZ5iaYGrNapyTSAQ2SswbdZjSFCX/BF3UWZr2N\n78YpIqXGPKnX0r3s1oYF8rRQIjrB7jyz5WtqmkKHvm1PML+A/igtN0+sTh86\nLJlZqHma4z4iUwPyv4/PonLGWmYkrzgWsTLFMVgyrhLHn+snFYxeSfJ79VcP\nWkMj\r\n=Zif5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"0412d85aec1e6cab78ff8eadf631959b1cccad73","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.1_1571156410626_0.37821886455142484","host":"s3://npm-registry-packages"}},"2.13.2":{"name":"hermione","version":"2.13.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"0d84940700cbfaeb6b4ced56573a8a1251692ea9","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.2.tgz","fileCount":92,"integrity":"sha512-F1lLhkpWKXRGab0lGgEuL5wm6mHWpnx9+xTEXOoH/S8L6WPiJl4jnoUj47e9T/rARVKp/toDdlw/pLoaZlVztw==","signatures":[{"sig":"MEUCIGxbqWsPeQaRFgfBlSfRZuNfGghPEb7v3OuH+HVi5x4iAiEAiW/e4pZ886Mjhs1kL+MEzBWERvj6OZxL3WuQY6KqjA8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":232953,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2/MLCRA9TVsSAnZWagAARB4P/2SrjzLvA5z1rmw3oz55\nImSX2jzVft6j3/4cY4/3fZpQ566T3bErlO69lw85EDIQQ5Hucdkf/JsiuPni\nM6cSCKFMmnj2boOpi+5bZGoaUyTXYzdbInC3NYfi4zf1+ccHYBcvMc6jWS3l\ny5PKkexXoqwZJPUjTAXa6fd0pyVJyQHGj4ZMI+cF55r5Qz4WLjE0xPOIl+jM\nEpfyLL5GMn6Hm7FvcYvgyiCg5sczpbNjXeNR+SP2sluoJoivRRpnHaxr6Apb\nrX9YM0GdNq6Z/iPso1vIwF/4LCyI0qCSiJF+C5ZoRPbwTCd+Gicq8l47+yYm\nl8zrH6oQUv4kTKpD5PZVSiU6m8u7+hBkLPMiaN2a7UJe30lugelZ5xUsiTRx\noQLsQYEYnOzJVaWzhV523idd50qN2ZC8hH4W7d+D9NKYR7IYwkPRiZdO2zfs\nYY217T8sRRGa8B+nokhljxcl0Jgi8tbSSHgPvAWypr6NieW8C/jfn0yEXW5J\njTKX/WY2wQcAUEI6WJIEAmzZaIWDz44YuQyD/iNlDtbGciz9N2t/Mr7qetti\nGL+vw8JkJCDJZT8CrCauPBs//rPhX+kr01Z4gm2fEsMz2ZjDeRWgRIpQBz6K\nK4IRVLa5dfkNLgm6MScZdPBAOD+Od3XiydRSK2e0fEEBzKa4pClMoaiqEWZE\nJ/Pu\r\n=5Arw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"4b86b10ff8cf40eb664bffa2c31944c1b55855e8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"nyc --reporter=text _mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^3.8.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.2_1574695690974_0.008076349292667873","host":"s3://npm-registry-packages"}},"2.13.3":{"name":"hermione","version":"2.13.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.3","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5ebff0edba758bc6c1ad7d8c12f29aa565710af5","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.3.tgz","fileCount":92,"integrity":"sha512-l9GxEVSNkeG8TQcvLxS5eDKf3WYabmnkwEQlEradVxWulcpk15Cf7x5BTtu2AKE4ircTGMt94aIhU1pF0WyYcA==","signatures":[{"sig":"MEQCIE94Pk2enWXdzqcIqJ/QdKfLLznL4HROSPufeUX5Gvj9AiBbbyE18C0iA6ppQINjr/axbLw3sTZkVvPHn0OCQN8KIw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":233315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2/gkCRA9TVsSAnZWagAAv9oQAJxh6ucJca449OIcdu4u\nPIjmg0pyWZnnRjPurstRUsvf9OjzTi/9S2Vu4te5sifAXOrE0kdNdiXOPwZF\nyiDNY82E3DuTi0L2wdmUaN17DnTvRkiAuxVGjI6DhvAB03vCMR7h6GmPY7zb\nPTZ7Ig4fBVZsFGRE6YAqzQI3GGDhuI8rIrtthH33xQHMqkUmhDGnSnHLAR2z\n44Rspu16I107N0AnBq1EyFNzcuSRy4jyC2rIVScuD3lIwY0GGyiHEc23tJ+Z\nWN0UTjTNjrcYizJF5wXFRd0DaUmQpQ458Vk7Qmv9gl99Jiv1NPB7QVQRnZQc\nDHhRM4RPX349qFQw8j0qmOnu4ue+w4pHGu1Zl/YXybg9CGWaUTDWSIV6+moA\nN1P3gI70pk8LGhTQpve84AIRC9t/09y6sPyDiydpo4L18KT1vHLHfXPjXS7B\nVv2Q4RVjAiBou/w/GQT9zTjx0m6y0mwbMez2Lzvf3UXYaTrTmB4CHZFBKXRU\nKS03aejFyfji7jZ3TrbdbBIJpzwvQE5mq13fHq0Fv+GjcQG0O8l9uxG1Cvlb\npvdsVyTj7EzaBtmPPCc/80VodvfEl9R8ZsoRY9KPwgDAKKOV7CToduqmNrFs\nV5glJ6bTr2nsfAtJAAqvrN4zqv0Fo0srccxcR8BSYlr8ukUOctDeFmWgjGRP\nnV12\r\n=YWkJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"d2299cbde64aa067919c0bc6f9af66b5204c8048","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^4.0.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.3_1574696995626_0.3943095757113668","host":"s3://npm-registry-packages"}},"2.13.4":{"name":"hermione","version":"2.13.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.4","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"555d80c8ed5493f40aa8cbeac02037ceb0b14a54","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.4.tgz","fileCount":91,"integrity":"sha512-HmWPFpYSnvP/gXsAx8M1ivIhrf5QUhw482EAZk401LQFMUMJucJSOKOXpqTOHE+1zTLzmucP/QRMNs4qtVDZXA==","signatures":[{"sig":"MEUCIH+Z58dOGxN5g5bG+/tBNQ969TEcKH3WG3IVR3r6wXRxAiEAh+sHNuv0++0KjyFsjNS8vgA+VcZOzZMOOpFiQ7YhC1s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":232345,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5pxRCRA9TVsSAnZWagAAvrcP/A7YumV+KZNTx65fxxZa\njMrdnZc31wnphW41aah3SpzE4p7+l1w4cvlXXXV19w82uuceY9LjMw6t3fIg\nFSwiHUEi83602N6Q3Wytfw4Tt+fcS0eIKGl3ud6YPZgh4PqvWmG8Wi0tYz0h\n7FKGCSWXElgIodW32t+onziylf6oBWNIujpScN/eVNnbDyTONkhTy4cs5Fi4\n152VMeOVwg5yxvvdT+3nQVzWhBW08wPE3zfQ5HH2DAB5z7H7C3itNiOcBOhb\nlPVujkYv9XWxv6JjJt4X5AN6X33G2/fgMa+xRAozHukuD9UfqBZJnBNry28T\nGSEil4GyGEzVaS8an2982JD6kTlVAypof2iLEFQR0S/Am79Rp33GByliI7c6\nCHEDkwZQxalhom5L+qVUqtDrtg1rb/BzuWh16t0Fr0dow2lMpOfWa8fJG1bR\na28f538+KB1sD6KWQbGed9J6cKkHMzbjtm//ZbuKz2tu+OjK1uGxVk1GVcoR\nHD1P9kRMkHCLDLTSp0/Mj3ln4SdEKuhvS7FAGXfC+704M+py6wupHMa2N/ks\njy2MsbjAUTmdgMOZq0nhIDYdNcIEtMRVVPjIKp4e5jpvGJFvexQxCwp7tY8U\nciGPjgchemPt6ErYAnXY/NkvoBrHLjpBTt+pTqbAXsYjn+XUp7EUSUumSlB2\ngGrg\r\n=Obt3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"6bf0dcedcf20df1fe4148d77652cf9a4d7c96c2a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"catwithapple","email":"alexeybegunov@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.5.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^4.0.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.4_1575394385005_0.01786182818107296","host":"s3://npm-registry-packages"}},"2.13.5":{"name":"hermione","version":"2.13.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.5","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"fed1f7a2c0fbf7c821314df0a22d8dafec2acd3f","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.5.tgz","fileCount":91,"integrity":"sha512-sV9g9HlMEl9lZW6MKlsM4y0swrXEMFmVelrUkZpS1o6C4gg6PE248mLW0SRwGjz0kOL193St6kfptANy0tjfJA==","signatures":[{"sig":"MEUCIQCyLZEJD3M3Ao18WSZErbnY3fhd7UnlcNs5NZv3NXGfnwIgBfawmlFvFtH7/6rPlkdHjoomCps6xjVHJYHqcu3wWY4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":233041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+Kt+CRA9TVsSAnZWagAAU5cQAIx7t8LrNp7vAK0HEO6L\njAvTZ1uJCmqggoCMklexroyZWeKdECYcpm5JPQgbKEWepicL+9AMPlLJ91Qr\nZnrkRpzMjsNDXOsFXiCpTjTBlFKjYM5fuVoUHo6zIXjpdhxR64EZsg9c4hrl\nQb+/FXDNUSafa99FtlucMwMQVkNYevre94ajLYbOxD94IrWAsw2IXV3nc/V5\nTwrfecZxXt9JgTLXB9/g3wdtgRrxkAL7jWA1tHo6fpakP8j3yvU1uMLf4dIu\nuJLL86fpw4jKRZAXN+f3HDHa34xr1nxvJBkczFpWxG42tB6aHNYU/4l4H2ze\n1RyvWRAHOLQE8TiuIxqInErc1GnG+UlCt+7BgF41k5PgL6WSaBpgeZ3MWuk+\n+RwnZLO+aSfsproLC1PULt2x4uzWmUnAvbA7CZyvcTlcwMFZgzmpHKMfIk4m\nj18qWGKNkdAm+aWH51LIMk8zSNQhaM58nFt6C8K66ZeW8VpkQl9p5El7lGUE\nMMcUCeMVdnZspDbO5IoKKyWvgpRtM23QbidKAohpf9j5NuIHvmU4Q41gnSVN\nkjHRRsHIDSfm+F+AWFM2x1nBH2e5QANte/Ds7EWdJKzrpWkba0sy2x8wUQqT\nKKWZh5UnMxG1ERaoUCvmoih7zaVwwivNPpeytMx0QaufxjU86k0Da0+m38yx\ndlil\r\n=KpVF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"c37067fa6bd44baaa19566c7e8057a8092867ed0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^4.0.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.5_1576577917464_0.6932034524211443","host":"s3://npm-registry-packages"}},"2.13.6":{"name":"hermione","version":"2.13.6","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@2.13.6","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"bde924aadea81818c20c381d2a2360679e56e04d","tarball":"https://registry.npmjs.org/hermione/-/hermione-2.13.6.tgz","fileCount":91,"integrity":"sha512-/q9+nUrXdof6mUWLe+nwXB0kqBv1jIpq4tOLxCe/fypNJeNFk+pNhJd8fBv1iFyoALoilatNxMhvOvPs6t0Ahg==","signatures":[{"sig":"MEUCIQCHoAav4xzbHcC69x0tfMGTtnv5/R3wQlW0lHa7QByoygIgLquP0jH1yBkFD3zO/iSoC0j5QTYSiYuqijK9nFgj01g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":233333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJw1XCRA9TVsSAnZWagAAtpMP/05uDcsMtwoe9URQZW+L\nq6EQDb2tPLxoo2KHOlGlK0M2CWDLkc2FBHuSc4jAvvu3U2AOOl2feWRJ/joC\nZK/d60qLDmteS/KhAvDKWs/LFv894SSlqqnOqwzzGA6/oMj0iRnuAyfORqbG\nDnDYgD4mfh/P0OwMjWLf3gBZYgDx+fnPpGauw7A6AWLlvkLs7KWoOQdZJIL9\njUfbjmgGlLX6tUGYFjj0XZv/R0F0seZN+ZYr+ri2EGOaWcblyFoH0euc1qy8\nwlve/JSGoS+LaswgJRWpHA1tSYIPPFOM/5QSAWur9GH8Yt3ps7bdzOoEMtPl\ni5SM9X4AVJJXMYcKoR+w+ROsnC6xHeC5PzXB8wNRBYIDALbTxanzGBjGNE0u\nFY/QFAYYDtxm+MRbTTNzaBGma5LGp/SRf9c/c2g+juqz+h16nUi8c1M2K8UC\n3nYTZMr72KZPAMSHTgdvmsEkvF2gR9ygDE+ID7N5vADAX89cIgTHOj3VCScK\nWFyLzatv7mxsMGSqKGkPu5+U71ojcGhYaY8t7PDYWv1lbx4Yj/y/oIJzlkhr\nFTe7IzKM6Ri6QoXd6ZIQIDzFsFD1nyDOX4q3/+PUvYRxStcepwbBgIqO2Dmu\nKlPKk/wCQ5AYDPkbIDbVP2B1s32Ftd9WgjR2aT/IcHkMxxfKrDtBNedxT2XH\ni+4z\r\n=/5fn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"bdc76c4ea35745b09e6614c9026b768297e76028","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.4.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.15.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^4.0.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_2.13.6_1579617622547_0.2396167965542848","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"hermione","version":"3.0.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.0.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"f2c7e5cce550d355449a880e2807f37efcc70212","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.0.0.tgz","fileCount":92,"integrity":"sha512-2RLx30dC9MN7FjI5mA15HWuWy9utXujuuC4TWxI7/vbgmJ8RLL8e/XDY+OBMkFWrAN6eJCTfnbSDrJcdFPcBwQ==","signatures":[{"sig":"MEQCIHl/bw7iFTNheSolP1v+swDK4yeFOne5L5Jhtevxdqw7AiBJgf5iIKk+fUBXiwOcK4dHw9uPTgfmTO42dujltWv1Ng==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":238344,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeL+AiCRA9TVsSAnZWagAAXpoP/AutTGi0coXdLhmK44Xz\n0JgBPU0a7aVOVw/nBvYwELi+f04SOXHUBnMuL/YQBF1pE/cwhat/P3trE/9t\nChBnPG5sn50PCmXWCdp0rTHwdHf0262CIQbf+yYYv4uIHbaxYFVaaUrXl5HP\nqeqYjKdyml7fCorPjfyffNaql2zikp16KwcvMh4230bxcyz9Ltrs4WnNQZN5\n0GGyslcK8K1ywRLVqmCCGrf0Tp2peGfkoVc7AE0YeR0EuTCNRc49nFPJwdPQ\nIIZbGxJ6ntUBZttDTqVH3HmOvQe/5hEcJVI3adBBuIKq8yxgbs8qQ86ZakVS\nVIa8cVYNB4YZPzfe2V4s9KgXoPEFDDD/UgnooB1Wu9OA8dcJl0f3BXTFrb6G\nDC7GpH+Nm6KpqsE9YMoUET9mnRQhdfpNKrbKtUajlerFBMrygO/xPSdn7rG8\nqPmI7b9q4XBeWEPXPdTDvn7D9KnEI27C9/mZIN9+trWmkZasF1o0akkzG4OT\n6juwn/U6XuJUr8slhEoDXGXjrABUo1QTUszdg8qPP6lykJfw6WUkYqU78QbI\ndYzrpK7zNq1/UhXSnWsfIJZy12kHw26pCz0N/r1pNWhp5LIcjUPA4cE+LIFa\ngwm8j0RVNjZENy/9WyQqQ7okH4/YvWRBqfZChDyKxycIdEdQGo9cVICMgrRT\nblbv\r\n=S/B3\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"8cec14be45614573d1f60faee0e58babd8ac3867","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.0.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.0.0_1580195873763_0.9026259741176828","host":"s3://npm-registry-packages"}},"3.0.1":{"name":"hermione","version":"3.0.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.0.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"3928799a50302d04cea7b5ffb074a62412b90139","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.0.1.tgz","fileCount":91,"integrity":"sha512-swERzKhTOKEtUh3H88v5uehCSSo7ZiPx2fTeqJ1XM/q9KmHTgmqPLlSIi6UCkhxuiy2njyu9CfD+bTq2roGfHA==","signatures":[{"sig":"MEUCIF0FpNvBWqAVfPmHb0MN8GqlLGqIJUji1p0DrJiPDrHvAiEAvG33lIbHGB9A6Zx5MqcR0JuAh82fiFahsPTWSWteQ+o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":237013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeaOp/CRA9TVsSAnZWagAAr0cQAKAVz3Liyjqh/u4KZa+J\n0mYca7jRWwasODjJtgH1HlRa/IKusavbTEpsyVLBHAimtejBuyYVqj7IsGYs\nkFkkSHiy6BEtKh71dZF+oBjRpWhGhRgee86/y+WGiUEp6jWrOOlX6YgYP8+h\nEIWbb5w1CFkCuNUByHoKT5SMoMvu4HIF/bJL6XAJSmJj0sk2jDGMNyaKwGMZ\ndDqhWbejVxUBl7tRRhcswlI/tXfde6Fv+bcFlzQD/Q0rYuTQMlDIQlie0sRt\nz2AaNqdbbxOGIkFShvDDudliIM9tdDmYD8OvFUxT4uDDd2sRR4axAxN+p6gU\n909Vknc/KjKX6uRUlSAQnPSMIW4Mm18pQ5L+0WbVvYJcW4bBESHD9dzL2Gr1\nFm2sT3iwKy/sr+GeLcddyOkpmUP/bX+RmT+LBQqZDLwOu0z/3V0yceXInNSy\nXsQ8GSupM/djUMijOCEt0pBJ0RkNINkhloUaDxYBEDmhSfUxb6/knMh29Q3L\ntKVwYERrCQ6/6xbQuMgoS32UGJ/HhEI+R2MAnsZuiw5OzmXdz+HSWHMKpmGI\nI3WO0vRSB+XPvcFbSN5bMuWQC6RVQ6VmvnxZlkLCab3NmhubBGOUb1zOK6AF\ne3PrmOw/ublu+teuWHEkhvZCoUDn3+3NxamnD6sdM1sL33XIBgwYdzT8iK28\niZjh\r\n=xwBU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"43f5e188d46e4dce1b855fdc23b8e614581d482a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.0.1","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.0.1_1583934078686_0.1706894648935786","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"hermione","version":"3.1.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.1.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"d41982e280d760ad525287d5a6e9d204b59a6a08","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.1.0.tgz","fileCount":91,"integrity":"sha512-GZdsATiHXTT0JUZha5yKAhey/MkWZhxH5HJKD486l5t9zN6w0LwU/58r1D0qwOopqeR4ir3HVsPXfxT29RWxHg==","signatures":[{"sig":"MEQCIEB9zj8uXgPG8PowRwgeMBdgcZYEfajQVkeOPobuEt8vAiAc7bA09pTSMQZa7vpVLmsKzRkddceS6PCDhaGh36vSCg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":238115,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJegQO+CRA9TVsSAnZWagAA4mgP/0l0Ja6XlqDciaIv3dsX\nvSJEmhRRvv55cOsMwtcwyJV2AKwmcPrrwvvHQMqJT3gWhsPG5jHqJy8vNUna\nxdmwXmIxcuaIgRRYHxB95fbAr5AJKoau9X2XS6Ha0mMcjnvz7F4V8POD9c2X\nfQ32klzkcngcgAH+oeszOxC6X6EsnSWeQOJI9ROORIezUKMj7mRR2XFUUhYt\ngiXhDFONa+CJKTC8MytLxxialJNRALAiFSRY2NIOGY59EtdXz/REmD4kJsG2\n04yxBByYmBivdvgTFm9RtNDS1rx11n2acG9dwRpPPhOaTWLW6ACikBqsGIxe\nfnWRWtKUpK0Nr2toBOH9XNJv1HQNJ7HFjm4dWDKh7MofMBPGvQBZJw8rXZ4z\n9rEwNSwaWwZH7Xc+BISmUOwHPZFgA1rUw2Lb2anGAjRfq5F80/P1bVF0APdF\nWxI3echWizjWj/w++C9FwsIx3JwPjyk1uLNyBCzjJgYzcSFUexFjaGiHARlS\nrdc26qrR+cbZnUvmXn0Be3peovuclFJfEHvwcFe+dn8lqCVZG1e+Tja5n2hv\nX7xvJmja5JLI/3zUEkoPh9p1y3wdgBunRYYNkIljLlmPOrDQ0X5+tk/naI1l\nIAWd9XePLUo2KZ6yOTXgCb765t5fQHBf49PkEKSl0vD0Rvfrpx7Kvm5OPhmB\nqN2B\r\n=1o5P\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"e46fec9bac606b141e90ef71291cb30c15b68dc4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.0.1","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.1.0_1585513405257_0.3044899422519829","host":"s3://npm-registry-packages"}},"3.2.0":{"name":"hermione","version":"3.2.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.2.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1078acf84a62fe8744b98494689d6edd49bf5358","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.2.0.tgz","fileCount":91,"integrity":"sha512-hCWXTSL/+i5gLRFYGAO6pvPPb3NUmUobPG4csnFu1r5vX5SuiZ8AKZXuDgPfr1WYqT9OXdnyU8gb4rLXdWV5hg==","signatures":[{"sig":"MEUCIQCZZDnFGjSctaRJlTcGN17XbnBYePx8DBD37xsQKlItDwIgb+F4Mb8oPLoaL8saFk1JI5AUbWk6lfF6kpBB9OMk/FI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":239243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepKJpCRA9TVsSAnZWagAAEFMP/jZPpuhBH6nQHhMhxdss\nF4OMLheZOtjeO9zbYYmbxYp0KzcdnaymkBFmCrbACll5RHfHQXdkz40yvfmI\neGHk2uEc02OaI2W9PqOFXN64zpkf0nt7f1rqbp3Ml+jIqWSK7yyI2jpbiCvK\nToB0/X1f4nyAgt16PbnkdqQliz0JyvmycoPS+YMcmyuuNP/erMSzMSz/zeD6\n6aqJ52GCs3WkCSUMDRV35NgBRDBD/wryld2ye9cqESXnsYuovoSnfgcZxw55\nVQ25tK6HIxf+cv40f5Sx3+KqmLxiFIooCS0r13xLM4AaHdpMN3pUMmxN/z6l\nkJA8wE2DnooEGXeaQN1p0JCO/zj2P04GBzY2oYGmSIXozovEX/9nLS5NBwdP\nVpDQ9iYjS4mWljvm0n0LLs/AKuY6xYCwoyPiBecNY6JhZ/7F2r9qpOe+nO2l\nskIF5h75GllrYBhMQ956uEwMI80Ti0IoA7N+c00zSQZBCNSg0dfBwzgrMa4P\nptKvd52PpCO8WH2ue0D6TBNxx9ap6e2rTExKVenasXCFcUO3Eo6Vi1mEfDRk\nhpiDR3ewxoLolMHT6we6rIvWRC6xVRAHbl8BhRXGh9wrndhyCvtdZ575b3To\nxGVcfvyfcVm2D5MeTh3LtWzMkm3I2nacaJEXq6Lkga9pn4VOnFHwEIxIxF1q\nMRMv\r\n=QpH6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"e71c5ad7381a57a376d1b4644061fd0be5480170","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.2.0_1587847785079_0.3904130798889931","host":"s3://npm-registry-packages"}},"3.3.0":{"name":"hermione","version":"3.3.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.3.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"37b357582bf3fee9ac7d232a3d1c9ee093d668d3","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.3.0.tgz","fileCount":91,"integrity":"sha512-4wzFk8BxZV3YMl/jbdkMZ1z5IDj00E56ZcQyn9NBPITLCGqUdPRSN2zaVUYkxmfEQO+Fg6jb19fUW0fsQD/XBQ==","signatures":[{"sig":"MEUCIQDBEMKpsWIhDHa4uWI4fEF8gJsxce0WBPsqtE2frh86agIgXWH1ySArYXBluGn8JGGFG87dmakGB7u7yMAOnkhmIxU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":240260,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqTByCRA9TVsSAnZWagAAYksP+gIb/YoRIVeTSHSf0Yme\n7qq7sdJWUikCV2SUTuakIfI7FHtRAfj5zNPhZZbe+L0FYU+ZgGbmbFRLwotM\nZ6u+3F2Jh+QnrsliGZaILJDHT2MDOo9FDXoB59x9cmOONdjJJPFZpmTdaUgD\nyM3GGPVnUb0rCdN+8wbMEu+VLjdEZrAEoJI0WAodXJtr25lm7ClaHPS/RRlh\njviV0Gig0624x5vpYMNHiVQ0yN5VrbOBkqlDm/1TEz1oQK4R6gZPetF2SgC+\nuqpQ6j/LSs4+pTnYZqCrdAxQGNCifrOUqk1oGtIwtey9IjrxkzOOaiiSFlA4\nOFpTbPSkPbBYiO4RYDWt9ea8I+vMS2LL35LFaWoZykZwOdXLr/ZgvbWhkDa3\n99xwle68OELFK7BTkWRfbiCnUpgIZjkeUej8x2nJ+dCC6WrGRMd93j/iD60s\n39zuwgFevb9GQ9vW4RXqgn6+OkkGdrUee28ry7VfqjUPA35mE8XLbgQGE/Td\nTMsBomRdH7KSap7U5l3GWmDBe1oYIoQNH9NGAtJsffeSZPMyVEbblQhMWF5B\n3Ubo5vDovia1GcEIAO0MC1+hYxkqYhpOpZutRTwJLbsokND6XrdeJUEph4d3\nSnldN1+moZihCIL/NOVmygKzgYDuD/UOlTdbsCJUBLo3+LVEixzImWgb1GwK\n8poy\r\n=Bt6X\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"567ff9ff717f323e4d2fece97043dc3ba8f14846","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.3.0_1588146289486_0.6665550988376923","host":"s3://npm-registry-packages"}},"3.3.1":{"name":"hermione","version":"3.3.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.3.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"895adabad9d04392085cf0804ef5d30fbd27b289","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.3.1.tgz","fileCount":91,"integrity":"sha512-Qf8h7foSBTsEyVVoqlPT91zCbv4eIVB2mEEba59/t2zUUgMvj2V49uaYevzmpNoSShJ0eLq/DTUs6cxPVf3ATw==","signatures":[{"sig":"MEUCIGRmJhCcKTELRYSenoiUTQmFHVOB3L0vvMCfM8vAkKa3AiEA6+qi4CLT8NiU6krlUccDWIW1a+fszShOeZ5g9tzaZJE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":240376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetqZiCRA9TVsSAnZWagAAEYgP/2A3wFRUHUel1C3ySq2T\nrKIFEV/iRIcEjcrRaNUia4OlXR3accaIwAwIqOVg4S2bVa6T7VDDIHHGRbq1\n4arxXUL0pbHUayS47HJ/YhQsxb1k/jWlwkq3Vpfo71eWfHLww2NEsn1IS2zk\nOsoKl0G7TgUz7KXVAhz5+HWHWToLfp+cPwfvgBVQFTV4Dg/nfgibOse674CX\nhVwE3+FFVZp0RaT3mIhi7gAqvzrcbQNSjhlnIxQiBUthakzRfXT7/7MU6ftE\nYVmU3Av+wVCFwftaRG8M7S22LXi8gRGeGyp3Mg7uRAixV9qHQleWcYLiXBY3\nXj6D5bLG3XeavUE7grcTwz0Wn9GFPVIerYmrASCT2SHCDRyMRFHKTbJbmr2u\n6+ILUjtQgw8dEspuxucHuyhDxk7q5TljB7HVdpuTKLeONQx6FFYV2yBhvLEO\nL85ysB5VIoKjYF9nZXaVkhM6b2TGH+KyMkOI1qMFOTb3ERENK8RbbZPWL+O8\nKwNdPJLYObCtw7H+P+uq1rnygmopTJdle72/rNlme1OJvo7OjBxA8WtnvLmS\nPL8D8PUn6LBiH6Kt+v9/GgRcqtE4BLhc9ZO+3ITwffSwPlC+H6juK0Hk/OaG\nYwj89H4/nKhTVc/4Et9Kgrq/M6CjQHCtBgPc/N9ls5FjMHXRfF9dcl+nJ7vh\nUyiQ\r\n=GSCL\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"4c8c8537ca4048101606e8dc07ebe403a00b1215","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.1","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.3.1_1589028449620_0.5154067732077088","host":"s3://npm-registry-packages"}},"3.4.0":{"name":"hermione","version":"3.4.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.4.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1632174a36a2c68c8261b66c03400a4c45607bcb","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.4.0.tgz","fileCount":91,"integrity":"sha512-Vss0r3zz51fxcfMyQVqTmhQMZz+vf1d5UWJodLGhVMS1p8W+VdqdchmJDFssnmu53y7aOadp8tgU122VvkzpSg==","signatures":[{"sig":"MEYCIQDMj1wajLSjZ4h3EWE8Awnyag5ABYP0mWD+Oy+fE+jr1QIhAMcyuVGElTw7EKw4yLND4WqgQQPo70UJ3vZjkNsGgZzs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":241324,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1RrxCRA9TVsSAnZWagAAqL0P/1O/igHiImERZH0YlKqI\njcs4VWTGcxktB6yn0eq93SPyC0inWfKE25Jahgg1C8jW9oK9GJm6GUzR8mSX\nlPjzn+uJibqvo1ZYqoH2sd48z4P+wzcqS8AvLDwORDfhMFGEr2wSGh+VW7MH\n0ZN8ser5LFw7iJrlJ/8HGMs+revgjLywPmixaPiPQ5nAl5TvMU+JrNYOGCZR\nkKSQtZok9FIHvJ/JtWbWQ+hIkezsEmqvmc+PezxPisXQR0bU839NuKn6HsSR\nhonptyzesV9VQRNPx4VoZP2tpAhkCP0RUaMEQCCIuNgWPprzba1BQlxZaBrS\nta1IQE8q9zMYY/BmhYhwCtefULTe8pJmntscSvYF2PTqiEA2+0M/F7pwxXrJ\nYy7E7+3PNw3LLBCrsghoEf7F8Nmtfzx6O0gHrsax47d9d1hT8h60z6XD/4YD\ncpzjLGR55ieKYlb6PD93gBKZlMJ0xclbvW57bs6u092RIwEn6vLLlws8F/B6\nPkmXPf1rLugxampYPyi0gSLGIktCRyGB1tMwnSpYxazkxgCQAX/yTdP3Bdoa\nZ/TIhUGKzTu41OAJDsOJ6iBk5fSQbSdYCqL24NbvILr9WdYktZQuBWlw8G3a\nL8QKybdFmSzu2DeR8VgzCpcWc0fe+diYURq7KvKHZ6no0IiU062VRaxaCVXH\nhPPv\r\n=VhZf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"e233769a959c2a10d200f4f9f9d79a2c7aa5e588","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.1","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.4.0_1591024368970_0.5087908403720207","host":"s3://npm-registry-packages"}},"3.5.0":{"name":"hermione","version":"3.5.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.5.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"db18957da515d8fc02c5e9de14d30f54f7d8cbaa","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.5.0.tgz","fileCount":91,"integrity":"sha512-xCI4A/Uzrxpf9buFxJ8qRtRTTFEDFuIPUe8pDXjRjHzhtRbLgP2DsTdANMYfcSh5996l6crgcKa4evkwS19/hA==","signatures":[{"sig":"MEUCIC0GVKBz+H6JRUtsiE9ak91lPueLng2Ko3HzVWe/C5VdAiEAsRVLSOG8hUK1m2r1iA4zZWtOOG/tPMqLgYvzUtHKweM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":242627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6NczCRA9TVsSAnZWagAA1AIP/RNdyVjIZqV20rxZKszB\nz36ifnxZbfyj1XYf0POoV0fkqpWaS9fe6IxX+M3dwbrtbPM53EU7JAtY2JNX\nsm5YqVb0FdGRYOUGH07Wx6GZPtayAmRt81HhOtS3OIM4VEfkIpvCo6PMXbou\nzQRZ3cTtmCcTbudF3Z9nEmkoWCH88cscTorN7JWgk2EQyoUN0SphhyhfD9Jd\n39WTHNExUsJNnHxzjNm1H+16kBpCogvb9K8D5Q+zwcZhTGH7+tOaqUNzvL9x\n/6AHLSp2zNDxtrsX4YtC85xyZVCeovuzCH31GxSZR/O0Q9VXmNLR7VZ5Y8MO\nnGfkfEeRTNm6CXT5KjM+7epGMDkEHTEaCaJBxtcCbdYz/yKlCrrsAhf6fNBO\nulL780achaKyuFrMh4h/9J58ZlzIPZ2ML15SJ/UNN2iFrQS6SHeywGFL8NtP\nweJ+SddVBoLX8XMQPVPhvglDAAjV5FelzqdNWgG89jqFWaC6e+NeR2XU45vt\nTv3caMhE/Ovx7e2e7vq6azLq9fSsZ4xyWZa/XefaF8K/nOf/8FqVT89oLFgn\n39s18h7QSDQoaoEwpwD9Z9uZLZG2ZEKCpwr/0E2VJ5l9P3u9OguJoGVwIXaD\noYCV25GYihOpXWwy4v4HTupWFU39+isc0hL41YTnC2zzBi38KE3TPeh8crvD\nZ4Gp\r\n=a5Ej\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"be4a08a758038ae3b2d2905dee781663192198be","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.1","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.5.0_1592317746003_0.31393059842037063","host":"s3://npm-registry-packages"}},"3.5.1":{"name":"hermione","version":"3.5.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.5.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"45a5f6b6d9e97012ccdf0ccdae1957ae9360d36b","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.5.1.tgz","fileCount":91,"integrity":"sha512-o8ou5bSWHUXBhfweQTGYkbE4eo08mYnzN/MDXrP9A4j8Xk1/njSA+8HewlnZw65WyMv7Y0x34xYxsxxVjsQNQQ==","signatures":[{"sig":"MEUCIQD70Fte91QMwVX7MvhC1XHUNe4EBu6LNvvA6lb9hT09uQIgFmkp9AYNVX5zm1MQsN0UoFD8qYePRvxNB47MzyAozTk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":242743,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6O6tCRA9TVsSAnZWagAAr84P/RuhV4je5OwoSrN6kiUB\nkNoIiwn8sgEuo/pozxxMOIzhogRuTz33jAqs9rbGpll1WgRT9Yk22DfWttMU\nXLRqaVD3jqSUHEbGapbjs2/UIpvFzIsXrh8g+dYdRVjL1qYkTWX4rVzVahpc\njKWcBoszZKrUGTVdSzlO92mg0RuKX5dnKYZcPWhIMJU1Ml9V3N7FyJKLwaQJ\n1kRrZb/us98Pt2Xbeyo29N+VwgV9JAJ2a6fb7nh+DvyENglqpMiBW6MO5mUz\nOt/q8EybelhwcxS4EOX98ttPWidkgnMc+3ogZ05w4OyxJ2XrpJ5YbekrdZ+S\nRM7akwiAQ8dLE933vWtNTfaAwobtvuc8UAzEX46kg+hRyyc2d504alslmPYD\nSea8AEnmbNgdarsnbYojxO8FA9PLWpeiXT5NdfX+RBDpza90bDBDH2f501qU\nXIdTH8XjDM5ei88fUS58T3tKHJ0Y1bIf/B93Ox809o379bxhG1vP5/cXhHV8\n4YDSVzvzRH1RjSRewfGMQQzvzPgn3OLc9zIInK8+ydjrb72gGjK93SZLXOpm\nLINrfTd6Q02W1e+lFzzVIDgubaXqR4ZWViHYtRtjnwHpybwMHzQWUl/Y43RG\nkLqsk5Mu14BYK+SATHX2Re+WSeb69o7773X/1Sl8i14121grTN8NIwonAAuq\ncZ4m\r\n=J67A\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","engines":{"node":">= 8.0.0"},"gitHead":"26b2f87896c71b3e9c731f9d23c1221b76551779","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","gemini-core":"^5.1.2","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.2","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.5.1_1592323757218_0.8066660865145729","host":"s3://npm-registry-packages"}},"3.5.2":{"name":"hermione","version":"3.5.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.5.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"1750008069bc4c45f9f61d3a66ae118853d70f7d","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.5.2.tgz","fileCount":96,"integrity":"sha512-h9Hus3jlyXBCWx6HZptMRRb4WrTRvv9mLndWcUz9poCHEN29UyCJ17jIZYdn9BoyPZYR42kfUcXFqAkHfx5Jjg==","signatures":[{"sig":"MEYCIQCBWJDNnmnh8FGHnzzjmEnsr0RQyAVeFvHiUFQWBvhaogIhAM+yao1b0KXfe4vVesDX8rsBO/W2MVsuwd5AZy/hDD24","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":271190,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6Q/hCRA9TVsSAnZWagAALI4P/jq0hBo8lPUseo3v/FTV\n6mEO6dzQ2noV/xUyGr/Rit5T4jVNvEDIhPiM8W94SfPR8C5XnP7Nd355/qr/\n55LkbHEtoQUDaH+l2IjqxSnSIPzLi8kg5IYz9QSSw+9KLa6CjUbh3zrbycLp\npnU6k2rIOIc7P8vlgGuzpW9ZZawDogvJwLYBBXyRgnr14jBrhqdaPUl5q3z5\nn2y7iSAWwEt24vGiY2gLXvLJm4uqznPVuBzmoFdvseCYy6EQ+QYrPgaBl6Sb\nuvExWxjU4LOQUXb4to/XMqgjJrUzVHpes1SKD50A0YI+NbNHkzNlC6FhazTi\nfZdY/51nl4Lxj+dPMsP/kHxxPpcUNwT8/iRAK2GiY+Y5YwCceY4ggOMLJ2Yc\nYPe0+KlTP3QPinxLm+H9Y8q7c4bZFYnSjCWK1MMOf0zZ34MeGCbQAx/EK6m6\nn/nLNg3dyq6nOHRGHA4VDidJMHtVjXQHwBzPqqZhc1S72zN3Om8taGm/RSHv\nAw+/dywmmPoP7szBoLUC6CQ6L8bEZmSXR9V4se8D0u6eLRwMfcYBogPFLs8i\ntNygoSp0BJu/5aaJdTRj03ThiM64upmLpTxSPSlSds5iLY2AVg8xsTt2LS0G\nxSColWMVp3ml3FsKasmxhEu/SESWZWPr0mTcpllCXvUQSZRbOgxE2FXvl3aL\nvMMW\r\n=WF5j\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"ec62eea117a29de53286e2df388b8e588d50b60f","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.5.2_1592332256301_0.20310854443408832","host":"s3://npm-registry-packages"}},"3.5.3":{"name":"hermione","version":"3.5.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.5.3","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"67cedc4b52d6c69fbad572870e4849e8a906f215","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.5.3.tgz","fileCount":96,"integrity":"sha512-5QZC+S2R0c3ukEoUBHFinB6n4kRq4Vz6rsYZFXRAgD9wci/snnOlNwsPxl2+ht8ku6T7/6TPM52kHnFXObL2aQ==","signatures":[{"sig":"MEUCIDXWY0TNNJzRLQIkBwy6Zh6hj/5IlDkGZIdEZDRYxoP5AiEA1vOTyzVJB5AYxqQeIWS476l9k+JGsQZD+y8HDS0i8ew=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":271428,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7niNCRA9TVsSAnZWagAAfkUP/jSRBwGOgd8LT8+4K+JQ\nr/AvMZZxusfiHaQcwIPT4cnyLaCcdVfb6GNFoAVuYFoFOhZvvlumGMSU25Ey\n1nv+ls59SnFlUetv1IV4pKtdxayhgvRcY/3bVHM8+L8fzlBhKMmsGJwBx/k3\nuHlEuEj39K7nC5ggt7/SOq7oAdccu04GifB4TbECBt4v0+r0WxdpefVreRQW\n6EMivAEkemRcDG+De+bm0PxTS3hDJgBDQ/QIvv6l9VEbZX37p23iLAfPPLw3\nj66T8yH8fmCk8PLDB8wZyn/+OhcdAl7Kxqs85riVUxJmusIDABXOu8jRyCo+\n8zL1ZWYNjLCrsa+mt81gaHfWw0J8sfr5g/yPIIy904o7UTMqZQtSsttrOkJQ\n8X5m1Y9FTgUSYr5qDKmzX4pJddNWO1nZzB9GWYz1gy688tweyFH0oIPdz3gw\nOk+7OB45klKBgsXRGdv1f+fm0pNJu1VsERpiJ4Pi0CBG4AYrZ8l9xE9n7R3w\ndP/XXUH+FxaSqvJ61QantYltQnESwVcKk/ujI7+JHJ4KS8P2id9FSVkoSaFI\nMoRgN7pImAVjcNqZvps29aLL50+A+8+p0NMCaGE/Pc1/gfNPVNyGwS5+5V8U\ncO+peYMu6E0KkqQzpRMD4s9Tudam/cVWSBxJ/oiPCf5ECQPq4PWdxoARup5R\nJOba\r\n=ow9I\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"5a16fe850317df55ca50dbc88d90f504a36624fe","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.5.3_1592686732615_0.6524358896379301","host":"s3://npm-registry-packages"}},"3.6.0":{"name":"hermione","version":"3.6.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.6.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"4cb34874a6fb07aed3a92fd9fcc45634c750a70e","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.6.0.tgz","fileCount":96,"integrity":"sha512-megdiGgAXaF0DyFDywusWmbW1A1P7biXzjbihMZsG0s691tUh8q/pUVeUCgGCitw9O4afGRfTcyowtKmf4SfQQ==","signatures":[{"sig":"MEUCIQCP2tHFPP37YL4EqfodUFn+K0Rt3OXfX0TKcjzhbLqPTgIgK+stkVLw9vtnbctUx0VDdO2h7Egbz6nh91JzxCtAlgQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":274085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8vzcCRA9TVsSAnZWagAAKJMP/3N5kDlKqYChADJp5F96\ncKo5+jGW4iLN9QTBbhUulxBqf6dREoI2rJH8krr1qlRBCRHu3DD4IV8UCMsV\ndGc2EYviis26siq+7oZFmlzO4yQGHwjZU1A4/e7k3qDa2iHurbTbwb1B+Kx4\n3qn6UHwQgwLOQjsMVG+O0FB5x2p/RT9DOSWi5L2+4jIvQ86i/jutZbKmWB1y\n/5W7g2BhfdGgsvyud5HX0dYMyBpvAkHISvl6K1CaE7HYH17viKk6ZcXonbwl\nE5nBrb+71ghBQpbNPAsEHB6Qm8xJSyAU6/447jZPibJZ5wRO3iy3Q9iYcd/g\n+bGwOYSnCgXT1JoatAP8npbBaZbBfrnOGW7JbNzSjstM2fp06P0AeEuFZkJQ\nqcxuvk6YcInueH/iWg2Reycp4DKnfWXLjKWx9WoDiFxe8DSXku6PKkd56Q9L\nFTiGeJjmX7kFHwTw4cvcBRrWrsOXw4O6mKtCTs6ZQdJaIbzK5JvE/CSEfpGh\nak1+tiJQmLv2hjvyRXEOe4Vq9zr95Dk+010KCZ0MdCLU/Yf0PV/gh7vSQNCQ\nHxiAaCHSGExpdXsmmJ3Qz1F9YpqMe0U93wc8+p4TeuQ28OiOBTz+erXou/hd\nLVlplyQRF2HTlU1lRsZYdGD5FYhUUv0l17jqi+ukULPrP+dTo28RorNWq3A5\ndrhO\r\n=r1ib\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"883d0da24c6deea82996e67e857a1f511c8054f2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.4.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.15.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.6.0_1592982747937_0.773435058371341","host":"s3://npm-registry-packages"}},"3.7.0":{"name":"hermione","version":"3.7.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.7.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"5528a7d8d84f122ec3c4ef0b68b55db26c01402c","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.7.0.tgz","fileCount":96,"integrity":"sha512-dmoN0+6b8fyiLJSQxvG1s0JGSjbZU2mFHQ7MnSXelUmp+o3BtyPnSHtmmkDRyKrCBAtrjqOeB4INXsls2E2KFw==","signatures":[{"sig":"MEQCICn3Uzp6VUKVQU4EEBOoTBbxwEfmSbwdmYHk3U4do8skAiA+pSKysL6ftmf+4ucLfXLtj+i3XkgCn4A2liGH55Zmew==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":274798,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/Y3QCRA9TVsSAnZWagAAnasP/0UNZHSD/7c5KY5I7bA0\n3CMWoXylsMYVr9U286NY1xpehhwxiT8QI6Ya8aAtCefUld2pCPS5flVsi+TG\n1PI9IrY4OjIo2oRCQ974bLDuB5nSkaEP0TCNfq8/WLdEKB/SyXRrwyhkACv3\nX2eAotqq6VAX4j9Eoy69lEc0im1QCqHiUXpYuBT9CNI6UUYk1N5kOuXDkzCp\ng+5rflfY/Ok6XuFS9LIvI8CCXWZnFYStxVlb2pCUHsrnnfr9oB3D8ABjK58P\nTJiu7u1dULO6bKT02tRSfzrzpTNjkTOswqoRZef3bwR3lUK0M59UL/YVAGCZ\nx6CdEdy49daBs7iFjls2K1XMCmrkNjtdFZa4s32kEk5WK0zCH2d03+HSbTAf\nYe0lj2MfP+FoZoEtzDAhg865D2flDxJcGmiKc0BV3i8dPEMCAAPGkiuDtY8S\n6SFNL/v2F8EBUnHrVEtmJeXsw5YiIkPW9gRNGSExS7tMYFuiHvnzuTL+6ptJ\n1KCTgZv+jLiouVFkw3KPOQ0j4bQqQjkXrHhWuyr5p28uhONIzjY6TljdL/tz\n6DdDM4GbA9jD+0RASzhHbfHxDe/1UFjNiB0T1PfuP8s1EnBCdsCsWFLaJsH7\naUJ1oVrcVUZ3/B2qLE2SH4x+Dz25+p6QZUOV1l8WoeJOs7TXtnhtDi2H3CWN\n+5YJ\r\n=+TQt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"c592aa33b4e2d4d716e229b144db6652939a690b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.7.0_1593675216121_0.18828483296974174","host":"s3://npm-registry-packages"}},"3.7.1":{"name":"hermione","version":"3.7.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.7.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f001afc4116201e85cd4c014e125388b261a3bd4","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.7.1.tgz","fileCount":96,"integrity":"sha512-M9V74kNSdfdqp3eTl0IfNtpqcHrVgNS9ijQjmp3vsgLLrMNTL1XeMZVG/hGAz3WoqKOQ7OXfGpkWf4U14MuV8g==","signatures":[{"sig":"MEUCIA6gAorJhpAl2g5SvMCTswwf8JGcDg9MsE/LM1xsoRkGAiEA4L6pcy+80XLxTSmCGAoB/UzjK5l1F4ef5or2H9de2dw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":274914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/h0oCRA9TVsSAnZWagAAz1UP/iJddhQP+z2rrRzoSM8g\nZVdrpliktM0yD12gwWv433AE5EJh6/q2Zl95ggd1a9CAT3GDY02dkFcFKjS4\nBl8t5lgbez//JnHdChXxf1CioYj8cD06+QPe8SKhn0k/fJDbx6SqlmUNIOzE\ny9YnVA2syGlnuKQa9DJD4hL+PHLrDvDiEcVAQGl+WyEzX0AKZ1i9SiASvEDy\nAgME/C5VYfQRVvBtFeksmElnZhS/VwrR7SKa1FIOgaBXMkdxYDV6jZfLt14j\ni07kjulGZLKiuiw55TqN0jytnaxwcwii6RtALp01FV5bd3/wucAgCyjgFdw0\nZO3xVGMxMb4j9j3xXacxDtf9WzNpSfAzHSOE+/zvnj3l0ZsFc/tYn9Flwj48\nuwfIG2m0u0VUQliyExmxKwtoL4UDJ2ZtjqJ3uhqDIItlYNuwiM66BSF5L17N\nDDKOg/7Q1KY1IJcLBGGU9lL7Nhlk7gEnGDtzu4D0O6s8F8WQp6/hK/eqN6rk\nPMkbak0lNIAKzfHrs3Zu2soeijloy3oGpFGmsGDf43kjCZF9dcaigFoFXRd/\nhJH6HDMvx3u0mOLHNKyutMC91Gva+iEULMWnoocIzFwtETSxNzRkeM2LgTVf\nuQyt8tAtcEokupQwvX9sy1E528LpBO7aXTL89+NrGxoJ7HthFonc4HEpP1Lh\nN8TZ\r\n=BAK9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"596f0493f9f687a03b0c5508af7d49dc10a6768c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.1","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.7.1_1593711911683_0.1725288841505972","host":"s3://npm-registry-packages"}},"3.8.0":{"name":"hermione","version":"3.8.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.0","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"91486b614bf1bdfc7a2a210f6e583624ef8566b7","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.0.tgz","fileCount":100,"integrity":"sha512-Nx2cZrOrJ0+iqTim53m0Khb/x6T6bcSBQy+b4raNzQdt50AP4cNoftZ6+Pb7HG4fzYe/wEjk1PozBHvycNBs1A==","signatures":[{"sig":"MEUCIDNL9S3ATpU8KzFaG5QuvTDM9NzN8NPEVFYcIMU7l4lDAiEAs7wy1mWrEr8pwLbOXb3txdjFMI24S7n+NPCbdfz4Ts0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":279359,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBZ12CRA9TVsSAnZWagAA+FwQAJXrH9+jQjAAd1O3ESDd\nCNEWFDszk4MTqlN/vhinnTWi2ZiADjXWhDtCc4rWQrLhNQSKqsanUCGJeF4h\nl0UZFd5DAKB6LCyVSyX5ZFc1/kaLcLKwBtxiHzL3FcMwU4C/VBCbPPmm20TJ\ntj3Ml7cX5I5+F0HcjsPpXOWfDNI5wTh/iSYHvqV7v34bpbROOO8WUrHZaYHQ\nXWqdR6vdjDWFx4lkRbCuR7Ld3CvUDlidgqlB2N7RlI19sKyrj/mkORf0WOzk\nCapvinRsnxfO8MqqCEy33LGtuVDip1gBIyDZXCl7dkcunXf+3Myv0lNbcdpI\n6vMzky3FJnJ/nmb7iDUOvG68BsSM0ff9AOGhHo8ZAb6NipglyDJ/wDIhpdud\ndDvlzAgaNbh2CMlH4X323c78WUPkWn0SzF4fuAFC3KrhUWQIxJQeDoPIj+aQ\nPLTABHgDTYAhtbJ7Nb/ufoi50j4ObXGp8Juznbfhd6KheUtbvFzmG6HiAuZt\nPTBHUCNswsftbPHHOhq0FWYfd3whHVvwW4UiX22AfQCaEJEoIFQ0qv4A05uA\n2jnm60x4Ru4QxvQyo7dsu22v7AAGJTW3E5atsnKxNYmpg+AlhmEAhMKVcFBf\nh25w0yvveOz6qxY0zckQ1wq3AAL5ORsYAZQwZ+bamYu8McAG6a+Ea2jKbqI3\nksi/\r\n=+35R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"ad2af24dd8a01b8eb7085fa53d3d6b8eaebd9440","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.4.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.15.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.0_1594203510146_0.4774669993540548","host":"s3://npm-registry-packages"}},"3.8.1":{"name":"hermione","version":"3.8.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.1","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"2be4e8e896e978a7bf7354353a329370ac75baae","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.1.tgz","fileCount":100,"integrity":"sha512-+ZUaGdAr5ihW6QmPkJjJuTxFsgs0JtvpyPp8SKDCpN9h4/SjlXYn+eU8rluO7M3SU+hKvKKaojkEqG78Zt/60w==","signatures":[{"sig":"MEUCID3+eyWbGluVdkBo+wwhNzjJRNiWWlukMt8FVw7GSqLeAiEAmnwZHDT62P5OW13MStUpNxZE9VyAUcYGUlK7moNpUBY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":279158,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfEXGECRA9TVsSAnZWagAAxo4QAJACCr0hWMda+jm20CLJ\ndrYf9TGbsvSx8nMbGp0l5rGeV/5VuSddaNKNMHOCAyaxC1LzYP8JJTmvB/hy\nJ+XW1pH+SKIjxuE5lVO/F9UEU9HAblCT+I4ruQ5SQAMPaiZz0JkY14XORbk5\nqACwpwltmJWDssjqz1hrVEpOb3skCNVdkLcCSFF9o1kx9acS7kHQZkT5NptR\nWwIN+M9h7tbdeLdM3uaT+/uTNsSfEYRf4dIfh15/HZUPAQY1ZS0JIi6UlUXF\nC9HsMLYdwqL5A0r2HcfrK/JzBMxBw2rNzEXHPdoFA2DbEFto6vSNAkfRzABb\n0hdAhG7Uq0DtbsvytVoT0Gn6wP6F29RlXdBAnN8htGGFht9VR5oqtSBb6wqH\nCuSJHnr7OxOmai0ClDRCq5cDmRujJzxTuriLmv1d9NjY3tQ0270iRDLUfgle\nIPzhSiCPfEljpBHKWYY61cWY5xmqBYzFiJje/sYh/6t2JZPsmFay60MDrFu6\naU0xW3WDo0D1J5bJSGF6OmwFUfB0vEWzz6no/2pIy36qgm3al8cZ4wZIJh8v\nfgqwuK+JbJphsrzjbkr8nt8EmWRuclgOeCAQymVNPcaYBiXFJOXZGBCR2Pkf\nwAl6/wzup8YQ3hNtu07o+k7JMxDyqSye105qv9AW7WAvcL6mKlXikMhunM9i\np0Mp\r\n=Pg8o\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"e10a6e4ec568e4637ef6491fe9e5d884233df48a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.4.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.15.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.1_1594978692160_0.2676307616673641","host":"s3://npm-registry-packages"}},"3.8.2":{"name":"hermione","version":"3.8.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.2","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"./bin/hermione"},"dist":{"shasum":"29236baf4b2a7701a5284a31ecc1b2950241ac94","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.2.tgz","fileCount":101,"integrity":"sha512-9qkMGjIlHjoF9+G0gE27Jaj4YUOFMe1rTYLPOM0d8G/YJnn2noYjrtBotRcGpVSvDGcBuqegrki7QRsqcLgJBg==","signatures":[{"sig":"MEUCIQCnFUA48mDOmbEpON+38TzOqmZZEaVtHtZ8cWk8BGTdvgIgPpVgR3z6QINsyHCWWHl3pRDfN9mtDTwS2fhfJKcJwQQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":280691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLVhHCRA9TVsSAnZWagAAe4IQAJjxwxwt61DhuTGluNaO\njUCragyqdCFAZY9DBRk429g7mcEwgZT2002LRVwK+zMb623Ejutl+ewWBAAY\nmhlg5UgeOxUFPTCe1KrJjA/x/E40kheALbejhxM8WJmZd/asJjJ4lT1H4f9W\nSJf/bzakDx/wLQNNi7uDg/5nItP/YJRbKo9NstF5KjWAHrpYSzw4fB8Tpn1u\ncuWCIhMc+WIxYWbk2cI7+XpEL7m1fkfCiz2hSK/m8H6rNVJnc1GHPmwjPIwh\nPlxf5MQ1TgGzwqG9dsQOPiqhPv8Zxxig5ixrxBflc5xjciaiGHMSxWiwzS9H\nX+xWQOjb1gfQX8sEkYfHvS6+tIn8lOHRLhvrAgckkzIWC+WSseW8GW6qqE1d\nDCf0qKOzu4fhE7kW5Kgr5ThGaulBkqx04IgmSGs5wLp3Rbd1+hmvN+qmE7Ve\nbCKkNPVNT+7xbUBKTLBMgddWA3GVcgyjGWcdcQhEdNC8c7DMUnnWf2LHd/mN\n/CHS+gD7WGIJ8pd/Kxp/QlUbX/ilnixlJ/3rztBo/nr3H5GqQzlSOLNm9K0U\n9BaBtZ8zHvivssDj3k60mkeShqvGjeyU3EX269eUlEd0d6Trjtqza4eDFFrL\nvn5yEeQycFKHLlDxggVNLA28uKPdTKzYDPmLNR94XJwGJLvZFAvtHDCeGJvi\nbD/W\r\n=xTRk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"efc28f6ffa1e32e6cf576a05314863fe16f733b9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.2.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.6.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.2_1596807239168_0.9804909157109682","host":"s3://npm-registry-packages"}},"3.8.3":{"name":"hermione","version":"3.8.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.3","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"79d13034e28ece12dffa0d78d79a04906afdffba","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.3.tgz","fileCount":101,"integrity":"sha512-1iqAQiJLQZSbBwL4FjVEhb9R31DtZNMsNd/kx63ILxZ8Ssta8Fgan92cgJGrRIBYcF6/Cw0AT0Js+1Cw4ddIQA==","signatures":[{"sig":"MEUCIAKxBWYRqxL3ojPK7T3xdzmkPsxZrPCx6P6K/fk9lVA+AiEA4fqwcOJBkbSix3F1CcKrB6cvbtAGJI+JcpFcTC3n7+c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":281106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMo4ACRA9TVsSAnZWagAAjqgP/RZEIDpmbAh7uNSgf61M\nX7+SZ/rqDw1zsuKOmacInpRkucv6BwmnKkTslYxE1MxiMQC2RaUhU0D0LYW0\n+bVVqdMDA4/pb3fnllhNt4YRjnNILcIAVMTpTiNJ6ECBXudinKaj4p/Xll6r\nK/qzubtUPw+rskLwTj5Q5l46YHciqtiCnHDZKRMNiKdwRhSgQNfr4xckjSY/\n3RrjwP1+dzW6N8FJbNmotj7+3AuRaD6V7Djk84b5jYcpZ7Gd8AV5ytXGF2CX\nhPYavsLBSvo9cjJ6LxvJkKBBEOExfvfMBNhvnwMp02g7nvBw08Y86qWyBRjJ\nydwoJbRK7WgWnkWxO4U/3KLS32YLaykz0GiQaVBhK+Li3bu0yz0BZfgz907R\nSAf5zxwabeUR/4KtvDhN5/PvhDfS7GRoERG0mONnizZ53x+jST30i37LjpFe\nV4GzEZAnihbnCzKAQSQhLVBwm6vW3kUzcpSa1Yqo6t5X+WDSlyHbPJomuv5e\nsGnvjqvLofJ+mKS4Bb0b0YIvHbsNZZRIHSR59JTAwb2XtKGvsdW1tHVDo0ym\n6k/udWyYzhHvWTNlktpw48Ec6OEVYZblimhzPU688gJzafEVr0FtgyISLPu0\nzv5dy/wLj+w6gnlrvuYMayHFGSx/0bkGNJ7ZBwwzVtIvD5hpRZq4zeneRptL\nYC/z\r\n=aBxB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"49d4bcbce04cd17be68c0b126303ee254cfc25a2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.2.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.3_1597148671452_0.27439027862928445","host":"s3://npm-registry-packages"}},"3.8.4":{"name":"hermione","version":"3.8.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.4","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"20c9571b17ab02509f38479cc49295ae813bd096","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.4.tgz","fileCount":101,"integrity":"sha512-u+7m6d9u7RUSQtcIRXL78DxyhTEdUSFmpRMPlfSIpYfuovXDqpb+RwGiIF4/WN+PPekADCZzJjnCX2PjqncYNg==","signatures":[{"sig":"MEUCIE2rhHOjZXeHszwo7Pva5A9VcG1fsJYrEJyPEtP+x4G5AiEA8VKLMMumAsuW5r/f30vj1kQrUrbXST4CD11ghpUEDNQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":281335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNAOzCRA9TVsSAnZWagAAdRoP/iSP/mFp/zteSqIgLPXJ\nsV7jpZylJK5YhXKFKIRwyP5GrLa+12MdgLvsSYpEMmXH5kM+p3E32l/ZhYKC\ngAKX3CBiUn8JScBdq+u0sknTZpTqiOSs1DawvyRbP8zZCMQz6pqhOeAalt2A\noYuY/WKOdd1LHjUxCav7QQS38SfQj8umrQwNVBfPvbo5gfO6hfjfIkbs0ej1\nxn7sd8mZXhTSVDvYHQhhxhz1KLJ8OptZfYzkHN0In5NtTE25q9Sf5eCJn3NQ\n7xgxIHh7oECvBllGYa2xKGOgzMAIED5VMMX/L2Fa8QEqpH85lAbH5vSEyfpa\n/7idiuVWTjWoDpYLySMwCRnceq5wA+mz7s++fP0NOmgO7rNxAc+4MumvAXEl\nYX/lZlmZiIXz1/LnjsO9gjxcb7Y6H+5ZkSa1RngIXS7wb9DaLTPsb/ezSXgA\nT+nqqU2ku8Kc+aDa4Ps5gCWrG9wnPFvczb9LyKAlCQwbJ6kt74uyn2X8upea\nOlJrgiXYqGhUwpaEL9W9B3I4QDr9XyGPUqocErxFxhYIlBrWxcPYY9vbo23u\nZtApWgUYV7tPbHFgNawjJHU8xh+Wi1BI7tsXtwdZ8muo5jaz7JykTavQdNqx\n6oW0QQq+SxV1Lx10o/Hr3dUtlcC+9FVXhGx3VD6LY6aBJwdkVhYHbWxcGykd\n1eCK\r\n=is+l\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"8677b64298bc080b331a797178aecfcdfdb86359","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.3.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.4_1597244338734_0.17605499746723718","host":"s3://npm-registry-packages"}},"3.8.5":{"name":"hermione","version":"3.8.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.5","maintainers":[{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"d67fcb4d8fe7163a6e90cfe8883b51306cd3bee4","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.5.tgz","fileCount":101,"integrity":"sha512-eoNpgY9WzdvApktNA31pO5MMzOhHG4AKF0V1P/rCRW92aBgb9M4MxTMUmO4pXbF3RCbfnJ2jnuxRHAySNlDTvg==","signatures":[{"sig":"MEUCIQDd16OCsv0swEF6/QS8x3Qr70k0zcQ0W4hwlXTu9TRTrQIgIk1vLl5O4yUn3QAjY1bSbhUaBDgL69/rFbrn80X8HR0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":281451,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfQqTBCRA9TVsSAnZWagAAvikP/inafn2avdegAPqhtRQs\nftSBgXe+fZ3QYGNE+FlteiZdT/kjuKbZeRuTNO6hF7fx9dlr2I39D3p9Oarh\nyPFp5CgoRVEv1LE9EE96g34S07rj7nUh4a0V/KpuJo4bHlekIWTd641FzmN7\nSiasoQ3IuCenS9DdcMvUYyTMm7EVNVviRHXiL/7zCOqRwQbFcDaqMq9IyiiD\n02bIwyiNy79x79tHLpKWuYUFhWYfbb8Uk0Fd7I7mJmhIEaPFhI8lkYN04TRD\nYISh7AFBe222AJeRS8yeROodiiN4ppr3G2cG7/hX6I45m8s+BiqkYzQaN4RO\nU+1kGTWDHN7+noUgKJMFx+E7jpIx5fbLGRZsEkMZLLW/5sZqQ0SP5gWQCDOL\nRvDHbQB8Z/5Ae8tVSvr72bFhABG86+0ESOioaiQinFUB4+ia9XqV4mKspENv\nsSeeYI+Cjf0E990DQNIOgCbUV+31wjJjIaVzeX91bOZ4FMES2jYljY9NhIS4\nPZeW0vONXu3dBGuXGqSCd3Aizn9kRdPbIhGbJGYqagkkxuiixuWk93BVrf7J\nUX/4ZUBjrrx2kSgSQfU6A8hvZbbByYmFTfdkOchCIGA/1TMG4swulujbLHZZ\nm1MpP8IcrbITHVI/a9NvpRp6hq+VojOaljWZm+CorRuGM6JEbBa9wTnkqD9S\nv4UJ\r\n=JQXN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"0980edd4b1e078c02ea08189736945adbcc9a0e7","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^5.3.1","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.5_1598203073279_0.9185339541425135","host":"s3://npm-registry-packages"}},"3.8.6":{"name":"hermione","version":"3.8.6","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"bbc3ec93f47a57e4c4fc8c50062dae4b092d3c94","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.6.tgz","fileCount":101,"integrity":"sha512-6OD22UyIVfjZM1xTIO99y9oJjNe826i2AjQ11v6pRwrt72lvrW2IVyI0lV48L/GOjIb1YhaZTPnjKpwyAYDjIQ==","signatures":[{"sig":"MEUCICexzWRbkTQPJiyheK+RZH7qYxpZ4pKcC3KSWPG8L7V/AiEAq+jQEE8QL1jWDoAAK1TOaX4iXuxXy+B4agfXunBNH1c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":281995,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfZRiDCRA9TVsSAnZWagAAWIUQAKHL9fG61nDKVIc8ZDHU\n4a58oFz3BtDrcS1HVDRu95C5xpYJT0B2SI55k20OjAINwgE0XBkm+XDWXgbT\nxop+9cxw8LZFCtTcJlDU32fwsVsSVZ0UX/M20yvNwhsjTQZe81bBJoNV6EDI\ngKQYNHxbn13qMNa7fYtVhiJu/MY01fTDQV8c9MqUPgGQ7CqaXxGOnGWDFpKM\n4Amc3cckqhBEmmhnvZmW19op3iJHM8b2G6rbp2ZR+bPjBg5elJkwTV5WFHOD\n6BiEGeYu/CijF8GQ1g2K63Y38uu9riOrrquxxobjp9jL4e0mFNDPXxHA86zy\nMLBx8FQXxMD5PapS7wlY0ufvdNQtqKMiywj3eK7BQoXkF3/TBoDslQRT1scs\nrp7AzZ0yig4q2JKAMGxhiQYpAUady9zg3FTFjh5i+tRp9Qx+0KSIvQCTEe8O\nfOvBzleZGTv1bOoRXaZEulIvSHmfAZSyAwxkYkWpFYxmPQXyBeb1aGBEd3rz\n/gndXzsm6NM0wu4NlZg6N7aZt4mPRnRwdC3K+zgzisb82TNT+E3+UdlZXlHP\nqiQSZj3H3xwoXfeLR54nca8L95QgHAkT0CfobC0VseXgylmeI58NY/+oSchy\n+WIQAB63YRcMfVT1WujXpUeF3/Yn6Z16A4J7i704mhHJqGrNg5qZ/wQFBx9U\nCTot\r\n=Fhss\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"2f581225fe9aa6022503f4deee7993c8ffb88015","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.1","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.6_1600460930826_0.13825009983796455","host":"s3://npm-registry-packages"}},"3.8.7":{"name":"hermione","version":"3.8.7","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.8.7","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"29b0596970c9d6a490846e28790aace44c771132","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.8.7.tgz","fileCount":101,"integrity":"sha512-56kYegNWNj2LdSXaKfe19cbp4pCMNK9afsmHYNlWQIfyjvv+5d/+XFQoX9K/qlnZOxBvKI+GgCKpWpxU3apNtQ==","signatures":[{"sig":"MEUCIHYaHaMchnDNOEIqL058FYSmvWI/C0Ah1s62h6qNByHoAiEAn0Ka4Gt2l2sgO6eK1X9gU7hl0KY8Pj9Az1/ZQKRKE/E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":282111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbdgZCRA9TVsSAnZWagAAMD4P/3oynPvadgE/1h+gFBJq\nAu+6oWvPQ/wNqh6qGXUcnRBNyQ4JVQfdJ/duofyoO6tmHc1G7oQ1O5k3y4JR\nwwO3syNCTnRKvuDgCSl7farBUdNTATljluE2cMHGtIu6enNghaPaSU8vW291\nfpsGI6Ev2lHHLZM8+W7qISmJ0D0l46rzLTC1spAOAdsjV1279fpZHRqHFh7a\nK+jDzJdpqCqVIKs1pzoqjELEEQtPRHQCzeUn4U9LdsxS4zqUo+ML2lOBLjXB\nv/mC0x+L74Q7fivVX6fuBFuTc9gDIwi5moqQ2yWYgwQYok7efNGW53oNrokp\nbDIi/3ToMu8fImb0/Hm61IRJnXsB3LF+ydDFE6PuLdQBoB01Ui/jXS8qgXXW\nkw2+5NQqS/mR3Pazq0zkZtx9zqIrDiSfbZZhB7A5Bz1JzdPEnoGR63sQNox3\nKwU1v2zTy8Ct281FxL6U99hDZIozLCBXss+Jj7rZVuUjTyKrA1aKZxBva9t/\n1Oqc2Hp0jIEaMq2dHBzpLnvTvkD+p8+7MZGCUdAyZN8DEoI86h05pYB1qYwW\ndbmqhGjH14epkXlKD45Anmpf8ibwCrVsf8TJ0Tpd35p3+0Jt/AKMtkUsoDi7\n0p3XN0my426neUWM/fnYpkL9lblkgubtaLW5L+eFFCzSYrs+5zMLrg/Y/1t+\nPz+G\r\n=0AtS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"6b26cd133934dc710f004f21d158cede157f92a4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.8.7_1601034265046_0.0642772759310577","host":"s3://npm-registry-packages"}},"3.9.0":{"name":"hermione","version":"3.9.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.9.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"19e88a640fca8b492be77d3561844dec46104e60","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.9.0.tgz","fileCount":101,"integrity":"sha512-H9uI/Qx36Z8Wycrn33xfoxOvAB1R4X0RKFRfeVgLfp1woabivpgFAOHKzi4EtjkmxPghpz3rcwYC8tAU6FmpzA==","signatures":[{"sig":"MEUCIAxp34wRmfHHwNoYGfG2eW/sFekdV7tqNHe5b6CGklOUAiEAopESiqHUi0+GMuj+EN7BmfmV7YVUCxZDd9F2k6fTzsw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":282448,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfcDS6CRA9TVsSAnZWagAAcm4P/0VXklpYnOPNw16gT70B\nVtkKEowL9Uj1iHPO9Vk2sa1+2dkX7oEqgnruU6vYEdQtXlKU0ZkdhaffxGh/\n4CoEak/r/ceI5hEgaU6Gq3tE0iO82uZCHz5L7giE03qFXbJpujuu4kni4Aj1\nFX+SbxvbYg4EmdSl43o+nJr72Mu6vFr1ic7fv9HtXQYCVZH7zZWe+iooYVB+\ncQ8P4mVzTEivmfyBa9cT2IV4wH1+lVl3fqgzn6S4oNc1lcG9DXigzqoi95TQ\n+WsE7cmcwbYaRjJRPbJiC5BMK2Tn3w24Z+E/g98TBlDhNjqlnxteYn4SMLAx\n3BZ5V/8Hk3FAc5iHvCls+QStIFsvdpB7UA2lPvTVit0vPwygTA4sM8oYAVoy\nBKOi6eF9il8YT+7ISETwOdfF4kww2YZ7CKBs+p80LvND1WYc1RIIqAOk8OvO\npqYcUn8dY8tlCHOz0Wjlk9WVNmDDr75Fyo+MMAWq4oyUHi8DfV1G2zg65AIo\nFVjZK/rY8n7ljMO2ngSpB+L8MPtggnEsASle+FokTVE/wGiP8bGGG988rVwU\nAc+N9y2+zor0xtLhTUsdAbv59fVrkv96Ecw69DXWAIuDQ3tscod2pz+7Syaw\nf5PM/zXu9UYQeHdWJxYwvMtfMHMjTCnKHxzQvP7EViqm1CId5ptSo8JpGwHq\nhdoK\r\n=EjN/\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"758225b14603c4b15f4560d7bab7b505a4407e01","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.9.0_1601189049666_0.7485673604855947","host":"s3://npm-registry-packages"}},"3.9.1":{"name":"hermione","version":"3.9.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.9.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"3f3c6d6bb68da37b0747e1569752b3256703e80f","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.9.1.tgz","fileCount":101,"integrity":"sha512-thhAAdnUao3+TFc9rou0f28GLCNbWH5S3rrTuA279Eqbs6HjECUn54yQSDgqwPcLlY2By+CYTL4Cn8c9c5KONg==","signatures":[{"sig":"MEUCIQCpqrj33dOCqPzCxrexIzmXxEJ4YH3dSPSXTeE4YhgaeQIgUQ8vdWM2wYZp1Mem3rcrLV95lCOC4iweqLiBrCbPxN8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":282572,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfrs3FCRA9TVsSAnZWagAACWMP/3Ft3JrA91fq/ZJjeu8r\n1GbO3T7bg6XPK4Oqv5E/8kpyZHbPV6Kr/kZ5qjzKj28t6u1bvyoh5Ertbgmp\nxMAWYwIgO3jvK9+ovTJV/qVgbv/TnCFbYr35sIiHR+yPRsfW5U94JwWaqkFV\nHrsP67XAewW0URCsaDTB5opjJX9fWnTCEVezXc2uPg73caNwS7q8om4Zu4BG\n5E9sc6/GZ6zhJqMRI1JMrd79XRIw4txRuT1k2XLMkij5NeM7+Q+Ypg+xG9/x\nuGgy9ZLTaNZ3sKNGd81+CElyA/hweKKgRlmrzL2OJkA2Jk5CIHiVJ5YH8bzz\nie6+HU9DYrlm1P+BvIWYJugbZ8VC7hNwfEDWdtCyK151XHg6V1y/DQ1iekf+\nAQX9OomOLmV2UxnXBcib9sAFm3yzrH7X6qufboUdnBhAN9hAgMHQDYMSYMTB\n+UcSosnmJtJ3hQOyJziUYu+qOx83d9SW8zxZuMk5m++hueY0Iq1TjcNYK2Gf\n2iXNKhrAfIeqO0UFx6uAXe+pp21Hv2MA3so0SzBfSGPVI3cRQGLTqQBStW93\niYvNDi3/J7ng50e6ousk0piD+wB1TjDEAYtCXZoav7qEVAJdNcldo2ecuuj0\nXJy+eDISm67HvJlhh/KartzCQJKq9L/GZk61XblM1r+OGHpJ67TlgrVLhv16\n3kxX\r\n=4JEY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"4e244783f278b50bcd862e9c6fc76c079d48e9c4","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.9.1_1605291460697_0.5568682492331023","host":"s3://npm-registry-packages"}},"3.10.0":{"name":"hermione","version":"3.10.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.10.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4d6fef236325f3fd980bf52cd5f39bd9a2adf7e3","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.10.0.tgz","fileCount":102,"integrity":"sha512-VtGX3CtFDsW0kQJHI78UWBugrwG/Vj/0/MhvkAxJpLaHzTu7Iy19QDkTHxOirgy+lxvlNDDpxiVmXZ77PCjJjQ==","signatures":[{"sig":"MEQCIAYC9KiXldt3cTGlXxq+ONqqtRljxkO4rEOY7V1uYZJiAiBBZxkkUdjowNHvOsBtLnNTsgipxYP8vijGG7xjWsgo7w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":283127,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1xh3CRA9TVsSAnZWagAAvKsP/3G/UwP5W4GH+VUWszCq\ns65Y+FPVvhPnKS2SRDHCramxogp9EOGYlFYEj7uQz6fxc/WuPWk50lKzFPn4\nqEbUgXBQFjpaaHQU75gxBB/pOZhQ/5JXL1Z/VwGQ50xWBsvHpFOGdgSXZR4h\nw0m8Xzvsfc9Sdmkiy/RZm0CmhBAAPeYSWFjVk3ZAue4wNunsNlB/4PdVoqas\nOMYbuCAccJSq3ZtSLYS563WRruw/Vl6UBzeHr1LTY1UpAEH8N94CD7SgmupZ\n7zbVJC51g4X5sVnMAo/KXMuFCu73frMAkZ2en3f/iIbS4hwJ+fn3XXFXGhTR\nc8A2Ozh9wGarcl1jkCV1JHtLChfv0EfkJH/vdCeu0QTdP2QCOUAYqkl3iSXY\nEkDGU+vs640awZiXSF4bGY9n/khPAP6bGcO7OBMR4L8Kcj8ayRhl+juCC2bb\nDBi7Vy55fR83xT9T9+Y5S1EwkNw6wBTpy5oOwiqePaTlWC6yFHanMWxq/Rqq\nqo70KmIl3ssoxoR7xQQRfQSKNKzqTKnDnC6T1eHf6nsQByAclDwX1G5WKCPo\npzazxPNG54OHo/OpU6ZJuw3VaeiqfGhGTPriaPl6ugChx1TEP1QmDQjGJSBc\nx9C6iTRGcTKNKvGfMksKv8QaOjqTPgeuBBgYbbGOz6qfy7waE/T3Xv9b/CFo\ntkM6\r\n=+2lY\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"d90d8766c6b3ee56b3d5438c4cfc3bb59c829c78","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.13.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.17.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.10.0_1607932022797_0.040556818126506355","host":"s3://npm-registry-packages"}},"3.10.1":{"name":"hermione","version":"3.10.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.10.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"be3e46abaff8d41e7afe04bc95075abd98495044","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.10.1.tgz","fileCount":102,"integrity":"sha512-/8bE/CWXJ/rklWL9l+MkfYv3as5vzzgGViQqi6VuOcmmPaykbG2c0wCH4fE/ILsZHaF98AdQ944pJfxmeUQ5Mg==","signatures":[{"sig":"MEYCIQCYr6fR+8obkDOoWqyTRlfjn25yeRTmBE3DATjti8y4rwIhAMBPrGLk4cQKnIoFNLUV/2O3KlPmHkiXgoX/RiEGQINN","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":283400,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1z40CRA9TVsSAnZWagAArGYQAIvefZQ6lOmYoBnWUSVz\n5E5IeZbDXooaiCU8ecH6PthqXS8qejkLmEVeW+usOfKnWqtaL0a7Mh8YwrqE\nRNmvrUkla0Kx/lQvd79cojWikcKkBq/nVpoSaWQTiBPjk6dpNTVo3unUmGmC\npRvaT3iJNmpSXlmvr03Hm4crOCzd1A3rwYv4DqcO0FQQbKTxGqU9h6VjmyGQ\nP/U9DeXkn/lxtSmULmJoloXKtELYhUqkfWNC8KWOgl7owgV/HvMWt2x4cBS3\n2DhWIoEiKye/hkKMi1Elr5G5ctTtkPg+hu6wM7Q1LdHUdvPt5yAIqUb8GHxX\nvoMvS9JwBaiWrTtC8jx3A9VG7mK+2kej4kyNYSCB9DVb0TE650+QHk63QiBZ\n03fX+ReYjHq1Pjb+L51X6nsYIGN3kWkQRnawFbZbvY/XcoGtdL1nzLA13APL\n7GNdf4FgMS+8QZ8cikglI99oPVX4jfBWlgQwkZR9MvowPDjC+4PLfN29h8s9\ngQGpEIM6Y+YMyKFwVORAV+GB36g55036H+wI1L8xC3xH5q7/j50sOu0x5/ar\nNZpE++5k93ZGF+5Iqs9oSwP5J/dnnMFIH7VDVNs0xAruhgh5dj5M7GKCpAAo\ng9XaZRTrISUyHFwCqsVGONQaS4fyCZ1TKc5teU8MUYeC2V/M3hpsHyn1cdgj\njCFm\r\n=sfWQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"75c55809146f7b73d4c2d714b6d076f20f46e959","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.13.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"8.17.0","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.0.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.10.1_1607941683413_0.5367759820199896","host":"s3://npm-registry-packages"}},"3.10.2":{"name":"hermione","version":"3.10.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.10.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c2750c0c40cc1754a366ec3fa67ed7dd9620d5f3","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.10.2.tgz","fileCount":102,"integrity":"sha512-uKkAAr+Km29thLpBeBsKhpdnqysxl/ZMbBznt0ayrhHtd2iEHbXbHh7UDS2OvhehHPbBzO78QlYP5gr5KoyyDw==","signatures":[{"sig":"MEUCIQDgxd1pSzTWwTc12pBeNh5Tl0a2zd92Ov8llEKVy3CKMAIgDIPZUWjaNVH5LABBJlj0HddloLTIch/xSJkFKcZuD1M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":283520,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgAJUPCRA9TVsSAnZWagAAjj0P/1i75aF4M0q8aDOutRTk\nE+N13b+tjU8vuJRiPbfN2tfMebg+RBcgl6uIFp9NXIb+RbGrGMGw1vKSFlKD\nF12YrA/dRRcG9bIVXi7kaNmYLuZVtrIvaWJOZIWAhHBpL2xEMz6suUefbky6\n63VdroQOmxplg6T7bN+z4OZ3Fobto4fqovfF2G5Ua126zRwsfoo1nTLL+2vP\nuo0Cz7FR2Fr5VDDM4DoC8ZQ2cyfpYFV8B/a3u2eWY3YQrfq6mmTtabKBsYKY\ntOL0BjDCQUZ8UqxlEdO1RSIytzImFdg/cu/2Kkdr2BrlVRViW0GBXFapq4X0\noR3rIjsEJ6hmpxEPHNK+aeHu3z9BWFxarIlsPT7IfK3BPjKPgxgOTH+3uwQC\nyl7M15bgQxNWC1VyH6Q7yP7AwEjxFMtKfLzT9AwS5tYJ7g93YWXRVpuq3Pj8\nxRmY2yp5kuWCBRpri4nbLvFB5c+M6RPvNbtpVmMNLgXqRnQNLscc9pVOhHew\nJInBQtlXvhEuFvCASqLwUZ+wjFiJM72sMyIYnJX7o4wLyi8UCb9nevquGB5+\nQGPje+crqnXxudGNf9Iluw5zTIf9WaamywelnAxBkb9uAhhSxo8r/OqjoAHl\ndZjFzgs3t3RBE08VnmjC0iSufWZb0xHAJmeiPpaUxAbH1NvKlHIh6ZnYNolu\nK29B\r\n=zbh9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"cf588cec75d7633a7bffaa4efa79fe12fb092ed1","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.1.1","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.10.2_1610650895197_0.780056221504668","host":"s3://npm-registry-packages"}},"3.10.3":{"name":"hermione","version":"3.10.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.10.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4d6b6ab00d1c5f08e6f222e3081542d26b0c34d8","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.10.3.tgz","fileCount":102,"integrity":"sha512-thGgUbHwixnG0eIpKYxYUYmqM5puHfeoAKTkB+qW84oYbyh0Afp3IDlZHXGQ/z9WBAiPorJ2bCyogbN+io5gsw==","signatures":[{"sig":"MEUCIEjgAurCobnjEg7dYGSalMNH+zW0q4Nx+9RRbpgcq3d3AiEA8fYkyAacpIfshmvLSJ9VQ7jeCLUbyRPq/KLSmdyIF2A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":283640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGmOYCRA9TVsSAnZWagAAHigP/2LkL4OCW8PDHHFEegmt\nUz89jqo9yEYtaOi/sFbgRWBbCBYR3O/0Vk8KauHAFcjkVLVotHdv1+3WS8PS\n6nz4p++eCibStrBBC91OpsHnwfG7y+WkA3MTTujGVk2cBEHuVRUyyUl07mRn\nNPyVhDgLp96tvhvmm1XiceCPkrgda9yBTOEPbw3t2dXBoTC0aqfNnMJGmNow\nVzvSMeiHMizGpV2+tU5DLTZkoYNW5NhCLjM89FPra8WSnkYNvYe0RLHQiVVF\nkPjHf/DoGeE3NkDjkK6rI7/Zu49E8juc7lq+KxLQ6eb5c5kWdwBlhhytdylE\n9NtxbHmSXcbWOGGm+uf2krBiLVdkiFMq9Mu4Pw57orlmljB2oEX9q6KjIQ5a\nUicPSUg6g2r/R0JpdJHZD634Dz11MwzSolxIxl6LTwqobmzjNKeNgT6gtZaY\nMoXGCl7917yxFCb0fro5PhBhBd6ncIDo/O5RLkBQ8kkCqy62g9WZam02uuCR\nowEHdSutTRwBG1Hb3FJtARb/hVK+P75dvcbtAq0lIkoTJE1llaTwY7sF++h0\nbkK3AEAjUseJPdmZCRxzRNEp8WNFLmc3ymU3wRDiRt+9gfIZ9lCFtn/jVtt8\n9znLywXhCIKJAkkSkdXrw/Capoqd2W/84caP6ny96j7Cr27nNLOZCA/o72Xg\nwkJC\r\n=SACi\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"707c369e35a1fa1683d6b53463e0eef7f80f83ce","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.10.3_1612342168243_0.10837488055655475","host":"s3://npm-registry-packages"}},"3.10.4":{"name":"hermione","version":"3.10.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.10.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"9c1991380f52e216fe0a79c6c324b12485573401","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.10.4.tgz","fileCount":102,"integrity":"sha512-keMKsGgi44/MllIPl5wezsqa12YyAp18x1eDrSEGCnK1hBs3amr0qciqvfyTZ0JKdLqJdJpKXCpeMw7/rSnzEw==","signatures":[{"sig":"MEQCIBxuT/+0fmUJ6zXTOvw8CFbRavSn+dEaDXHBf0nTZvSeAiBA88ev9gTbpJNd3SKB06N27dGPKFOJU2HSV6uYLYrq5A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":284226,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgLl+eCRA9TVsSAnZWagAAh08P+wUjEu4EMw0gtl0IpxEP\n+Bnt2nROgVOxEucN7GbJKq7/IQw4hCw7Rm2Svr2VVW9P6POXR8rvfoxXO8cR\n5t6EcTxj7KISw4Kffl8iWCXxFQMK8otbaCip1vaAhR5WMMj9CJ3w4NpM5Ais\nOV0TS9CBcaqAcrV4SAItVoW9m1XikqDmhGQdaiq/Vx2zJe9yPXO3m8cS7fOQ\ndGYvl8tuKs+MM7hMAxzyh9Q2JXMo3ADdYyvDob0iKWaQ4RmzqCzfXdKARFJo\nQcXQwpWZ97UUsJv/6JC/rYDdZ8bpy2Ia1BLB8ekO4d48H3ROKIULhJQpzco+\nVFkB3Yb6t2mqJcherVVjPJnGx7NM+DyUp9/6ViZPjtyEB+XBFeA/k82lqtlB\nSjn6pCL0M3cqemIIltkEvzPNOjmPlb73xYyZjre9N+HIDzL7yh44R3AaOgRD\nebLMQPDzXLgorF4gBeIhibH1miK7TTig9B/sinVKc6FfU2R/epKebVAt0pNz\n8XXng4Cud5YVRdZvuJYvhgs81S52G7jJ6iK0RyJJgNw99wechPAqQ34EnTOX\nODjUo6ABDu3OaE66/RsRL9pAMe1C8MTx+ebTgpAhBeEyt9XZ65WbrIqt39wJ\nOHIIElkTvJ2CIYgxtiI5FwmdfGnUh6ZSGwfBWv/ysIdYYyDAzN9BKiLlJ5S5\n2D8h\r\n=9KUH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"6e80301da863d0ff0145f815ed7446da00194ebf","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.10.4_1613651869948_0.003214172648310143","host":"s3://npm-registry-packages"}},"3.11.0":{"name":"hermione","version":"3.11.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.11.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"7d38eac36fa314f205c6a11b0a84078f3543ef22","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.11.0.tgz","fileCount":102,"integrity":"sha512-JueyzhRmZkKTI02aTzMgpfoWI3wHZI01dgarDXBKVYV+fvjlW1zRqm2Bpi5kGdpgjXtkLshNsHi8IkMtRY/Lgw==","signatures":[{"sig":"MEYCIQDNgCshbK29Th5VnbllXLI3pVhQ5quZnlE20ymtYzvbiAIhAOGEU7j8nhylJnmLMch1Z0t028vIQ9+fESrlSEv4hx0l","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":285272,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOBJcCRA9TVsSAnZWagAAAREP/0cFnUxi/5V9OYgxUaX9\nskQWUJAVZU9IZroNVdfuakg4RssfU0q8R3P2RtNJZED2qYuTjg3oGSWPz8Yz\nJOmno8ulX62r9uBnpjtc0EAnJlC5JvFjm0oHqEqJJXUcG9TjpiKX8bjw1BXX\nfTmUqMj2wbCq5rls/u0IxAFVndq11LUuJe62ZAzSg+hrAqSY5+kxmGe8zEJO\nXUhcYkyTNTdEcV/CFzlJKgsTOV9I4nE2C7ZooKivOTS33pDIVuEOyEX2x7LN\nzjVBfGvQYuHw6M9E9T346YIpbe4zpOv8FIzMl0fpb7b7FqfhsrxPbNN7b0bT\nxWB5ogISq0StQOEyGzdvzB3u8oxB55ng9776Zxs4qQpI5egE9XBBjlFwzzoU\nwKnnCf23C7hC6HB2xBhZaMUexXWUeoaGR3BtInb+pKcGiP2cR3CcwWJxtjz5\nA1dNU3AKDpGU/2EHnIo9Bc5eeWnWPZiKS052IppXNMN1dUD//noR2V7gW+nU\nKDSOQqAIZiy9M49glvRADKcaS1YLWnWaUee4eYYtj1KF830aEST7jEjbdR62\nSVldZf5i3UpTNnHnF7lhkLZuAFzOYJUuLzxl5qGF/XSySwm5jrHPPiDOgWgV\n5M/MWvQtjn2+VbYK29BBQ7ofSb75RsdZOQyeqYHnLakfkc7tjuC6jRRX4sXk\nCK/e\r\n=y199\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"7f8fb099b774e4ad73b3a61da7ccb59d7a01da74","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.11.0_1614287452017_0.858186213232893","host":"s3://npm-registry-packages"}},"4.0.0-alpha.0":{"name":"hermione","version":"4.0.0-alpha.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"b10714d328d224f6cd9edc8a5ae46955fdc635aa","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.0.tgz","fileCount":101,"integrity":"sha512-91zTx/mb6Ddi2ui8BgIx4zzSxFVzOLuWMxfhmZ9q2x4zQwgSjwv8wmwPNBenXDmfq4cM+dAqn0obRdOx0Rbf9Q==","signatures":[{"sig":"MEUCIQCPOQXbmTpnrOIEQwqQZH12rX2bdruzZOXPI9qdHW60IQIgKBA6ByVXEwVzG+l/H5vvzEaxFLlW2FS8c5xZkwYHwMM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":293156,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSMyyCRA9TVsSAnZWagAA4aoP/AyOgYXMyhJnMgLKi0/h\n7pv86IM3EyAZs/dbaWqlJgcWBeajU1fvbIebArtpk2Pt+o1fGFbRJXVFOfFD\nV4wJpdjh9COZ61bUPRpD0JBu29PzqpAorKL8WBgTnFGY2msLyzsolHh64uyh\n9EGuix1e4TlnIEP6wre2rC7l2nTI6PAwWfiHcFT2nHjCa3BrENsIYi8WC/ak\ngDJozLkZkMBB0SfWPQazf9XTTrYFfsBvLGP5AQnxlVM5LaIEtNiXOJytJxI8\nfgUdsTIYmaW8EQFWpdOpetdMIrvjlQ7iHZTVfsHzGwUVhCwsN5vmeKJFoRAB\nTCNscLji9ODy835z6DbH5uv8KVMbaSphNbA/LRI6QrJ1SJ4u+cXnOiEEHdZJ\nuBHzGZcYQEkwxlDuLXp/FqchZKLwTHhwFfKFGf6709bNUB8j56D7HojHbYMn\nLRy3UNuGs2Pb6t5oYhG5fGvyBuDkaOIsKAoGKYcYsCvbqsUx9nTxmPQzqGY4\n8F/PXfFXzZCsKDx9L0vtMr5iOj/JU26nNf5U/1fcYrnGlV4Jb1t2iPS9QdSC\nZv+Pw0fgXjMeLI0ACVymxy0i7VL77oNM+TcDe5ODBqZqJqGDIYJj/+uGW+2t\nAjW47A30b/QPpJ3qv+w88L9g4zYFJMY5FUfk+d9MYnpRjFe0fUGM3H4/Ew90\nN6FS\r\n=DZlJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"2692cb6c35a1c1d65bd015263ecfe287e36b4538","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.0_1615383729229_0.5620235914403018","host":"s3://npm-registry-packages"}},"4.0.0-alpha.1":{"name":"hermione","version":"4.0.0-alpha.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"edcf555af431264103090eb9cf86ab67ee063318","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.1.tgz","fileCount":101,"integrity":"sha512-m49hZQ4Qbb4carcSp/GJx+07HhDrnAJ5v7STNoC2KGP7N7nae0mM8PoIj2AeGIKR7S4C5ZFC++v9SXjvWBdRTg==","signatures":[{"sig":"MEYCIQCtSd2UkIoBcS+fTNenEeQ2g8kUSeAojxPHe9yLBnGbygIhAKVwa/SSTWXL5ZPtuthvUm7VVa/H38dhRJpMsxI2nOeU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":293471,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYkeLCRA9TVsSAnZWagAAmioP/j9OzWeW5clDd/ERpDyX\nTNNHbON6MttzMpbO/y7T3uFFMlKH6buL0VyDVL9E+dCawDpTUcrFdh6Fc+UU\nCZ0BPPuAohACJLxztyAUEGQbfHyeZz2sF2JoXvtqXylcHdZ4U1LhMnw4NZ2s\ngLyAqG7hV8Q579ThkllO46oNIOqonWNBfQEEOPNwh/JomXW9+ycjDLK1ykEW\nzWMbpd94o6tYTc4KT0XcqOhvE/QqCZWp/dFIfAF3iyN6XqXwV+cmWwZIkyng\nfAxT1dzcs95Iwz5zaIKb60NImRp4rXDphqotwGRXeH/S047t/atks3pe6u7d\nVDrqB6eZZ1Ki5A9hOfjzlMkRHVSRkOT5PJhqQURU20YUaTP6kBd8O3FtsQNt\n+j7SKCiGKQf8X6YYXb6Lql+31QVc2DBtR27LnCp+t8AODgWZuKc6KGt9gv9E\nHACcaTNo5YXOTBiJIamrAYzuOHoFd9ndAw2tDWtZANZUQhg2ZtgyPfLyaSvJ\naIi77b4HCH0Lr3q0DGFzWYqEW1k80YY0titZ7f+7mxBTBaWGOf8IpVBs9qHb\nPCpeLnS0GqKWLj3SnBrSYXs+SWeR7LdWNREAi/MnGqPgE/qecEwuxgcJY/AZ\nLngYqxvmRI2EXjNtbxeDtjgAO4KdyQQRXP8FprYhIJrP4sEHlF0AWSKmp7bL\nnCci\r\n=O8NG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"ead5f59296dcc71917af20f36e50e187cb98cd87","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.1_1617053578799_0.6550019172195498","host":"s3://npm-registry-packages"}},"4.0.0-alpha.2":{"name":"hermione","version":"4.0.0-alpha.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0313fc90914e07662f1c82d6f94ef33dd6b8895c","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.2.tgz","fileCount":101,"integrity":"sha512-VLK0NHI1GKR491PHa7Ru2PBmC7WkSy8niOZzOEraVSLYhVh5KZHYDTpW8CWqI5SYs793jPQQ4hrfYfK/AESKBA==","signatures":[{"sig":"MEYCIQC6dwKQyqKObI5bS5zjC/7PCba7s5/oxiDo17tbWOXPHgIhAJ0INDSaN/7GRLmcNeDRBPChaLQyMuYsLVJ/g05uKLdZ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":294783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgayY/CRA9TVsSAnZWagAASvwP/0287fQO+mesZdacYMCJ\niYEGePer6BR1gnWxDxZM5CHrycpw/FfBXjQ9IfSW5j7ZJyDiCgRqlkPysCFx\nUBh0sMB63fXaeBItSS3VuU1kDSlWJwkqcJBgSAfh/VocqC3iuOpk5jizB+wM\nd2rDXyOiy+L4FlAvwtJxcTdNjTw1KDzCiz/BV0BqdqhK8h7OdRqw4n9rATKY\nnIKshSmtOdeiVZIa0FwLHmBumYjUH13sR+BC2bsvAQdqNWg5Bgl79IN8H6F+\n5UVbi41vDiNa/y4Qx0SWU1AlJRj+aGpE57CuV7IdeRotjfNf+bGhgrQTWkhS\nL4hvFlVe9NqYQVpG5Oq/YjKOMvNFBUOC+CHOPNBKeozSHlxTg/Yzr4jZBUQE\n3GyIhki4kDk/JCeakqRESkO7Rk3RXjvEjE7SfLYKkc97a4WEW+bhjwAE1lCU\n32YXfsjc1iPTY4btpZ/srINZ/3fOFVSFghZ2BrN5wA16tHZ9weSgTKb/vrAG\nfrN/D4A000+1iAHTGGzeohGWDudQpbFTrmuFwi8ud0GjK3+M8Jrx9J0CGAf4\nQ99oDFEWyoRKw2STCfqHISe927bSVIrBlqdhYkkx5Oi01sSFSPgGE0OaV3yK\nTByPxweSy8VSMWepqPGOA7Rz6HakUUuN67hc3vXvRGtrZky/6uFM0Kzq9EZr\nDQt5\r\n=/Gzg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"d2f0a23493082fc44a7dbea03f141ca12aa28e63","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.2_1617634878530_0.7135630000725623","host":"s3://npm-registry-packages"}},"4.0.0-alpha.3":{"name":"hermione","version":"4.0.0-alpha.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"41332f3e5db544f1ece59a45b4cfb1a1b30a477a","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.3.tgz","fileCount":101,"integrity":"sha512-lKBjxxJjperuuZxEmomkf88uZ+RMqf90QisWh0ERVa/yHExTQduZFwg/MxyQ8+s36jd31RUjhhESa7Yh86Sm3Q==","signatures":[{"sig":"MEYCIQD4/ajG7RT5YcCoDKZAyb3BsoS8c3NsKVc0D3ICPEEQkwIhAOPELygcfn6r3bQIdl9L16uGFQr8l69XC5fycQV/xbD5","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":295123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgfyIlCRA9TVsSAnZWagAAp6YP/A6JphedR7mVvPw/+4Tn\nITNpVM8/LkjBC9KeAU9T549QGpJ6NkENlcSejWAoregBne7iPgHnFuw66uZP\nGd4wZYkQZvWP4bnDdcUHGhMy5Ny2rwbm9HiiyYx3Fd5yx3/vIR+/XHVy4O3F\nMqdktvoexI8IbPY6rH2V2n3tMJeUjRyi/sIN5hVI2RlytpCxn+ylgoxN1rOg\nxNR+gZATOaMO2z/JmDXs6f1+WbNAVvZtZRCCEazCOAxuZgrLBhaEPF9fJhLg\nhCDvcOWxZQvm00VzPNXw7gH7/o+BkjXIwxIIiAsRer/8vg8q/p60vMPUsmRU\n+0vEECGJIUQxtrJbi6scqPWclQYXeC/Hk5JY5Pb/Jb6YYB1ZeA4LPyz7k4a6\n9iRKVu8muiJriShJMevIxmo81MiQlYeo0Whi/0zKvF8hbpyJkDbr6ZGtPD8P\nxztPLqiZT62H0ZE94SyJ0HGy17WH6+67CMIGDGPLkVqYkkMHyvpTwBuFfwon\n9LtFqwhn32S5BqutlrszyHEIUIA2+nOILNHu1zSOFaBjf8Hckg4sueK+Wjij\nEVOBwT/aotLwv00KGoothI1rjGS0JzXkUFpUnRZiCsl9efoo0//hzyhIEx4u\nrWn/u/w6IWuFHxspobhS3qmDtApcS5miWEo0+7BNg1e7+QNfevGhwGBuAZq1\nV1Mp\r\n=UEB8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"83dedff8f98bceb5c877feba79f294466d88cb37","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.3_1618944548453_0.5836264163643232","host":"s3://npm-registry-packages"}},"4.0.0-alpha.4":{"name":"hermione","version":"4.0.0-alpha.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"67877d009fea0d40e3e9ada4cc1cd80bebb8e177","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.4.tgz","fileCount":101,"integrity":"sha512-3JT/o7p3iVK/9yIAJKgjbuTA3eauWBrCl9XLjk2CVwrMl8rz6tX7aFRD4xFGh1aAkFNzwQ/2SqMPLwui8Ts2Vg==","signatures":[{"sig":"MEYCIQCFoFe9eWNt4O4+D0jIIkvwP6Ts80myaDJGPv3auPP0cAIhAPEXvnMeRSa2KeD0BeeTRzZ+pQ4sAzMH8fozehfN1qOM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":295385,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgfzfYCRA9TVsSAnZWagAAZasP/jsk1tgi2ZHPiRWE58eW\np5dCW8e1k9NTlLo1Rb4ZY2ZipanRWJR6d5UPhpgHhOchY2Stl7cW1NaxnKuX\n//2jJWcEFyPMZH0Glt/uUY82erext0xOtxQJ7iXw0vJ4xNh+1gr7rmEUmENn\nRWR830YVx2vtSWrZtwTYXz1Yb0kKGig+jDzc2DGRlPUerwf6aW8hwY3LY1tX\nLtFx/Ttq8axevxUzktqoGivL2O5Tm33HqwhfdZTE45h75hTix6WWvrAm9DaM\nYNdNOn99h4vNTDHC0PcPy1/Phe4WPSpHfuB2tkFg0Ys6mHCY/+oH7+IeUs1u\n0jYcwIYiCub/dTf6G2ufyoqm+WqjWLewFKcR4VuBlHQxk4dzYGNWPR/TwoUE\nLXCCvOcDdv7LnIzsWayi1F0+1J8DE1oLMO8fFahgSunoXImZhUA22Lunez/I\n1ko7yu5idRdyTNKbgMGdwBEf0FY3Ar7Wmc8xkHuuTe+Hc22CMwT6MHX113+h\n/dyAUAiArOiD67XCwhNC2qk6k49bwstOvWev93SxFRu7ermY2wIiC0Q6qXwI\nacqsaYDvK8O1rmB3mzFyZnqOTOoVPpFyWPkNqEOAOGMjOdn5U21BQT8N+3Jo\n38SpgAbVo8n1/zhApedzxdM+b3zVSJ13egyQaOJRDrAmsz16uodsRD1eisyT\nO4gm\r\n=Qbju\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"c89a6934b3f04fba5b038ee37419463fb8f18113","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.4_1618950103749_0.48436452579345013","host":"s3://npm-registry-packages"}},"4.0.0-alpha.5":{"name":"hermione","version":"4.0.0-alpha.5","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"bd2da9bad5e527ad7df012789805039da766e129","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.5.tgz","fileCount":101,"integrity":"sha512-ztNR5zjErmNRqgiR26PC3lJgJPEwhCHTIOGxLGONJDTLY5npG6i31AtpbOxyoZeXFitDGZTNM4StaGS0v+Z3LA==","signatures":[{"sig":"MEYCIQDgU9gpFjjnlKBa+O8yBaOvWChwikiTAgTCUYGELZTcTAIhAPdBg34/JfU9pDbxpKMPfgl85E73FqcjiHA0cFmFGXvQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":295723,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgf/XHCRA9TVsSAnZWagAAkBMP/11eNehQh9YQddaJeoE4\nJ4YJZiLHXBs90/nEk4gnRjnuXmTOg/Efje3i+XFbQUlwHG1waUiJ43sHTsAj\neMIRLWmkc8dGqtauClf8osczZzh3K6mW94EzYoi8QmczvHiaXRM692LOCc9X\nmONEInIerqbKU1Mo/6ckrj4+pJA5VHZzpe80s1xMn1qD8Z/PikRLUMyGgpsk\n5+7UiLO0BNRYrLhYWBFjMvBfose5r47NKwP/AF+2XmXdawq8iK6Dn7m8K/tn\nqThxSBuhz8jptcPlljyDZQnpleIgNA9dnZ8kHlvchWTQBm3lr0oeoI00G0Np\nyYvxfPNIk+V0ZyNixmf5LnInFAL5KVD1uf4Y/P+XL/9cQqrzs++SDncjIjfW\nPaY6zC2ssbpOOleLVBr5kmbnTby3EjXiKGv+Eb2o8KSTh5Omqo/WLdM3YWWA\nKimHufFbgcxTobfu/pWLepw5x+5Ex7h7t6eQifg85+AwvXcXdDqVqNkrHnwf\naos+l1VfRUGm6be0RhzV32xyYSIXFRkBFIWlZhUEDXelQvoHoHC6m5+YkxKa\n/hlMN/FvyVXjlUUdcfxFwI3NqUZhnpjyZabJxhTwb1y1yPqvY/f9w+9VQHCA\nRjFla8JTdht5Xhm99SQ9avQmhCL2oLqkXqBBKS3m9LuKqT6rvB3hFOvHz1FM\nF6I2\r\n=Lk4a\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"de1da0ec999c2059527a6991c0e6edd3ead1ceb0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.5_1618998727082_0.7555826707771682","host":"s3://npm-registry-packages"}},"4.0.0-alpha.6":{"name":"hermione","version":"4.0.0-alpha.6","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0e9ea2e4a98dff44c05882b7f4cde4d1bfb71549","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.6.tgz","fileCount":101,"integrity":"sha512-k8cfaBzIzYqKz6ogKpoXFQHMjjhONQoyz/aJeX0NUZPoHon/1+az19AadgHVOAus7gn6GrcFJKUIZZTr29moqA==","signatures":[{"sig":"MEUCIQDTZFV44QAPx4T70kTa/Ir/YXw1V5JdcA65OFPgeH0L9gIgSKfBokigEHDBlSXaPNdvHq1lCpzxGgMj6ti6Nn8Mn+4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":296583,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgr5wCCRA9TVsSAnZWagAAxJ0QAKQ4Ul/66jlV/1D/u9U4\nFmYNP9iw0orJ3nK7IdOcadmew4MqnwDHBZvDv8ZPVDDfhgQ1AJMs4IWhxKXM\nohlpg4wEuX8jJ+LzI9cLiPP2QHj6hyLFgzeBaQfBxd9bDK3/+1/1DdFoQOOW\no+m9rAuuWXA3sJ06zk+jw1nBuiK23MRazz8YDGqn7VmQJTM89MpEuqPk6MSR\nRxfbWB5wm16UFZ579gTHAFHnAFOTPyveOX/TsBtNOjEElkTCSHk3f/ZfL4dY\nap9WZ7RVz0+Hdu06zIkIRVVCs/yJ2Eob7iTHiMu1ISlMIbT4a/WpE+qLl6l1\nP0epAJ23mUiBAI7Y7UGlRHFt0FYqhF46yavKpoN6nJbYzicuirsTmrOUSYsT\nDk4Hf2qco9wuCSHOvAfLkbh4cv7nwHxgABbeYWQembP5M5LSLbjZgOOEb0go\nfUvtwlZjWLS1hRdIP8JLpxsPJSUyJskbkewRswdw4hWqpMBGIMXQanwS39CD\nzAYU61HVRBKGDesNMnXOwajjABPdm+EgjInU9zllFtwfuW1uTBeOhrNLeKsW\nAB+UCpaa4eMCwrQrkuNA3dX8okAhRwNeF20r4JuOMc3GaWO1vT5frX/WohHB\nGXdAvL5t/wDfRdRiQTAPkpnx4MbSOwwHo6SuslcnhQKSlkkivf1ZquFdxcGA\nJQpV\r\n=BJmZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"6425fe408044285da7ff14a131119e8fc5bcf05e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.6.0","@wdio/utils":"^7.0.7","gemini-core":"^6.1.3","webdriverio":"^7.0.7","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.6_1622121473805_0.9634179334321828","host":"s3://npm-registry-packages"}},"3.11.1":{"name":"hermione","version":"3.11.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.11.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"52c197c145df0aafc36884a43379175c7ce4d606","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.11.1.tgz","fileCount":102,"integrity":"sha512-MuTZAW/JzKcxJaaBt2m7TQUFDKXFa9YbaQh1s0wqDJfzBY8H7qDBDt9ebuKQg/JwVCrWT6CO9EWREcoIdwIbxg==","signatures":[{"sig":"MEUCIQCDW0ebWQNy5wF/rG0t2C6oEZyDoY7MbpmBCwXKSrbDFAIgRMn3vACGFfEe1OIYxDb+BiKTz109Q05Hkawmf8IEWak=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":286008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgr59bCRA9TVsSAnZWagAALAsP/iywegKza6RzjdTtyG+J\noPcHxJHx+v7miWI2ZDSo/nnZEBMSn6Tkblmw02v15lZTL2hFjaOpdVMn3Zne\nZqT6jD3cl0YZ1PGxlSXLUGQgtAOMgMqUy0QJFhoO8Sg0ELA1ygGk4sq29gED\nBBdCbymLcvLcvWfpSiAeVO3j11cH7jm2Cldr2VlJiSoJPARqJuBklKAW/kE0\nASaL/derUyDhSUakPtgL7V8EAxB4HR9pdhEaHooaOUCVvogXJB7tzRQFUxI9\n6yYYbG5E8hQgIU/UJuQmfe7rjRjpIpiX4mDMIFOdKIKctpxupzFQW4qKvpOl\na7bdLX+yWsYhemm2Z2cEQwW6YvE6vbD5TPvRgdjhtsaC+1dkQudIhxCRRrwp\nn1z9GTlZFR7ZSXE/2ZU7WPxWdqCs2mrJnS33+FneWf4xm9D8fXzsBqu284KB\njmYuMzMsDy9IKROtSGrhp/DGNA0jMRgN490dlCIqtjp+AT0Ea6WLadc4Omui\nQ1tOWTGg0cCbbfHTLgmMqE3JaGbQ8hSm1n/9ydF1YG/isvljMifPkVChZ/17\nAl9PeikxAixGT9p2i+B9y7NVZeNXcAC5AFizJUztgDTPXOPXrcXRe9akLjj+\nLWvsIsqWBySjpTbGpv6DouenMfvWTs+Nv+gnzjrBlfgpHy9M4SGYktGyH2hQ\nPMqe\r\n=VoCb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"16a426b38d9022393e5410ce942a635ec3416d16","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"^6.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.11.1_1622122331413_0.1444441012918556","host":"s3://npm-registry-packages"}},"4.0.0-alpha.7":{"name":"hermione","version":"4.0.0-alpha.7","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.7","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"5fb80a2d4aa6f6210c9bb4280c2c3f482f56aed5","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.7.tgz","fileCount":101,"integrity":"sha512-b/4XV79F/ZfvLATWTy+47AaZRNcRoFpuhV3wkSyCsMbt3a7yFDfK8UfmGspFRBXdbLuZAHOBTYSXgz1WO+eHmA==","signatures":[{"sig":"MEUCIQCRTN5PmEwCrqrJ59/nabR0YibEi2aMsmckz7xaBHi3KwIgO0UaSmgNmmJpIXfILxid45lB07U72kskwb/iZLfw1kE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":296886,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgweaqCRA9TVsSAnZWagAA0FEQAI3xlH46230IydOnYJpB\nXMnHJuFk3YI8mmDdcWQUQyF5Q+oE6K9tseDu7GjDnDdV/rKoroC6Geovfn0F\nku3IxdGnsP2Rvg0tRY60KMNOlJwBhhSCYJ/KNvCQ0iky7Gmd4B9tlhgvMmhy\nCfOmsS7S1DjPa40QE36Ami9qmkq3tn41JsouWiROwBDCJv+6FJqoVtsLJPS/\nx/Zf1RhTwbsL9tkl4AJRpBNe59mRKWNsI8nl8G5iu3BFsL95rXNxnE89joRn\n+7iLOO5F8bVe0ib8PcsBKvdwEqUT7CCWF3BLpnTHUTJZ6F1dL4Z8lAE9JJiD\nDV6RLLEGHET21mNdSf/CpgLCi209IfnFlJ+nzJRm21W8lW4pboh15pMPI8Zm\njKXW9/9rgDXYqhGyxcChSGqzklBLhCgLFBkilzd51f29tBGsGdJZat3r2dEg\n9Q1Mh6h8pPBU01cJp/5bAPenb0Rx1IYWRL8UtYFdTC1lpuqmheMozoFijwru\nIg0U1zqosFZxQAN4ugniypTi4VAjBHWmmREcU/+Q0T6wjN3lDMkeyxD9xptU\ne8QJlXufn+D0xJwNHBsFgPAH4t+EJYde8+YNNKFSHBoA2+hnIq45mPAimoz2\nhUOa/oseC6mlGkpsIMdlFn6qfhyiD7wozXOPjP0Z4Ljp2IArK7WUU96W1Q75\nTVGX\r\n=sRIR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"3c93102d16e6fc46499200a02d8e6644c2bb5836","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.1.3","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.7_1623320234313_0.3351045924346523","host":"s3://npm-registry-packages"}},"4.0.0-alpha.8":{"name":"hermione","version":"4.0.0-alpha.8","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.8","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"dd5921c70636f2e38ac29f2654f3cd638716f839","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.8.tgz","fileCount":101,"integrity":"sha512-CF/7bI7pZ0LCQDY40Kwybs5NEeugrj/tPbMfp11YPkdRZI2PLaTQLMo5aAdJa84J/E+JyXmOfGcCbGmJsub6Qg==","signatures":[{"sig":"MEQCIDPZ8YKikOrwVt1obfQXpKjZ1ABQRX0d/W3m24o2RJ9RAiBD2RgSUMIiHtI84IecWqYy6t2VJcN8t7G8nypwPMKywA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":298182,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwe51CRA9TVsSAnZWagAA514P/Ridk9Kxjbdo3XvljZGK\nVc5SBpkuiuPKLTkaaOOfB/YN9B0P6R2bak8pzcYLcjLJs3E6gMxk1XQ37f0P\nnHqSY0ama59u98vuhJTNZOHMfTq0J/ByVstA1f7uaf87Ancx12IMKv5kMVZA\nZXzkcm3gc+hebZ6aJ6JQkA808jYJ70ElvrSzCoNVNhxYtE4+PPf5aiq6aGBy\ntEcK61ptVcnIZIQa3X9jkN3PD+wP0Bn5uKU60UH7O8Jw2abkwG8YHLvcYmQg\nOLerA/Vv+HfRYw69d6ii+d+O2IwHr7WAiK8tgn0AJLEmeQkdYTRzL5fpc0U5\nn9QlnUGcnfxuiF8FOtu2q+L3SGBiCZY/S7J8Vjyc3nNKCb9gdursBzTav2zQ\nCNxqNv7fE8GNKgIK5gXoXqMeyNAJeE0vgNFy1TDr+8I5+MFmGVgI98lH8FTo\no9ZRwjZdGISuZQIkX88CEwsvDMLLUSH9HLzqVgLrblmwMr0v0ag1G7/Jq2+z\nLUNqL2PbKs6FnCGZSNiT/mKJeO+Fx38n3K9YM9G3U5z1splNje+QkLbGuc3P\nPnjHL0RrguTVvy2mMXsqH85BjdO3MmCBIPEtbvWMr/L0t4QvPmj+MXxFBvgg\nczHX9oXAuA5qRV1dfnrYg3g2BtOlKgJyctoUTC22eV081O6nT2Dvc+p00OMW\nsluc\r\n=1V3L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n  \nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"9e8be0e9ea48d7b77e44b9713a8d0f1286eb857e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.1.3","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.8_1623322229672_0.03906979544150335","host":"s3://npm-registry-packages"}},"4.0.0-alpha.9":{"name":"hermione","version":"4.0.0-alpha.9","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0-alpha.9","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"43481a06823d566cbf520337388cdd9ae59af189","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0-alpha.9.tgz","fileCount":105,"integrity":"sha512-EVKaTg+ZO3nwNbCk1KbyyWzVRauMkMp/3doxL+R2LHbSgm0SchDnUMhxGrp5aV27+ZDc60JTMkeOmw0Sg579LA==","signatures":[{"sig":"MEUCIC7YOUdtyx09oKS6BKbWdC3XRcKPrHRzid/ZN2iuXWvvAiEA+Uen7f8QzqsPH/TJZ2+HGUkMO2OlHEpumQtv2UKrOe4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":305158,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg1EdGCRA9TVsSAnZWagAAPAkP+wRoggumM64Wa7onac0W\nNTTBXWeWI0ekO6lIdOZPQbIjyt5wjscTgwV51fQhN0b6EQxgsQmBjgUzC80V\ne+k+tI1F5rcW1qYi0LcY/BqbGXChau+teS8QIkLNPqcSdbq6cC91R5JdM6S8\nRqkDc6174SEzQDXJvj3JLGAbWZO/VF/VIl+NPbJ4owyu0Ujzo0DLV252nvFm\nbbZufgXHgfoPCUUoKHkD1wzF1DRNVSNgv0w2aHGIAI4V+JkWPH3KZbMZGYk1\nP3BQxYHjlmTZtCAW8ihjeVgClZBYvz40nozdpF6DpdIb3scxlt8YHOm5wju0\nvlyokfsz0Lbk2ZgnKDVEKQUkbA+HP8J/zlCrxmyi12cpuKIuuGQaSXG925PB\nRqlfetFsGhBj0RV3Dh8mI8RKCFWs58PYCWDjoQ3Gn9nfs0QTmEvZ2D8fRzdx\nHgupKXxh7QLVba4P6mBK414LdKI+GuQpFInQlA/YQJIVM6f++r+XYGfsGsZc\nLOzp32LFBWj5rr0xMSF7ueNwdDnwBln/0RS8KsxZ9N0bIhA42mhrxFi4ZFjI\nB/o21C4H0DLgY5ZCP9wTFUMPS1TUNFpz6VfgZw6C7bNqLY6ZYrhso79mH1gh\naWtVjwR7RL8+UIzT02Szc0P4sx8gxkw9z4sUhlRJyk+SOkfTQ5n9w4dI749K\n6gPE\r\n=sIBx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](http://webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n    - [saveHistory](#savehistory)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### saveHistory\n\nAllows to save history of all executed commands. `false` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got#headers) to pass into every http-request. Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"6b0a92311d5b3294b2f2b897a493d8e66432340c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.1.3","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0-alpha.9_1624524614019_0.1571535058397031","host":"s3://npm-registry-packages"}},"4.0.0":{"name":"hermione","version":"4.0.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.0.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"870650f7b66c514d738e952a801d73871cdbb60b","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.0.0.tgz","fileCount":104,"integrity":"sha512-454j5bdS/gRtbD/n4ZNay9qQqWe4MbMZy+RzrBriqcHqH2fnpe3ms/DXy3T2HYD1zjUH+9NggUU6jCFAki64Cg==","signatures":[{"sig":"MEUCIQDAqosHr1rwtTDtnKgNqF+AORB9qoOqg1LaguEQZzVkkgIgLPf655WalilGhS3yLPjGiJ8WyGl/R3XhKGVpARUGk/c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":301355,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2aNUCRA9TVsSAnZWagAAaXoP/1RRPp/QmWGw9XgSlnJ9\nNGwU0RImHLIANHDjMHtsSVUF4vTOuA/qYMUF5rhjAvvhXK/bAiLgjkfyxtIs\nDJFKlVFeijhgm68ZI23Nl5aLusgp4R9bLFSF+29u1u4IlKSq+8hpLIFMstjN\nR4IdG2fqNMWjPVygx1ZK94tlLzo0M3anGjQooXsysdmvgXC9cd7kYzNjTFI0\nB+gvrUiCvp0xhtMeRtt2Rflm1y3v3S9dltUQ2Cce98mFqKJwCsV7RKaxz7iE\nZaGYTLNCRn9g61La0ndx41FBq2Q1wPzjXENikSxj5utEZLe75/tOcQ7BLfc0\nKUc6ZU/ECI6GFzElIHlhYG3+Itira2S5R0YOiBKszGeibpkNrF/QH4yd6BT2\nwLm8pLpqkF8+33u91Y4NA3COVP3NCz+vXsFP17cFMrDX/uW8m9PFEuDAYqI9\nXVXpefkJa3jqzsOv/jaxUrVVfvgqnukqF/n9xH+S/8/82x61EYpbf0MYxgUx\n7k5hxU7WxflOIVy8MdK0E9uwoo1RCjBdYus2BJVfy4PTZkNhSD0Fa5TKkVF1\ni1nDy9CcDq5/EDoOyCVrddXTcYkBOnxGB4avGcrjsbSLqk1eWR+tCQ0n3oQv\n9UHxeYxqvvLXEcLq6/QTzVtVvZsWRUnxcH6qV/6X1FK4X11dxiWlN21nftNG\nFKac\r\n=HBXp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"9c906c092f1396e07396807a0a8322c0395f79fd","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.1.3","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.0.0_1624875859935_0.3518660931562738","host":"s3://npm-registry-packages"}},"4.1.0":{"name":"hermione","version":"4.1.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.1.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"118cacb7ec49505b24b7e22ef78afd63934b27c5","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.1.0.tgz","fileCount":104,"integrity":"sha512-LKv15fJ6rzSGONnO8++h1lAoiArNmjerhLoelsdoDZ8jq2BsRVLeWO4vB5Py0yEeIU+kVhMMUR7FKu5CIWp7qg==","signatures":[{"sig":"MEQCIDdJCdpXKLss6PSqAMRC4QU30f4DizElWE7MdI6Wvq2fAiBRrAU6lMD7vzeFdl+Azf+DSX0tK0T9Jd9Or2QhRgPBXQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":303738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2k+nCRA9TVsSAnZWagAA0tsP/jCMQZSWGklOzwP/Li2s\nvblPoncOW+pSQMrcvYlBiKhdacHJ6LTKZWRKc6FtNhgsE74zHYefZyr6UHeD\nQBE1T6JiM1KvYG+iZF6MoqVPaqYftqxrg0x23SuHFatEpz49xYiaxmh0dhAJ\ncFSNgKu7oLPGwNkjJcKxDwp30+3kXoPuK61W3NQKVJp0BFsif61Xwun8T/2F\nF6czy89/UPQZmhYNo0B0lFn6BiQVfz6L/C5rvsklGCDvdKK2C+xF7MgQUYf4\nJ0xiaGk2c+y/nltCgEZHieMlYV+FbTSMTkmIY4KTmgMWag2kVJHV5W4VmljI\nh8aO52YXZ0T0N3HlH2RpFJiE3tmSTVMAPzx4m8F5kD+jCY8hNgWBYz80Q7v2\ndLVWamBSldsuPVT7VI3l+U4zQvVBu1LA+SnCx/u/MEwW/G7o6lV4ujJfKOLX\nmCZcKynYdneTNAc7deWip1Nyt1QmpKR3HDyiTRvCbhFpougqbYdSMJUwRAXP\nW0Qw/XQGMERgtrIHfKzO6TY+29AS2r0JCW26hzCNB9HlkPZTbCVB7V8lr7CL\n1D+8DP3od/CxyyJukNKaZfRv/f2TGiEmnEmOjrvzr8R+lQl4HV8ji5bQMj50\nNtfyFvZrte+x9/Mh9kJyyMHmaL37x7lJ1f3ZqNSY8oqXZIKgZ1I3GcSgN/35\neyJx\r\n=A43m\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"4b54687a6dcbab310f5b4eba2c9ef855dbdd9172","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.0","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.1.0_1624919975347_0.060751456400602866","host":"s3://npm-registry-packages"}},"3.11.2":{"name":"hermione","version":"3.11.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.11.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"743bf6f9a200e3bee4865976ff25c64db2680206","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.11.2.tgz","fileCount":102,"integrity":"sha512-Is6XtDj7Ds6IOQlnIxjQ02MwChK3abxHKs0+PImINa+H8CA1CkjkKxjWbdwJ7KedfJOt+t1AB6f0Z1a2SHR7dA==","signatures":[{"sig":"MEUCIDwuRzy7Bg8ad4bv7G7LVQevLXuO96LiVgij7N1pP6KLAiEAsfgE42tn6j/VVSnsOMHZuFa8/mO7i+AazjDX2SRQ9W4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":286129,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3b+7CRA9TVsSAnZWagAAGt0P/2XUIM4WZZQ+X26X0j9h\nU38mIqdn2SbivX4uDviVtjJTaDRpwxghkddiRc6PiO7MrHhddwYgDksAszcx\nFpszZVo8+bEv1X+ymekyVM2G5Wm569qHQ6eaioGqdgYKy6NB822SWagyhNWl\negGQtCvmuISUjkOgyq8TN+eYvg/vucxAzuiva4uSRx/6B4KUO2/vVw+Pc4cK\n7SoHEwYqD9fdlMXbIeRIPuzKbMUpteAQ+sc7mKZ1Ha4ssrQZ3ZeRQI4oO2nu\nBvPJCbT5tcHxYM54bERMKJIeSnZAC/sBQ97FVMgRtW3QpOy/wo/DMowk8jCb\nK15JCX3ZNJgF70OnUCU9TwpHO0qygzSE6wQZOWq27Wqk1d+RCbZFbAUysjlf\ncC9etfG15cne44Mojtivm3l5h1lBiBaPtm1O30fB3iO3Mj+ylFp0lt/v76fS\n+M9UedYo7AYn1gzemP2rcOH8qg4BRnhSCU1mJveMkIvZfSUk+Lr6MKj3AAhg\nuwOov3Y6vvbAkWENVOmsVZdHLhv5zZYY+ztJqUoeLwTYkMcBzssuHEoBW6ke\nHq4RXue3c8qEhuHf0Sta2LcAArc/1XeFdiCBegELQnpDWuc2WoP+j6MSc8SY\n8IHamHAjgelUM6XPkNRMVU9BOX8dfW8Mb7PgzKLc0Xw5VExlQW1fio5Hj6e1\nUhj3\r\n=LWvT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 8.0.0"},"gitHead":"5a1ff671fba13a795a61a8bf9294acdf3b6c7b5b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.2","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.11.2_1625145275157_0.10276272767322547","host":"s3://npm-registry-packages"}},"4.1.1":{"name":"hermione","version":"4.1.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.1.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"82b17f434f1ce8dc9e73288f8efa46a70020a2a3","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.1.1.tgz","fileCount":104,"integrity":"sha512-nGIYnPnmHPhyCpGyPicuSfbs/Fr8ftts+4tO1+8fkUnWSkfyYbc6e7UQnj+dal37h/RiU/g4qytwadJcV0OIZA==","signatures":[{"sig":"MEUCIQDr7koDNY2WrrlYiQo14umidFxQlFqlfYL5crZFhqxslwIgfAme9kM/VUNiezdL7P2uQtDlBG9lxA87PV+C2FOH2Gk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":304074,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3y26CRA9TVsSAnZWagAAkbEP/0EN1mRzUXqP1O6VaRwY\nNN0mmrc/j0jaBT1jekZwjW4vcj7Y7emWFToW98IwE74r38GngefohUjxBRwV\nkBx0u1TYqazbHKw8EraWpZYKwTekAlopanIDD7JtzCFD5earTSDKJO971Axn\nnceFwM0im0RAYHJY9h5u1eEgyPwg7NvDyF82/efQBJhbIskkXcdwtGcfA75K\nAnn7gWmxdMWbSEqsGaXGWyU1rfcGgIEyPL4TVpioOEFMC4mB0MGmu5kMJdrF\nOUwBc4WcP+Ejig91/JNQ9tK5r3vU+BmMVDw9hRc+NX9Hjf48P9m19RJ6QeR9\nc+uX4g86pDNJ52LGeAkekfm5Y2TANnkCpcQWy4x93qVgtwv3G0HYzToVQFwM\nx86K6gBfkXrXdyutE5f9CvXxCtOZUil32WIbZ4H3CV/RfIpt3vHt5XYht2hm\nIHJSgCRfFXRAcsssd9HmJ+gZnxqCFKC9r+Jx2Bj9HD+p8Fdi6xFurnN7AZdV\nlHtOviqOAJyxxCt8koiiNBH8cEblh59+7Kw5rCQSHwn10pj7EvCP/QnKNVU1\nVNszJpikDmIjhI+SBEUVlv1kelvySJp39pmYEWHDmvzydff9kVkV6FdiVe21\ntDpMyEVkrd9PrnNt/WmFa+OO6WzfXZb5pcO3N642vOlbgLHL1s5Cii3wFNlc\nILw8\r\n=4jIQ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"b6b9f42084003bbb8dc92f7e3c56908b4affd45d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.0","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.1.1_1625238970014_0.29199179735147474","host":"s3://npm-registry-packages"}},"4.1.2":{"name":"hermione","version":"4.1.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.1.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"a7cd78135d039a23b63333cdd77d31ec4993380f","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.1.2.tgz","fileCount":104,"integrity":"sha512-4jWOL+h9bytf4ta/4IFXzVqUP1U12F2KM9OBOUCG/+BUa4P/3XHQzv/AK2rd9JxS7SzalBFf1weY4M/P1HmM9A==","signatures":[{"sig":"MEUCIQC0ekq0Am166QBE0R6xGz0fj0p6c2WA3GVLUuMLoVk1fQIgPUnJiafTbAy0EhhCiIQAiTfjtVxMZt4iXaqXzCK2zvg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":304190,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5Bs+CRA9TVsSAnZWagAApe4P/0sPvv91XZU9uL8a0SdC\nZTeYBTh7bqOgARgGxCvtuZ67S+UIpp8GUrUEmhEHFEtuF0ehht8cekCukcsr\neGW02n13yyD/uodbHDK2GrJDZHNP7Axi97HX3Y1JeGwNJHK3Y+Qwfiyig8yu\nr5LkkucBkzcVxjwcWVhG6pEl/QIbrWQQnn355Oi6fNGtmuDYaumydtZ3e9X+\nQIDMofOSqDl0an633NsjfJSP2bdtJUjTfGxWFlGXO2/WGCE4DrfehmDPkIuO\ngWInntpA4ngRMyQTYYhC+HUFWoVg9tQ1g0wxcS4P/Ii8OMVCtcVtO7ffsviK\nOoDlRFbuJVB8umpO8vmo3PFx2R49ax2BjIDrIRVhWQVE/ZFMDe/BGPsjYM3n\nu29giatRrt7ojD/SjrrutIu5VcU5TJhXz7snLf+r+9WI92qMhVZ8rT8iit5K\nqpnsTgp/O+vWoj3HIgRkoZDZlD4pLl4LXGdBSZxcZzPC5CkNsrF5JL3gq7rs\nVoXI6n45+kiPMCulUDN5gAsReChneLlpgNkByCGVHXeovo/Ep5Wc4hWCgGpD\nhd/ylDyWmgpVImVUPLBRWBpryr36QindawmXX33ohUVg5CzfW897cVwYlXea\niGIa0pZWoK0AOh53Vo2Uf7FxmMVXjbKv8xzMmfPn3hlDANr8o2JKsOzVF9jz\niv3K\r\n=Jhio\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"9d260ea66d025ce740b5dc08da9cd0e864c1361b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.1","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.1.2_1625561918253_0.057347218177273396","host":"s3://npm-registry-packages"}},"3.11.3":{"name":"hermione","version":"3.11.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.11.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ddddb09cb16ff6e2a81490f6a983811bcbdc876c","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.11.3.tgz","fileCount":102,"integrity":"sha512-TTvYB4B0FBwZHg3X3yvicfgdax1j9GhphlMY7CjCBDHDMJ8p71HHbrK1dNh0TuWDSz/r+tOZvZls8m+rKl3iIg==","signatures":[{"sig":"MEYCIQDyhl7c3TUa2gD6zKUQwhZKml9zW8PG2bndEqh6L3k3rQIhAOdA29W8kTlFFZYdkFBBNiWsjztIwIuU6GIBqdxc2RJ8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":286249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5CI8CRA9TVsSAnZWagAAvasP/A7mbRnEANfTkrjfEYe5\ncyZGlQH/WE0dw0nuq3/ScEXVBMmeQl9R4Yh1KXdZKT5nchnoq1hwGX+344rB\n5OzWUwHc0TeNFNP2uMiS9soa6b9l/U6X0VIot5FO85u9GU3oslUrDo9zJMM6\nBWIbakXgSeRvgp77gh4NMNc3w0t/7JmUdPAgcdxn+Y1tx97m/0r+2vpDhuVD\n6tFoi1whSKcS+6yqYON+XWeXe3U8KspUgWVRcBMEDtLV/+Kd+AwtYEkjEKKI\nmSvnRcqzfG2MF4pSA5GHp8R+QTU43frMuFc9t3W6AGDSpgPfar9S12sE2SAz\nSL3mUGVFHac4AZ2c2YU4XzqdzK7a1r0/zvrX0Itt6Thd1orXQPlTZ9kDtXzn\nCUY5//kbFQMztuEfWuoxr045GDusADdDUxq+YN4Y1INFB9ezcm0xyP8/SZY/\n7O36FPL+PLHnAfZ8Iyk5Im6jB8p+jX05Zd2p693o1gsQaBIjC8j6vaL/+9yP\nt28bZZ2m9g3C7rt+dMbVgSP+A50W9yK0DygBHwen2eN+e+EjkWy6lfTzanta\nLTjbS1COlq5fuENwPctPoIFy7jsRQLGQAvq3rTAiSYUebWYSNLBSxshvoQsY\n4k16xhqTeio89JOxY3W2RJE1doIi/+gvItl0nCObjxtJw3xXArhD/DkeI2A4\nu6LW\r\n=GWjJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [w3cCompatible](#w3ccompatible)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0',\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### w3cCompatible\nEnable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"5675f7d4e4868a861a66e23abf128c5bf85c528b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.4","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.11.3_1625563707675_0.3422887330687774","host":"s3://npm-registry-packages"}},"4.1.3":{"name":"hermione","version":"4.1.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.1.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"50c9d20efa7fc6e1bf56bc7e81e55950d5c6572e","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.1.3.tgz","fileCount":104,"integrity":"sha512-fgtGysy746kmB+JHrd6mmFq+Njg4lHzpanjzO8r+RclU5531qMpgEbPzXztm2fmRaH4d3Ha2YuAtjrA9jZ7k6w==","signatures":[{"sig":"MEQCIFi67Rec8pYDl7r2lC7JCN4keFdH17bQGYimpjhYR8uhAiArarECeiGRBMLKeZz0GcGVlXmon3Pq1R4LKbjmU8kLeQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":305141,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5DPbCRA9TVsSAnZWagAAa6YP+wd+h3pjhymxNyVDknR9\nQLWzVNcaE5HG5ROGp2Eb3J8/rq8m7W0FX7h6ahZwFrtz1CkIqr6uMwrKag3u\n+JczBCHoFjHrHl//OAxx7J7pFE3FPURilNU579IiwpwfwsjnFE9VPQ4Ggkdu\noFeRLDeHZErBn+x1w8B4LYCI/4YLTqOIlvcBzYJS5CsKzbNz/7rKX+KbZpto\n2OC6SyfZthvuj/AYIP4rbdnBOIPFpa1w9BnUDeF+CSnalNNzOEXdPV3KYd0A\nlqR8RFJ+UHtuLRrbH1pAtq2FMuwoN9FDG416wVQvnD1obengkKFPNAftEQQb\neuj4w7svXLD6um7JS2On0BF09tyrtIdMowl2XVWimmHHSyG4j6JGsZaD6pEH\nwQwpyiEPqrvOHuO0RvobNQsenbSdPKerPo5U+Qwjp8T9om+Kc3DZUyyeaJoR\nYgfXPqOZc8UDaiwugTvIT/7Q6903OMnMSTyRQEOoBgnwsOCt/XJlA2ke6uo4\neuLeDr6P6YlJaUMHC76+WtyiuAj7s5NT0oEBnHQkzOlTz1OvcbpscItkA1iV\nUnOrLcMDJlvjjCLceyUH4gBOWvt5SffyJWzfdgrK4U4oWF+X3hcGnqghD2EC\ngCjekwqLScOUvadYbwmfDqn7y6DgQZ4TkM66Ow1eyIkrX5ynywhli9VkeCwB\nw4lF\r\n=niUm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"6ffbe703483ee53629fda3350efe4d0d22da5a19","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.1","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.1.3_1625568218926_0.15032170255943544","host":"s3://npm-registry-packages"}},"4.1.4":{"name":"hermione","version":"4.1.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.1.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0ee4d9644eb50ac775c24ad7a3299cad82d05ea3","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.1.4.tgz","fileCount":104,"integrity":"sha512-pTgYqIYfVB47r2xAJmPdHMOhLcyt5fAtKpV73b8gJE4NPmSQXLdPihSd7aLD6Jph1+SeqlJkbiq7ZM5G8tY0yQ==","signatures":[{"sig":"MEUCIH25xLrPUrdpR58QzcTT6BMeI82P0PWmrkFinSjEh2InAiEAo4kvOh80d0GQWGmiOOEPva16RdTtkAuercUdYqfbXZg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":305421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg5ZSWCRA9TVsSAnZWagAALYkP/1TnLC1fftpKDZyzwkdT\ndOk6CVG91UgOr5VQQHoSjUJ/Rau4TZjRi892xbs0KdWfGAqT8eQBDgUIjzVc\nA+cNwlKLEU5aN1gyscjP//H/ZsMCN+N4SewziSZyVZVTTo5kdbmf8FLfgpKR\nBdORErmDfVe6YCL1D4NIG8ItTxQdRqm4JlPWyHeKTqpAjP5qVKDGHnROhLl/\n9nMkI5PcBPn8lqtweswTNJb/xxkYSQBhTWHKoSj0FkV0QF2j3xUC4QcZaGev\nuZCx26OP30qYvm+r1xWkP6MLAJ1oghoQGVOq5VywVViPbvG6FTfsoz13yhRG\ni0pLGZ6KqiD4rLLd9aihhrbRCED2xzGpiKQW+2O+mmdAMuJh3HkrZfz2b30q\n3TArv3pGST3ODyUtddLxsRtCssBnL6BPg1wBkG7a1KYrN290GWX8KkkfvhGg\n/ce/nOIV3spHztGnOG7W5k9E/hGcqqJXeEX2pHcK6PwpFKQfRK5uDh4T4Dvn\n7Pz2zeefUyIY+aiCWf8ldcoYv3i+568d0X9yi0XNDBvNiZAdAm/8aTbj4qIY\nEky/ityjkwwWd95PNSKQEO1uQLPJR/HZlvcejigAcYIbVodc5nh4qzyBH6gS\nEjbWO4Pak7f2K5As33i5KAtzhyHiy1Kz07b5yn6H5sHH+mp+e7IpbX0JWr7Y\n71wt\r\n=Oemr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"12354cad2ea63c3b945d3c05752d8a15eec2acb2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.1","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.1.4_1625658517779_0.7750588910978209","host":"s3://npm-registry-packages"}},"4.2.0":{"name":"hermione","version":"4.2.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.2.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"09a6d99c2a3b4e8f4b201dc33aad6d69d58681e5","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.2.0.tgz","fileCount":105,"integrity":"sha512-LfAwNP16vmcuW9hKkbgPAr5ifjyKDgQrukMSX++Jq/pHCV/7yWkjEyfXSKY5O5N2F5MqQwAD9wUmqdvPwuGdMg==","signatures":[{"sig":"MEUCIQCbw8XhS9jr21708lr5Hz163VPWZEK/PNCuDOmx7rigswIgQEBXy56NfSZoQmNSwnGX5SaI78AOG08EtMfp53hmHcQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":309442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhErWVCRA9TVsSAnZWagAATKYP/2B1c3ASBS8/cQYc+YZa\nyeJ+jCR1kRAYvj69DHVQg0FXsKHy45sP2UxSp0xk0HnVQZP60Fq3DD5W/Hdd\nstKQ/audTWrIYLZp842+qCGrode/3QbCzxlq0dJyd/VgzJjxf7fCDnhc99w9\nHvpU9thdE9tPQxjejTxHMpocfdy+xDeqfUQGRUAP1IFyZ+j2z3I4+WClMrti\nTsTwOgRfE8+APtJ9y0oBZFr5i22LhfJAbpd6N5DEvRzZbl6TciuSQlJZ9/7l\ndXLIqqcNODso0WEFLZ85GJTVM58OzWTWyq1XjiTIXWZqWjfGp26WWQZlvls7\n9Ht68WknQ2nDiyg+1jTz8X0lUtmD1uEMPlGqIOzGzRWuEPgiqvFlbaoedpsV\nyt/E3IdBh8oL52VDVV7B80WblbIPZkZF9QV626VnF8inUgdyIFEp1GtTRIER\nKq/ZX0xWbnUpevPb37gUw87q8mNghyDMcfM6nGBpaad2dXnU6SaN1M9ZClA/\n1WsfK53pnzcnviDKu7TgyhJo7xsLORwrPyeGjilvC1s4SSrtx2B1pYsJLxGk\nRtcXNR2aJ44HCWYJ7EknKKhMLwoWvWaLdWR8mJLHy/vR2xWFumUpoWdjlUyC\nsIbmIUX60IjOCSpA3yOMzma6cWG/uOW89KwRK+O5B1Rsauxkcvb5xZk3Oye+\nF/XU\r\n=0TxA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"4e8e268cb82948d6ebaca844f319953382a736cf","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"unlok","email":"unlok@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.7.3","@wdio/utils":"^7.7.3","gemini-core":"^6.2.1","webdriverio":"^7.7.3","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.2.0_1628616085511_0.9348117265487816","host":"s3://npm-registry-packages"}},"4.2.1":{"name":"hermione","version":"4.2.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.2.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"91424ecd21810af7e7a1be715f80c11eab6fe42f","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.2.1.tgz","fileCount":105,"integrity":"sha512-zNZxPX3oA/zwSX54McYVJrndFOYypatmwymcE0Krmurs+lrxsK/8CN9yKJO6HnMlat5/KO/gXpYIvszguIALNQ==","signatures":[{"sig":"MEYCIQDD2IF2QqEYM3mHLOQt/TdWo0i8qwnRingPdbyv3xl1IwIhALbDZJujG3vQu29PNX/MRrjDynhu5lPmQJxYyFt6Ic7s","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":309286,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhHCaICRA9TVsSAnZWagAAcasP/R3f1FFExmlE6IHC5Nxk\nxuEYO1iSvKp98UHI9vz53yCb2r4QUQwATsWvq82WTfcRH82JoQYgpy61BpoV\n3t8jcWDIeJK7wD15G/5RHjmZwxt5x3RzmttICFuMymQMWV99+6VLDPdbQSVx\nbsELA4XIeL84pVmxtKZKhxTSZadPiUzSE88IP/RkqKtVSQPwouTeg68Tvuxi\nQM1c8KfU9pu9FzR3N5jmgaBGfGRrJ2mprboeKxdjrzkHRawQUhmn4Nj8TKn0\n6uz5Fi6nLM4jC69zziX52hzwmL09qNYirSWEZSja1lyCVM7ZpFHh1jnze3SJ\n4qOpAPJMiHTIzIMMeu3vB5YcWyr/HSFJDujEM2Fd8z003kzrHLYfX7kh4+tL\ny8zyz40PqXejkkKbYPWM/yXlEK4frCFi3kDeYHg1cphYQRq2nKWgmCoGcDM1\n7S5qoOgUsvVpbHw3pR0bMfW7K+gkZ1xkPyZPSzIz2mkoz/V+rIs9DI8yGBL1\n3HNH1bi+LGfTjkJ1xxR81jkn1q0mwQxn7KCKw/xyZz9xAaDnS+9AEo5ikkhH\nFXV8oLlyZXWM8hqpBHkOmC5QaCjBiIQA1hHxfGUq3/zsp9CMFq13893G+azp\nbKmO5dLt+Rtnq8cUfBcxYF17LBCaLjaG9PVUB+G06OHUvH8gAyKHb8BG7b6r\nJNan\r\n=kGHD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"b7635544a8a6a49c5abfb010d3b73648a751f734","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.2.1_1629234823872_0.3823052800552955","host":"s3://npm-registry-packages"}},"4.2.2":{"name":"hermione","version":"4.2.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.2.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"eaa093a088ade88f5f6eabc9aed56e06eef003ff","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.2.2.tgz","fileCount":105,"integrity":"sha512-9MCM/KeCtIYvGPkUJj+6NW8urvBeD5jFT0XFXwMU4A9pb4sAEdZxdp80rAATOy6czw/bA3jAW+60um27mOwCWg==","signatures":[{"sig":"MEYCIQDnBACMjIf/VtSTOYJINHiVAv7Ii6wxceCF1zpyhh7uLwIhAJG3mKYIMHEVPNDfMCo4H1nfwtX1Tn+2QH6QvQj48etw","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":310295,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhI7tpCRA9TVsSAnZWagAAGDoQAKBbwqfvgGGig8WUqmj1\nbAhFVGz4HmL9ZvKb2oEn5UZ+HDhw//vyXKSDYWqVKb3hwSjlF7HIkVgP7roL\n0jKpKcPCZ8n7ZweqrlvmdDtpq0xpKEQKULHWiXHDHulxu132iKcfZYmh4/av\n9e0PO7L4nd13AMSprY8qb5zxVlqoxP+ZaEWPukirXvqlluZ7UpKVOuLDCedu\nwGaEBn96zCLT9DC3MF+mwX9Dyu7u3rCBY4N9wfGTy7ajcOIm0XBVZH8Wpb9J\nJKDhzLkahPIE0U9+6AayQukxzXQggQyAcZgLXzS0uAptGENRXpDLICmpWdHF\n/Zmm37duVZXK/z3Eguo9htErC6LeG5v0EMgGTYcPADEBpL7HGdHxqXt2OAES\n/cPxxB8e1IW7E1noVY7Oz2p+CQE19OCC2x2DfO6bIZ0dsfWTlNHWXLdHw3AS\nwWVCmozf+Sylj0dW0KuHxu9A+uNfSDbBjYkju+O6sagEnBckwNnAM9xUY/r1\n103jsnEFc+d/dy57tFLA5L12GCJbRAjLehsmE0mmYGP6LMNUJOSR9g/kETtl\nUDGsXSOjiQhduKAHOnYVmwt4ROCBqDOOof6qYZognkxZsRm4pvtdqWQKC30o\nQk8cF/7T7Muw8sHLZKqyBv97ovvAbH+Lt4Nlu9PKpdh4sOTdBLs7bF6xG0Z7\nWgY5\r\n=ed2L\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"7bf5ce64ab1c2ee1269e036dfe522271ceda8f0d","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.2.2_1629731689699_0.8114672056191856","host":"s3://npm-registry-packages"}},"4.3.0":{"name":"hermione","version":"4.3.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.3.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0b54d5f8ab6d8d3ede44a791070f9fab81dd5ad6","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.3.0.tgz","fileCount":105,"integrity":"sha512-fSfTV0HkuxpOuaT/j/k0aClzc+wkccZUul6NAkGrvL5Sk94QOfv5BS0XTmZk1lC546pdt/jzdCso/H0dHBGMpg==","signatures":[{"sig":"MEQCID45BChKtcX3LdEGAeMvQLBcBvUH8FsRX3p15YY+JVzYAiAxjGJS5orhiviinKXbvYQreMmAwRl1JHj/UvK5zgV2xQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":310587,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhJPBpCRA9TVsSAnZWagAA6gkP/1I2g64ksXrUxH9UVCE3\nYY0H1BESKSivk1onPEroVzyCAgxtS2adcueBEfPglHoN/JqvEInR+7pg0bj+\nXI8IyRbqPT/oRciXInGKPXTQ1m28f0fVaFdnmaT3wId7o3sfS3ytoee69P8T\nXXyODXnRCevkxjKqDPrQYm6M00vQD+Iy9AKcEnR7ZGvPXNSuHF1CtQPB4QNn\nOhnoPoyOiiaH7jOAsZiwIJdV6Z4/ZxWqzbp1Xpp0LuJjLHtvahPoKZTZSPZ7\nA6KCeEcNuiKS6CLHtbejmQLgeEWXItds/J8CMJxhBPJZeT7ibskrkKH9lk+S\nzzWTvCVmwRDS5qXp1VNLwj9EWU+bvgywUQqu7krI7SBbXHxWA1hOmip2eirk\nrJhleZrQrS6HDyoqFppHHFD5SedCDv+PEtRUvoGrQnrcf9gXQsvvng/FnXON\nJRDe7RvT5I/d1pKqnmdny5nHTKz+u9J8r3V46ezUtXIU3aXCm0mlR9iq2WAM\nkzy8m5bUsGY1h7h/yoZd0j4fcO3Gb90BOizxIwQRMF0Iwc9SShRIZdpexyqw\nUMKOxbBHOBnVbS3oryBFCMeqm6zPuMvRFSiv5HLkz0ZMFvoTs2Zm91lNFQyF\nktMYBcVEwThRKuU5EVYs4sIrOKfl2LfkZspyfq7HH8Prn79fAUonjoAmPnHg\n/14/\r\n=MLk1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"bfa5b97ba3bf201470afbabc558f7eca83b201f9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.3.0_1629810793019_0.6032076258387904","host":"s3://npm-registry-packages"}},"4.4.0":{"name":"hermione","version":"4.4.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.4.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4a0e1de1648d015218acf1caf0466d879cb6fd6e","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.4.0.tgz","fileCount":105,"integrity":"sha512-l/291zL1sJTliFrPGtn2pnXIW+fvfhD09SUD/e92nSc62LZOS1Yd4rPOMLPLesSbNoXiqzaBLXfSHPMrShcjPQ==","signatures":[{"sig":"MEUCIBXFYlXqY9c1GsACd9OHW1BzPTiaepSdib/nHPhZF4SDAiEAky5P+u+cZPJyT0Rm1+2gsT8GVGnse4yue6W9oClu+JI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":311290,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhJ6lrCRA9TVsSAnZWagAATAEP+QAJKY2j2OAjbobD2GGv\nyjps4hZommpa3k0XeLSamREjRWyeFxEoJKQbypYJ1pAeyGxyIc/C7FxyPlpJ\n8n0/ihtL9GiULgXr4KLOvaVG1N0I76ZldNGw8QNDtbCe/A+H0LJil3lUYYZY\nAQjpnMuztYP1LSQrY2QSvcSOHMNx9mA3X9tBRvWNh3EDrYOOzd7Tf71w1ojM\n7fs5tmvhxCEWuZ/PmojxK8OOwzuwO8vJ5wPoxaS6q8s0jS+h1tiC6eLrwsRy\nNNM7vge1TAsYUMtjoO46t71Ap7TgSpqaTJq40j4fdRicLBcQpwr5hqpXT5xY\nMNKHG6q+2qMjNeXdIUVMNrfhwcePE7x0A0emTZLynrNj3MKbcQ7EPQ7Zp+Fe\nHpyQFnlZ516qfdMUdAy+1ACnFuvmrvi7nDJ2euMwGObukavuQNIfWrgp1QBb\nCc5sxwE9v6d6zPxYjghKDioHSqeKYihERc4Q7Ca7A7Pl13VnMNEp9MTCb9Fz\nc7ugXHgIEFgJ/BhmH5jaeuFLfT58vdp04yTjKaMgg117yA1+4IDCziQ+j7Op\nagw8IJCNGMM/BaslUuWLt1S3P8BZCwaFYoDH10qRXyF+Hg0fzXqV7Eyy+T0P\n1uBzUeh7yfQ2u582Dq/yYDbBL9XBhaGKx/vBDUF8RFRXc5YDEqikkPP9bEjU\noYnn\r\n=TGwM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"3828350b28927ff6032977e762033673aa4eea16","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.4.0_1629989227596_0.8011343758871285","host":"s3://npm-registry-packages"}},"4.4.1":{"name":"hermione","version":"4.4.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.4.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e953f18e7587870d92a19d322b2949dcb5f8fa30","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.4.1.tgz","fileCount":105,"integrity":"sha512-HdpBdDdeP9bpyK+QaR0uOemX6TT3bWlgkdxj3jgihi0zZnwpoFPAvEYK9B+/GIGWbMG6T1lY9ex43CXif+rYvA==","signatures":[{"sig":"MEYCIQD3eb+D2d7PWSRmU5/8cZ7XpfP2SeWYfESFdTwthaPYDQIhALbleBpwCHFv+sv5okJGJQohMaxEgrs1aeHk3weAHeFX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":311622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhMgURCRA9TVsSAnZWagAA850P/2Z7HHvDbrnV68MEuBut\nxQUL61UB+WQpCljBRlz7PeOn2RDCl0EcWFXSEJ/fZpdJpkox6bwuuMpdNkPW\n4IGrMLYCg3gody8vTu0xH5QNa0cVnlrLU+KC6xWz7DYbOmkgibJAKp6az+Bo\nHLUiWMXz+pBYBQ+jihvFbp44DEPnn7jT/EdrsIujsgiGS/ZHvADSzjAA0nuw\nMIfKwT5PvukNYWvqFeGVYewYtGMsQxcJNIbHcS44YncIOJv+zTHY52swsnn9\nWOdS38QfRDxzPfMY/n8HylBlZehlh3YbRRUK8tK25EK2lZaEsraFVD3bqGe1\nUJdkaPNg20543tHbaA0BskLi67vqft1jjX+yIOXVX2PFGGf8Q63evvXX9ILC\nQiLrL9nkl0+BWQhWV5pudsJSbYoq3K2jleommOQo8X9UXQoG4JZnoYBqWK8D\n2RYa3qPaADuDta/MdwBQCv/LDXqAkW7hM482WdqM92B0rfNBkExw5sit+hTd\nIxssS5ib/su4lrBEH7Rd7hQ/RQxV7xO4Wj5yfnqXujAnmUAXVeCsTins8Yjo\nDhy9rCphsh86a0NmaWSDCKeYpU06/YdNQRuoiGSae588MvEIlyV/T1MyDC0B\nwn5rzDL1ISt+YIidhGKCQvjSlGROQXFc1fuoJOLaSA7AnyCDYVZP2e8y0c5l\nQCEn\r\n=OiGz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8faa6917fbcb37b49a6b14abea99e94a326a9108","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.4.1_1630668048957_0.7658591392590102","host":"s3://npm-registry-packages"}},"3.11.4":{"name":"hermione","version":"3.11.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.11.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4c6d72236868ff77387d647b4f407817031a2300","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.11.4.tgz","fileCount":102,"integrity":"sha512-1/V4VeWC1plrWPDH6TBqVuu4/OOqubNE8z00ynXV6vRCQ8WgHN5Cs6p+0Zw/88UxgcVVpKg0M92cfQ/zHUI2nQ==","signatures":[{"sig":"MEUCIFplKB/7bXNpBUSZdjPuSrAEzUsLZ7EtLHntRVhr74aOAiEA2rBOUtUR3+P6T1ztb0qjv52lSwzIjqAREsaNLYVoeCs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":286369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOiAWCRA9TVsSAnZWagAAqqYP/i9SMn/VaKqnZqnd8nbX\n+cCixJpnMVBj0n+pmkeLd2G4RdxbrzKk/DOCFIL2etX6Ag0E2EPtCOX6FRXl\nJhmYmlnoHcLdI6UNdB9Vjb8nbeisHGGeqd8AIvp+082CDh4b2wNnYzHGDNhO\n6oaunV7Gd8Y8ISCw6VicLa3EGSEvqJi+b7eSttuw/ulmTMeXHnPJAm6zX83z\nDMqWp1ciLvw3Zhw7gjBebiEpkIgV+Lp+MbphmX8QF59vhfkn4quRRtDBf73s\nndTXCWa1vcXFcFO6LOfExxj1oJW5JrvI+nUAUlC2yDa955na7qwvbMWQCiKJ\nQIxow1gICSGEwb1bB1F+KzZIcyI1ldznQgSX+6DHqkHfJBj/z4CSsp3WNJtE\nVD+CGYcU/hWasBNsyUzQepdVDYcAppK2xeeUrxSePnOxws4U1CfZor3OWgMI\nXPLn2KhBlWkcYbp+PyknZF1pa/c+dWlxpoRWuXtFkoVm/bZbMcEZnF1GwB0w\ns/VIR3F5x4SlPo/W6el2BWMNtwrtUsZMzqMPEXZQK1aNPlDTitN2nw3aG84G\n2/jje3SJ/gs+g92VPJaAbr0Z+TImm5TO69g5YDzdifQ44zslixLya0yImKS3\nySHmOiuYf+CGk7Aj+JP8UPGIQfYHgDV2I0S5UDaxNyMhNeT2JXvQtKuyrLHU\nD6Hp\r\n=ukNu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [w3cCompatible](#w3ccompatible)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0',\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### w3cCompatible\nEnable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"e60dcb1b21d3bc95793fe9e02b25486791d44390","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.5","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.11.4_1631199254387_0.4985103935365449","host":"s3://npm-registry-packages"}},"4.4.2":{"name":"hermione","version":"4.4.2","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.4.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"fc9058957b86a6b2a55d5be0870a8a8f30f0ed94","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.4.2.tgz","fileCount":105,"integrity":"sha512-TFe2BFj2GbWa8qAU1yvaxVwEVqHqaSD1NYh6/1TXY18szVcDM0QNvNUhLcbqmjmvkUWNRbWrGNqTyFv5eW6lqA==","signatures":[{"sig":"MEYCIQCDXDIBEgSZcmceJJOmjNRuEoO4h4+05JFVugfDQzruHwIhAOakcOG1RP+vd0mbNSHiseLAjbjCccQk4IBtvlLrNJBg","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":311738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOiHDCRA9TVsSAnZWagAAiKgP/3BwEoIhvIWyq2ZQd4Ne\nY79uadOon9uuy9almPCKw5lpPxXNqRlwRPTpbLh7HAetG2t8eHx8IVCoEvr+\n6Hmo5fEnsYYUWdC25Fh8xWY6GBZEpEo0uBJtvcvaELJph29RtVJs4m0fcQ3R\nYLRvjgzwY8NHyXRJ7NvW2866sYZNZCupxmfVVewF7P7BtDEacRu33Vwg8iVT\n4Ez5sEqq35TC3nIdceJ1jEMEBhZWSXiTDSIuUNOWhH5zAKGq6dz0IsOI+AOU\nXL48Ol5BXiQUCgBb32ALu43S8BWGXImFVzCacOICz8wLLnUDv3wtzu9GPV5Y\nrxgnnmb2igrbVT9UDzl0i5IP3UZZq5eMT+CkPhs9KAiCVnV8ia/vH4MbVe6q\nFXv82fbQHYvOJimRidrsYXbOpeN07sw8ZIgLIKY0sW1EQvBr6QaWPWSkwfxX\n+7WI6UmFiZh6kYAXfBxzlAsfX0wQQ3rDVczbwXpeVcqXEaIDWN30H+GLcZTY\nPRxH9L9a0I3aVaEFgotBae6VtCi4wCZesNe9q/wvZkjgfuUSUX6H2iLnaOrO\nS8BYUSPqPVbNJ6kYYUtH7b9A3847sPZGYDFxGD0V692xSnINbYoitKGpxGKm\npqyU2xcOEdceBhlcFK86yz9vSWtzHo5qaEQp/wePmOj+Er/PrCXLi1yO+DQe\nTgCc\r\n=7aOS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"034f1193fb27493f2a07edad67293bb758cfe0f2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.4.2_1631199683172_0.15889810473054156","host":"s3://npm-registry-packages"}},"3.12.0":{"name":"hermione","version":"3.12.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.12.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"831a7d4fc7dbf856479808f6f6270504a61b3307","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.12.0.tgz","fileCount":102,"integrity":"sha512-SWy1PisDEc8+TKRLw3AU8HbKkAPcnSzt9qcayTvfiX2QReyKerA7AoQ9kWwpT1HGP8JcdR+tAmVp3/qgvIZg9g==","signatures":[{"sig":"MEYCIQCImF6Qk7Z8cuFxnPdpZNzkr7c08fP/c0sgi4rQHEKIEgIhAKY57ewWXWvGwkCerxcFVDq+LYJ3TnkhpoqvRQIiiQfE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":287154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhQxn4CRA9TVsSAnZWagAAIfsP/jdIjinkvcv/QBniE2rk\nIxnsCHDWCATBwSsvB4ayDfpVyw9bUxYTdgnuikXwYWtxlPLdcBojLCWh1mPR\nx2I/Ri/QTF48g/pli11cupHHRGqVX1+8qe2jOjpJAdnN7US9G11EHezisQat\nrk2pAOiLNMqByDEB/geGQmCyqspfr7OpXsFNRuRTHpOgHbpvqUQBm4wA7KBu\no79OSOV/6SqXVWqcSBafr2P8QDwq0Lcakhz1A88vpfRV9BHIfCiJ7x+oLapJ\n1puoS4Zt4DIabKrXN3hinRrDkq4luGgYRqClwqtewjjWBWBHIDe2y27y7JGr\nZrjsFGIPVRY6lE3uS10aslxrXG2HVYcFToAvpnrCJeOFxytFJySqCi5V3mjm\nCFlDjL1lXveWPqCysWwobVuWGfqL3iXdVqb3oVutvjfjVdLMfyGkWcBo4o8o\nPxi8MPjzDDxi0fmi+rHfTXEbeq3uaRVOpB76rJJ4ccPFXH/V0g7J1yLGxPFb\n9FSu1zh389QwSPx8UQjhndIY7GD6k36xHrI1TtOFL9yxw04e4E2MaADVFLbA\nNJTSRLFpCMy4vjLEUn80Omfkj1cT13Ni0Wqaa0+2uiXWKEj/C9+Euy8E+joY\npHfMfdQ8nWxes/oCDbRqOB9JyjnKbRBGPQT5n2vwoT0ix6+CoAHWVNkrjCby\n2TH1\r\n=1t2h\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [w3cCompatible](#w3ccompatible)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0',\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### w3cCompatible\nEnable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"79baca1c0b9035f75707472a3ae5385240deef1b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.5","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.16.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.12.0_1631787512545_0.525452411102761","host":"s3://npm-registry-packages"}},"3.12.1":{"name":"hermione","version":"3.12.1","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.12.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"5b2e7f3abb84361b10026110b61a6937e47624a3","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.12.1.tgz","fileCount":102,"integrity":"sha512-wf01A2xwaTV9C/6v0GjZ9Hhd3MeBBORCUPwnWcK3I1pu4Fernpmq7Li0SdsT5+MQZJFf3ZPuaCYgydllHqH0Wg==","signatures":[{"sig":"MEUCIQD7b9rDiJOOeqBvGXSjLj969rv8bz6peHAvWnw/c0PitwIgbGfvIjW4jCAhP/bt/G+J4eKPE7hB9/1l9cj8qIWjE5o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":287274},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [w3cCompatible](#w3ccompatible)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0',\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### w3cCompatible\nEnable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"9087254e5509bc696692af34d04df5844981abe5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.5","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.17.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.12.1_1631887208819_0.2105039142263614","host":"s3://npm-registry-packages"}},"4.4.3":{"name":"hermione","version":"4.4.3","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.4.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"44aa3facad8c72382e288907b77ddd4c53b96900","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.4.3.tgz","fileCount":105,"integrity":"sha512-cOxtQJ17y3IGfrbbhAES8VBv3Y70k77BMwS0zp8FTsxROKqmYVtEsXFkaPKdSzgBajZjS43HOoK2+bCpHMyiZQ==","signatures":[{"sig":"MEQCIAg9CtjUZRst3Nt+KwfdKFhIXD/s2hJlhmxcrfnxRtJgAiAI1FoYpvJV7kefJRqcdCkBL1VZPALT2eY38nIkpEVfiQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":311854},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8a6c5d91bb1fcdcac7445af18a6df2109ff8d67b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.4.3_1631887691117_0.12951045896715208","host":"s3://npm-registry-packages"}},"4.4.4":{"name":"hermione","version":"4.4.4","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@4.4.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"84a09fed1c4696cd642bc6c4c0af6903ba7f007a","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.4.4.tgz","fileCount":105,"integrity":"sha512-w0EOL0E5gn0nWiunfLephbc/5vSzD9u5QW+0f1RWrtFEc2PoSIcqKElD48SfHurSx+8T7RI8qHEqQ/d68TvVBQ==","signatures":[{"sig":"MEYCIQDkWJnmAWMSouaZLTJ4PtW/qKVDAKMTkfIrp3GVtIHCywIhAK6fL1c6rkKgX65y8cvCQ1DKyPTH1fEZdfWf1mD/ROqo","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":312160},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"f0ea3f248a4c245638ee87ebc14cf0ebc93d6d15","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@types/node":"^8.5.10","@wdio/types":"^7.8.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.4.4_1633076601240_0.5040071424151726","host":"s3://npm-registry-packages"}},"4.5.0":{"name":"hermione","version":"4.5.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.5.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"76fc9812b0f345b23dc78a151f3bd9a681bc9f1e","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.5.0.tgz","fileCount":105,"integrity":"sha512-Jm3ZrMBuFFzPSPxhCLHe0HFCvH0fxvrhqFPFDer7WS17qo2GCBEEp+XK1G0ce6+7Yud0byKODjFl6yIjZ9D6rQ==","signatures":[{"sig":"MEUCIQC1CB65OeCvyZUo6zYw33dIccLYDBBNiD7XdKhpvaD8OwIgROzJwhFmLqh9sxzfTO8pIFEGNe+cyONA7E89xGnoJz8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":312433},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"d08a58b329519508ba7817dc784bed15a5a52652","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.2.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.5.0_1633975528816_0.08798191648957143","host":"s3://npm-registry-packages"}},"4.6.0":{"name":"hermione","version":"4.6.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.6.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"16b0bd87c893c718e95cc7ab2d6e98b675cbba08","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.6.0.tgz","fileCount":105,"integrity":"sha512-OrT9wUgNozRPCqdD6W64IOxzHbiZbdwa/qD9mC3oi6Qw9sx3zZdlv17ZF108Ia2W6g7YCFhfwj48/vzkKlawHg==","signatures":[{"sig":"MEUCIFZ5dDMMzff9osMcmpLB+gYn88+y5E9XXW7CR6jD1aZkAiEA5xvBI6LUlGlNQiPy9OhqTd5KknEVCllxkaC/JnSiqL4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":312696},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"79e51b1513ff992bdaa1fc971a235f83e587c32a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.0","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.6.0_1634047821301_0.3224959124558888","host":"s3://npm-registry-packages"}},"4.6.1":{"name":"hermione","version":"4.6.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.6.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"fa04674b17879d0c73ad64d32cad17c2db4e8f54","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.6.1.tgz","fileCount":105,"integrity":"sha512-nnRed392TY7DbUabbwKdlkWYA39B4vih8hWxmwmE9y06bO2BifDDl92vb3TYnDm4WCzAy4MSkNMaxvcY6puIJA==","signatures":[{"sig":"MEYCIQC+rxtpjOA7M+D2nvLt1/RMLWsO6SlbGUNJTLfLarraTQIhAMQXZwVHpUxafm8M7aSx0KWHLGxvOI3l+GWPTmO/XqEE","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":312917},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"e29c34363e63a3b03cec9021ed4f4ed63690e74b","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.0","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.6.1_1634124848714_0.9744727435286709","host":"s3://npm-registry-packages"}},"4.6.2":{"name":"hermione","version":"4.6.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.6.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f92ef8ba339ff4c989ec8d3940d25561ffaa1c72","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.6.2.tgz","fileCount":105,"integrity":"sha512-6DwhXDqH6VAmO+SmxsYGYUq0yE/5i9Fl2QcWO1RPUiJkCtH7iZvI/Nzd76Z5oxdTNB4r8D1BO01ep26amDvMcA==","signatures":[{"sig":"MEQCIDYw2PbPgO7EEV+6S+CCEs3VhkkzdiWTZgM2BQ2P4bm0AiB7aNhC6UgiwoXgtXc8gxntFnw+UOc5zt9rwXNXi/dkGQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":313186},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"a1545e6c55d059b2ee312c66e96d08e08a3c505e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.1","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.6.2_1634137206271_0.8709876801472669","host":"s3://npm-registry-packages"}},"4.6.3":{"name":"hermione","version":"4.6.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.6.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"d56c850f69b9cce6353fa5052c972a50e2e77cfd","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.6.3.tgz","fileCount":105,"integrity":"sha512-K2/Y/WfFp2yvOloyeQvQGyxoMkRmgZHN3KY5iiG6WJJE1+MRZz0yR8jy4fojaZ5evAQYXzHrXdtoX/89sH+lDg==","signatures":[{"sig":"MEYCIQCIZV7k0TrVQl/dtTSgt2hVxC9aB16tKWdYXA7RZ1qiFwIhAOBjuFLXS4z8rBtd8istAa0pRkqKAsTDiLKHqsqGyLro","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":313437},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"1576430b7196849a09c23efc984e7ee680dcb460","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.6.3_1634138797002_0.7242742474585235","host":"s3://npm-registry-packages"}},"4.6.4":{"name":"hermione","version":"4.6.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.6.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"1ab96f99d79150096ab521331671c6ee01fb44f1","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.6.4.tgz","fileCount":105,"integrity":"sha512-Dypa4e+ySZRlZW2zIBSVuTJn05D6u4DHw5iLk0CGZwKEGprWiAflQJex2l0yJVoOWVo1Ngkb2pYxIORNnHVufw==","signatures":[{"sig":"MEUCIQCx6C4IqzzOOovXEQnkLEugoGDEyDVPu1Q0QytYb8Mm3wIgPmYuiOsuPxCb81M9SnfwnHAOwsLsIyYGVo2HAr3aUDo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":314679},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"f9fc1898aaeaee180ef7222fde34d6bf5d85c2ae","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"mb1te","email":"mb1te.comics@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.6.4_1634292174602_0.1727968277677463","host":"s3://npm-registry-packages"}},"4.7.0":{"name":"hermione","version":"4.7.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"433460fff3aeed77826241c947eb287f5ebc7530","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.0.tgz","fileCount":105,"integrity":"sha512-7A1DA4Sjp8ASjyTToU/VkzEPjy8AnvNg/OJW/+wfyj4ujKxrGywOwUYu4K27tRrbD2gsGW7YkrEAgPpM6E3g+g==","signatures":[{"sig":"MEQCIBpSdhGBTuZnh/NjoikX+2LwU2CyI4wT0nQRiF/9h4CRAiA2ME/EYmMExBAk8BzPqrer9w90962bWYwdCa3z56aJcw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315377},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8274bc4037f1133b4f4be89fb923b6f4c156b0e1","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.0_1636364108956_0.5068873201986435","host":"s3://npm-registry-packages"}},"4.7.1":{"name":"hermione","version":"4.7.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c7b968ba0e53f9a282eb76a0353934d48b1418bd","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.1.tgz","fileCount":105,"integrity":"sha512-ZjJML8lYJl03+culm6PamGOUCPXz4a4d6PHsm3Ei6rbn+mCNaI0jTaGgKFwJ4W03soOZGTOmy67qaalCfZ4zgA==","signatures":[{"sig":"MEYCIQCppqca5REBHNSRmYmECcTf5Jjr/SXvnKi49FzSyKWnHQIhAPvvZYvySkENTZ1SV7tqa+HirPw3Ggs89GMZjpOxFXkn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315183},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"02a28ad7f68fb6505ef59bb92921194dbe136a42","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.2","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.1_1636389545778_0.43567495694790326","host":"s3://npm-registry-packages"}},"4.7.2":{"name":"hermione","version":"4.7.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"05a563043bb6a03853b1c8065ae070cde75218b3","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.2.tgz","fileCount":105,"integrity":"sha512-BT1D3E8nbLUyuPN8VHob84tGZph1jhuva/GvhOQ2uVwxHpeW2Y8tAN5cAzoPeOb8t9gvlQ+aoXh2PE1KtsJVfQ==","signatures":[{"sig":"MEQCIEfAUUwgXXU1uYtruFjaJbWQ8SSgFmbEcJy1kCNbYHxyAiBzF+8HYF9rKD2XU+fuow6cgc12vGiysmX+MGBj/ebzCw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315431},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"a2f03022fa64cd3668e59d05917bb6ad377e82db","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.0","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.3","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.2_1636650462714_0.896740628637414","host":"s3://npm-registry-packages"}},"4.7.3":{"name":"hermione","version":"4.7.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"112b6b9a59e2fc8bf1352ee7dd6b888700688f53","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.3.tgz","fileCount":105,"integrity":"sha512-mIu263HSIq7U4c1SYieHXR/bLNdOm5mlR4MmUBs1d4MtGG7gEDt9xPsv8GyzufXdWtPRznWw0z0IBOGhJTXJdA==","signatures":[{"sig":"MEUCIARTbmjScvqmAeSyLwpsDouZ4QGrHdw1CiZ/5wuuBJmEAiEArYSXV+ubZUiXGMgliQPsgJDq6RTDkPB1Eeb7fXC4Fzw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhm7FUCRA9TVsSAnZWagAAZw8P/2RaJdLARA80M+xYxkCf\n312tjaXpgRl8NQzBfDnat8ItS/2rj7TesX1IHyI3MN+F6YI3DFuOdoQviBZt\nAED0+fiXAArhpWgVeQiTzAObKi21xWZCQ469mphHvD159dQjK5gjNYYuNbOu\nCsASjckhRgtbZjoyYDcqklUWmUWP3hTk2k3/3SZ9cktt0IZHRVnjGqbRJWFv\nb50i9VrpCnqNgWvZQn4xv+rzFfKfRleTkOhYHe4/SyON1+1M1n0FgoiAGiyY\n7KlNNmYUL1YhU6JiHkYvWS3oxSuI2D6WY86Fgx4VJ6eyl6QbqKbmib9Rtwdk\ntQ28WkD/wrcU2+e+jcWt31bAYn5pBi5rrysEGoceOip0Q4fpbekcAbFqo9Rh\nHc6QXQGqNWaYZEtrAycqhwFzUEGAXgnEgxIZLJ/QoVhqbc/8CCXujy3dllyp\nBY+FGVXE5a5zCkvG3co5N8Bx8CQHLvvMl0hIrx/qsZY79L7vv+8TzdVLENHQ\nHLJyZVM5haqj+Vrdna9FAeWbPQZPTrS4sH7Owk9Cb2Egu6G3TosvMtBB04/L\n2J7I6GfcBBvRwVbYKSAxl/LxImAEPGrI0jYeCnF0zFZoRZeD0TNenXaTo1gp\nF4xfEJArr2v/0sXPlAQNhUI0yQP8f2OirKE5xu+WBKlhLVxBQfMsDPYbMKMl\nk6pq\r\n=1rju\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8a28e0f2d078c8acd5ee22d69c6020cf9b5a26d7","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.0","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.4","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.3_1637593428121_0.3678423891375606","host":"s3://npm-registry-packages"}},"4.7.4":{"name":"hermione","version":"4.7.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"76e2e83880d4cb1f2ae4a46da677b560441088b0","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.4.tgz","fileCount":105,"integrity":"sha512-+MuGSUOA2sLfO0sh9+g4hKHjAebL69XMSsfzk40l2Uh4Y98faW2uAxOO3F6oOeecnVemHfbhQxMTGF+9QDh99A==","signatures":[{"sig":"MEQCIAd6SP6kDlLtkJc09q9lIFMG1gpJVLwKy2gxi6Oc7u3nAiA9ERgGI4WZ0yxfts6aWIONfUBOZEm+SfprMO4OqsKung==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315784,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnlTfCRA9TVsSAnZWagAATj0P/2HS7gLylFrNTXB8cTKg\nUsC886KPnlvlRBfGnZu0yXcKMajCmnxW8cdiqd8QXRud17NurOL6d+/KZ796\n9hZ2JjQJcuwB6jgdZrDI5WE/fZKed52hVlM933I7d1GEgNQRwDbI7HnjhGvx\nG28iWXp32f8WpYZPXrlPjau+PUU6s7zok+ZMcTk+4uohsps6iFT/ipUOfC1w\nwRfgFGhOtotLbgn3Ef+V3wijmo2JpRrFCI50InQ6Tbe3top1uG6Q4gnx1ccw\nJCKfcAaLa3XxzYCmqY4/7bVDw0JIdLmKFqxV++PZtbGBf5KPIuchno3q3gk0\nnK2XB/qmF5K+ki0h7JUfY0z8c2glk+rZuqVfvhj6e5GRU2/TXuc1YCDB4JIP\nlE4DD268ZFMDQw0/Tp5tK7cKvryIc86rfyTJunw0YT7V2lBVATlkVC8l1dsb\naC9GA/2AET8V4vo9nTGRy1QnBWnOeh+DMZBK/V8vYpDwPMET+w15ldwRzBSb\naFN39q77GMPe0tUvT14+UNzPzky53FnA0/a4LVdqi0Hm4zJM7ksDIwMoV43y\nPDisQEPjowOfan7seFJrdd9gRuXaVzHtvw1CvgGqgONm8744noR6R4RcPfA8\nF/BJxrqgS4wa64o7HrdSx/Wne3ynbLFibfwnhrsfBXRwO9tRtrptMce/p5Zq\nIMuo\r\n=cKE6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"50626d74a0498a5b9823be2789566e92e2742dda","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"rostik404","email":"shtanko243@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.4","webdriverio":"^7.10.0","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.10.1","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.4_1637766367563_0.8614234172491293","host":"s3://npm-registry-packages"}},"4.7.5":{"name":"hermione","version":"4.7.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"catwithapple","email":"alexeybegunov@gmail.com"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"2c14422e1fedfd2982dd091fa909bf13f432e537","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.5.tgz","fileCount":105,"integrity":"sha512-h67U0fZA3JQBn43zv4yCZ7sGehr9CMpWbbLIUiWYK6U5/0VUb/V/8ugnu9mbRYvPso9HEKcN/YO8iQpXGTiFiw==","signatures":[{"sig":"MEYCIQCRrYN9qSh/4kvc3aFScr2kFlPWOc1GFey2Wup0oZpqDQIhAPYWZOeMCZ/L3/6TYFh3g+mIyYGtZ8QK25MDl5e3BLmQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":315902,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuZcnCRA9TVsSAnZWagAAvQgQAJeLfJwIpp0jfNuBZC0H\nOUfeWs8BasKOiPeFmpa/y7dgelJGPkDIpa7dsypY1Ru9ceD3aoNd33CChMNs\n3cTbyaz8tztXWQPUPJSJ6MEiM1G4vp+foBf5efvfR2xmWPx8S4tansrEDBfs\nmkZgSkoZshlNrnDg49GbKGuED9Sb+UzXR4jpflNn1uKHlwmfSN/8kifginYc\n/DXUp7Zei5nzB2l3KU9a27eigtp1AK4lWzd5GR9GMtOteD9bGK9sbep8e1AZ\ndhM8Pded78Lea0A/Zd7YGw9rPqMXCf9FkhEqN4qfJ5n7nx/1/E/0+ShI9EyW\nhIKKIx5ogFLuogo/e3R3AVtDWfzS5BdZ6XCXA4CEjS4/a7aknxLCcO8jdzZF\nXhlz/x8AmAnZdMB53Gd1SkaV7IJZMJXrQ/TDGpx0X+/nXhXZpiTQNr4gV/q+\nWUOHF7/I+fct30fnLAvikWwfb2p3RQ6mJRBFyNQIPoCTg3qRg+ZZJReldMu9\nDFJFm4KCniUDEo/ipOBfvau+bHgCGVxZHptNCcg6vvHqpSE/MMwMTqMp7X7D\nafUYESk1Z8AHIKTqZJrVA5rEdEUq180gpAefQrMMpt20DMkBk/Akydx+vfUD\nWxxf9M9HrIOSA8MgtatatnG/BPpnhU6Ct5v+8bZot92yByYnk7wEcWjWcQKG\nIoVR\r\n=JZKx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"bd45f0958b5932b15b573537a44d8fb903138a16","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/utils":"^7.10.0","gemini-core":"^6.3.4","webdriverio":"^7.16.11","worker-farm":"^1.7.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","@wdio/types":"^7.16.11","@types/mocha":"^9.0.0","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.5_1639552807589_0.2262917214335276","host":"s3://npm-registry-packages"}},"4.7.6":{"name":"hermione","version":"4.7.6","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"8c4c07a71ae179bb6ed289fe6e8eecddbb6e3b07","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.6.tgz","fileCount":105,"integrity":"sha512-WzDs3oT6bUNViCdd0a/juDDwRLIhyssrDBhPDJ12BMxUmGFnY/KbtDZcxCIyIWkImJYMX8j7+N1EpUkKG/8eMQ==","signatures":[{"sig":"MEYCIQD3VRgXMG+9//MWLNc+MCDqCvNuj2YrzaUQfLo/tDW64AIhAJQCkPM+rfB4AhocIpnUCSnUu1nJjfC78pBSsZuDZLQR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":316156,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh8YqvCRA9TVsSAnZWagAASesP/iGPAhy2zVOIyTB2MGps\njfOt3ra364DrsiNmsMluFDWecrrXWcd33M1cu6tOEyKPm6edYvvXKIKQUmby\nZ4PZ25jPg3eLkEJUpUA4MH/9H/Ig4Yg6XaRSdb7cI7amw0hgyw+TeAKMvBAm\nKjevwNPasKDXlNwNkH9da4Mi/n7ZyC9AVDSB4hmxJ8jt4ehFqDPetgbzirEF\nD10b0Eb9ViYpuWIdjOZjB4ytuyhYxeD0a/7NaFh17qbLuScv81i5FSjGqvh7\n2OqY5242ifp8QdGSC9LKFRpGTOWvQfWDvlYVD0Q/GsvtoHct8jjW8fi4HOHE\n1tGr0kfpC4zbsBY6L2kbPfvM4fDrJAS5NYyi8b4vg+aHfZuho6sBen2YQz44\nrs/+rVekJdPJiSme5E92dt7Rf3ljaMefhSA9tNHxytJwNcTutIkWcfq/+mxP\n3zdexwmJKgsHb4NrtSNtbzz9ujCHAgQ5HBd0GqB81IZCIoRFL2YT7sgCxs1X\neoWpfLqeMQz9hMQGPGCMDGdcs7qF9VUve0SwvhJbymKVUcOASN2IRdrB9jMG\n/QAQEhK1zqWpfElyvNqwDC+n/0iJbNycpyimu65SXlCsYzPk10eytYk7LF6v\nBSCfJpGZz9L+0H3SZmkOoJkbPelXnv31U57UnKNBiwJ2Rxh7ZT4ex3uas+YI\nB2Pb\r\n=ob/R\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"4281ae32b74dfed7183ca2422d1ccfaafb2f16f2","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.3.4","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.6_1643219631741_0.09586997904867833","host":"s3://npm-registry-packages"}},"4.7.7":{"name":"hermione","version":"4.7.7","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.7","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"flack","email":"alexrybakov@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"mb1te","email":"mb1te.comics@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"9352e88e2ead77ff7558ea39ad6357686e367fe8","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.7.tgz","fileCount":105,"integrity":"sha512-Itxceqqc1zuR/DhhZhTr3fjUoWS5F3vNJj9LNE0V52sJRvggDdECYF9YKJEPHoS3HPsc3+RCu/9EsFgdpRoWqw==","signatures":[{"sig":"MEUCIHcjIeJ6xRTUW82H0jNPaKPRyI6e0dS92qnNU8Isnl6AAiEA/zKqMi0wGyD2T+fy43A6UA20O4nEFW5KZYRaUSg3WV8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":316390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiATGQCRA9TVsSAnZWagAAAqYP/1ZgAQfjQNui8e6Bepr1\nGw3bdfET7Av1NYBLJD284LzgUlcnJbfLhwHILLGqEAiO+ADvqtBNGlOp0y8f\nENOhfv8FnhkjU5kYr+Of1O6HecKrZi2oeJcljNrPnp8K5SR4q7xqMMBjNMHH\n/JdepiNROwpVzndJ3LTy4TdcMJjSTA7yEJdz8cS/50ib+sq2rj1jV8F4iZnO\noValbNRJ1HhrEoaO7vTenQm9Ps71Pgi6hCUSdyaDrrniUXbRu5o71MFGLAC3\nD3SSCar561ccCdd/mfS9kQGcUrEKSP9+ex7P30qLkZY4GuuD/YxINbutDTY0\nrorAUPivT1s/m8F28jwx7wJ3lAunpgf8KC/NDMlDPt7ryAOyTtB5Ptnag262\n8Tu1k2aX5daLEMighwTpJsC6+Q59/HgMkM5UdK2jY+CyZxkW5+WNWw4Hp0XD\nZKqu+tk16Ia/ILXWKddF9yPY+xjuxPSUfXUb+lybKb4XYrkRHFpFqpxXhQVu\n+SHqhM2PcL3KjXwazsCcyETtM+ZxCj7SVp0C2AL3LT1QVNCGdhg1FttBj2vk\nzQW3UhK8P+6fwGdJfW2cOOXgBtdc32VhlTGNotyFpr5dIHxLOIeI65GlW61z\nQUdmXMLZaSr4gWlAzIWer5wOflIUe93fyybnqz9SfcGEDg6/UquJnMzYOHXN\nnA6L\r\n=ond5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"faaabaf36be9cead5d33f49b03a5ee13e0339335","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.0","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.3.6","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.7_1644245392436_0.9484056000222085","host":"s3://npm-registry-packages"}},"4.7.8":{"name":"hermione","version":"4.7.8","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.7.8","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e6f41ca83dde33c525f1022310c0d313fc192d0c","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.7.8.tgz","fileCount":109,"integrity":"sha512-eJAn8wg447Zk3cL/3Z55mYD58Gg+DebDy7kX9R0shhcnzvvWPR3yFMdtIGrWIEteqs2J0A6E6iv5WFRy+yDRpQ==","signatures":[{"sig":"MEUCIQDDj+u0bQ+/m2Sxq90GofM8X1Jxx0/GxO8Lcxu1I5FuFwIgKJCJ0+WZe77GJGrYM0PI8wjwmHJz9KuWWVlYx7JqIXQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":318315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIf+bACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8KQ//WQKIv6cwPY1ciQmkso0HTckC1na1UssfF6zFcIJZEJ0dDs0O\r\nBBfmPISL6AR3C4L7bpC3EFX9hpuBQdjORo+uh/PT7Nf44F8Aj6BF6QF5kjMg\r\nYqdKhDo4Z/fRB52sd3ANP8a3Y+lpgzVOyElpvp9v08DUf9XU0+jVNKcQSE5T\r\ngp715p3ZpRdCJ7XViunyw/gCFTlX4RaYbLqzJmWmEEKYdijwH970Q3NjxcEb\r\nnI+qN9KQ2vwP3nBsAZ3I+TsblL20p/cietFzmCCdrRraXiAeSWbu27J4L5uS\r\nJXjoUHvF/De02ys8EmalrxBdBN/HHB6OCL51wYRtE3PeQHCWSuY5qIu5/Kq7\r\nXu1fsJmlhunQGI/5uMeoVNYGVsjBTf2ailW2TYP0pv5Q86wT4fNckAtL7Dtw\r\nFsI7ADmckv71z0eHVD0NOMF6bLIzZqdzVm+hOaTenR9lA84dV7bqLWpIBecn\r\nKw5SlcqTDbVqpI3VoH+qCh3SzcZ7+AIFmz1wzBZWrCXaMudMlBogYwyePbOu\r\nUawULa/kC9vpHsfdhKitrvgP5sTthRqALcYX2Q5mcfCQcguF37Sv04Z7pGFK\r\nPDg9CYe29VCi1mrZWjn4MmZioU5lC/lJ4ftJ9+8BLSBRsvrGkz6B/vJUNIe2\r\nfhMCZ9KfDVjYdidzdmRcVI1jod3mfBEshyo=\r\n=o4Rm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"17e72448c9d07279ff53f54b762d7d6e350502a9","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.15","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.3.6","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.1.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.7.8_1646395291348_0.8052652552765058","host":"s3://npm-registry-packages"}},"4.8.0":{"name":"hermione","version":"4.8.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.8.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"386dc8b8982fe596aca5550eb41be2b866c9a337","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.8.0.tgz","fileCount":105,"integrity":"sha512-1tEmGQ21KjWeVesVGh2Zie5KbmPxxltTO/41zwqptiXxlBBjaHFIBNuAGLTadpeO49Fu+JrGsgp95k6Baby/EQ==","signatures":[{"sig":"MEQCIEbxXu+HKjt3UWV/5Y5sZVk0Mv0eZvIqObo8TuTFTLHuAiAiEMCX8a1VXss/nJCYUVnCYuNTOPpagn9TBjvp7LhGTg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":324330,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiOZsvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr13hAAkNQm4B5Y0hx0/1t4UqpMm+3iGiGI3hlwhhh7ztENtdjBFJaD\r\no465H/Ikkd2hPhqkgqhdOQPWgcHCnSLRe4C/gHLBvi3pNjU7B7XUco10sHUi\r\nDyOGUytDbUAusZBcmAYtb62QghpNFg+Q4hyZlU8nwyHq6YN1fWwyRrdVmuFO\r\n9yGkDYpUL6jyjOVKYc9aveGX7VRAf95i6oYrXHaISJ3TdSHhe2Rx2o2VDjDk\r\nhtsQaZiWt85O7TWetL/g+sHgTwDIUvlRIPqAblKeiURRdtPGK8V5ixYU5MeX\r\nHe53FmIxQ9ZHGzpAZiNzKhL2F8oyV5v9eEWeZZq2+ET5sg4GQEuPqeRYFOey\r\n+T82dE1I6F9opu6H67fst0QISvfNr6WG0nCajJTGo/tGSezyU1SLASemlaq1\r\ns9JlYnMcB+pe3//rDlN+BnxwcoH2f1xBW3400EyZ/Lbh7v2fs6RdW71MKHI6\r\nhBswm9nRbC04trInXqrGZAbf6jfXuZDrywvTB9XF1UAr45FoGkz6lblkpUUE\r\nU1sMbjyYzL7Bd6xNw9sZri8XavRtMS8x2iuq7yUXRYkn80ODum3rOo3TnMwI\r\ntQGJNWh8RXYBkpczrd8nOz55ZXvjqrPjp6QPcPSLvCI2HLU14N7cbNn8wvIi\r\nKVidPD202R5cHq/A7eVK7cQyF3n6UDfjzMc=\r\n=3Jdh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"a1204d470aac9df0174c76617f774aec63a4637e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"oldskytree","email":"ilyashassen@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"7.24.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.8.0_1647942447009_0.10513312854638457","host":"s3://npm-registry-packages"}},"3.13.0":{"name":"hermione","version":"3.13.0","keywords":["hermione","mocha","test","webdriverio"],"license":"MIT","_id":"hermione@3.13.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4bcb38b05f9278a02e47afbab155f2c0f41e8ae9","tarball":"https://registry.npmjs.org/hermione/-/hermione-3.13.0.tgz","fileCount":103,"integrity":"sha512-iOtDGXXeWS1np0yFPcp+n792x6nE+YsekcdkYfbS4cVi2JAatgUmW4jSeVEXYcJ2Sbnphi2F5suHbeupdOHVzw==","signatures":[{"sig":"MEUCIGmZDfSXVYsYihPFYl64QDzVPn36z03OXM63SpTjhGccAiEA2vZwrawLVf0V3zIZMwvc7GbM5snWUtYrfQ3us6yzq9A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":289244,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJic8oNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoABg/+MMSAJw3h3+yx1OM6VnfRs06UK7rA11qp2w6F21Rr0zvmupvC\r\n8T27D4gqbRu31oK7ph8JP3SNEU+1nauKkbDFBA2VpbsEQbO81oiXGsCbCJwi\r\nsHkFSF4BxYLW5t9ESJrcaNSxRgGNsacFrh1up9uEOGqV4zSBeGvq87fayhDQ\r\niJWcl2to+Sjwg4aIsl+eLwaIWiZVyH/lOXuEy/1IUZ1FCzafNscMCGb98bff\r\nL8FIYcqzytxBec0ZRedLsjRrHruYo0jwGOMUVrfQN+bNjRCH6WIrhXqqdIFC\r\n8HJCfltwscJ0B/YAdWGG+ru7+/uigxMpvcvUHSs1zm4P5iA80zUfS8qwdI18\r\nR3NuWeJGQ5ZFZKoqpoZ5RDMJKqLsWuHdAmQIKpFJNP2XoYGHlir/Kxx0cz0m\r\ny6RoV1vdUYFcODX6CX+HK+fg8PBOjQ8r349peXzAnS0LPcUxADmaqaVGIaXZ\r\nKPoxaQCj41AXLISUl3JrXo+alRFwnqT63IB+ycQx1F4Z/VV9POGYWmM/YchO\r\njv5tjyeUFklBcp7OBQDrbmJumyF3nlxjX8GfZIR+bCQdqgEkmnAUJmOtAEHV\r\nOEERbS6F6emZ1De663euiaWCgw/U276FlUH8zQ4doP0ulvYNz5q1/dwEcLyy\r\n5UP3wzdeDhKmAL4PGfJUZ/VBg0RIaFwltKI=\r\n=5cb0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v4](http://v4.webdriver.io/api.html) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n- [Tests API](#tests-api)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [Quick start](#quick-start)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [w3cCompatible](#w3ccompatible)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryOnTestTimeout](#savehistoryontesttimeout)\n    - [saveHistoryOnError](#savehistoryonerror)\n    - [headers](#headers)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `this.browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nBecause `hermione` is based on `WebdriverIO`, you need to set up [Selenium](http://www.seleniumhq.org/) before proceeding further.\n\nThe simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). After installing it (globally), you can install drivers by command\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Tests API\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', function() {\n    return this.browser\n        .setMeta('foo', 'bar')\n        .url('/foo/bar?baz=qux')\n        .getMeta('foo')\n        .then((val) => console.log(val)) // prints 'bar'\n        .getMeta('url')\n        .then((url) => console.log(url)) // prints '/foo/bar?baz=qux'\n        .getMeta()\n        .then((meta) => console.log(meta)) // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', function() {\n    return this.browser\n        .url('/foo/bar')\n        .then(function() {\n            console.log('test', this.executionContext);\n        });\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView('plain', '.button')\n        .click('.button')\n        .assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', function() {\n    return this.browser\n        .url('some/url')\n        .assertView(\n            'plain', '.form',\n            {\n                ignoreElements: ['.link'],\n                tolerance: 5,\n                antialiasingTolerance: 4,\n                allowViewportOverflow: true,\n                captureElementFromTop: true,\n                compositeImage: true,\n                screenshotDelay: 10\n            }\n        );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root.\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome' // this browser should be installed on your OS\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', function() {\n    it('should find hermione', function() {\n        return this.browser\n            .url('https://github.com/gemini-testing/hermione')\n            .getText('#readme h1')\n            .then(function(title) {\n                assert.equal(title, 'Hermione')\n            });\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`screenshotPath`          | Directory to save screenshots by Webdriverio. Default value is `null`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`w3cCompatible`           | Enable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistoryOnTestTimeout`| Save history of all executed commands in the error object on test timeout. `false` by default.\n`saveHistoryOnError`      | Save history of all executed commands in the error object on any error. `false` by default.\n`headers`                 | Allows to set custom headers to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](http://v4.webdriver.io/guide/getstarted/configuration.html#headers). Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0',\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### w3cCompatible\nEnable [w3c compatible](https://w3c.github.io/webdriver/) browsers support. Default value is `false`\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\n#### saveHistoryOnTestTimeout\n\nAllows to save history of all executed commands in the error object on test timeout. `false` by default.\n\n#### saveHistoryOnError\n\nAllows to save history of all executed commands in the error object on any error. `false` by default.\n\n#### headers\n\nAllows to set custom headers to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](http://v4.webdriver.io/guide/getstarted/configuration.html#headers). Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [hermione-allure-reporter](https://github.com/gemini-testing/hermione-allure-reporter) and [hermione-tunnel](https://github.com/gemini-testing/hermione-tunnel).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `String` – Path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 8.0.0"},"gitHead":"1e963c0495b4d3cecfcd5ee8bff13928119f2277","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha -- test/","preversion":"npm run lint && npm test"},"_npmUser":{"name":"oldskytree","email":"ilyashassen@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.12","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"10.24.1","dependencies":{"q":"^2.0.0","chalk":"^1.1.1","mocha":"~2.4.5","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","bluebird-q":"^2.1.1","@types/node":"^8.5.10","gemini-core":"6.1.5","worker-farm":"^1.7.0","@types/mocha":"^2.2.48","clear-require":"^1.0.1","plugins-loader":"^1.1.0","q-promise-utils":"^1.0.0","@types/webdriverio":"^4.13.3","gemini-configparser":"^1.0.0","json-stringify-safe":"^5.0.1","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6","@gemini-testing/webdriverio":"4.17.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_3.13.0_1651755532978_0.3089602365048647","host":"s3://npm-registry-packages"}},"4.9.0":{"name":"hermione","version":"4.9.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.9.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0c09a3a9ce383ece88f7f51fdda9f1042686dcab","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.9.0.tgz","fileCount":105,"integrity":"sha512-yHSk2oiv9GvNKFdiTEOhZ6oB+3PvdrwyFlGoh7a0r5WvuQY3hv9paPY7WglA8aaqWRR4gAPLns/cgCSCYfrgkg==","signatures":[{"sig":"MEUCIQDea1yqnYdbxtxdltQ8B8zKKdDl79h+kIgD6CoqFyvyxgIgeJobz7UhOIk+d4FINxeWX9cFPLBWF3wf/JltT4BjFII=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":328087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijPfLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqz6hAAlmdIyv4c0DBBCfP1FryvsESGAzPRTvH2UXg3MKsgfJUiBSq0\r\nyQBVJYGNqivZZjUPhVnmQLt/qmo/pXeF2og0hgnHMB19TrGhrvZgHvSXBMP3\r\nHNGjH859fdqfnr4GJHJLEReX4Yf5KVnIvkJIXo61+9vQXG+PrYM0yprHde24\r\nhCZhNGngtHgwvr32A0S2sfyEdq8AFtkxiRtb57YSqxZIVJkhu2XY2QiNddXa\r\nWblEiGqeijumWoAH+IF5Q9FA7dVUa2Oeo6HsG/fX6HrHmeNdc11LxY9YFuhB\r\nn/gwXNsuglXpRhGR5gXoK97Fu1m37JNU4BdaVoBUmtqxj5CNYTMUhZE8/YBX\r\n1zbJG7xB1JdeORRyjERotVjSCBshRhgfpZ2x+sQFf9cowBuw91Qr3tgFbVrr\r\n9GiA1jZWo/wz2xMDTJwPGe01XlpBTy/D7j72knZcTzRG0NDA9Uh2q0npLz3F\r\nRcx2hkLua5FzT7lXU4FWAOyHsAq96BboxtWaZcrifxyOQeRPW7Ay0ZB6i7/B\r\n6aRaBTIPKRQ5e7T3qg7tdh8WoP1BI1EwKquz6bjpUtEUeE5crgCyI4GV46CA\r\nD+beoS9kp+osPPbKhvu319SH+NNT4rXObiNhliCRCoeAyv1B7v3wP0U46rja\r\nx6mhiE9eab1o/QwUUobhSI5mnSZAg7XJovc=\r\n=abCx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"ad38faaad05612ac391e509dc1bacff5030b953a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.9.0_1653405643245_0.4132779067816139","host":"s3://npm-registry-packages"}},"4.9.1":{"name":"hermione","version":"4.9.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.9.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f7934668b633017ea30d6062177f407661d535fe","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.9.1.tgz","fileCount":105,"integrity":"sha512-3aP6FVDBhPZ3NgkhQIc6DD/hX3UNICNwbdpgM9/9o/uhZAMidnunICbzuE1CK7Wk1J9nImNeW0+SFUg1tXDd/g==","signatures":[{"sig":"MEUCIQCQ8Vc92tNSwgkHBxPdbfO3ueGXka5m4jhivJlmwP0GlQIgQW6iEUgD+u1JS/7bzOL2DsFyxPHHYfScu5ydkN618ZQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":328203,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJijW9fACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoH9hAAkCoTECdIRhP9i8uPNMgDnLLvXfMr2HAYB8N0gQIqKfwYMYGM\r\ncTtmR5koUKEo/voDmYGgxDrqxHGyxZTldlcQEn7PHQNy0Sl6Kz4IINfmPZNG\r\nynJaWh4aLNVGwAegtV8pot5ku7B1uQRqwJh7IGQO0tWiB4iwlHrDdHoU7KwV\r\nd+uUGbfqh4dqP1shGjgcU5Kz86fMducsmZz0FpIC1hrChhrldBn07NlLPbaM\r\n5zpj9czUOabcSMKi8gFamlnsOKKZR+WhU74ZrIBPhuudT913aPx9OVuNMB7e\r\n/6V2cyoTTk7NIwmczy8GJshrJCTH3xuFcGJMqNELWazCKmirMCIPguuVbQmw\r\n2R+dzZ7eOUTSocQeBzLReNWvw0wz7JSFbOYSkalKtU5pxb5HY/JyO9LGI5n5\r\n6z5BQlAnNjQdy8Klwq2BjRQe+Gv6nFss8hsO0YGkDQz2N2zN+8kBsTRur57q\r\nHMSlzcp4gRL38zgIxop9YEv8jv9n9lXzyUx/6YlVIczp/6/B3rtyDul5RjUc\r\nMziMD4thsQFHtIkKtTXp1aoNFHzAk0/LrL9UgZM35t/KkkmAy2D5llY+c14I\r\nGzT8AMuVTwFwD+5OXUDMpohS6xa4zz5Wu/7N/z4c28kXhT96dhoZMdIXSbX4\r\nrYokaQ6G0oud1SYPNtRFwj8fgIcbbEA4XQk=\r\n=m/Md\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"39873d7828566d7e98599ad5c3018bddb87fd46c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"oldskytree","email":"ilyashassen@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.16","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"14.19.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.1","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.9.1_1653436255006_0.5369338143825113","host":"s3://npm-registry-packages"}},"5.0.0":{"name":"hermione","version":"5.0.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.0.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"03900a4dbec14961707800eb41c451456df0cb06","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.0.0.tgz","fileCount":111,"integrity":"sha512-GU6NQG8rKHzTESlnnc2Oj+nk3kqySv7DxqhzfQNHluwbxnsqUZt9HcBvzq5EWQmTBeGMenaMJ7pqhaplhggPDA==","signatures":[{"sig":"MEQCIHFACNFhFIBzFEiDyJiWKrRcc7SLaYofhB2mgMCjO6W+AiA/nnDy9C24dAhNdyGPBlq5tRBaaCfEBvArFNssXCCTyA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":332289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJipPrBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpOsBAAhP0NOsZB3hCUGQESU+fATrcttNG6rXYOKfstVn5noOpWxW/L\r\nYYUXSbVtjsIKObt2R1gkbcuKoBGxxNDPwUV4ip7lhiQBIhAZZdQv/AaLL2hT\r\nck4hmhfPYGIkXfeKE/zAVvElcTdkuhvxowwFP9oXJc6e7yBgeA9y/Z4LtTou\r\nBjlUkE6bjRWZcTBjXnV6jmXG+j3qwakGroS2sD6ig0TZf2fE2OY1gdX7O62l\r\nrd6DWMOFsPv4OW1WX4W1zIOOo/o86+iahQuPzpAKH0U0MTDVfXppWd0gHSpp\r\n3316FJPEJKrkC3tp1szzYsuwkjQE43e4LY6PEhjDfVyVchWQC+i80jjGgVNW\r\nvJZVyRHznP3GRJQoVF4yW/UNrhDVa4MR9ha6Jd1tTHPwJ10FqdsRpzi/2+6E\r\n9X3ykBnkOiwtWCxViLP3EepHN5nAtbxbZiG3AGs4G/vaz3yArGMeYJYp5LdL\r\nA/BCjVny6tZNavSVRgSwKaiQLzitSJQNH71N6abZSgC0gem21r9naryfyS+B\r\nx1KGub2N68Ps3/8VUDDqk/Pm54ZGycYFh8kD5Q21b1n5Ixcv/4S+dr9Ma33V\r\ndWBBxaoQyanTJdOsLcs//Vx6vd/PWggGGnj2OjwhOEgZoB0j/9HUsYnqLx1d\r\nKTO6oBjUDbFeKplGYzAI/phl6RMGllBrvCw=\r\n=FdaA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"a40dd109eda8d8bc90fed1e88ee4284e6ee09109","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.1","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.0.0_1654979264948_0.5998208594530319","host":"s3://npm-registry-packages"}},"5.0.1":{"name":"hermione","version":"5.0.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.0.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"0f2998931939c66b7f3a13ed8859af621b782cb9","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.0.1.tgz","fileCount":111,"integrity":"sha512-2waiiAs/JPQz0+Xr//Ia/pxC1CAhpryLWzxYx7dDSAasD4D8UHqe2932LkalEHT1EOzW7bAAP7uP7kEwX8lqKA==","signatures":[{"sig":"MEUCIQCjE9FTZDwJV3jWbCs+LMz3AE/nsFUp/KtgZN2oLTpZCgIgIKI00SyRNfWZUxFA946LdCSrckh1/sDO4MVvdXFoAb8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":332587,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivERRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqt5A//fJ6QefrjGXkQSCt4gMlQwgZ1PCl1dPLL5zTTPri7uYD4R6+/\r\nM+mFM0zPwZny1pH6TaZJ8XSCzrWnLGFQ+OsDbbo5gIxQGWkKCfxktlx3T9Ms\r\nhgq0TLnJdoaWzbYLRL8G03ExPAFhJwyaaBRnxkSr++JKEEUwq1vhiii4BqkB\r\n52BVfMzr1Qz2qIGj+kpLCcYu4n/fiqSzHBe4N2CRzi4/0bC0gNKAnLrJn2tl\r\nYRfMSzg1MVEAT9MOOGuPrUcpRfP/gxzsg1vaISO/ua+D78Va3kZgYYozfnZy\r\nWGIiDzqo/XRi9+vGvR6iUUo6a9nMfscqaZRvOJz8wTTFz6dH/+xERUoQpcAi\r\nww10helyHdYHZ6/2FoWfQO1xwyPf9gLkV5zwzRvqVxRRZYbbK5BNOlIIi46z\r\nmnBlSD3Bb8N25AXfS+azfX5981zckMN5An0WGJI1SByIjUSY73gik87JEzqu\r\nb+QiuelboPRnH/l2JEY/t4wecXGXfIG3D6Kk4dSTxWE0VL6YdfapuGLw0Tt7\r\nHbsh/oxH4YFyCFeOhXkbKw5/Qa/vC/6J471B7ceHKC8xhamBo8ZlZXgSkIQN\r\ngzM0ZSimyjMdBhryFrXoICyIv0FRHJ83rsSknpaPpv9x4xowxtSqQ7kZZAqZ\r\nHmHfUf+P2hJ5qXKooNNot5SM1dbJ9D7ohnI=\r\n=DaMA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"7c29e4d3c81baa9aee4be51ae54d71ef335ea117","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"egavr","email":"job.egavr@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.15","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"14.17.3","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.1","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.0.1_1656505425463_0.45949235147787015","host":"s3://npm-registry-packages"}},"5.1.0":{"name":"hermione","version":"5.1.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.1.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"mechannik512@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"62e427cbf9b9ced6701557caf9897ef2ec493464","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.1.0.tgz","fileCount":112,"integrity":"sha512-1xtvPvnu76ntv1LaCTwxzwwqzQaSVlP6V/fdq0eokg4b0jRBB4Bt7WehJQfQf81yEktyZsrDdIBSWks15MQgHQ==","signatures":[{"sig":"MEYCIQDUKJ3ibSNjFsefutlCx9dfw6aklIo/FyjEAJGTRNbPSAIhANA78vAqav2UTYt2ayyvCPYiCsQmjupd0w6B4N0N47kI","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":333144,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi+miWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUHw/+NIg60pbkVQyXukp75DTKkDV1ap1hG2j04GwSwW/5V4l2+R+c\r\n91iA3vcJ15qOd2RjLD50XugQQfS3E1kKn0lTyUt2ljs+ikXk237uYF3+mkam\r\nX1htmvfW3N3AZVIvknUnaC6jU7bNJiB3CVfZklQ7gndJulYAXpvXUVxF8yY/\r\nXSNFfGjmPIPjuZz+Oq9PTtbolg+e31TCNx78cSz4z9qsYfPjQTnBY1sTRnF9\r\ntc4U1XS6AIn5w3CgBAkFW+ZLLYPW2RJS8toqkEmJ8w12S50yzyijwCrpppja\r\nhNzP69eM/Jisa+dJztWyoaiig5Obsqfa7ldKuy2+1jjsLs+2AHjij+nEQXmK\r\nDl+z3rCFpMsCGEM8KrRUFFeGPbYVCMNIVvynGM3dnKHCst8+yZp8WxmQldrP\r\n7VKTL1vQkM3SApo8PMiZ/kzc5odOIRLS1lfBC8lfqrv3JawggshZJzGm55gG\r\njsObUbEfCWxbxuELqfqn2hhwJMiswEyrkIoub1Ei9O1+pLzPG3M9vJ4wmQ7F\r\nMGAdTg/B6XYgzMe2KXHqPQ4MtEu6P7yY3TiwubR0aj5CzIwfUJcf/jjc0Mpm\r\n+7VA0QfG5YP1xRfjWCGQlfkxR7MBd3RbE7eiLXJWOZr44i849AHuWHDIcDsN\r\npyGlqESJOsOBMZx3QNcP4Z00TbcOnUlDnGc=\r\n=IYcf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"efa01e84126f774fc7c8a1efdf125583497396d5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"mechannik512@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.2","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.1.0_1660577942523_0.36871940703139794","host":"s3://npm-registry-packages"}},"5.1.1":{"name":"hermione","version":"5.1.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.1.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"631b1b9f920bf61af4df4517ff47802885932e5a","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.1.1.tgz","fileCount":112,"integrity":"sha512-A/JGNPFa4EcNZ2DOiEg/Cocjzfqb+oHQiau2ByUDh7rzxkTnWGWg52fqx45/UYBHPaaxtC3rtxcwN/ukKn1Kwg==","signatures":[{"sig":"MEUCIQDD2B8FXg5S46TIHyjp61JoM6ORmdOr5sNTh7H1wCDe/wIgXI7E/Cj4rW4FyuZrKD4ukKzmNiU1slcaMlhDgkvK7Zc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":333466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/1NSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6nw/+MyxvkGL9dGuqWv3sAyGenb6OC5V+jm1dy6+7Z5hZ9yydqdwI\r\nADnYnGI1yxn221dxI2EuKPbmIhPV4KFWaHEc1CAI7zfLEvfi5L/T1pwOP+5L\r\nyte8rKfMhJpLLra6R9kS+Xj4HsZacfgkPPCLn8XbQHk1DqiZNo6AKTaleqS8\r\n0IMLi3h1/LAW2afMaqu+7iYQzQKwqmKXlm+JJ/clb+d1F3BlVI3rSu9wqrcW\r\nSniDCr7jS673SEZfJmu1VaV2eXYr13tfxgEW0uOZZMiy5X5RkIJAAuZ7H/rh\r\nvFUWb97NliLILqXBixzjOQsQPD6tTbBGqSVVLprLxZtrOr/1WhtRxtRA6qvs\r\nJjplq+zm0b152Hoh2QlCsx3+wdMY2OAqNrkVS8Ho1w61z0OMoIgSvY143Pbn\r\n5vL8XtC3tENAvg6clserKzS5p4l0XTtpIvN4exrdKfHwEjfRpa7hmL3WXAx2\r\nz2ux6VkMJNkPPnd8xzyj++CCSW6+1ovGhcIsFvAHVsTMUbDST55aDAbxDbUH\r\nYeIPu1g92j+ZW9i42ktr9uGkluLT181hDZvuytt/ezUVv3aGvU7D9/YCh2tj\r\nJs6gnSmdqnNwRSkYK0KhUsD62UhC1ny3CAEUkrsKryesu6UvTsy+NyILeSm/\r\n30Noa/ybmRnOiK8D+fVdPMFXVEZSNM952RQ=\r\n=+iZW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"6f88fe181aebbe1bb10fbd5894d9d740794e80ea","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.17","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"14.20.0","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.1.1_1660900178228_0.08993556709283967","host":"s3://npm-registry-packages"}},"5.1.2":{"name":"hermione","version":"5.1.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.1.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"37a50e306998b1793c0bd30d6c0a8dd10e1d974b","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.1.2.tgz","fileCount":112,"integrity":"sha512-v3BUe7fDWKPU2OW7Jbd7wFHz2LVseL4aQZhATshXHI1Ls63HIklxP4PxTJcf/egNS4QWR1HTG4DA6SsGcxWBzw==","signatures":[{"sig":"MEUCIQCpkh2vOF1VGMpg4X8/ljPJSpeD3gvWScHOJ7AC2MCC4AIgRHLGLM/yl3wgMpMhDrKI/RoMwQhDgAyp9FzLgef8LNI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":333745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDOYtACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqxLA//WgR40pj4VoaZYCrsP5p2r8XFwLLElJxPZGGawFS0U4awse2c\r\nY//aE7emSQ2QAHnhAt69Z4if8rroR7ZNfYp3haIxu/TGT2L7fndDKOp9LJ9u\r\nfhobFLDiuT/4NiWbuV27CtJ/FGtLzAXXrph++0NtEchH9MscZENzBpvPulFT\r\nYwoghHYUw96yegzsSKd+kBlQKanMNtbKGKWCeBSv67PX5pY4mjVRmXFGLE7v\r\nM3IO1fdeB5WaiXajwsPovjirSyH85Vd9SEP1jUaUub9JyThRI8heOKDeSzi1\r\nmj/8N+JWp7NtaPU4xmFxEHtcVpPrgTJx/UX7MrxLNYXfFixpR71z96I7BJPA\r\nU7gSPD8yng0WOSjl53uutF2jL4vkwrL3CXxAZcCMLsIVioRHeuPpGfofjxf8\r\nLC3lX5QcsDynNUdZoPa4LCKgYITdFZQ0DAHDaEtWcoKCPF8arUpmOaYUxbxj\r\nWPio+TX2izbCGUs1UKgSYG/ThZxvThefBCK+NVwOX2+zC79yf3n5TlwkfnjR\r\nM+S6ZBC833L4bygE4Di6DQGUd4Whlcuj2wAfzRL9f+MBZcAZAc6hIkvEdWIn\r\nPKvafr/zb46j0dcK2Dsr8nEmy/pEuqOOQyOYaNr1iK6MF3ok7S8TI7uQ87yd\r\n6MGxTDUaZvBrbZaRxutLpQya9tbQzMFntAY=\r\n=NKTX\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"90911742f19628de60f7280ce3c4d07c7de7c874","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.1.2_1661789741711_0.5783293314395466","host":"s3://npm-registry-packages"}},"5.2.0":{"name":"hermione","version":"5.2.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.2.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"851ad6014d5f03dbf1652105054da787d6f215bf","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.2.0.tgz","fileCount":112,"integrity":"sha512-BqG1Q9CK0VEYRFPjbcpFJ1k5w+x+RMKlVUSa1k6iEpHOuTsTDFIDR2WgSNbBNjYR4hThyhQK74NVmlQDRXXV/g==","signatures":[{"sig":"MEQCIAUHkgnk9yFA537ZHli3zUjrYz/mB2rWEXwYEsdwemDoAiATgKmRKffvQg0Yrz9a30mo7ibV7QVvrP9ACjzd2SxzHQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334246,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjDmEnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmquShAAloinyDFELIZpKJFrQ62lgJqW0rqmH72H5JAKAvDSfgAQKM2k\r\nqFnLY4OHeQfletOD2vxWhm+QeoQ4f4byZ6SWJ8I7Do+E4SDM59igX4lRZ7kL\r\niDHUZakh6RFVlj5VHvJLa95NeR4Cp1fjMttzhX4snC8d6Gl8K6MseB9N+bV3\r\nrl6Vl5zajaTRBDoW+/aKmgn/Jej0z4rks7cl8YPZGDy/uUvG/ZhxmYQpeWDV\r\n15+8I4m58hae2nTCrwM+6NZjR0KzXi1ATQ3CIWuqgv5ccxcKQhP2rzyGs3AG\r\n8hacHxPoHUrawb9H7dqOCd7M9MOlwG4kPR1a71Si0uk3F2yM000vA5JED6Rn\r\n3x5yhTotlnPVtdx2Qm6sDQTCVxEx5nO00Nn27C3p7SZlQxZStJBle24HXh2N\r\nkCzrtExPz5NYV2uxKppSS2g7LxRcEZBA2SY1olceDX69MV9sYkQ4xRNTeC6B\r\nqYjhgSxjuUkKJwbR7ornYjR+XhV0nktx5y0EN2F0yfEU9vKRJHrAlIFaoYBf\r\nDoVpLX0xynK1z9stEPwnaykKXgSqqnb2XXBEHkVOkH3daL/xOMmp+5+RYk7s\r\nnwmME4+0hN2ncIKtCMnIpgbPb52vFKpubDtrIgEHyMfjKTjueQObmdeg+I09\r\nMV7IfElVWKaD8Cfh2yK+7+z2twS+6+QyM5w=\r\n=5yJg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"0cd068368be26692478b30fe03fdd0200976fce1","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.0","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.2.0_1661886759728_0.5772963293998421","host":"s3://npm-registry-packages"}},"5.2.1":{"name":"hermione","version":"5.2.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.2.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"09d24c18d491dbcf911f9b45ffa19bf4e6bcaf83","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.2.1.tgz","fileCount":112,"integrity":"sha512-vdaxanR998jtaIhGEYz6ZXkfnt57yuOeCg9appQnoVJoUIyx1B9OxGo5GbVGJM/FqceZSJN4B8Q38uSt42YDDA==","signatures":[{"sig":"MEQCIFvXCYwZnTSkG0ppT+EHHn2daz2n9ZsfGy0Okf45TeYnAiBht3nC+nfxaAkAupja40N4PJLXenrz6RkXGb7+nU/cVw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334246,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGl7AACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqSxxAAhqb02YXWUZMrHPXcj8mAD8irxJeaI1woBCiuAzsvhnwZRe1w\r\n0QzA1OYCgjibtq+tkUg5VRaZfitIxD2DLZPkn7Wbs2GrgmNo91YB+ZFCyvsq\r\nLQWwXLdeZhlOYjbvL0X17q19a6xeW892JelQTtOv1nCwJZDGisrgtUH5UZLg\r\nudVt5Uw51lq/pdbsgY6t0362OKcrylO6/AEGxOjoWnhzggUdwmrfvkHNjKQV\r\n1YJkq4gaLfqzGRrpN83XnOyOSxSm4vNqyKPLFtxPcV45bwYMR4x7NJKdZPrE\r\n94zvFGuV25qtyEgEjb9JblC8+RW3IHL6dbfv1YcdVFRDHHLYmVsoj4wY+Nqw\r\nxvB40yTQMAxymL/SqEkXSFD/OPMiLA8U4rZP+mBnb4pdtJ7PYv1hhhjeB3jg\r\nbBZq0zopdBIlJLe7PqzUMyySqXj4F6tl1+sFkwOy8idDxEOaNhL6eLohXvX7\r\nAJmZLGz3Zr8zEcCGsfnvldJulTBDaDhjzdfRiuMbiFei4f8erPb/4oOre81F\r\nDQ3/nTdrzztV3Sr1oKCn9P7QN1diS6EERsvGGDQiHwE8DGETRyLfzpIPdgFR\r\nEEbIrsU9PNdPLeXaOfhVXhfvxHidOLL1IBbjm31J/MrFeg3LNySf3Tt2tMxS\r\ny3OMXte0Y93DQAmUr+dVUH8/FDnaKL9lnxw=\r\n=jWYI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"286bda049723212dc0b807933a8af5cdc204e8da","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"oldskytree","email":"ilyashassen@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.1","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.2.1_1662672576713_0.5418186911479472","host":"s3://npm-registry-packages"}},"5.2.2":{"name":"hermione","version":"5.2.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.2.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ab3da3c118f4bf9dfca1b3738dd80cc74d37ef17","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.2.2.tgz","fileCount":113,"integrity":"sha512-KNsM6Ov7nugHsBihvW9vnE1tG5dw68mRifGzaOTxeKhQ/15JfskINFr3P3j9TKgUF0j4QCktiZ2ECQKrf1vW0Q==","signatures":[{"sig":"MEUCIQDDfurvGoxhWahPhAr9jGwxrUJeW1+loiPRYzagwIEuWAIgP0ioAEhYNF4MqDqTuLB5FuD7V/GSH7EZklvesBuDM+c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334545,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjG4eKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpcnA/9G4i5n8eEO+sLle5TCg5+B4YiU6l4C/X42hNBQwX4pXlxSTW3\r\nVDoUye88A+cYcs47l7J7arohg0zOJoajKMED6QZQukdQsh6TcxBPg/9ETcLd\r\nPbBJd2OU9LpHLzUVEWbGDi0ZR5I+7nVXoSJpnJQro5P+nRI+j/Va/Ul85Kht\r\nBcqO7y0kSV+o0IqFxU7P8cbhfMMFuKxk/45IsIoFceJmR/7gumE7TW0ZlYax\r\nXPp1fl4J9ZXnOwhzwHc8AUYAbcu7wOgQQoLCbNfmd73mWF8KJdI46m4sBOSC\r\ntRDPB4yKol7IkqVk8484M8aTmYddRfNAmsFKS+vKQXgHxZWfoyHFtGcxNak/\r\ncE7ruC5zF1aju+aDckHYfc4lVyFe0OLmfU8K4sOaxWDBlS+rb1vC270vsHPk\r\nQCXaphZ6fep1Wn5vEz0w7wP3oO75FWZChpSzXfbsbwYPmHpp+fbvEHQf8Tro\r\nghwEacp0+2l+e7UMCdy/+tWRAn/EjijSH3KVKN5jME/yHxEHOYVV2WZ2SeYA\r\n5p9mXK77SK6Sm5sTRE+B2ilFz3LcdvmS99ifSjvBNDUDn3hJBY6cVNd1txnF\r\nfqupONTJ/8PdDM0FXSnGXUnTUI/3BwX+2/t8QfJuIMD7aidGiezkv1PHgBsW\r\nC6tpGVv0jcY71BfBEsTe2ypTilYAW/teCXo=\r\n=P10S\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"c7ce1232455a02d3eaadf24335deece95a25556a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"chalk":"^1.1.1","urijs":"^1.19.11","lodash":"^4.17.21","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^7.0.2","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.2.3","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^5.16.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.2.2_1662748553949_0.053978992584315044","host":"s3://npm-registry-packages"}},"5.3.0":{"name":"hermione","version":"5.3.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.3.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"79b471ec961aeb8c20b3aa066ef42c9b76c5123b","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.3.0.tgz","fileCount":162,"integrity":"sha512-tJP9fI2TuobR7jLvs8zPjJOqbDZnv+PCSHfOa5OgAowuuI40Oc4/comPd4R9FPTttPofSkgA3E6+QcqCukBPbA==","signatures":[{"sig":"MEUCIQDXJPry3xx18FIwYaqvTU1SGtfhETdWtvQnKefYxcnZEwIgd+/KsrsEfoh5E5TtQN/jw1+6UDTCDBrUDKvdVWF9o3Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":414951,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjRB+xACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowXw/+Pm4ZLwwq4g1HnvFvOzyDdk4bAISDyhATBAn/pUrUOeKQ+G7V\r\ndzH0uD9hrtQfVfck1fsmBHhJsYlTuz+oL5HNNo8kgbUcMoZ5dLRbfsL0zWlR\r\nIEKg5P5RZg4kACAbqXAmOKtie/bidqMadieCJsSc0AsaFAUrW8+wOvKtS15a\r\nHG4jA0yAqd0Y+pXTq9kNrRLNg6prSWy/UGtT+nSGJ4KeVvkCblLwG8kDJYzK\r\nji1mOrVOzf5hseutW5S5BL94WQOrI2N6c7Y1J+JCSNzcMENQeXjD+48f00q3\r\n9wKJT4si9JeXdRR7jRQQqngX6KCBSYqCVE89a3wPfSMHeHur1jA9Sk3wbMMV\r\nFmQUgtCBtbfn8DDUFZC1qIfJm1lDYYnNJYv8sw1bhTZItHQ94SmKGJLUF6VL\r\nDy9HoDxHDFdNeE7Z/Z1XvR7Is93FqrqgPV4JExCdcIAWsL10/Iw5V/8f6ZWf\r\n6LKrnn7AQElWgdTyDzfkFmy9JUIKDLq/WHxcgvOQQR1e9vuRoXMpDD8v4eSk\r\nSFrVXN/w6A2U0KLZ0YH+Q5ZuCD3m9jG+heuMP3b/M5GOaOOUioonvDTNRMA5\r\nJ53wGlfNHb4UEHhIIlJDSsbSZUhjqfYEwnYC6Sytk417TgXPYpHtW6k0laNF\r\nhqCdFhWGH7m7vcZM3hHWIHIi7UCnbAm2RVM=\r\n=JMXC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"9198785f8c09e7ef5b205f82a34a670bbc3a4795","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/core/browser/client-scripts/calibrate.js -m > ./lib/core/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.17","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.15.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","png-img":"^5.0.0","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.2.3","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^5.16.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.3.0_1665408944829_0.8125201296878539","host":"s3://npm-registry-packages"}},"5.3.1":{"name":"hermione","version":"5.3.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.3.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"997233aa31bac3262a71fd9233f3bb475caa5d25","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.3.1.tgz","fileCount":162,"integrity":"sha512-4G15Kiwazbgxk89JYBiW8b5fkl8OKMic08+EU9KsL7fqEQ2jBA71nw75JHnzCVPZbE7afI69bX5ZrPnSdXT6+Q==","signatures":[{"sig":"MEQCIFbCoO2llWGPhM0brPackXOhqdi++DGpiln9QDogtctoAiBwbERIXcviRSZoL3GDs9llaSbp9byrbzGcR9rPcG5L7g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":415215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjRSRxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpwBQ//UCZe5HIZxSea1e0mj8XtFUZN9UwQd/d8H2xjBSixbE8wpzVT\r\nLVC9qZEHUd2DqAJ7nQC2qRl/r/Va3lPbtsc33VH3Oz1GgAkJh6jFh5gHJl+W\r\ntJ0Csbw7vM9XdaORKUe8ZsoZLwthh5x13ejXLiwlXJS3FhJV+xLYtIEj7887\r\nQI66ok0MGmmBF6G8vrlQbwg1G/x6crtRb7AEt/UcDFuaVAo1T+g3WlbEl01P\r\nvxugS8absXCX+vnVsugAUK77M7JEAhKevabu/zER0gTgS6Q1O0gTMloeRfJc\r\nM3nwFjTY+oS1O4FjPNZQBVH53ma2KhBaCA9KBC3QovhR7/bC9c9nX6o4Vi6v\r\nASW3jheSkTg4oEK6kDV2T4I1Yg9OBQL+1dCPSuZm9kPnTVedGER6O6400uL6\r\nZkiA+CsfqJQVGltvoClJuySRdsQZD8lFUc5QyChVyAjvUxHLEU90drdFt2N8\r\nS364P4VpqD7fECz9BMPtkHbr1/ggmAlabYQNLmOkO6XZVep0CB+cY/7J0miM\r\nnxZnsrn1iR+0QDyusvdW5cwQvuVREm04Vd9thkgBvwoqyZxoLlc+c8z85cOa\r\n/PB1wUhfhP8uCyOh0izRWmi6ISH0guuo1xK/3rSww+Hci0HohaCS3rpdxoq/\r\nHhLcwLakp5AlUELVY6Y858l1lJIRm02xoqc=\r\n=aTjI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"3980aadcd6afa8ea10802722c16da5628d69af13","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/core/browser/client-scripts/calibrate.js -m > ./lib/core/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"j0tunn","email":"j0tunn@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.17","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.22.8","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","png-img":"^5.0.1","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.2.3","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^5.16.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.3.1_1665475697368_0.9534509973220651","host":"s3://npm-registry-packages"}},"5.4.0":{"name":"hermione","version":"5.4.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.4.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"74acd234ac01abd93142fa6d0c20232602d48574","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.4.0.tgz","fileCount":165,"integrity":"sha512-f5O4ihT3G7pux30HYJ8RPxUmMYrGvCFlLaF86BpQ48owEnlk5eW/orwf92fzu4Qgov4DdVRMDhopxyM3TGWcZg==","signatures":[{"sig":"MEYCIQD8BM1ombTbaWRbPUi2HsYTh8Ub213HxJm0W6gBQDGH6AIhANbj8JqfZOmw42ooL1MvJAoBQ+8t7TPAkFMb7jDTz80V","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":422512,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjasiKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp+2g/+PuJkoWIGqfK80UdegYezG271nZgNE3oZ5j7M8VBroQLwUfuv\r\nae41vhP+2kpxjHgTo/wKi5R+P1Xef1FRb4euHD5ovXvD5n8WKL2RSK2HKaJS\r\nvfaPR27n0QtU9m+exINaFOXlw4HaE8AHxxEXnnr+dvqcDBz2aqpIxrzi4JL8\r\nYTdNosK3Cbya/wvcUTS3tYDTAk7lvUfPYdEuywlaLdtglNXd9nipLxNpjWSs\r\nvRWcPQ6zij1qTdxYpz7abzXdB7xQecXAeXG2fXS80ZIquQfpfJt4+IPiW3lW\r\nHThpfwvy8SXjtqBM5KeWH0hrNn5R1CBh0i2tfJm1puYHNT4oFZQqAPHEkaju\r\n9GYfuQPv+JvLq75I/87cgoI29LTPlztlDVc1y0a6QUKUT+zGKG15TDAC658V\r\nDtpprnoyJ3jjHrpepo5DqrACaYb8WtqbT055qKEUUqRrUIOXQ26YP+7fAE/z\r\nhPqhHO0ApPWhJZOMj22Pe+FY4hzRBOX4Cksk5UTrkAKZWFJ3dNNd63G5ezWv\r\nkhm4Qv4QjW2VZOKFsXrNph5LVLQiHbrAjoJ04wpIEOvckO9ZS9wZijV/ZeQh\r\nwPxahH0MUD2xQVf7NO/q8x9jL0m2lZ37Pp3RYw86aZ+fl2R8XV5SpZ5yyIz2\r\njYpj7tU24VeEbvCpAZ/7U40Mh63swjC+9QU=\r\n=7p6w\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"6bed448e8d68908b093588d185505f7a159cbf6a","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/core/browser/client-scripts/calibrate.js -m > ./lib/core/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.1","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.4.0_1667942537928_0.839577561617977","host":"s3://npm-registry-packages"}},"5.4.1":{"name":"hermione","version":"5.4.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.4.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e2760521ce8155a4e3a97cb881f0762b2f3fa7a3","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.4.1.tgz","fileCount":162,"integrity":"sha512-5NPs0fQ2RfMZtR7q1t5OqLGuWrTjWUGTsvFRdbG/AG5O7SlpHBFQ1nr5zUaYlEJBvK+Evq1smSauuOCKds6CfA==","signatures":[{"sig":"MEQCIDT3uuRuS16l1WNxH2a2HvqFhSbiQlCHV18lDww1THJeAiBVj58pS28n1cYkpSlSAMqESBzgRfHcD0RajMt2g6uCEw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":418914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjdCf1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp4xQ//aZNyJ6TRtSZRRzX2xzF6qkhOMJas1dhSztAlFKZaWn4tPJ7d\r\nYE4jD39nQWyYUuGtBxCmhvL/3PPqdpKHf7pxHrzu0zoVvyuuXotJIRV5B9Tg\r\n9zMvgaxASBYPZ1NIs/ktQFxi5qfgdoF6hNCQL0tVu1BRFk0GbePr21jH0Zi/\r\nQA1pcEZKrsKvulA1adpeu9lnL9+F3d0sp09txSog+XQ8qKu2WGFhfL+uUYuD\r\n2kAYMKdv6GKZgLNGpwoyQZ3uOksX1B1q/nAnng2WVa9kWoRZCBhb3xWw/MQq\r\nwlDzUPowdgJ/mwVJoO8xeN+arKf/d4KUDKcNTjTijS+VdPCk/OL4Emulj51h\r\n5uZQjp13+g941t37jwb9KfDjpDIxkA82JsnUv951QihWwsRtWZ5NcWuq4n0K\r\noKT4roePZ57bfaIusaKDTc+Bw0/UFnxd8sNbt2h4l52NFfE/uREt2N4nFdXi\r\nWL7iwoulZ1dehFpZMqxCpNlqUDlkk+j3/8gpcaIaDG+i/vy4DWLrtXZfoR1E\r\nGZcmXckmNqTShSRyellCe4mZFT/CQPi1MdB3s1QyGnlSRXmqz/jejSApJmkG\r\nCfD3DBwrMtOOf0HM+9cSfOSZ2B+GJ5al+fs5Qai1StVuruU28eRUxN5crdZw\r\necT3JxOKjT4LUhXy/wrLrTaIzT5LdWoeky0=\r\n=lQR7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"39f9c5c946a6277a6f5459810709b48e9cc23ed0","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/core/browser/client-scripts/calibrate.js -m > ./lib/core/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.1","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.4.1_1668556788922_0.9638995436456308","host":"s3://npm-registry-packages"}},"5.5.0":{"name":"hermione","version":"5.5.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.5.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ad3fe3dff1ed1294f5deca07b7969c9aeb8d30ad","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.5.0.tgz","fileCount":158,"integrity":"sha512-Lghl6DY7kmPRyhug9yooTi61cmHvG9OZqQe7x+zhVkhG8HOr/WCQbT07Uba+A2JmIyc7wiQrTIEmYJuruJxBjA==","signatures":[{"sig":"MEUCIQDQqiRjyWp+r1/2VDr96YZs1J69ZQbxy5h0mNpeNkdjQwIgC4M/XpKX7m5GdCHNehG54QRxJ5DW4hl0nDfYu0LUGDw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":419491,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje7Z2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpBTw//RUYOSfZpnq2MkS702DgwcwA3hcZSD4y8ODA5DdoydiuYsEYJ\r\n6lY4ZjbXG8iw6RUJ+F4dmifGQv5WxSG7YbC69og3UK7HZ8RX1J0a8qSB8D0n\r\niW7mrFIlAssDJ8lymybPwRNGwV6pECNnf2V0PnnzBxadNutSNWrJ5FF3bqP9\r\nayXg18VM7+IgRTIyZp0xQWAlTHkJS0oZEf9rPC51Jgg84X9eL5uDOlEBup/W\r\nSX2QCoVeYMT5qqjju7AkCHLPBu/6S6OIKzq5bzSjihQrYNpMsdFrQ+vVfqux\r\nmD1O5CdSEpc8C2uOfgdrUTtVJHRD1LpY8BYS73gzdAn0xQcAV1EpkXRREPjR\r\nN62h0f4K1u4GlNONlPZtqtY63qSiql7ONhrHLgoi7T+cP0exYZp2H7jrKOY/\r\nG054t3NrFcm715Zd5Wi+sfyb86X6PGjauxzQP1cEDfuXBSnMc76kzPsbmbiL\r\n+Tm5bE4gg0EejwqffeU48SHymC/VW9WLgGznerp/KqBFamfIYcn8PiDNLtOw\r\nsqIlAIleONQIFSBNKY2WMLdI8BUjFHkgH9kjjsWxpIL5fhSDfaq1Xh48FLWQ\r\nmqh1616u9B5A49flNM1hCrsURVZlvk52mj2qafdH96sQR5DT0LV/F1D1L2iM\r\n173G2l5/yA26eX+sWpbDZc3aTBKno5/X7l0=\r\n=7K+f\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"2a22531e51c4032bc3e5ddaf5fa8f33b10446dfe","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.1","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.5.0_1669052022168_0.9308070092712093","host":"s3://npm-registry-packages"}},"5.5.1":{"name":"hermione","version":"5.5.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.5.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"b0669c060210dabdd86a044b16a91acdaa2707a1","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.5.1.tgz","fileCount":158,"integrity":"sha512-/thalqsK6BtGUaNNpBNKvtkFO7HqLpKEa+kFiJwY/HFpVfVt+gDrnB4tKT0gdlsgYz1aqcMHNSbyQVUl5pasbg==","signatures":[{"sig":"MEUCIHKZVtUcvfsoEn1R3vexwfjYa8ojQFoPPzPio4PhtFwiAiEAjunXquHGAQnWRfC3gGJqCYd0KvAfYfrjm658oxmfCVA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":419734,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje9IMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmreJw//ZaPLlcA0rpX8A/4/WZC5+Wu2KRZPxgO/DejgPMj8w8C7xWwu\r\nxQ3dc0mWSC9/8mteVl6ts+4fyCQ1PycVs7v/HQYzo36siRTPICQX8y3d2zT0\r\nUrJp7t9z04nOqyHUVqeE8XqYPTjcQhPfWPVccoFKjRr6m3ah3qoLOQ0/6SMx\r\nvbWvBr4cgpAI1FrA2ZO3znJd7bOtvpls/w0gX/XYsedS0rI65JZS/6auj7H3\r\nf4oyQjbopfyLp7tVJmed3FlBmBJBV1ZojMvKaq+XT0AJSuCbh/8SVV/a2QET\r\nWFJsD7yEKfxxYR0k1xjr61SuygU8mtz/qoaPadRQSYBcmow2gt/opnDE0EsY\r\n2s1zC+qL8S3wVzAZwGW0d9S8AjGikyF+8BWR87d5c+py2OmiR9K28J478Tid\r\nwyi7TTuQkEZXGP2+BSFLH1alh27Tut+nDglUfu6sWQVTZG+eFzd46wTIld9i\r\na+qHD8arOFatj8H9g0xMRk3z4893N/aWyZO1jEGyVgh+J/UOC9hEkYgDBdA9\r\nPRT6XY5qCPY9vVMvisg3UcFfuu4UOV4PuYgF/fqURFYU8qUfXQlfJsVTINOd\r\nKWicmA+f86XLpiaoB/LLlJbKwIrBY8Lnao5xv3NA574mjKAV45Zs/4V+CEAO\r\nFUoK5T8fLvcuv2NjEh8oCdAQ9wxjNchAiUQ=\r\n=YOsf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"c162931dc59508b893368025bc7ed60824716220","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.0.1","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.5.1_1669059084095_0.26818644872306807","host":"s3://npm-registry-packages"}},"5.5.2":{"name":"hermione","version":"5.5.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.5.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"de02b13448bf4dcb398e558faf85a1a4acd4c80e","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.5.2.tgz","fileCount":159,"integrity":"sha512-RuAv/RtrHnvZunRCnPkgr22s51bECtRFFIs9Oa5lXJ4/EwqNzlISbZOJW38GZhAFm/c64ZutOjJSCw6fHlc+cA==","signatures":[{"sig":"MEYCIQDtrsycGSrR5Wwd6Moe8eOoggERZoxEvV63DkisPj7iawIhAPXN9eWMh9Y5H3vf7to5ZnapxdAXcxO4Up/So2FieY/F","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":420719,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfkLMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmozLw/+LYYWO8Owi4KwUUulCS7BUeQ3DeRN6I4vDPKT9j6gYSJheWX6\r\n2NVXaGWiF9uU/EPX4WKyzz3r3nrgKroCP1UpEiXMexbGFqQ6cSgSuwlo+NrQ\r\no3FMXZZuDyCBlhBbAqyjZA8T1kGhah3o9NRK9v7/0ESuig4sfjm0iDdP+dj1\r\ncLbb+XAeNcxBbZ8r3ir7ZPqRQmWLLqh80hWQbsuyeAvfAM3KShngYOSxAbrp\r\nRMYloNO/qlHQ9jYunVLrJiKWsCQ0nfAVdc9qxv7s6piY6aoaWNgEy0ShQ2hw\r\nIqVqLrN8+m7CaahakzI4eHL4jzarkF8LzGCpl0NezQMdHgTmwhLNQwRgV/vf\r\nFXEdWR/AGBYDbw0FuHheuIN3Y34B4WdLVTVvBmgB9ip2l2gZxxV7ZxCdhh/i\r\nTJxMXELaJDszOZ90r6+KMv3S4YC/x91S26UBJXidvLL0F4HyffqrFq3XiVqe\r\njz+KcUwH2VLCcSVcqqUlMJnjXWWWjbwFuBnPYgB+Wj6VMX2xcOhShBu4mPPR\r\nuwoVX3kcsz7yN9k+dX2Y2rKKhy39L9RrWCiyLeC141UqOgWflNbzJArhYbHx\r\n3wKDRqEI1XPdoBk/i+rgyww6Z+vHEnwzu8pWCcNiqphtfgEzoepSY6Zn61zN\r\nRxoItvWRB1a6+UibEPymWgtGLqFOuxI106w=\r\n=0h6K\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8a29ee7c487e69081a1cce0004f4d362d785f536","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.5.2_1669219020669_0.04443941675046492","host":"s3://npm-registry-packages"}},"5.6.0":{"name":"hermione","version":"5.6.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.6.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"36020c1f22ac22f8781e18bdc760d01cb1ee8971","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.6.0.tgz","fileCount":157,"integrity":"sha512-WNn47z735CHDuA9T8sgEKbpYhRfSr915++vwzVJWfqDx3wwoSHOQFUK3E5g8k290bnNgpNQ8Dz9yu0Gn4gI/tg==","signatures":[{"sig":"MEYCIQDXj3mPbkPNiscR8KB7bpCtIKqyxuG9PECnEY6qMeGD/QIhAInTelYJxSHAnXZcpunwqxGnZlZnSLxekH/cmqjK6S2t","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":420978,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjj5xoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqwpQ//QsFVJskkHmTUyW2aRSmOb3QK5zK3sblEOUJOJ4+JzrZgx70W\r\nSFfuY20bFkib4UhBGRpFMxXRV+nYb/TXdSD1A/S3h5kVmHbnwyRKBwZE1IjN\r\nvPZ1hThbp9zRkoVKi/eb5HqDm1iUxNrEec5EelKxITkvtwaP75RVHA6BoC5p\r\nCiE6cCwtMX+N/2BTBWd0gqMFFlOFZLke6Wk5tnOCNPhtliMkUMGCSWywJkf9\r\n6yS7LtDEyhfxhjCcxWSI6xtGeJuL7TJOrJmWIpiOhD8NLYYkJ4YeqXQO0IPu\r\nG8kgSy3AUAL1QBQ6dTApjz3kohLJdcZ0UEyTDLhf324DtmIYBqrDIteudqug\r\nnDp80UseWf1u+//DMKIkNsXXc8wLPCR3c04UFKP7GNzB4D9CEbP5qcRpkHo1\r\ng/+N3S03SFrEH1ceYdU8EF6N+QovZqKDtltascDxhyD7ntqJTlVKfTMGMRbJ\r\nL6lfXvLrhDd+ZV3wpGR9qo0pZ7xIKtdTX9ZyVHOx9jqFgJc1Mr3O4HGR5spZ\r\nPBSE9GjDnja7P9nsC530GJDuoAONUNx7x1SCYhnfD4BgWxHty5wA/KrJm5K0\r\n8+umGocbmNeg5Wz40jQ7C43otzOdd66UVcxtPMMxxLKWM26eEOApEDdufNBh\r\n7jmKDAkle0/W6Jx1alC0fLQaiFoJM4tVQ90=\r\n=xv+g\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"70d81dd08cfb74d75a9ddf093df87fa11344d83c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.6.0_1670356071967_0.965689280989126","host":"s3://npm-registry-packages"}},"5.6.1":{"name":"hermione","version":"5.6.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.6.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"aba91524eb908626688e8cec4ecf45d21ca5e4b0","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.6.1.tgz","fileCount":157,"integrity":"sha512-GdVxhJhkmxeRoes2rCvUqC5Cq7G7C7kjQ4p6hhll9NjSxvby+j3+5kI4BX/yYXihx8VOywN+QEZ9gOTPzRyb5w==","signatures":[{"sig":"MEUCIQCUvf0XZ/OK51YZDay2pDiVqTHDuMul5mnS7j0ktNKbawIgFX+VeSRdljja4L2UYv3humzn7DN1XXb00CBpkaM1R+s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":421809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmLibACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7+RAAkjOScqrxRbTlbd3VN2JFKSmDyIqnfsJ7HrEG20veNfQCqtr6\r\n3NmAHKeQWlW82IsPAYQSOtwS5FVj8XtrGDBDu94oNTxhSnNnw8H2+0+R79lS\r\nn21r6SzY8oxc5oKKEboBzF25Fld4yoV7CXfSiof1qt6a8bPxpZ+yMjrMxegQ\r\nvs8uCtN5vNkc5P0vEkdCOWOU19UUvdo8ddPneuVN+/6QpJVLOx5f+a8DaeYX\r\n7oOC/RAjT1ngsqOX923Jlh59njlkigp+Wd2PfRzra8s5fm34AOq5Tdrfh+2U\r\nCgI8ji18n9KoDotcEXxsSevyjFPL1k/yDc92GXwBwXJuPTiFsAWusud4MzXP\r\nnISg+4u6PgxnP7iDXcgsUoC/yxZ1LSSawx/td3j9xfsMXYLGVBNp4SrrPKPq\r\nC3jxpL1+suBKffpV+9FSMBq/+lFc0HTrsVzjvxGQTzSGotgccsiqImZgsqvn\r\n4XfVaQKHK9K8oiMDskIViakFpzuIvfTIWvmBBAsPo2TBbjwqKnhYU+bJan/K\r\njMk0BeK4j9DiIOFSwTHosFONawTUbOW4wDo9h2wiFL/XHmpiCQcSwkdw4q87\r\nM05Gl8hoz+MlCLCcG7W6PK1ZyxHQW0ApSK21tcm0M5uY3o9BRsqLZeHIYOsU\r\nElBJySCQJc7e+VGNH7T4sAKp5nSNK03QbUE=\r\n=Nl0E\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"54c96efcf9e5ece32377c02293490b9c700dd78c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"oldskytree","email":"ilyashassen@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.5","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.18.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.6.1_1670953114905_0.7326397224254177","host":"s3://npm-registry-packages"}},"6.0.0":{"name":"hermione","version":"6.0.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.0.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"90bb4da0957e61f773f0331cafe4f6b08da01402","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.0.0.tgz","fileCount":157,"integrity":"sha512-Yv0zE1furVOOYBB7lKEOes2P8smxWKap9BkQJCQ2k2dOZFVd6fV1YwvnseomzYbL5/zocfJR0kMZEarDkbZt+Q==","signatures":[{"sig":"MEUCIQCNtnumY0SxYRIBkgKrmyLsLyggUJmiEhFjLUkcN5nyOQIgWoFPOlatVkP80jcGIXDHvQDvByahQnwt6UOUP0nG5mE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424637,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjo5S9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDvxAAjFG8+yGObyuQIr6jRmDqswDJ5o58MpB5ZX1kgKjp3SeYXdl9\r\nHG9HZF68bpWX8yq5X6frVw0fqnpLivW644GKaZdpGoI8YHWuKicOGwlo6rxT\r\nHhd592jMCgvcTaeLz+G6bRryCYBXI8wZzMaHPEafaWk0Lzi1cFaskjGE4sdH\r\n77elpUPauRcsjZ2VY/gNngJHZ1kLqIbXq3lhtKxjHm0pk3VU06Jpyu1quc1k\r\nKN3PPAKPzPJiet3DjEL6xtb31ewj4R3LLiJ4p56wuT3Udt0Wt/7/ev+rHLQ7\r\nVdIQDhNPrF0RyfHdDMteMdHXQu7odDJqnRM1WnSjc/8bSI4C+YQKz1ST65oq\r\nHycFvlrhicZnKtufO5wIL65ijJtWwKbNHONwxfYm0V2Mp8XhwVSpIG3WrhgM\r\nKWOcz5NTnaEMEM4McNtmC2yVYOAOl00TyumsNVchlrAkIGbTjk7dE7FozIvR\r\nJ3k5FXt73IEWI6ywDuc5klD3Jv4x9EGNPI+P8lzusk5ZWkDENhOQFRxmFVNS\r\nCqySMTJR27896DzLCvDaQVxfwE6l/F8Sp9MKrmp/YdxnHxw1TjbggXeevD9o\r\n2aaOogR517YHkYHZTIk5aUtK+6l2PZO5ZMQOMpoc1LDtlos9LQDpCyc+21pQ\r\nqN5JFxfKkleitFjDYnsWXzJGty2S6x/wpwU=\r\n=YnQz\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"e96185943a987912dac3d3d5240b6b1deb8cf68e","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"^7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.0.0_1671664829119_0.7616553356981788","host":"s3://npm-registry-packages"}},"6.0.1":{"name":"hermione","version":"6.0.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.0.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"8b160dcfa52c8ab004a22e75484012db074c5ee8","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.0.1.tgz","fileCount":157,"integrity":"sha512-DAyGV0LCIoXdsbcKE5YqmwMtTcbjmHk5wzgWdflo71WfwYH1NGHQAig6pchqs9+bmk9Vh9p5PMSNuwR0nQSmCg==","signatures":[{"sig":"MEUCICRS7YQTdjgmhAF68cStOqX05yfdb0l7eu8IpihaYpTEAiEA/GU9LZs5ZZxCZ0vMbavYEqXL+AGFYTiksbL/t/QA2iA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424941,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJju++cACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdiA//QS8OJIREDgmEUeA+cqDCddQX2Q6AkE9kG5337RRCrk2b6gXx\r\nhllVknaBCyuDLVJIx5C9e/bKLCSQNlAgBkeSv7FPq5uj2kxJ3cjdUWOi1Gsw\r\nJeIu16mSa3SXf9ILWGUpW9HxiuRumqEvgyjuJOGSNtuKtYNOEKHF6t9zCqLH\r\n0AL9WSQl9bMONh2irWwIc7VmF6tH/Qs4iDzMqtuw0Fd65MIxQF3TxNcHl3JA\r\nNDFGcfbi2lwRg5NbuhauM33RjWsTr1EL/Zozo/o0x/LAA+CbDHGqYiDIGTMC\r\nMRyLI0Se6JRThuibLmLjiexZaw0HEuniyDb4EXVKWLQXHvhVFkuMC0tnxjul\r\nRtuBZrRl0rirJk62E+n6xsRpm1JEaAs+cqUcxBvgn4ax/BJ23gsYRkr8/qdZ\r\nmfOAB/wnDm+I9gDJ6V9p9tY3CQJU9nMntqH/OP92VPpz4DxsaaJeQQwLFrkL\r\nyQ1nzNiiiLR1ZX4M6PBT+WfttbmiOxCk3FqfwXp+RnVI5N5hrBX5hBnj3/Rd\r\n+7/4lZMZnGSg1L/VBpuqF54RBahvdpXxDTEYf/L7K+T/d2diBzHfIuDFuS66\r\nD2UMhzjC6SAhmgDP5t2SoTaf2W6Zml/qtJ8XobzENa4feftopIG3alblRPwl\r\nsTJXdILrXymYiK8vzoRuRi145tziwx/lWos=\r\n=X3f9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"7de37c3efbdc0ed8071bcfca34006351cc19f749","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.0.1_1673260956266_0.14238991286074731","host":"s3://npm-registry-packages"}},"6.0.2":{"name":"hermione","version":"6.0.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.0.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c0681f5c751c4e44a0f05f909dc5a5ee45309b06","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.0.2.tgz","fileCount":160,"integrity":"sha512-igDzBostEW8hMKe1rExSnFuH7xBZ5DYz/jRooZYSTsDNGpbd8UHRnC/n7RsPraEFuo7nOptWl7HKnsGhuNbHXA==","signatures":[{"sig":"MEYCIQCnXkAZEoQBBB2UoZDaGJ/G0MKzTZzeG+rajgwtU4IoLgIhAKPoqQmbZwayOXyNcSiuhQXNo//xnA3t2Mfg+9FbN32n","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426979,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjvvo+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmplOA//dvYQe5agAglcAVe/I4jX5O106VHJbkq8iV6i1AH506iXGg70\r\nXT34TkcE+GmpVByLwsx9bUeFnIoufqVNPn/inXkEfhouOKfBJ0hCijrVtlsI\r\nJPrk9k7kjTTwLHg4hj3yFjSGCBWiIwpKiGeZ9KORZYFJJ+LK458cv0YtyHv+\r\n1xCK4prZFK6GRrij23kgsLedlEFD18mgxAeMisyXxBg/jM7ZSU6PtC2obQpe\r\n6NcR5GPoUsj/diVqQCZ6RzDBsR/hhoNyWbkke+SC0CR3gAV23c6G/0hR4F8g\r\nN0QTlWFPwG1VmsrEOT1dc+qQ3auDsL6N3/MqtMKrHj1D7JsnNxx01B0P7K/y\r\nt8k7i0Iv1In8DZo1QrFC93FF4RZDGAVkll20PQeP9ygg9xACb5vS8x5mkdlJ\r\nc6nuB7jSz2XRlBl69R3vDPq1zWtB1HokWd3E4ApBIzkt0rcUgLZbqqrWzcxX\r\nMYdkStRLCtbme0DS/iwFs/6jDh7mvRwn1S9dAvgrRkMnz2wfaAoimBdHYlp/\r\nxXgZyzDvP0A30WeE3k12GYI1t8iMd1E9kRhkIn35qG3tFRVowM+0RN3M00Qg\r\n4JQFuIYSFIVUrWvARokiiHJsObAb3x0w41Y/vDba1CQFlF+LmxD2Xstrk6re\r\ncHmybFNt9VUPJsyZYOzIDnICWjMquwDVIHU=\r\n=HBTW\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"bbeaa5da15bc89e6b6b1003d0cbb4de937524342","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.2","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.0.2_1673460285892_0.19275480584177784","host":"s3://npm-registry-packages"}},"6.0.3":{"name":"hermione","version":"6.0.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.0.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ba6f2038210b0a14ec8b4ae64db502e1fec247c6","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.0.3.tgz","fileCount":159,"integrity":"sha512-mkBalhqjzws4v6/jJ7dPqSM0ABmCO2hLYDSbj82C8EnlLprpuapVRTr7pdtsmnt/UciKxOSLxXqqXkRW59Ja1g==","signatures":[{"sig":"MEYCIQDw0o4JJ8Fzf99YpeW3xm9Q1UXWsxdssHBkTkYOrlLTRgIhAIGHAATBGihn8U4igKvrBIbEm96uXM5DM07ojGojtkp/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426464,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjyfCKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8hA//Rjiz3ClX4O1a9VqEAucqE98ptaQsH2Yb585/lZ9zcyLDl9M5\r\nYs2eYEY3Q6kLoyyAoelfEgNWgr8y9jflmkzj8Se63X5TaNmC3jhnXd7S4OdH\r\ngC+gLaUQduqXnjI23lCtWTijO2SHT67SirR9+fZPugD6utm7LIDuba9/QKHe\r\nNJpNoT07m84IqeMlNxHxCdGjOjKIiRrAd89BcJlR2kgfJkaUksVDTiwFyaRL\r\ndvT5aKyyFE2WCwU+JMtcs/ndeqlIOUipFSpwjuCkmHuNYfgIpDmQC5MWpFE9\r\nYQ6ukw8aaAoLk0wGXyPJ+GQz5pjIzBAZMNXZK1zziU4czkSXePw5Cy/4/LoN\r\neRg+GqqTOOXirKHmlKtomA5vvSwHUPbyntN3wgf8hiLnP/6I3TCldXPgtqdj\r\nT+qMWdiofCreLyJuRjhgBXuU/66VjHfg6sCAd+7aveTMQoqByDR/OxCqWKkj\r\n0lMv2Cv/D22lYOQ8hAsl+PDFviFCy2JboHr4UnLsIAotsxJ9AbZnQhI6jxhz\r\n5N5C4ReBsig7jTreXg2HvHfZ7fBZ0vM2Qa+75lUAsEOmZ+l3zPDBGXf5H4T3\r\n3MBU8TrO1sGRw9ZmEtXcVo7HFwOx7hftqgRAC/YrYsd0G2sW78Qm+7Y1us39\r\nqrYub6PshZk+mfWOLCpKc4j7UZAUQCC8buA=\r\n=hqUA\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"00a4a81fb16a0ea2c814ba8396a71d7348a6a5cb","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.2","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.0.3_1674178697972_0.059747095618215784","host":"s3://npm-registry-packages"}},"6.1.0":{"name":"hermione","version":"6.1.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.1.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"76dcf15505ac701282fedd1412818044551afba3","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.1.0.tgz","fileCount":166,"integrity":"sha512-vN44WdxekZvwxOljfPi8w9WhYC/Yyyef/rd8Tj4TK6LCDINx3oWVFFvCxe/WIeCeGJLLfrHcLdqiiVnM8Jfo4Q==","signatures":[{"sig":"MEQCICCjcW/0Ug2th0yP8jQ2zE2+WnDBBs7JoEQYEECdJcJXAiBRIgm9426ffYpZ4IdywZCNDWsiKCrG5x9dlg6q7GPnTw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":442719,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj15qOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq0wA//bc4TfYJQK+7lKhv+zRGD1F3gh3zccnwoHuT69yWS+t/fuEYl\r\nZOa0pE65OMV1cEbj7TIdVfE+Mp/SpYVnPc0NvMjdIdteY6sQ+9kIl1+ziMCz\r\nAbj/G12cBNvdq8nROTBX96kZ3PnDCop8xdcBwv2vD/KD6ZQ6uRxwP3QKqlHo\r\n1qj0SmYgdK9MhNqCne4KRL3xuwl9eabBS0nJnu+pvM/qdCLMS5/D60vASRob\r\nbK00yyUsqSwW8TMvHwV0O0+3uok7OOyJ+vFtm9T1QwvDIEmXjlaNbal6jB1w\r\n7p7pQ+cR44qt3Nu+6DBrzn2qKme4s4owTIr/k+p+yeHXNNDaqCAneHFLmMlG\r\ns+s13ja4xK1AoBrNsFG6hxIe6d9tWhxuKnqaLdzlSY3Y1Edbg4vLvswNQaCa\r\nGg84z/R6uPysPE/heXTrFjHSkpVelDbgTa+zE6YjY0S7FI15H7YeyBY8FAxu\r\n6DhK+IYAPsnnm8z5TNm7CNcDajCGUPnv1wxrGLCC2cSio8DxiC7pH+e36Fyd\r\nPEAo8yFT1bAw0oEmj1Tbw4zhF1uw5y6FadW3h1YzXGUjFCzJzovidecj9X7r\r\nGIEwkyUFAMYls1GWm8hoYLrAYQszdP04F5e12ytYcpK18KBIgP//TTycTL2u\r\n4iN+w+2idWW5HNH8d5oAIdcBhXNQPzJlwlw=\r\n=Dsa8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"326011d654b4b7855f817a7a77f0c125b9375a24","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"deprecated":"doesn't work","repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.2","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.1.0_1675074190673_0.17161796557616915","host":"s3://npm-registry-packages"}},"6.1.1":{"name":"hermione","version":"6.1.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.1.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"cfe77f13f13ab6602cad86e5bc81f2b3418a9b83","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.1.1.tgz","fileCount":159,"integrity":"sha512-OYDYQKk7oKdYZh4BfWYyPGY/Cj+4jfT/LW4NQpm+0UgTjJ3eBNNunpsMVBNQUq6R99hh9m1O5MXhiHRapnFhVg==","signatures":[{"sig":"MEYCIQCCU2KfxWoVn6DK71SaFoI7O7N2dyHFgVXfoNVTNYrHpQIhALur07fTeJbgmWp0o91VnEeTF2nukZaOo0T+9YBfqXTs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj19MGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrE9g/9EiEkaoVLCw4DCVkqLgE1g2BFVh9ehZywkirXYJBESxYIsLE9\r\na+x5SaiKIMte6yYV9xAaa+y3aYJUFeNgTm5CmDMyYHxXddVUVYByVt0yAETi\r\n8zWeJ6rXHlL6nCpfqgT/fc2fulIk7wC/1KcyO5RssUP5OnPg6MoZHjt+gyV5\r\nesngzOI/WG5jvg/7FkFn4tsC6C1b6O4HKWHSb56mQ8gOaYacV2A9+0VdAqxx\r\n+NTWRFzfyHzcgAEl2CuO1wSla/7A90glOUtH4Io4enyod0j4vlkHdSsItX+v\r\nDhKIpzFPUOdZLmazVMhUpZjk1jclX6RizaAw7bGFWFbkD4llSKpAVhQOHO9e\r\n4xl9nAiZV6/47KCQcJWyH9knUSF4FEpihcMZaH9QcD+PNAT0GgsuLsvlPQ6m\r\nJTo3afZZNTa5O4dxzj7WSXxJhCaYYKW+h8FLxkfTJvcSvkD4PTxbfjCDnFT7\r\n7IgQDk3MAVUCbDK0I0wLNGOzLYtTTYHLHxEgaNY3GbCP/iKk3VqWyf1K8jii\r\nGZW+ulkIBtS+EHEaM7S5ej7zb4Peis89dxKIV8NM2SE2M5LiroCIfyjEM+a7\r\nCvCN4+V8/IsMvbQdX34i36SZSlWkMj3SQFxn1GvT+YKzlQzc0mr/NW7m3gPg\r\nayQd+O8tc69gMPaL5eKyOm4cPAyK5NaBlAc=\r\n=GmvH\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 14.0.0"},"gitHead":"bde9e01fb4c09f09a20d42045713d3271965f7ca","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.1.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.2","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.1.1_1675088645946_0.40694714288636247","host":"s3://npm-registry-packages"}},"5.6.2":{"name":"hermione","version":"5.6.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.6.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"fc0df19c817dbb9ef51e513d6f0e64b0572f2e13","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.6.2.tgz","fileCount":158,"integrity":"sha512-1ZAJtvniJ7r+LT2339292LqvHZX0VIIz7sZFe0W4MFc8jzAl410pHcRo5GLANxriZEfHLhun2V+cP7zruuXdQg==","signatures":[{"sig":"MEUCIQDV8pcmCysYiO+Z6mdkxt1Z18E+weucKBM/s7aYvxOFxQIgI1N3EGcuTEv+N4/xexJoJDsJJWE1aYtHe+oJALdwttM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":422771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7MDwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrpDRAApODablj6vw8C0At8+ikKoBaZQjMyt0SYlIsQzCKE5b/D7tBp\r\nQUlnCjmvp1QLMUFav3JKJ+48Fz6AQZWGKdRi8vS7F1avNSTfNrLoYyCNhjSu\r\nSSgw+qH8Jk6MA6y6BWzEBRVKzu6dMeyrLRnWzLKMZY8uQ33wSTtlPrwiiKpL\r\n28GkBuWjBqFjvbvJepAy3Cs2BOnq5OPktO9o6WKSrTyqAnmGxjtrUjovrwfc\r\n9InY9KEhk8+itB8T3KqRlfxczeOreUSkZeY2T+Y7bZvvZeLwpWoyb38DdQhk\r\n/KIA7R5Cjx0BVfi0bSs0JX2X/kc8qFUbk2pOohmYM+YhACNfNQzz90VVg5cg\r\njDL0sbU1JWZOu0ixsNvIrLvihy82tYWp90Ht9aWNzoFcZn1Xsvzi3Evu6bdF\r\n9sy0YpfgJjK7Fnw6qzcpcuctWIywtB39ahycQn6VX35y+GD6A+hszxhejS+n\r\nEFPs19QlbWoeg7M4z1aYrVkjn/GzD7GI7WTRK6x3Tw65ewZ4rC4odiI4EImO\r\nxp0WdwBl1rXgqesoixQFkQebLvY4SwUCxHUQE9J+V3mmeTLr4vDC2oWjwIva\r\nZKmNq5pAEQndPE4AsRFbXq970PVhA1EBmZdWBTBytUphJyrfF0bqkZ0y97l8\r\nUcYf+zBl9Mvfm2pUAQ7kCxh6rdHNqvo6P0g=\r\n=wWX4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 12.0.0"},"gitHead":"8eb0781139ba3d3370e95686efdfe08bf52ae9a8","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.16","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"12.22.12","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.6.2_1676460271903_0.6944576440167691","host":"s3://npm-registry-packages"}},"7.0.0":{"name":"hermione","version":"7.0.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"7a52bc5020ffae3d08f380be0423cf991e7381d1","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.0.tgz","fileCount":422,"integrity":"sha512-TdJN9xNYT6mJAturvIV2s7O8iEm8irgd81V/fQFzeNESP+SlbPUOG89IDldfcmoiGixVonFcLvNmHRXMSo+7pA==","signatures":[{"sig":"MEQCIGUm8MM6Jq3+aIER0WMAUm8hmOLo3GXF9/Xkl1K+cbkPAiBEbwJqWJWhGSloKPUjYQRIIiv8+wAxwUZdB3HYYAjQZw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":689394,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJX/zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr55A//dm2oZ8g3DwihbbdUCrWl3XSuSQ6R8tc85GHRacRgzM0hVoN3\r\nxvXEkAlJzmUF+q5eZ5F4YYSv65eBMZH9iCosXHuPHL7aBzZQABTkkcnAEEH6\r\nrYvGSiiCvyKRwj35FFdExHiJEuLHsffBeAHX+FiyaRQtUnx9aT+FKMGqwgHw\r\ntB1VlOtDSf1lfhqBE9BqqQTutfi2aXYSIpWyayCymM+sJTBNCEE1hZyndZes\r\nkO7qvv4Mcj9uv9Hghuhq7MOeyh54GR+OBOfVH9fAldCauiHhla9EgrlhnKIU\r\nnCOssbibUnsuIQ0CAKBUr1KF391U9Z6VBYsI09dVC2H5DHL3OMfhPblqSqpn\r\nVtKrE2TQBFzbdFD2V84ZuTlnUz7kvYNP6IrwBLbP6f5e7ZfZ5m6wMeC44THg\r\n31/n5A3sOGMxFQQja8dGub96LmpO7Lj2FpxI0+8QpyGooYhPlnD0vSekm8QL\r\nKJIB4snd6iKLJ15P0iYTp2YEsFMSOyrT6PRb1yWC0wd56fAUFops+1vckb5z\r\njbfZGRbZ/OY0mL+gCiDUkepBAZU6Yj5bnFp3Vz1qjeBpGeV8QSPG7405gRBY\r\nsJ7M1TtKprl3/0nhKL7dxFAEzxfP1ZEMJgFRTzk2M69UB16cQDW3i6rLK1+p\r\nNwTN19oL69pRdh1ErbthrBw2iBk7k6o50Ts=\r\n=NpPZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"98f46043f835f514d572f565688ca041e37cc02e","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.0_1680179186954_0.5836988203659084","host":"s3://npm-registry-packages"}},"7.0.1":{"name":"hermione","version":"7.0.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"b9e2f566eaaeed7257f18180cc23f35ff18a915e","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.1.tgz","fileCount":422,"integrity":"sha512-uXUZUolA60y8i2LIvK+9Nt77IsR0yu161A9UqKkq90iZ9QkLsV4o9VWHWhMzC5vyHfCb7pize5G2HweRTP8T+A==","signatures":[{"sig":"MEUCIEYjOkz4LQEF+8KO/bhHvkUgrI7hHhii0waInhSwI/1xAiEAmrFc34BNFZbkphg59X89vPUcF1+qrkDixWp9ki35uvs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":689401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkJrv7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpHqw//dQIkW0ZM4YEmCubDmIcuAKA+5enOe26uJh0jYU6Kh4ncbMYm\r\n3klmGIKL8Yj4twHg7gJqaaYvpMiCQrzABhSgp73yNi+QZvw4PnZxf8t49am4\r\n0UOkZqRgg6PKPZ0WVRhriVQO7XhneH3h0hz2qCC4DRt372rEimMUhcL7pxzq\r\nxtZqYgsSbVwCqMlCFBCksyY9OYnZdS5Vlg1eqR3tTgWvs2P6xT7jq3OrNP8b\r\nY9Yv84Z6v9NiBvs7hpG/k0Rhf2JM4kquB1VgNcmO7beplQy1Gqkto/NeM8Cm\r\n4yGkbpy6dlgrlSNwVMbhF/CqAp5yAvgDAtW97i5Z2r13k9lELNoAIIjBYJuZ\r\nWhAlkYh9e7MYBREkXb+cJe/IEbT4HRcUNEgFf04pEeH4iAS/G/e6davXLED6\r\n2z439AL8Ed+Ig1sF63Nh+mDhPV7OxvTSRWYAolxyMULn/EYxodz/w9J1KCJ6\r\np3LCNBKO0YTRdXzeIK62Z+nXyhZ2YzvaRw4P5ZX1fMOTL5UjxcOvk3IOQDde\r\nMR0YYj4sVe7JxT/xCeQ8rEC0RtdztmSZICGuZrOOYBmH/yXIbKTCZzLueKIm\r\n63GrOUUMTcPlgKhfPk+1nlkXUNDA/lKwF2obVXLpYnZ7NVQs76qb5N5dvLSF\r\njhfbe6WNPAmJ/Ig+GwODRqJTKifkjYE2Sqw=\r\n=Jv2P\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"861607480f5870a6dcd214f7f958230b5ff93637","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.1_1680260090912_0.043805771116935066","host":"s3://npm-registry-packages"}},"7.0.2":{"name":"hermione","version":"7.0.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e14f073d0c38d2aa68c63df10af7ac056359952a","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.2.tgz","fileCount":422,"integrity":"sha512-iRcbc6bJPucZQqcoTydbeYpPMUvTG1+0uzBMGXUPEdCROXjVCd0FIJV0c2YGFVZM7doyapgnJBwx3wCJl3UtMw==","signatures":[{"sig":"MEUCIQD74qKlU03E/cPeZ+3L3jxfOACmA1RUxEXlhUnABLb60AIgPTl54SWsYERPy9rYKPR6orfP5F9TtqUQRat7Pmrne1U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":689396,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkKvpoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmptsA/9HMq/amHJSvO1crNrxhhVst3eMa3PTQnVvhCm1k160s4FTBEY\r\n4PwRX1IueYP1eZYeYZX6QBxhgcGQbIwhdy4mm077MkyeVd2Fmq1lvw+QHGs7\r\njGp7sD6TnBteIcAEbyE/skGUxes9NNPmqBggS2nHH8t4mExMXGl4wgsd5qYs\r\nObxuurE26gIpKOlIRyzSETykm9YAAOMfsd92/c1jYSk7oQ12Q+zop0DJAAG8\r\nO28+srHUPvviZSeLxJl8+lQxCgIu0ZGyuhb8JqWXzep/nWHBxUuMz/ZY5exP\r\nzUv3Wr/xcJviqTZGOq3hxmJEEGpUeq1cHNjUUcQ5CJvznFp8yUptMY7gUaq7\r\naCCK1f7Mp56nuxliGsPO7dmR5sVKnSr1yMeODxbskK1RSpCGHOf8CinM6HM+\r\nuhiG201OL+C2e7FruZ+9NAGMXIS5vBwJTmeAt6xAtHSnT+pqnFdgioagdHAJ\r\nKQYo9UsmiN+7PEkYmSOUH+gvZKZBh8PmeKSJMPwha31ggEQ6A88H/efCjLN8\r\nlSnA/hIsE5tZdbL+1UHU+qCSsuMHpvYTu8+UGT6Ba2qwCTZC5evv6+AUBkBC\r\nD8Vks5JUJikgdbHYtmw5KI70AFtuc8A+ydlpRF/ZlFQxfI229A4LAz/MuPR3\r\nsnfbIJFVpSjj6mbrnM1BpVVjoGr63iOWV2M=\r\n=IDFR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"f546234cebe7869be08cb8bfc428b64161e96003","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.2_1680538216439_0.014163001132306396","host":"s3://npm-registry-packages"}},"7.0.3":{"name":"hermione","version":"7.0.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"74990d46d5b841e7dde1dc6a20a2ddbd5eaa6f1e","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.3.tgz","fileCount":422,"integrity":"sha512-icbk5TjwNh8LqUYzVsJTFXJCTG/NOGZGnPCexB+50vL0/rb3FUWXi+l2+PtI2wRZ6BlpWV/FngQcJQ1L+T9aZQ==","signatures":[{"sig":"MEQCIAHgCcbyCndM0nhOrh3i8HJmyOy0WkWzq3jbGd9Or9/ZAiA4Fl9t91jJ251dpWcgxKrCg1poOIHsVd/Cs+eUbB8D2Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":689429,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLCOYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoHeg//TOIwcs4DwOjef7hLO7b5NczRiA9t4Sg54UG98XuRdzluT7xF\r\nHbWMAqU+kB8nflSEN6Bd2ICvS562r3wqcPt5KMliecL4vyw+YZRvrUTBpdXK\r\nbezzexVnEpqOtHslQb4ymcDaOQLUSiCSGhbypoz+psZDde2E4tykf0pGvG/J\r\n6oUb59BiUuWBZFRHFhwpGWQ8Qx3HuDfe1y7Z9jzh1Y9iMOX6imiYOZnWg+MW\r\nvcTVd+6/u657QoY+11s+vnPRBgh+XPIQBtcoxLYw+SWPV4+Eea4rUx06RnJ5\r\n2SlaPFvxUX6wKPH20kzZhI2NobFDWreQ7PAQI3WA8szvBmQMmAJNLbwukS1B\r\ntWPTlSPLzczrL79olV58QJL+rlx0ClgnhexZGntc6GB/MrpC/j1mhOHmvs/J\r\nIONLveLRL+6mD37aQjbsufdBQ12qQXloSXktfVvZtmvDpkcHnAJftE19mueO\r\nkjB9DIDU+T7K/Z9HWXmbnuqN7qldXsS+S+C8Oym21DJ0q9oA1Lxci5RC6Q/9\r\nH4rPGj0Tkfh1izLMB7y+NSU9t1P1PR9JYqaN75Bu2UfNgtWWDebMGlTB+MU5\r\n5N/Oz5JODm5aQsQD5kOcwaDzLs/NwdDUCnPJfrdVvNmoqFMVXEtbbl93flnm\r\n4DX13DIXHUfIu39OAoOkzoBoqDpqB70KDhU=\r\n=Wmpp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"e6bc3f2cc76c9165dd97def33d3a20c706b53676","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.3_1680614296439_0.858748006522501","host":"s3://npm-registry-packages"}},"5.6.3":{"name":"hermione","version":"5.6.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.6.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c726660f774bf84797bade187a3a7e532e6ca506","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.6.3.tgz","fileCount":158,"integrity":"sha512-AZGzBl4Z/5rPiSNRtLoWqwmW9qi3fLmA+LB73oit89BITtzQQxWidEQ4KU5ckATV9+BVn4SvJnPEWOGdQF2RgQ==","signatures":[{"sig":"MEYCIQDqMQIPMqNcVS8tIjFIKI3OwyMVsDIkGOw/ZD7txS+b4gIhAIo0LFeYbSrrRMHf+2YriSUEFEaYPco8F4a3GhrRxxGQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":424308,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLrD9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqNBRAAk9SFpGQfMTq+//sMvFjVVIEyYOBrc3QtDytr8rao4mCRxO/s\r\nkdcnn3cSBQ2z3d9VrUmQlg0cZxRc+OV/+P1uZ5DNo2UXCFaXlzC6+sz6rJ2d\r\n4MfhBBB2YCzNSGNdGrquKpH095JOPp0I1APgD6z+7x32rn5rzjyHGrjxSoMT\r\n9jNse+vAs5kXa0nPenbKjhufrreovdExM1I/OpfL0XXsWc2SR1L3ETvpCIiO\r\nV5UBfKrCbPR2mxowGdKYzSz3NzCzHOOp0mDCQavE9wSxftiJ6BZUIr+5hP0P\r\nvkl7azRP5vRZEf9tND9CiHDf+SCiEQj2Q0s7jbz6ReneJP9hTLQ/Q0t1ryYl\r\nkS92RbHjUMSKKvO8HObjPBiTWvwH4ffkaXHLbwo66vqHQJrEG3PF43CqQmow\r\npTIk7Jp24MjLhjbXSPHLHYJp88wsYeT6C5xWKcm+WusYTm/CeZMFZ/TBx7On\r\nchX6EElvP2xmvj6ba5IS9Oq+Ho3S6in7+1CFrFl9zexZ3WsnEfSuydI18MzD\r\necyBIhJ+0Lb+VzQANMSdU93YffZjVQKgtFqZZ/R8O5/64QSMf85ndkfSdbQb\r\n711M/lq4PgRPusuYnMKIW1PBUn5/Q4WvuePtyTqrHVSPNpA/hJXHVlQh1EEA\r\nB4j53wSji7/zE5nMmZV5rlsokZvX12TzEuQ=\r\n=ko9b\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `true` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `true` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 12.0.0"},"gitHead":"bdbcb522b6a760164925451f1e512b14f800a277","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"6.14.15","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"14.18.3","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.6.3_1680781565584_0.9530907337559029","host":"s3://npm-registry-packages"}},"7.0.4":{"name":"hermione","version":"7.0.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"665653311efa085a9a1a241925c4087fbeb8a716","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.4.tgz","fileCount":422,"integrity":"sha512-t7AFYiAQWpABxsHyayMgbGKXqDeJaotSpXzM/WvYjLoIF2vPrn/IdiPgpBPSzOR/kyw5bFf+3Gcp0AzF89cNBA==","signatures":[{"sig":"MEYCIQCnQ+aJG0g9+xQ8C6R+lcSvxhD5gCXzXp/zppLbSRr3AwIhAPg/qRAiRHzrqPSbkoQTycsTmcQaB04BF2asq8LZroEH","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":689563,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLrjsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmppAg//bTOLX57m2S0VaRPPA3dinhuXFWAFe6ukK+1/hZpDxUaUD/Qy\r\nr1IBHZGKeduLCIkbJq1MWc57qIqHI2rHI02nWZ24iJAVbPhtukPcqFfNF4WC\r\nPXmSoS3fzGVcG/5EO7bEL+Et4Et9JAoPxE3PqLRe6VpjjvbeuXg7gxgDNM73\r\nuW9CTRP6aXgxY+gDVwW5LE9L77DfItSCC/2cdLii05YTriKVT/PuewdQHTvt\r\nABUAV67qkUQT0TL6zxM/Qfy5iJNycb6vugLQ4pvN51me+w0wJgQcym8xIF1p\r\nqCM+6dX+ocIX0zwSk1/ZxS2xkDZW+cNQc7KMvA9ANoZyxjvD0o9Ut2ezViDL\r\nSs5qxTeBzk9u6D70+YM6sEn2AiyudoIxmusezWzSaqUxUtWsBIAq+b4QSAGf\r\n495kmYqk26yF99VHzLruRenXngfzmTtjTw4b9jRIte834CbH95nxZFaXrsoH\r\nGXffdxhp3jzUChm21gUKbDoR4xrPq9DsYrRj621j2tYJxIpy7qsQSC9ut/rk\r\nYiu+PrEnkucIXFJboOI/oC23JbIbNDob/LjXDXSoBHtNGqagCuv7ZGdLmEgV\r\nX+Cvw4AJTvGwNwVMRk970unrTm/h53WInP2OVJEXrqmdAqyfmgQT72dgEEcq\r\n/pC+1oEFsfNVJ7aeEAu7kmKa+cOgJ1KmJ0A=\r\n=deg0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"d59ac1adbb12178b291d2ce6a51a624f68a36d03","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.4_1680783596238_0.0009809911626887935","host":"s3://npm-registry-packages"}},"6.1.2":{"name":"hermione","version":"6.1.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.1.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"9ad873f4e3767b914ba80d44b39758b2c8f46b80","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.1.2.tgz","fileCount":157,"integrity":"sha512-SR9vkGoFYYwpY37TzuuLiHLdasDigSq4JuUKxQeyeGjIGW/6CCjsdufZpghzLUZyxC69JduoBwXoPU50YDuIAg==","signatures":[{"sig":"MEUCIQCBJ1I7DFwSxjZ75AUOUzBu+R3ogmCx1eSQ5v7oMQlHEQIgXj4yYxVJz4bTL7kfTVNO2IS7B0i2nawtYxm2KYAPQfE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426119,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkLwcSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqq0RAAnk8JgomCMjlxeqmn9mAvODIdcjdblFJ5zPQl5YpAXh43777f\r\nQUT+zhqWjAA14CgUq5RYYO4oLlcvZFhSYTx2/sVLmbFhg/Jh//wJyHaYEBCf\r\nOJoiaX0PpAsyvTwPpTRo+qvZgCLjFXDIbBuuJg08ZDoWk7zXnE1hgZo4uSFF\r\naW9jSGuRs9e8eBCNa6CqLtP5LGWEsWQUKZoPU3RAI2bFNLAMU++Ysglz6JNN\r\nDQfDbh7IjJp9Z+FLulZaK7EH6xO6W8Fbr6C2Yhq6kc8tBeY+V3UsjcqIN+a5\r\nVBQn77WRx7WQvUTzG26pTFzrSK7Hjd5Vk3oQh3FjuIeh1vMJY2zps+18+Psl\r\nAsK3zgCRB/4mx40LyxoVDjSryIdmogp8m13X9RB3BjSbRFS34A3wIdhTFC6y\r\nVdmA2oIU04ST0+KguRO3lsxdfrrGis2Ipszm7jSysxm2OccbRGiBpw7Xox5P\r\nMA3CaX1QibtCe98Qhun9KI5e/K0RaC/GQ5a5hZDE17jt1iZVBo7j5U1fxYI9\r\ne3q44aS3sGFs3/mTg769cb3ZsMyEkXW51B7PJaWpl2YyrBfWbBN7Qg7Is6CV\r\nS/WeWDBhV6BuAHaPcIdxqlQmLxKBCQEcVu7+qXcMMsXGd8wrlwzesgOUGjw6\r\nQvQc1rmwVTyu0ltoX/tTv/2ZUpuPOKjQXXM=\r\n=cIbs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `true` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `true` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 14.0.0"},"gitHead":"7c27c444d16329acfd6cba19653c50eda34a4111","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"xrsd","email":"rashid.online@ya.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","webdriverio":"7.28.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.1.2_1680803602255_0.6090074220287243","host":"s3://npm-registry-packages"}},"6.1.3":{"name":"hermione","version":"6.1.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.1.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"71adbc63c1a55ceed8de5c7ebb1ac5a910729362","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.1.3.tgz","fileCount":157,"integrity":"sha512-+/AjskJkfSanEtQh6fZ4Nf5FrlLX5pNgAl/yVw2J376cJ3XlkwpWvZPt8ZRP+1jpZy6+bYUX9WbhR4wePrHH4A==","signatures":[{"sig":"MEUCIFx6MtbksdY8jEd6h+U/rLJoMJRwkaTfR4zZ3Bqw1WMTAiEAmyO6k+UyINKwWPad05GUAccgSf/wWFzsjeOoDjtMHeQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":426488,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkOFhLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqP7A/6Akm3DLk6ekTJNmN5Q/ITd+sAXBFB8odOAUedgjSv5qfCpu9X\r\ndV6UKqaPZgfaTT30U1L5a9yHdiixNa2bVFa4c50mevdSOsVTXpCCARh1CTKN\r\nCZ2pvof8VUioh5thnQJTBGRIHq1HnzgXcp1QGDro9dqMCQ1WqCp02nCioZdP\r\ndgZMFaRV9H3xe4uSRDQgp/JcLKgXUPUcnVpAniMElRAzsAVbWGQQfQN1XfIt\r\nIE+1IZUqvR17FqzcLo3f99J+Ik4GqCTpyVYTIu2AL87p9SL/LkwNnYhLnand\r\nn0PTR5VoG/yN3Ft7JFghndFMMa9A+0V4Luc/0hTiXujTKBmOhtWFn3bgHulM\r\naY0mujWSIuAWCYlvxmVaHWZpSUJe2f1HvtK50iQ8XcH9O7k9ED3vhePSx3JG\r\nJcNVlBFzsIifhQAjTxZFyxZ4vdfk40Oy0mVCZsPghbmU36atqmEDcAeXLTLJ\r\nvJoV94itE837VvZXLDKovKJyLlq/akVO8FSBLfsfaFOBNAGH6SZohqJw/zdj\r\nF2Jz764SpIkqWDjnnrUmvGNeQw/mJYeaoII8ecPsn/bbNV4VFMx1fymgWFsC\r\nmZ+iDrba7l5yZvjp3jzfLcfT7JM2pGa+Y9gNbmplDiKWi6ml1/04dK0jjP9P\r\nYCUTQXeQIUqgMyvffgWJkO1MOgZVkY0o7Mw=\r\n=aAMf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `true` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `true` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 14.0.0"},"gitHead":"9a75af5dc15f93e77ee2df2e2ed3c0e82530fa3c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3","@gemini-testing/webdriverio":"^7.28.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.1.3_1681414218950_0.8632944295516973","host":"s3://npm-registry-packages"}},"7.0.5":{"name":"hermione","version":"7.0.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"7e5e822b2ba7de8dfde6df3cb4cf6b9e7f08f133","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.5.tgz","fileCount":422,"integrity":"sha512-Awc31cYCry3NlbYlJZMgkp0BI/eakBrD2B/lmLcrX8JP4TQQBU+D6Z9kBpZv672K2B8Gz9nje33/MDVUzK6VXw==","signatures":[{"sig":"MEQCIA5LLXFR5PjRafLhmCS3f7J0FXTV57ZcFP0OjSvIHt+vAiBhdSpLtd/h8sgriawVTi9YW2R4NLlwP5UN42ZZZ0unxw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":690249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkSlzJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjFg//dt+BJRLLQQ0SOfUjNtouDqeC/VjjkD9KQDeyVxjPVyhILAHv\r\n8sm1a1djcNyewcUpWVoEeWpj7kXTa7PwUTFUF3vvANdUZa3a8hbtv4OwTc0I\r\nWoDLNuLZXe0lGZ8BHOHKoX0x/k4ZyZbDqI5d30Bwu2PooaA64lWc6BBSmg0N\r\n4ALFMH8P4pQePrf5X7GnCFyvANTTHvgq/ADbYd8MrXlK6pDLY06Sth8Ray5H\r\nUWEpDFIOQb6rt6LRyfHT1EHYUu/0MvwYPzgT+y98KH4hYsZXk1H7mF6lVivE\r\n6vWzuMHCU94WybxVmlGo2d3FsgxUQhjGNrjJbD1M452a0sz1AD1Rfii3f0ox\r\nzANojxShQs9QOKZHvYe2wYn2oOsxDEEVjSeTYExhKW/aA0FOp95r8VbasbZ+\r\nO7IUEzV9c/Xd4/f8COtSEDXyqPXaOZkKiEVwru6llEgKKMCR0pbN8/jL+gWU\r\nvNHQgGpkhPvSMwRn+kqUAcf5G1Xqm+Diw5yXvfLDEOhwHykOhW9vRhxRRKMe\r\nDp1NigJ/iMXjMO0437jdHK93a6PVufGJhjBk508emtFIu1eLKOjX/8nkjnwB\r\nN5zcAUDDAmfpOF3Fwnf6vfQ/4mFgamBUctJg2E5vjJ99d1KumIFe5hN5Cfvz\r\ng/UyLdZlnAa7EL6xlg2u9cYmPUwVZR1vwng=\r\n=6UKh\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"4fd984b5e63af160cc08cda12d71f31415e62208","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","serialize-error":"^8.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.5_1682595017020_0.20598856277210875","host":"s3://npm-registry-packages"}},"7.0.6":{"name":"hermione","version":"7.0.6","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"02e68cd6652444651bbf62f4fdcbd2e3b58b25b7","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.6.tgz","fileCount":422,"integrity":"sha512-7Je6RCq6lFqI98/0ixsAQ9GjpV4GI0veQ+pMeeCevYvUX1mT4JOGUouNv3XUscq2ZWLagxe/c96d/e8sfuPt/Q==","signatures":[{"sig":"MEYCIQCCbSHyNZ0u9O2tMz76/gRo6TWazF/6BFGJtq25rA7tegIhALyk6LW0pkPUFQdkT41TUoi5XDSR88HNfrK6RSz1fIM8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":690355,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUPCgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp1vhAAhTChIV9XLF1qfxDvbhywcg4US/c7NGD16odPEAevEvMUwBY8\r\nO0Ch9KwxFwFEdWTLT5PbaEaHRh6oifxUO9jYsgxpBoCSE46aSwOEMX2teOKo\r\nSRkreLxB6BXw0uaA4S/Cx5VwP3L0J4zdSSogra4/365GmDhq9eD1MZY2iHAU\r\n8yMadVTOv2YedJoWj3TuWdYD0SrvJAvKPWKTQyz/9eDcXlg128c5RlAQFZ+u\r\n6u4s/FjndDALBXxQ57KjSJuO0fAPz5eow2PMhKfst6WKUm6GxBE+goFsuJhf\r\n1Vdzl5eYlkB4XLoLvnAP5Y8hClvf9ZnYIfv6oUD0oaB+8zVIc8ISSout7EaY\r\nOXAExSjhtDhAh8o2KxU7tsCNYK0Aw4xo/OgzNZAkHXnvTsITGqHs5QUxS9oj\r\nvAtK+H4TMDA3Jwg4QIsuMEs//ARCuNfL3fi/VCDIs95pjndGEI6nGMX3xGyh\r\n31/KwS1cE9tmlc6c+Ob7E0x2ZPcyE+2Rhghz7vNT2Q691Y+nmUBp52b/q4jb\r\nFOXUdVmeikGwqgremtP8R8YTRyTMmaArmZsNUDORr6UfG5TgNI/IYvw2k85K\r\nI/aWyCb9hwbKj2J9xqqcbdKRLjf6hITH4CkziotE3uuU0baIfzLq/dFQPnYH\r\nR94SAjPE9xMrF68ij3Il4/JlFugJTrIh23I=\r\n=9lyu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"b76ae72631c90339fcca5cd7fd7eb59d691a7c36","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.6_1683026080104_0.4071135037564251","host":"s3://npm-registry-packages"}},"7.0.7":{"name":"hermione","version":"7.0.7","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.7","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"cf6e433aa056fc101f53b81b8d4ab557345c45fd","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.7.tgz","fileCount":422,"integrity":"sha512-+UeaNThoBPhJpsAeUVSoG3FmSQARncz7Dm/L+IPqtSgUDpGtQzj4ggSKjsKe0e04pFa9+ZBrUp+pw7u6El+zxg==","signatures":[{"sig":"MEQCIHnBBTD+C60ozo7Fbrjks6p1zxrYNyVkHgGxRA2fPYv/AiAegBPgm46YRaBs8qQxIF50fSjMBLKpNcqhdtpUqXzn/Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":690401,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUX/wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpoQw//a4RSBJGMCf+yJ5UV2tvIX3nuWjrOK7n82dgDUN/Loh2V3/qU\r\nIOKgaeqW9svbi/itwwTv6bRsN1u0ZrMles2CfALqkxsWmgf/EDVuCIXPn6Ft\r\nr5zmUEtHO013BUcsDTj/Tm1HaWCWcchYW501izCxarIUZceDdp2lcDYg0Jd/\r\nv2MYbA48ro1MtHjmf3bhX4ve0GJx7cb0SX9D8Or+Tkrs1hrgvfVgWcgtbuF5\r\nJedXZRBotsyxb75UyQCJWLmR1h8AF+OetPs5k4H+bEDOI0GsM96mwHrbucEA\r\nawxtRZiUIWnFSj2uixKD6pziizI0J78TgePIJyvlNrI3NkbJ4GvA4CbYnPRv\r\n8IEapwf6LKt2Exg2eQiQ3LBT+eRpVhQkkvJGbziLbSA6HP5z4Mcu8LofJZJj\r\nKNYI847oyk01SjjvkEINPIQRZ7zFVfva2sZV9aW7BW1iJqCPtY95s2SkMX1t\r\ny9bpRRWG/nqgiDxo2zfHUydxz8KA507LJQd1NsdvN79ahROksLFXn0Q6Rd9z\r\nbG2GEXZWRu6+sMJ83dAcn951KsQCUdMTNHdahRAyQfrd/yO8T9qM/NaFTT0S\r\nSCMczSzsnrtCcesskaCNsMt3AI5NthZocx9ZVyAT5yHofFbcFOeMIhqJ/snT\r\nwQpArhaZzvh29HrBWAjIj2M1Ypye9BEe5mU=\r\n=3BMD\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"df011c8bd887552e00e60f6badd29a50677b6fbb","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.7_1683062767795_0.15142549502991565","host":"s3://npm-registry-packages"}},"7.0.8":{"name":"hermione","version":"7.0.8","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.8","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"1b7384e8c617a4d76ecfe35e6801a442075985a3","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.8.tgz","fileCount":422,"integrity":"sha512-iBA8qZ63h71gUcmKePSS23c3DIG4QutMRFVlUNR8mc6ZBzhPUgSb3qZqciKFGbE0ES2E9HqsCyKvtxjzshs/4g==","signatures":[{"sig":"MEUCIQDsEvPev0QObHgoTGy/3Z6xrECaaVlHcnle8UMCiGZpOgIgFa58iJQiw3aYlzFoMHK2q3oZ9xLjzDmw4debgOQ0wxs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":690507,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUk0CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo+ng/+L3zUa2e5msLp6l3Vpqh93TmWL64SMfdC460trfauolYvGZH+\r\nNTbFvlQzsmTU0gtoEgWDzryG2KkhwYcnUg/DG7EzAmI36OQDI3BffZ5kNlVV\r\nNew8fnEnovCs6VwfEwuiSvYwRKglhO4KxOpjJ1+8doJiD/I/ZNDlb/8s9g/f\r\ntYKJtC4LXfci8Rz/JdoYcbth3hmw7ULKxya1TfO3e7kFnu11KmPvQaIWyxw3\r\njJauA3QfrtPytRYC/M8dvsYoTiOkwghplwusqitjxZtbwuhzyCbb0guS1nWE\r\n1dNgBBqA1QxHazOBKiTi9lQIT9B6B84DvWDLl20GFo8Zr1YS4rVYN2Bf3kMv\r\n9bxF9e+WBXchcLLlRWdl9gGKR6Oq2jSLhF7LSklrWtqlsb1G+HCJj/2ED4hP\r\nRnEU4X2qByetna2LA/x3mZHpm8nXDPCyxrGlwy+7+/HzpqcMTpKuXuE4fo2n\r\nNuu9pBazHzDG1R8nZsl1KxREW6xpQYETxC1N959q97AKVcUy8L72UsAdGene\r\nKXY+sYx865+HLjBANqcsDI/7xN/GZkzoQIbpbDYB0SwdwBHXAQ+c+kIBQSMS\r\niCBd1fBmR7wm4T4Fg+esDu5KPZuQLYLblM/ByLp6bK0XCBqcGDBjIta1Bu4O\r\nNwhuwWLlayn30lHOuq0MGG+lpNSdEC8Qsfc=\r\n=q0Fm\r\n-----END PGP SIGNATURE-----\r\n"},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"232a9d8e8efec391b9638f2afc1c22e54794e7ba","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.8_1683115265800_0.8928086592331101","host":"s3://npm-registry-packages"}},"7.0.9":{"name":"hermione","version":"7.0.9","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.0.9","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"02ae900b59dee8b5fad82f10ec59c0bf889ed832","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.0.9.tgz","fileCount":422,"integrity":"sha512-ZzHdXHahoKMpui5doMFxDtwW6wrxfJ5QYjxFT8V7zCwjrd1aj/CwDXkSCa9aPhuVz1YEzWUjcCQ2ftSblNh4Vw==","signatures":[{"sig":"MEQCIBd4pKphOtrhoCknadTqgsyFj4Ir6nnbK1HHryGuSMnnAiBDvwX628D7BLJawrH97PUqx1/T0c/CydvZsQce8TYubg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691268},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"34eb3813989d6eb1049ca274c6604ea7003a684b","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.0.9_1685460642712_0.5217564474184551","host":"s3://npm-registry-packages"}},"7.1.0":{"name":"hermione","version":"7.1.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ae4b572dc9de298e984ee25681c9f42ae546f964","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.0.tgz","fileCount":422,"integrity":"sha512-gqjoMAhHAQ+ufQ/mkQq098bkbp2J4ueUcP8AZiZqyz7mB+Yv0DqIkQzUUJbgkhDZWeDQQibXof/Q+JLn4JVGpg==","signatures":[{"sig":"MEQCIGtpPEdUia7VTKITrZAbY49NHB5jJgHvwthVj9zpFguCAiBMowoKkJNZcGrDJQd+v6VcPcRr9vLNUn0yPLrm5nMdlw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":694007},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"e4c3d581b6e3eb491b14f0277b636c5ac3fc0677","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.0_1686733875785_0.5231846030979515","host":"s3://npm-registry-packages"}},"8.0.0-beta.0":{"name":"hermione","version":"8.0.0-beta.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.0-beta.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"85b33614ed1ae5e0b10b26de323fdd7606e182f2","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.0-beta.0.tgz","fileCount":433,"integrity":"sha512-D27QYlSXCsu8P9azaxPq+NxcR7YyDKgCoXqekA3vTTNEZgAfTSZxSBYCdViY2Y23kP6DvmH7mD0xrN0kdPNYQA==","signatures":[{"sig":"MEYCIQDZlqB+dO9PpJz5IsrB/WNHmW2gULSfV6j1Gshkt/jzbwIhALk6Ze4J5+j+XGPidx+rVwoHDH0/huerTf7GBiZeGH0D","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":702885},"main":"build/src/index.js","types":"./build/src/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"7cfc0de5dedbbcff8ae076ae6fdd92a73cd5d08b","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"7.24.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.13.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.0-beta.0_1687326454131_0.9521377472459354","host":"s3://npm-registry-packages"}},"8.0.0-beta.1":{"name":"hermione","version":"8.0.0-beta.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.0-beta.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"df7c0e7dc4651348c0168350e6a98d2f8c297236","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.0-beta.1.tgz","fileCount":433,"integrity":"sha512-s4TAqBxQxYejMhMaNa6mzvKf1hZlIj6ILWJiD35wDkl5FWuBNvC2Mc0PekdBNy0dmnRhVAI2ay7fUx5Raqpvzg==","signatures":[{"sig":"MEQCIByVqgQRV6lt1/234WhhobccGLCr5ElPZPh4uhsrTvzOAiAGFy9hMrz2bANGrlpu+cV37OiaUWQ972sqpmGPTS4UzA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":699793},"main":"build/src/index.js","types":"./build/src/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"a1135e3f28bfc89e228951b354309ea6e467945b","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.0-beta.1_1688470915489_0.7916461998746094","host":"s3://npm-registry-packages"}},"7.1.1":{"name":"hermione","version":"7.1.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"5c1ea79f443bf6342ef0df06336b0c3158b246e6","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.1.tgz","fileCount":422,"integrity":"sha512-nmhBOwQY4JSaoKBcKbq0jtOFvmt5CVWTMMvvX2Uc0G8ehMCsnJBrzvdU20x4VXXs6LxYYobu1lVy7CPHdz0uqw==","signatures":[{"sig":"MEUCIQClpY/2MfluglTN5/K6KIAmHQlo+oSMisUMaU2CXJAXtAIgV3WRLUi/FEFMtjZAp56mlzwyo+NI0uBVnUBH2et6MUA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":692215},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"0d95862e1a3b07332e9e51f8dcb5293442ce3852","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.1_1688475504937_0.045757613145332776","host":"s3://npm-registry-packages"}},"6.1.4":{"name":"hermione","version":"6.1.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@6.1.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"60afe51e5fa7bd84075851baedfaf29265115454","tarball":"https://registry.npmjs.org/hermione/-/hermione-6.1.4.tgz","fileCount":157,"integrity":"sha512-GIDTJTRgk5cNPEOWUkJDzdi6f+yofLX6r8yNEa0kEQqLoGPK8iTRk5TiHFMtyetFrhqKC0cYKSz5i1FsGKhK/A==","signatures":[{"sig":"MEUCIQDvhQd8lbe91fY5ZW974NMwXyqyEk8JVZv1IQEFljo1ywIgCQJSwWSXL+ZKQaN0jAUQ9cWdJEsYzxUVmRFlbPRt+8Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":425361},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `true` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `true` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 14.0.0"},"gitHead":"9549edec71b33df7fe0d1bf8a743ba5c9981ce64","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.26.0","@wdio/utils":"^7.26.0","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3","@gemini-testing/webdriverio":"^7.28.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_6.1.4_1688480336520_0.3107910693681706","host":"s3://npm-registry-packages"}},"5.6.4":{"name":"hermione","version":"5.6.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@5.6.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c260a02316645ac21c050132e9fdef63ddd6e376","tarball":"https://registry.npmjs.org/hermione/-/hermione-5.6.4.tgz","fileCount":158,"integrity":"sha512-ObVPHQaHNcm35D80eqRHpt8y0rYCxcqHoOW6ipTm2CYKh+NxwRyz6OaK3bSoM5teiyaEC8ivesd5qxwSCbEMjQ==","signatures":[{"sig":"MEUCIG6rtG3qvJtNjl3SE+lVahGlN6aZWCuUzy9h/sNaPOp6AiEAw/1/ygkoi1ZDhA6XU3B6r48nICgIwYdvlv+oY7pPBxk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":423204},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `true` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `true` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 12.0.0"},"gitHead":"6442b19942be8a58c3132b48a30236d6498834a5","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","prepublish":"npm run prepare-calibrate-script","preversion":"npm run lint && npm test","prepare-calibrate-script":"uglifyjs ./lib/browser/client-scripts/calibrate.js -m > ./lib/browser/client-scripts/calibrate.min.js --support-ie8"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","fs-extra":"^5.0.0","uglify-js":"^2.8.29","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","webdriverio":"^7.17.4","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","escape-string-regexp":"1.0.5","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_5.6.4_1688481308675_0.1930416613883541","host":"s3://npm-registry-packages"}},"4.9.2":{"name":"hermione","version":"4.9.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@4.9.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"59b1d83833c2ee35204a7634f31f9a9edada1bb5","tarball":"https://registry.npmjs.org/hermione/-/hermione-4.9.2.tgz","fileCount":105,"integrity":"sha512-cPfmC7O5Q6qSVpj8109dPbo3ixmScHUbZ+NXfJ8Tt9ccKwU+lXlSExclsr6GS2YA8D8C4D40kMG3ljd3jiQNlg==","signatures":[{"sig":"MEQCIEkTbtzCWEkcf28CC4iVkZF5qCLztRvKUewyGzktW49AAiAY7P4vvBQBeLWraMkS0uzUmWBKSrVnZTlZXKRgiFuAIA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":327404},"main":"lib/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO v7](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n  - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [screenshotOnReject](#screenshotonreject)\n    - [screenshotOnRejectTimeout](#screenshotonrejecttimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistory](#savehistory)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n    - [events](#events)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nInstall the package.\n```\nnpm install hermione chai\n```\n\nThen put `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` block.\n\n### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.js` file.\n```javascript\nconst assert = require('chai').assert;\n\ndescribe('github', async function() {\n    it('should find hermione', async function() {\n        await this.browser.url('https://github.com/gemini-testing/hermione');\n\n        const title = await this.browser.$('#readme h1').getText();\n        assert.equal(title, 'Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id()}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id()}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook mocha object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. In this case only visible part of the element will be captured. But if set browser option [compositeImage](#compositeimage) with `true` value, then in the resulting screenshot will appear the whole element with not visible parts outside of the viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `90000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `300000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `httpTimeout`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `viewport`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`.\n`screenshotOnReject`      | Allows to attach a screenshot of a current page on test fail. Default value is `true`. :warning: Option is deprecated! Use `takeScreenshotOnFails` instead.\n`screenshotOnRejectTimeout`| Timeout for taking screenshot on test fail. Default value is `httpTimeout`. :warning: Option is deprecated! Use `takeScreenshotOnFailsTimeout` instead.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `0`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n`screenshotMode`          | Image capture mode.\n`saveHistory`             | Allows to save history of all executed commands. `false` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `90000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `300000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `httpTimeout`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for web page events. Default value is `1000` ms.\n\n#### waitInterval\nInterval for web page events. Default value is `250` ms.\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `false`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top.\n* `viewport` – Default value. Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n#### screenshotOnReject\nAllows to attach a screenshot of a current page on test fail. Default value is `true`.\n\n:warning: This option is **deprecated**, use `takeScreenshotOnFails` instead.\n\n#### screenshotOnRejectTimeout\nTimeout for taking screenshot on test fail. Default value is `httpTimeout`.\n\n:warning: This option is **deprecated**, use `takeScreenshotOnFailsTimeout` instead.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: false). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistory\n\nAllows to save history of all executed commands. `false` by default.\n\nSome plugins can rely on this history, for instance:\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n````\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `browser` (browser id string), `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file`, `browser` (browser id string) and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        const test = Object.create(data);\n        test.pending = true;\n        test.skipReason = 'intercepted failure';\n\n        return {event: hermione.events.TEST_PENDING, data: test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -r, --reporter <reporter>    test reporters\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    --require <module>           require a module before running hermione\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\nYou can choose `flat` or `plain` reporter by option `-r, --reporter`. Default is `flat`.\n\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report.\n\n* `plain` – information about fails and retries would be placed after each test.\n\n### Require modules\n\nUsing `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, browser, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file} for browser ${browser}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n\n#### events\n\nParser events list for subscription.\n\n**Available events which are triggered in the TestParserAPI**\n\nEvent             | Description\n----------------- | -------------\n`TEST`            | Will be triggered on test parsing. The handler accepts test instance.\n`SUITE`           | Will be triggered on suite parsing. The handler accepts suite instance.\n`HOOK`            | Will be triggered on hook parsing. The handler accepts hook instance.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({testParser}) => {\n    testParser.on(testParser.events.TEST, (test) => {\n        console.log('my awesome test:', test);\n    });\n});\n```\n","engines":{"node":">= 12.0.0"},"gitHead":"d582c67a79147233eab0e178b179ac54df76828c","scripts":{"toc":"doctoc README.md","lint":"eslint .","test":"npm run test-unit && npm run lint","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","commitmsg":"conventional-changelog-lint -e","precommit":"npm run lint","test-unit":"_mocha test/ --config test/.mocharc.js","preversion":"npm run lint && npm test"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"chalk":"^1.1.1","urijs":"^1.17.0","lodash":"^4.17.4","inherit":"^2.2.2","bluebird":"^3.5.1","fs-extra":"^5.0.0","@wdio/types":"^7.16.11","@wdio/utils":"^7.10.0","gemini-core":"^6.4.1","webdriverio":"^7.16.11","worker-farm":"^1.7.0","@types/mocha":"^9.0.0","clear-require":"^1.0.1","plugins-loader":"^1.1.0","gemini-configparser":"^1.3.0","@gemini-testing/mocha":"^9.1.5","@gemini-testing/commander":"2.15.3","teamcity-service-messages":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"13.3.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^1.0.0","eslint":"^3.9.0","bluebird":"^3.5.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","@types/node":"^12.20.28","jsdom-global":"^3.0.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^4.4.0","escape-string-regexp":"1.0.5","conventional-changelog-lint":"^1.0.1","eslint-config-gemini-testing":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/hermione_4.9.2_1688487611147_0.2681070013517175","host":"s3://npm-registry-packages"}},"7.1.2":{"name":"hermione","version":"7.1.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e2ea2c77a0a32c5bbbfa8710260207a5f33a9cbe","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.2.tgz","fileCount":422,"integrity":"sha512-KdKmuHVOP1i/pM9QVC8LsxMpYZyUr0fGJFne+46pS+drB1887DcBSEMuQTuOwUVCSmYLC6HNCVy1bhkU6BVbjA==","signatures":[{"sig":"MEYCIQDgFhs7B6nmG2Ci+Fd7uB2dN7I8Elj/v5/7009dXF+hfQIhAMyczltF4hKhl1p2xzbXuYrSHxiX63BS6tIey8v9XuQj","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691244},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"ff1e4f9937bd41e66db8231f3b2669b70e138f37","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"^8.5.7","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.2_1691154050782_0.34940659847626554","host":"s3://npm-registry-packages"}},"7.1.3":{"name":"hermione","version":"7.1.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"3ddaa21b4ca6dc47b8b0eb27f030363f96fc5f29","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.3.tgz","fileCount":422,"integrity":"sha512-rMXxe5YATSzXaplWtkYKDE2Lj2v7hz2vZs3JcSmU18r78ECj+SJyXUlt5hbp0IJnJuY5t46Llt5XMfq7vjg8cg==","signatures":[{"sig":"MEQCIDKet5T3/+yGZZhhmyDDTP7k3UsH4HU6mLIuTCNm7ZnRAiBesPZlKS4rdekTr327V3ggheNpN5r6WjbyR6RuVwUl0A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691244},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"7f4785ee6901108a6bf19c2fbe968c96ad35de45","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.3_1692185380063_0.37909959275220007","host":"s3://npm-registry-packages"}},"7.1.4":{"name":"hermione","version":"7.1.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c8ad809a4adee1da098552c9a6a461712de31234","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.4.tgz","fileCount":422,"integrity":"sha512-1drCjIXlca8PI4kthj3RXXbt4PxUGFfq6tHw4C6nONTyC8CPmwu2/qS9NAfYheVz0QUo0lZIKrXTs8SEzXiYJQ==","signatures":[{"sig":"MEQCICZJOj9Zv0/5fCJ9Rmf8bviqRdm+sIS1cgP6q6mnWz9UAiAY18TiGkiZ0hNdRfqHXe/y46X/g8wfRZMeAv+TUbXmcA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691240},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"bcf88730090178ed42b01a160800a48cf8bb75d8","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.20.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.1.0","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.4_1692698672619_0.7376036690243535","host":"s3://npm-registry-packages"}},"8.0.0-beta.2":{"name":"hermione","version":"8.0.0-beta.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.0-beta.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},{"name":"rprovodenko","email":"rostislav.provodenko@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"9a6dd8fc1b6a3e1cc0c2d233f110f903098ed8b5","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.0-beta.2.tgz","fileCount":433,"integrity":"sha512-KOgcvP3YuSWijV4PtjgBH7hGctbbAQB4P/Hw1OoZxpV8woEErNlPhz+fWo81+rN7EbVlM9jb6YIsutY7UtNzvw==","signatures":[{"sig":"MEYCIQCGPIcBsMWhwvk3OOLPmUOiPMTLEt6bScOhU/+SIGWGBAIhAPQvZK5LJlG5Ji2qCV3tL3uCIytrw52z/KP2z5uj6e71","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":702191},"main":"build/src/index.js","types":"./build/src/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"d4bb9cce7eed26bd90374539b1b9e0fe56e64c67","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.20.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.1","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.0-beta.2_1694015710585_0.5275204337166561","host":"s3://npm-registry-packages"}},"7.1.5":{"name":"hermione","version":"7.1.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"a6cbd2d4c0a5d40fe683ca541325f9f550671766","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.5.tgz","fileCount":422,"integrity":"sha512-9xkTtMC6i08SaCykuLbHcPfJXDWV4X1KhgSnrrr1a1XMtA4NxWRxKk7YUwsvnPsqIlS/lfTXL+oldd9E/ipQbA==","signatures":[{"sig":"MEYCIQDCbB2PzhDRjClO7bvudtV1x+TdD8meZuVkG6o674RPlgIhAPcXunqu4JWY8TIuCtgF2kt2BBiM/TZMXpR3o9+bLdS+","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691919},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"02fa5ff22187736387f20b13da9b9ad7cbf2012a","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.1","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.5_1695726993407_0.03296797838901622","host":"s3://npm-registry-packages"}},"7.1.6":{"name":"hermione","version":"7.1.6","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.1.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f5f644f42c2e806e587e1b1df492d0b8c2ce2522","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.1.6.tgz","fileCount":422,"integrity":"sha512-p0TOgrhFg3WN9i0QXSHb8TGS+j36GItkX1aTAQIseYwDqE1LH/Ow3ilqBMtHZpMm1ePZEsPNbDytq3h72ggDRA==","signatures":[{"sig":"MEUCIBy1AsSUTnoPx9Y66IRRmTILyXZu/xS7aJwmjMRUTqvaAiEA+MAWhzQ0WJmD3P8NN+DPcrxBxgZ7gS43UK6UbSbQlwE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":691919},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"817b00a9a113c293a9901868b56fe7e372f3200e","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.3","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.1.6_1695803085973_0.19688722767539146","host":"s3://npm-registry-packages"}},"7.2.0":{"name":"hermione","version":"7.2.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.2.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"96af9301e24dd95466e0cb5748a53f719d8b3fdd","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.2.0.tgz","fileCount":428,"integrity":"sha512-LYDG5iTRIPVKkAesaYzql4wFJKsikVEp0fUOXLvtG14RkyJcMYqt1u+RZBGSD5WYTv5Er+PteQouMaD6767Hjw==","signatures":[{"sig":"MEUCIEaGC+nQ2UGFTr5bPSfHkZIFfk0UkmdHhTMh4us+ITiyAiEAlt5iMfLTzf9cIU9jydKKRwCp3VdgbS/jpB8wfByizk0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":698638},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"c562571e03094360bbd82610927d6893f8a3cccd","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.11.0","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.16.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.2.0_1697617076610_0.031907515876273385","host":"s3://npm-registry-packages"}},"7.3.0":{"name":"hermione","version":"7.3.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.3.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"7fb2d2062d3015ec937abb674d496535b52daea9","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.3.0.tgz","fileCount":428,"integrity":"sha512-jlCXONM/lInzNRZJzZXPhT+VWwPlqYatN4PDGjN/A/DMYRePeAk1N/PzprRetsbPjNjAgUGxU3QbfmboNCxx1Q==","signatures":[{"sig":"MEUCIAYIqMt3Fi0Nur4ZLcw0LR2SWZT9ZkF0K1JOltMSL7GnAiEAkv/Zf8k6e9UIB9VRI7/b6KK0BOFI0miJOKb0lmwDG7Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":705244},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"5fb024aa5327a42ad71e82a8902875dc67242108","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.3.0_1697720482969_0.999330777195863","host":"s3://npm-registry-packages"}},"8.0.0-beta.3":{"name":"hermione","version":"8.0.0-beta.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.0-beta.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"a19dc1d69b45bfdf82226d829dbb6027dc5c62ce","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.0-beta.3.tgz","fileCount":451,"integrity":"sha512-zY6HL3FDFjlHtiIdr8CzJHLOY6UKZvekrLhaozTnFS8iyBz/l7X9B8uIYblILf5AOXfa2ZO/VVIbf1ry9Km4Rw==","signatures":[{"sig":"MEUCIQDLLlgGys5UnOHObkkt+x0wqAXRf9qk7aiu4L28YMh+mQIgXgM4Gt1OjHV7en/3M7jIbk/CJSNz4jN/2BHhnNOm8KQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":747066},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"889cfe4d53561e1f1d91ef977783c1f9188e9bfa","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","uuid":"^9.0.1","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.0-beta.3_1699999637302_0.22985539875518146","host":"s3://npm-registry-packages"}},"7.3.1":{"name":"hermione","version":"7.3.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.3.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"6cfde3944b515b4fe8446dbc942480f65f4ec0aa","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.3.1.tgz","fileCount":428,"integrity":"sha512-QPbkjO7hlZNK9cMEaZJNVYV36wibt6fLDjTdAHbw3Z7o8Dq/tPSfnI59ASmhAT6MZj6TKpObiu7FFgD/orvK2A==","signatures":[{"sig":"MEUCIQDZHsyHrzHLf33ckdrb8qZHCJHMW6bjFmBlsOIMHPESBQIgQMuStvOXxCzke63LN7wT6sbU1Z+tkF8tr9Vp0R2mrak=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":705181},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"04c555fa538aacf61770bceacfde52ce56892f5a","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.20.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.3.1_1701255415973_0.25811913559159283","host":"s3://npm-registry-packages"}},"7.4.0":{"name":"hermione","version":"7.4.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.4.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"ed26ba8b724bbcb09532c694924feda9445ec0d2","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.4.0.tgz","fileCount":428,"integrity":"sha512-ixxDovZmd9DwiYAxO+OvJlQ8Gp8TzHmESd9TS3XP28GGSXBGV8T691b090nWmGfTFszORflJ/qpKAmcj+l0V4Q==","signatures":[{"sig":"MEYCIQCG38moCbg//zt+Vfu+0cBl0frnz+rrj0cOwBSYSRsvuwIhAN5fsq02P1jsesH+y/q0VggLmjRH7b7DEMNvEIk69rBV","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":705602},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"8e3e247ee23d5e59bddc3faf49bc6a2e2ca80439","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.4.0_1701436233532_0.2708845649843894","host":"s3://npm-registry-packages"}},"7.4.1":{"name":"hermione","version":"7.4.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.4.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"009d23f01904ab05a9e71f826e710082db029bc5","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.4.1.tgz","fileCount":428,"integrity":"sha512-EootiOsuK3fLJs3uBB41fbioLJEhA6Bx7utdkExrxcTepVvWPV6JBnO68MoaA2Btg58csk28ay0+2ZrEEPr19w==","signatures":[{"sig":"MEUCIHf0xL1TXNzeRZndWvPnnVJ/0U3vOb6OE5vo9HFGkkoYAiEA8kyrQ6ZvgK0YMDFdABrGHepZLrprIYyGQslFCOdINB8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":705844},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"ce34cbac3585dca1d82ecd905535ba37392f92df","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.4.1_1702987783709_0.5740848086225123","host":"s3://npm-registry-packages"}},"7.5.0":{"name":"hermione","version":"7.5.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c3258de739230224a68d0a2810a6420d1ee078c7","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.0.tgz","fileCount":428,"integrity":"sha512-BJecTSl3SYwrS5clEFx6M9wFaz9aatvDRPbx3QX4c2r+4kPI6EMzhUiwReBYkqAqq7AyQS4+FVamR5sMOgDRZQ==","signatures":[{"sig":"MEYCIQD7F/t4x0q/UT7jCN00M9HinZ+gOGcohiRIlJqN2rlthQIhAOoECakDYP6qEktCibGSD4Q/AvhgDifEtEhsK85UL1Ct","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":708757},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"5eab513ce9a64c509416838cae7727f7a8198289","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.0_1703755429018_0.059413118098605944","host":"s3://npm-registry-packages"}},"7.5.1":{"name":"hermione","version":"7.5.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"cee62320c4cb8ed872e08dc84c08f86fb1142b42","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.1.tgz","fileCount":428,"integrity":"sha512-SzxrFuLKwG1uUN4nb3N4g5CcEa7gkeA5zYpSPeBYZRPfbojHcYUMVTEIWjzCjcXCBHswD/gEkxgjuR1gYuaIeg==","signatures":[{"sig":"MEQCIBypAweMdcAFy1V04W5pLIrynx2nDxNpxAXRLU0951D9AiB5abYDICVLyLl0GGnotkHRocOnGAGE4AbO5YV4m5/ykQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":708875},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"19eac5b41bc82ce03ab325256b66e5d7e44532fb","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.1_1705414374274_0.528448165236354","host":"s3://npm-registry-packages"}},"8.0.0":{"name":"hermione","version":"8.0.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"52ac946d675a62ed2988b725135287c34bfe3d63","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.0.tgz","fileCount":457,"integrity":"sha512-fDuFc7Yo9uMgpoc6wOOK1Y1M8cGeLYoC04rdXPZrwITd64bSFNXIBr3kBQqRc+OC1QAwsQ9yw+O90m4llue54A==","signatures":[{"sig":"MEUCIE73Im0FEP2p8eATrupFVJ3AcrBnfaErpPUiOmK11jT9AiEAr3RVAM9NwemdTFwBZKyFvWX6bKooP9alJGKyr9PgnWw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":772494},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"21c181821b9c2d0f98597effa7f1a67f70a3952f","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^2.4.2","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","devtools":"8.21.0","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","strip-ansi":"^6.0.1","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.21.0","worker-farm":"^1.7.0","@types/chalk":"^2.2.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^5.3.2","@types/chai":"^4.3.4","@types/node":"^18.19.3","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^6.12.0","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.0_1705498940437_0.8101532586704927","host":"s3://npm-registry-packages"}},"8.0.1":{"name":"hermione","version":"8.0.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"77410c2a59f4ce8f83a7035891f64e3f84e2a423","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.1.tgz","fileCount":457,"integrity":"sha512-2FwkGe8a49OZmbW37wHJnmgEYKQR7n+1dQ+HeStqngTfJsQUBWTDOV/Zxd/aHPNUA5wJ15VrriOo6BcFYhLpjA==","signatures":[{"sig":"MEQCIBIvH/nmUtUr1VCHltjcxVdUUkglmcz/1drhHj7BaUhaAiAu9ctzqocIj848ZgwvO+KnrBEVqf7zenjYEm7XuRxu7g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":772617},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"ade44f8079d2c34a70a447acae22f4d98f428f2b","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^2.4.2","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","devtools":"8.21.0","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","strip-ansi":"^6.0.1","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.21.0","worker-farm":"^1.7.0","@types/chalk":"^2.2.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^5.3.2","@types/chai":"^4.3.4","@types/node":"^18.19.3","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^6.12.0","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.1_1706003005298_0.9836876458961803","host":"s3://npm-registry-packages"}},"7.5.2":{"name":"hermione","version":"7.5.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"de060ff3913434e153781470e45af22aae706644","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.2.tgz","fileCount":431,"integrity":"sha512-NEP92F1RGnAig6I9cCH0Mtr5mnfDRiw4pGA+PT/JSvOlVrgbAJuAZaVzp1leEa2tMeuqXey7Ox/xGCETOkpD4A==","signatures":[{"sig":"MEQCICZ2Sb5qbW0XhVnB0G31R0q9eF5zieST4qsN+QWu8J14AiAcw6mFBtp0VK1YtzIWqRRfe1DkvSIyXoxhHD8J5W9CeA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":710284},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"041a3dc2b361d78c91f96063c5ef748ee733670c","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.20.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.2_1706107746703_0.5156181673731297","host":"s3://npm-registry-packages"}},"8.0.2":{"name":"hermione","version":"8.0.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"93710b0983625472eb9302854bdf93ce1a617987","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.2.tgz","fileCount":460,"integrity":"sha512-/PU8DZWztfIRKp1c+eEjbUL/AK+f2gUH6YfmVMi0SrXvKLQVyKH3N092H8AwRP0kbMHwN2sfMvXVbFUTr/1zlg==","signatures":[{"sig":"MEUCIGV0oHrbl/8k8ycuud1MR2UU9Ao1D++dUIv5yr9+cGcLAiEA5KvTPYVsFH0LsqmJLNkW5tE54Ki7qPSmbR6yHtSRgLM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":774113},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"78bb5584604e7b6551fe1b23332b591d6e15ff4e","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.8.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.18.2","dependencies":{"temp":"^0.8.3","chalk":"^2.4.2","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","devtools":"8.21.0","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","strip-ansi":"^6.0.1","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.21.0","worker-farm":"^1.7.0","@types/chalk":"^2.2.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^5.3.2","@types/chai":"^4.3.4","@types/node":"^18.19.3","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^6.12.0","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.2_1706107911046_0.44144278860185415","host":"s3://npm-registry-packages"}},"8.0.3":{"name":"hermione","version":"8.0.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"eb663a40d68aa258d2dc2c8e64877c3ed878ef14","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.3.tgz","fileCount":460,"integrity":"sha512-qP5rRs+rl4wbN317ovAE+d04Q5BsyTFSC/oPK6gyfAenCudOL14MYo5ElMfkxk6b6m51o+myAQsi+R47ZhefAA==","signatures":[{"sig":"MEQCIF0dMUd6m4s4FPvaqI9KyTUGx/r5QMJj7zwsDJ7/hZsmAiBCajLC5c88FZpy34HahR6nw/faN6ZQSv7oI084TqVcVg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":774910},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"701807e63f097de2398fc7f68fdbafa3c3f48e93","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' 'typings/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^2.4.2","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","devtools":"8.21.0","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","strip-ansi":"^6.0.1","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.21.0","worker-farm":"^1.7.0","@types/chalk":"^2.2.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^5.3.2","@types/chai":"^4.3.4","@types/node":"^18.19.3","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^6.12.0","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.3_1706110087047_0.40787952201776934","host":"s3://npm-registry-packages"}},"8.0.4":{"name":"hermione","version":"8.0.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"62035f4a323a14d981fe837e8279f3ea16620c54","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.4.tgz","fileCount":460,"integrity":"sha512-4XoWbPJEEEPgnVb7C+ezoqleeNaCcmnF29yrmB2ab2caNtosiM6jEOEciiWE7Rx/vKXoAcSnOnnn1vI5X9PknA==","signatures":[{"sig":"MEYCIQD/8HASEoklBYyZW2GEbrU3kOuOkxH2nOA+xUWYI2wmlgIhAKCCFSy6CwDvL+m0TVrFKh/oVTRkzxrfZJb5FS5nt7IF","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":774920},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"76f8c69f140d9e4d62328639bc8178bd7b6bea6b","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^2.4.2","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","devtools":"8.21.0","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^9.0.0","micromatch":"^4.0.5","strip-ansi":"^6.0.1","@wdio/types":"^8.10.4","@wdio/utils":"^7.26.0","webdriverio":"8.21.0","worker-farm":"^1.7.0","@types/chalk":"^2.2.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.10.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.2.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","type-fest":"^3.10.0","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^5.3.2","@types/chai":"^4.3.4","@types/node":"^18.19.3","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","@types/bluebird":"^3.5.38","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","@sinonjs/fake-timers":"^10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^6.12.0","@types/sinonjs__fake-timers":"^8.1.2","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.4_1706209628238_0.5877778773497004","host":"s3://npm-registry-packages"}},"8.0.5":{"name":"hermione","version":"8.0.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"8c5ee23fe046a805115c90fcb03b693a7c8031eb","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.5.tgz","fileCount":460,"integrity":"sha512-AJsztjghMRL22rjR52ydhXs6Nhd8+hRBflurqJS29wBuC+pN9cnyOgjJaEMm6YPHDTS+Hx0MJFJXt9tGwRp3xQ==","signatures":[{"sig":"MEYCIQCmWlUJSO+px7L1ogoioTVU0Reoh5ASzvIEKwYekzUD8gIhALhSUxVMBU4mmh32qf1FpGhTXAv2JS4sSQyUC57/BhjD","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":774885},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"1f68f4017510dce695bd0d09db87955bec9d8f1d","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.8.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.18.2","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.30.7","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","date-fns":"2.29.3","devtools":"8.21.0","fs-extra":"5.0.0","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/chalk":"2.2.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"15.1.0","chai":"4.2.0","husky":"0.11.4","jsdom":"16.6.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"17.1.2","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"17.1.0","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.5_1706709269529_0.23947288908405517","host":"s3://npm-registry-packages"}},"8.0.6":{"name":"hermione","version":"8.0.6","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.0.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"6a249bb3e2be7428af2ed575f18a7ad8e267e746","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.0.6.tgz","fileCount":460,"integrity":"sha512-qdIBqnc3ryllwhtSs9fE3ArewCoybXlKcBWkVKKAwZ4HdwovKOhgnEMfSZEEz+gcs8EnS6W6X0wgesNwX+OXhg==","signatures":[{"sig":"MEQCIBoQ6qWEMfmKFNijLz4NMyghpZoWincsCNRQaYYyKh0SAiByO57YwN/fCZV7eNM0VmHTMZ6YwekGabazCezsQ0Je6g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":774849},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"33a9b156e46613fb32844ecc60d13ed7545debaf","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.30.7","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","date-fns":"2.29.3","devtools":"8.21.0","fs-extra":"5.0.0","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/chalk":"2.2.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"15.1.0","chai":"4.2.0","husky":"0.11.4","jsdom":"16.6.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"17.1.2","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"17.1.0","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.0.6_1707746173919_0.850879530278325","host":"s3://npm-registry-packages"}},"7.5.4":{"name":"hermione","version":"7.5.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e6e1ea84077d091d1a6ff83a7d5e02dbed049704","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.4.tgz","fileCount":431,"integrity":"sha512-oQ5Igwo5dzIfUG023QT+/M/6T0LyqbxWrGal9ErsFuF3TYuyK3yIkj3wrRqWwZNPGyDGvIStwwZSsbJ7Awri+w==","signatures":[{"sig":"MEUCIDnXFQVPZxT49mFjdp/rJ2RdqIGVcSVDb8SZoz503kAuAiEA7hFeRXpb8vN2zpfaEvtZ+F46iU78n5z4NyRm0j4wG7s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":710248},"main":"build/hermione.js","types":"./typings/index.d.ts","engines":{"node":">= 16.0.0"},"gitHead":"a33fd1e58581bd03c0b29ae2971f8f83df242162","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.4_1707747879416_0.995262672242623","host":"s3://npm-registry-packages"}},"8.1.0":{"name":"hermione","version":"8.1.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.1.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"e33195ee95204db9878d4461a3accff5bd1a4b2d","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.1.0.tgz","fileCount":463,"integrity":"sha512-Lbfh9nSNHzVQl/HRl7fLjvMiPH65KBmrXYUcAX6BPhAhMOTtUzQYyPYnFcPS+sVzwo4koB6RrevRKTiv7vYT7Q==","signatures":[{"sig":"MEQCIAIN4QNhwxetDV5r7+OJOu0o5KjNSHMbE9aq9G9MxszYAiBfVDr02bBzUcxWZ1nschisnhUvlk1wnBwTeC0GoCSIug==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":781778},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"467f58916439113ae009595694c8f918182cbb30","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.30.7","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","date-fns":"2.29.3","devtools":"8.21.0","fs-extra":"5.0.0","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/chalk":"2.2.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"15.1.0","chai":"4.2.0","husky":"0.11.4","jsdom":"16.6.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"17.1.2","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"17.1.0","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.1.0_1708425551367_0.5184347817460664","host":"s3://npm-registry-packages"}},"8.2.0":{"name":"hermione","version":"8.2.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.2.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"9c4f6efa6a0c926c0d1996e7a4c23de2bdb0e544","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.2.0.tgz","fileCount":463,"integrity":"sha512-5sRkWGGKAWIXDYjwje+NW7n2A579gm5lfuK1mQb5RMCrLHyJ5JI6fBvZcrJCELSoAWF0Wfgb1uVw4hZlJo9DMg==","signatures":[{"sig":"MEUCIQCmigHvF7LPiXLIPaE9z66C0lQDT+hjADYkgviJn+QOOAIgHLfELDKqeQtsUxHTzxQ2Z1rhYX1HGYLDpLpp82Re9xY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":785655},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"refs/heads/master","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.30.7","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","date-fns":"2.29.3","devtools":"8.21.0","fs-extra":"5.0.0","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"15.1.0","chai":"4.2.0","husky":"0.11.4","jsdom":"16.6.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"17.1.2","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"17.1.0","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.2.0_1709236684431_0.11445144789248296","host":"s3://npm-registry-packages"}},"8.2.1":{"name":"hermione","version":"8.2.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.2.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"8fb0dae170da57d611e27075c5e1c8adf2da624e","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.2.1.tgz","fileCount":463,"integrity":"sha512-gE884oPBAdlTmpN1ZsD22c6+s0HfWidf15iggw/WdupE4R3NNA+s8Z/2UA24aPWVlap0yXSjYB6vq0Ri6P5CQw==","signatures":[{"sig":"MEUCICkiHIg5gnmP2XoEE1+bCBXBe3Qx/PjYWgSxHyHzHbwdAiEAma5t27kabsv4j03BqH6fIfadJacCWlSVNv4TxjiGbCQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":785707},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"refs/heads/master","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"10.2.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.19.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.30.7","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","date-fns":"2.29.3","devtools":"8.21.0","fs-extra":"5.0.0","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"15.1.0","chai":"4.2.0","husky":"0.11.4","jsdom":"16.6.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"17.1.2","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"17.1.0","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.2.1_1709564987852_0.27467424312343947","host":"s3://npm-registry-packages"}},"9.0.0-rc.0":{"name":"hermione","version":"9.0.0-rc.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@9.0.0-rc.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"478353271ea6babc3b239065dfc2510b98dfd13c","tarball":"https://registry.npmjs.org/hermione/-/hermione-9.0.0-rc.0.tgz","fileCount":463,"integrity":"sha512-eiPj3OZCPMzYP8AqcsACMwK51UOXr03rqCSHKCqmzcMMuYMmwj8J3xKwNAKFLmORy89GAIO18tMA3DmN9t3Gmg==","signatures":[{"sig":"MEQCIG4EdwQ31M96aJLxfzF8BHD2hmnPukYV5oTWLiu5Zjp0AiBQC4/yYgYoaav2abUcak58rycrz4DPuNtgFF/f5ipduA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":785557},"main":"build/src/index.js","types":"./build/src/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Commands API](#commands-api)\n  - [Browser commands](#browser-commands)\n    - [clearSession](#clearsession)\n  - [Element commands](#element-commands)\n    - [moveCursorTo](#movecursorto)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n  - [OpenAndWait](#openandwait)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [openAndWaitOpts](#openandwaitopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Debug mode](#debug-mode)\n  - [REPL mode](#repl-mode)\n    - [switchToRepl](#switchtorepl)\n    - [Test development in runtime](#test-development-in-runtime)\n      - [How to set up using VSCode](#how-to-set-up-using-vscode)\n      - [How to set up using Webstorm](#how-to-set-up-using-webstorm)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n- [Programmatic API](#programmatic-api)\n  - [config](#config)\n  - [events](#events)\n  - [errors](#errors)\n    - [CoreError](#coreerror)\n    - [CancelledError](#cancellederror)\n    - [ClientBridgeError](#clientbridgeerror)\n    - [HeightViewportError](#heightviewporterror)\n    - [OffsetViewportError](#offsetviewporterror)\n    - [AssertViewError](#assertviewerror)\n    - [ImageDiffError](#imagedifferror)\n    - [NoRefImageError](#norefimageerror)\n  - [intercept](#intercept)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Commands API\n\nSince Hermione is based on [WebdriverIO v8](https://webdriver.io/docs/api/), all the commands provided by WebdriverIO are available in it. But Hermione also has her own commands.\n\n### Browser commands\n\n#### clearSession\n\nBrowser command that clears session state (deletes cookies, clears local and session storages). For example:\n\n```js\nit('test', async ({ browser }) => {\n    await browser.url('https://github.com/gemini-testing/hermione');\n\n    (await browser.getCookies()).length; // 5\n    await browser.execute(() => localStorage.length); // 2\n    await browser.execute(() => sessionStorage.length); // 1\n\n    await browser.clearSession();\n\n    (await browser.getCookies()).length; // 0\n    await browser.execute(() => localStorage.length); // 0\n    await browser.execute(() => sessionStorage.length); // 0\n});\n```\n\n### Element commands\n\n#### moveCursorTo\n\n> This command is temporary and will be removed in the next major (hermione@9). Differs from the standard [moveTo](https://webdriver.io/docs/api/element/moveTo/) in that it moves the cursor relative to the top-left corner of the element (like it was in hermione@7).\n\nMove the mouse by an offset of the specified element. If offset is not specified then mouse will be moved to the top-left corder of the element.\n\nUsage:\n\n```typescript\nawait browser.$(selector).moveCursorTo({ xOffset, yOffset });\n```\n\nAvailable parameters:\n\n* **xOffset** (optional) `Number` – X offset to move to, relative to the top-left corner of the element;\n* **yOffset** (optional) `Number` – Y offset to move to, relative to the top-left corner of the element.\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - ignoreDiffPixelCount (optional) `Number | string` - the maximum amount of different pixels to still consider screenshots \"the same\". For example, when set to 5, it means that if there are 5 or fewer different pixels between two screenshots, they will still be considered the same. Alternatively, you can also define the maximum difference as a percentage (for example, 3%) of the image size. This option is useful when you encounter a few pixels difference that cannot be eliminated using the tolerance and antialiasingTolerance settings. The default value is 0.\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n### OpenAndWait\n\nCommand that allows to open page and wait until it loads (by combination of the specified factors). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.openAndWait('some/url', {\n        selector: ['.some', '.selector'],\n        predicate: () => document.isReady,\n        ignoreNetworkErrorsPatterns: ['https://mc.yandex.ru'],\n        waitNetworkIdle: true,\n        waitNetworkIdleTimeout: 500,\n        failOnNetworkError: true,\n        timeout: 20000,\n    });\n});\n```\n\nIn this example, page will be considered as loaded, if elements with selectors `.some` and `.selector` exists, `document.isReady` is `true`, it has been 500 ms since the last network request succeeded, and there were no errors, while trying to load images, fonts and stylesheets.\n\nParameters:\n\n - url (required) `String` – page url\n - waitOpts (optional) `Object`:\n   - selector (optional) `String|String[]` – Selector(s) to element(s), which should exist on the page.\n   - predicate (optional) `() => Promise<bool> | bool` – Predicate, which should return `true` if page is loaded. Predicate is being executed in the browser context: [waitUntil](https://webdriver.io/docs/api/element/waitUntil).\n   - waitNetworkIdle (optional) `Boolean` – Waits until all network requests are done. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - waitNetworkIdleTimeout (optional) `Number` - Time (ms) after all network requests are resolved to consider network idle. 500 by default.\n   - failOnNetworkError (optional) `Boolean` – If `true`, throws an error when network requests are failed. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - shouldThrowError (optional) `(match) => Boolean` - Predicate, which should return `true` on [Match](https://webdriver.io/docs/api/mock#match), if network error is considered critical for page load. By default, throws an error on image, stylesheet and font load error.\n   - ignoreNetworkErrorsPatterns (optional) `Array<String | RegExp>` - Array of url patterns to ignore network requests errors. Has a priority over `shouldThrowError`\n   - timeout (optional) `Number` - Page load timeout. [pageLoadTimeout](#pageloadtimeout) by default. Throws an error, if selectors are still not exist after timeout, or predicate is still resolving false.\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`openAndWaitOpts`         | Options for `openAndWaitOpts` command, used by default\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`, but `true` for chrome@93 and higher.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: true,\n    ignoreDiffPixelCount: 0,\n```\n\n#### openAndWaitOpts\nDefault options used when calling [openAndWait](https://github.com/gemini-testing/hermione/#openandwait), can be overriden by `openAndWait` options. Default values are:\n```javascript\n    waitNetworkIdle: true,\n    waitNetworkIdleTimeout: 500,\n    failOnNetworkError: true,\n    ignoreNetworkErrorsPatterns: []\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.headers[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `null`, but `true` for chrome@93 and higher.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    --repl [type]                run one test, call `browser.switchToRepl` in test code to open repl interface (default: false)\n    --repl-before-test [type]    open repl interface before test run (default: false)\n    --repl-on-fail [type]        open repl interface on test fail only (default: false)\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: `--inspect` and `--inspect-brk`. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n### REPL mode\n\nHermione provides a [REPL](https://en.wikipedia.org/wiki/Read–eval–print_loop) implementation that helps you not only to learn the framework API, but also to debug and inspect your tests. In this mode, there is no timeout for the duration of the test (it means that there will be enough time to debug the test). It can be used by specifying the CLI options:\n\n- `--repl` - in this mode, only one test in one browser should be run, otherwise an error is thrown. REPL interface does not start automatically, so you need to call [switchToRepl](#switchtorepl) command in the test code. Disabled by default;\n- `--repl-before-test` - the same as `--repl` option except that REPL interface opens automatically before run test. Disabled by default;\n- `--repl-on-fail` - the same as `--repl` option except that REPL interface opens automatically on test fail. Disabled by default.\n\n#### switchToRepl\n\nBrowser command that stops the test execution and opens REPL interface in order to communicate with browser. For example:\n\n```js\nit('foo', async ({browser}) => {\n    console.log('before open repl');\n\n    await browser.switchToRepl();\n\n    console.log('after open repl');\n});\n```\n\nAnd run it using the command:\n\n```bash\nnpx hermione --repl --grep \"foo\" -b \"chrome\"\n```\n\nIn this case, we are running only one test in one browser (or you can use `hermione.only.in('chrome')` before `it` + `it.only`).\nWhen executing the test, the text `before open repl` will be displayed in the console first, then test execution stops, REPL interface is opened and waits your commands. So we can write some command in the terminal:\n\n```js\nawait browser.getUrl();\n// about:blank\n```\n\nIn the case when you need to execute a block of code, for example:\n\n```js\nfor (const item of [...Array(3).keys]) {\n    await browser.$(`.selector_${item}`).isDisplayed();\n}\n```\n\nYou need to switch to editor mode by running the `.editor` command in REPL and insert the desired a block of code. Then execute it by pressing `Ctrl+D`.\nIt is worth considering that some of code can be executed without editor mode:\n- one-line code like `await browser.getUrl().then(console.log)`;\n- few lines of code without using block scope or chaining, for example:\n    ```js\n    await browser.url('http://localhost:3000');\n    await browser.getUrl();\n    // http://localhost:3000\n    ```\n\nAfter user closes the server, the test will continue to run (text `after open repl` will be displayed in the console and browser will close).\n\nAnother command features:\n- all `const` and `let` declarations called in REPL mode are modified to `var` in runtime. This is done in order to be able to redefine created variables;\n- before switching to the REPL mode `process.cwd` is replaced with the path to the folder of the executed test. After exiting from the REPL mode `process.cwd` is restored. This feature allows you to import modules relative to the test correctly;\n- ability to pass the context to the REPL interface. For example:\n\n    ```js\n    it('foo', async ({browser}) => {\n        const foo = 1;\n\n        await browser.switchToRepl({foo});\n    });\n    ```\n\n    And now `foo` variable is available in REPL:\n\n    ```bash\n    console.log(\"foo:\", foo);\n    // foo: 1\n    ```\n\n#### Test development in runtime\n\nFor quick test development without restarting the test or the browser, you can run the test in the terminal of IDE with enabled REPL mode:\n\n```bash\nnpx hermione --repl-before-test --grep \"foo\" -b \"chrome\"\n```\n\nAfter that, you need to configure the hotkey in IDE to run the selected one or more lines of code in the terminal. As a result, each new written line can be sent to the terminal using a hotkey and due to this, you can write a test much faster.\n\nAlso, during the test development process, it may be necessary to execute commands in a clean environment (without side effects from already executed commands). You can achieve this with the following commands:\n- [clearSession](#clearsession) - clears session state (deletes cookies, clears local and session storages). In some cases, the environment may contain side effects from already executed commands;\n- [reloadSession](https://webdriver.io/docs/api/browser/reloadSession/) - creates a new session with a completely clean environment.\n\n##### How to set up using VSCode\n\n1. Open `Code` -> `Settings...` -> `Keyboard Shortcuts` and print `run selected text` to search input. After that, you can specify the desired key combination\n2. Run hermione in repl mode (examples were above)\n3. Select one or mode lines of code and press created hotkey\n\n##### How to set up using Webstorm\n\nAbility to run selected text in terminal will be available after this [issue](https://youtrack.jetbrains.com/issue/WEB-49916/Debug-JS-file-selection) will be resolved.\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools. To do this, you must require `hermione` module and create instance:\n\n```js\nconst Hermione = require('hermione');\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\nNext, you will have access to the following parameters and methods:\n\nName           | Description\n-------------- | -------------\n`config`       | Returns parsed hermione config.\n`events`       | Returns hermione events on which you can subscribe to.\n`errors`       | Errors which hermione may return.\n`intercept`    | Method to intercept Hermione's events.\n`run`          | Starts running tests. By default run all tests from the config. Can also run only the specified tests.\n`addTestToRun` | Adds test to the current run.\n`readTests`    | Starts reading tests. By default read all tests from the config. Can also read only the specified tests.\n`isFailed`     | Returns `true` or `false` depending on whether there has been an error or a test fail while running tests.\n`isWorker`     | Returns `true` or `false` depending on whether you call the method in one of the workers or in the master process.\n`halt`         | Abnormal termination of the test run in case of a terminal error.\n\n### config\n\nReturns parsed hermione config. Useful when you need to read some field from the config.\n\n```js\n// create hermione instance\nconsole.log('plugins:', hermione.config.plugins);\n```\n\n### events\n\nReturns hermione events on which you can subscribe to. Useful when you need to subscribe to a specific event.\n\n```js\n// create hermione instance\nhermione.on(hermione.events.INIT, async () => {\n    console.info('INIT event is being processed...');\n});\n```\n\n### errors\n\nHermione may return errors of the following type:\n\n- [CoreError](#coreerror)\n- [CancelledError](#cancellederror)\n- [ClientBridgeError](#clientbridgeerror)\n- [HeightViewportError](#heightviewporterror)\n- [OffsetViewportError](#offsetviewporterror)\n- [AssertViewError](#assertviewerror)\n- [ImageDiffError](#imagedifferror)\n- [NoRefImageError](#norefimageerror)\n\n#### CoreError\n\nA `CoreError` is returned if the browser fails to calibrate a blank page (about:blank). The error contains the following message:\n\n```\nCould not calibrate. This could be due to calibration page has failed to open properly\n```\n\n#### CancelledError\n\nThe `CanceledEror` error is returned if the [halt](#halt) command terminates abnormally. The error contains the following message:\n\n```\nBrowser request was cancelled\n```\n\n#### ClientBridgeError\n\nA `ClientBridgeError` is returned when JavaScript injection on the client (browser) side fails. Hermione injects the code using the [execute](https://webdriver.io/docs/api/browser/execute/) WebDriverIO command. The error contains the following message:\n\n```\nUnable to inject client script\n```\n\n#### HeightViewportError\n\nThe `HeightViewportError` is returned when trying to take a screenshot of an area whose bottom border does not fit into the viewport area. The error contains the following message:\n\n```\nCan not capture the specified region of the viewport.\nThe region bottom bound is outside of the viewport height.\nAlternatively, you can test such cases by setting \"true\" value to option \"compositeImage\" in the config file\nor setting \"false\" to \"compositeImage\" and \"true\" to option \"allowViewportOverflow\" in \"assertView\" command.\nElement position: <cropArea.left>, <cropArea.top>; size: <cropArea.width>, <cropArea.height>.\nViewport size: <viewport.width>, <viewport.height>.\n```\n\nIn this case, the message prompts the Hermione user what settings need to be set in the Hermione config in order to be able to take a screenshot for the specified area.\n\n#### OffsetViewportError\n\nAn `OffsetViewportError` is returned when attempting to take a screenshot of an area whose borders on the left, right, or top extend beyond the viewport. The error contains the following message:\n\n```\nCan not capture the specified region of the viewport.\nPosition of the region is outside of the viewport left, top or right bounds.\nCheck that elements:\n- does not overflow the document\n- does not overflow browser viewport\nAlternatively, you can increase browser window size using\n\"setWindowSize\" or \"windowSize\" option in the config file.\nBut if viewport overflow is expected behavior then you can use\noption \"allowViewportOverflow\" in \"assertView\" command.\n```\n\nIn this case, the message prompts the Hermione user what settings need to be set in the Hermione config in order to be able to take a screenshot for the specified area.\n\n#### AssertViewError\n\nAn `AssertViewError` is returned when an attempt to take a screenshot fails. The error may contain one of the following messages, depending on the cause of the crash:\n\n```\nduplicate name for \"<state>\" state\n```\n\n```\nelement (\"<selector>\") still not existing after <this.options.waitforTimeout> ms\n```\n\n```\nelement (\"<this.selector>\") still not existing after <this.options.waitforTimeout> ms\n```\n\n#### ImageDiffError\n\nAn `ImageDiffError` is returned from the [assertView](#assertview) command if a diff (difference in images) is detected when taking and comparing a screenshot with a reference screenshot. The error contains the following message:\n\n```\nimages are different for \"<stateName>\" state\n```\n\nIn addition, the `ImageDiffError` error contains the following data:\n\n* **stateName** `String` - Name of the state for which the screenshot was taken.\n* **currImg** `Object` - Link to actual image.\n* **refImg** `Object` - Link to reference image.\n* **diffOpts** `Object` - Diff detection settings.\n* **diffBounds** `Object` - Boundaries of areas with diffs in the image.\n* **diffClusters** `Object` - Clusters with diffs in the image.\n\nRead more about [diffBounds](https://github.com/gemini-testing/looks-same/blob/master/README.md#getting-diff-bounds) and [diffClusters](https://github.com/gemini-testing/looks-same/blob/master/README.md#getting-diff-clusters) in the documentation of the [looks-same](https://github.com/gemini-testing/looks-same) package.\n\n#### NoRefImageError\n\nThe `NoRefImageError` error is returned from the [assertView](#assertview) command if, when taking and comparing a screenshot, Hermione does not find a reference screenshot on the file system. The error contains the following message:\n\n```\ncan not find reference image at <refImg.path> for \"<stateName>\" state\n```\n\nIn addition, the `NoRefImageError` error contains the following data:\n\n* **stateName** `String` - Name of the state for which the screenshot was taken.\n* **currImg** `Object` - Link to actual image.\n* **refImg** `Object` - Link to reference image.\n\n### intercept\n\nMethod to intercept Hermione's events. The first argument of the method is the event that needs to be intercepted, and the second is the event handler. Example:\n\n```js\n// create hermione instance\nhermione.intercept(hermione.events.TEST_FAIL, ({ event, data }) => {\n    return {event: hermione.events.TEST_PASS, test}; // make the test successful\n});\n```\n\nRead more about event interception in the section [about plugins](#plugins).\n\n### run\n\nStarts running tests. By default run all tests from the config. Can also run only the specified tests. Returns `true` if the test run succeeded, and `false` if it failed. Example:\n\n```js\n// create hermione instance\nconst success = await hermione.run(testPaths, options);\n```\n\nAvailable parameters:\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\nAdds test to the current run. Returns `false` if the current run has already ended or has been cancelled. Otherwise returns `true`. Example:\n\n```js\n// create hermione instance\nconst success = hermione.addTestToRun(test, browserId);\n```\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\n### readTests\n\nStarts reading tests. By default read all tests from the config. Can also read only the specified tests. Returns promise which resolves to the instance of [TestCollection](#test-collection) initialized by parsed tests. Example:\n\n```js\n// create hermione instance\nawait hermione.readTests(testPaths, options);\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### isFailed\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests. Can be useful in plugins to determine Hermione's current status. Example:\n\n```js\n// create hermione instance\nconst failed = hermione.isFailed();\n```\n\n### isWorker\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process. Can be useful in plugins in order to distinguish the code execution context. Example:\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n\nAbnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n```js\n// create hermione instance\nhermione.halt(error, [timeout=60000ms]);\n```\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":"^18.17.0 || ^20.3.0 || >=21.0.0"},"gitHead":"c5d85b74705e7d94a15ca646a7b3251dc5ac74ee","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.33.2","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_9.0.0-rc.0_1709806656816_0.9586335235279821","host":"s3://npm-registry-packages"}},"9.0.0-rc.1":{"name":"hermione","version":"9.0.0-rc.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@9.0.0-rc.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"4d106569ba98ec33e584a9e497ab81b27e6464b2","tarball":"https://registry.npmjs.org/hermione/-/hermione-9.0.0-rc.1.tgz","fileCount":463,"integrity":"sha512-5UiMt7aNPgh3S/2RGfxRxKndeOonxewGprnWzh1ax9fnuQNeas9OJjqWvgPCZimGSFDnhFQlQurCPADAKOXP6g==","signatures":[{"sig":"MEQCIFgWsvFihrbdrLIrjStXfzOkhzeD8ZRX9LsABSxLdI2GAiAtoXBFfsk+mUlLJr/RNen5/UVfTv29EGY9NG1pjtJvVw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":785569},"main":"build/src/index.js","types":"./build/src/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Commands API](#commands-api)\n  - [Browser commands](#browser-commands)\n    - [clearSession](#clearsession)\n  - [Element commands](#element-commands)\n    - [moveCursorTo](#movecursorto)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n  - [OpenAndWait](#openandwait)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [openAndWaitOpts](#openandwaitopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Debug mode](#debug-mode)\n  - [REPL mode](#repl-mode)\n    - [switchToRepl](#switchtorepl)\n    - [Test development in runtime](#test-development-in-runtime)\n      - [How to set up using VSCode](#how-to-set-up-using-vscode)\n      - [How to set up using Webstorm](#how-to-set-up-using-webstorm)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n- [Programmatic API](#programmatic-api)\n  - [config](#config)\n  - [events](#events)\n  - [errors](#errors)\n    - [CoreError](#coreerror)\n    - [CancelledError](#cancellederror)\n    - [ClientBridgeError](#clientbridgeerror)\n    - [HeightViewportError](#heightviewporterror)\n    - [OffsetViewportError](#offsetviewporterror)\n    - [AssertViewError](#assertviewerror)\n    - [ImageDiffError](#imagedifferror)\n    - [NoRefImageError](#norefimageerror)\n  - [intercept](#intercept)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Commands API\n\nSince Hermione is based on [WebdriverIO v8](https://webdriver.io/docs/api/), all the commands provided by WebdriverIO are available in it. But Hermione also has her own commands.\n\n### Browser commands\n\n#### clearSession\n\nBrowser command that clears session state (deletes cookies, clears local and session storages). For example:\n\n```js\nit('test', async ({ browser }) => {\n    await browser.url('https://github.com/gemini-testing/hermione');\n\n    (await browser.getCookies()).length; // 5\n    await browser.execute(() => localStorage.length); // 2\n    await browser.execute(() => sessionStorage.length); // 1\n\n    await browser.clearSession();\n\n    (await browser.getCookies()).length; // 0\n    await browser.execute(() => localStorage.length); // 0\n    await browser.execute(() => sessionStorage.length); // 0\n});\n```\n\n### Element commands\n\n#### moveCursorTo\n\n> This command is temporary and will be removed in the next major (hermione@9). Differs from the standard [moveTo](https://webdriver.io/docs/api/element/moveTo/) in that it moves the cursor relative to the top-left corner of the element (like it was in hermione@7).\n\nMove the mouse by an offset of the specified element. If offset is not specified then mouse will be moved to the top-left corder of the element.\n\nUsage:\n\n```typescript\nawait browser.$(selector).moveCursorTo({ xOffset, yOffset });\n```\n\nAvailable parameters:\n\n* **xOffset** (optional) `Number` – X offset to move to, relative to the top-left corner of the element;\n* **yOffset** (optional) `Number` – Y offset to move to, relative to the top-left corner of the element.\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - ignoreDiffPixelCount (optional) `Number | string` - the maximum amount of different pixels to still consider screenshots \"the same\". For example, when set to 5, it means that if there are 5 or fewer different pixels between two screenshots, they will still be considered the same. Alternatively, you can also define the maximum difference as a percentage (for example, 3%) of the image size. This option is useful when you encounter a few pixels difference that cannot be eliminated using the tolerance and antialiasingTolerance settings. The default value is 0.\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n### OpenAndWait\n\nCommand that allows to open page and wait until it loads (by combination of the specified factors). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.openAndWait('some/url', {\n        selector: ['.some', '.selector'],\n        predicate: () => document.isReady,\n        ignoreNetworkErrorsPatterns: ['https://mc.yandex.ru'],\n        waitNetworkIdle: true,\n        waitNetworkIdleTimeout: 500,\n        failOnNetworkError: true,\n        timeout: 20000,\n    });\n});\n```\n\nIn this example, page will be considered as loaded, if elements with selectors `.some` and `.selector` exists, `document.isReady` is `true`, it has been 500 ms since the last network request succeeded, and there were no errors, while trying to load images, fonts and stylesheets.\n\nParameters:\n\n - url (required) `String` – page url\n - waitOpts (optional) `Object`:\n   - selector (optional) `String|String[]` – Selector(s) to element(s), which should exist on the page.\n   - predicate (optional) `() => Promise<bool> | bool` – Predicate, which should return `true` if page is loaded. Predicate is being executed in the browser context: [waitUntil](https://webdriver.io/docs/api/element/waitUntil).\n   - waitNetworkIdle (optional) `Boolean` – Waits until all network requests are done. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - waitNetworkIdleTimeout (optional) `Number` - Time (ms) after all network requests are resolved to consider network idle. 500 by default.\n   - failOnNetworkError (optional) `Boolean` – If `true`, throws an error when network requests are failed. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - shouldThrowError (optional) `(match) => Boolean` - Predicate, which should return `true` on [Match](https://webdriver.io/docs/api/mock#match), if network error is considered critical for page load. By default, throws an error on image, stylesheet and font load error.\n   - ignoreNetworkErrorsPatterns (optional) `Array<String | RegExp>` - Array of url patterns to ignore network requests errors. Has a priority over `shouldThrowError`\n   - timeout (optional) `Number` - Page load timeout. [pageLoadTimeout](#pageloadtimeout) by default. Throws an error, if selectors are still not exist after timeout, or predicate is still resolving false.\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`openAndWaitOpts`         | Options for `openAndWaitOpts` command, used by default\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`, but `true` for chrome@93 and higher.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: true,\n    ignoreDiffPixelCount: 0,\n```\n\n#### openAndWaitOpts\nDefault options used when calling [openAndWait](https://github.com/gemini-testing/hermione/#openandwait), can be overriden by `openAndWait` options. Default values are:\n```javascript\n    waitNetworkIdle: true,\n    waitNetworkIdleTimeout: 500,\n    failOnNetworkError: true,\n    ignoreNetworkErrorsPatterns: []\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.headers[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `null`, but `true` for chrome@93 and higher.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    --repl [type]                run one test, call `browser.switchToRepl` in test code to open repl interface (default: false)\n    --repl-before-test [type]    open repl interface before test run (default: false)\n    --repl-on-fail [type]        open repl interface on test fail only (default: false)\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: `--inspect` and `--inspect-brk`. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n### REPL mode\n\nHermione provides a [REPL](https://en.wikipedia.org/wiki/Read–eval–print_loop) implementation that helps you not only to learn the framework API, but also to debug and inspect your tests. In this mode, there is no timeout for the duration of the test (it means that there will be enough time to debug the test). It can be used by specifying the CLI options:\n\n- `--repl` - in this mode, only one test in one browser should be run, otherwise an error is thrown. REPL interface does not start automatically, so you need to call [switchToRepl](#switchtorepl) command in the test code. Disabled by default;\n- `--repl-before-test` - the same as `--repl` option except that REPL interface opens automatically before run test. Disabled by default;\n- `--repl-on-fail` - the same as `--repl` option except that REPL interface opens automatically on test fail. Disabled by default.\n\n#### switchToRepl\n\nBrowser command that stops the test execution and opens REPL interface in order to communicate with browser. For example:\n\n```js\nit('foo', async ({browser}) => {\n    console.log('before open repl');\n\n    await browser.switchToRepl();\n\n    console.log('after open repl');\n});\n```\n\nAnd run it using the command:\n\n```bash\nnpx hermione --repl --grep \"foo\" -b \"chrome\"\n```\n\nIn this case, we are running only one test in one browser (or you can use `hermione.only.in('chrome')` before `it` + `it.only`).\nWhen executing the test, the text `before open repl` will be displayed in the console first, then test execution stops, REPL interface is opened and waits your commands. So we can write some command in the terminal:\n\n```js\nawait browser.getUrl();\n// about:blank\n```\n\nIn the case when you need to execute a block of code, for example:\n\n```js\nfor (const item of [...Array(3).keys]) {\n    await browser.$(`.selector_${item}`).isDisplayed();\n}\n```\n\nYou need to switch to editor mode by running the `.editor` command in REPL and insert the desired a block of code. Then execute it by pressing `Ctrl+D`.\nIt is worth considering that some of code can be executed without editor mode:\n- one-line code like `await browser.getUrl().then(console.log)`;\n- few lines of code without using block scope or chaining, for example:\n    ```js\n    await browser.url('http://localhost:3000');\n    await browser.getUrl();\n    // http://localhost:3000\n    ```\n\nAfter user closes the server, the test will continue to run (text `after open repl` will be displayed in the console and browser will close).\n\nAnother command features:\n- all `const` and `let` declarations called in REPL mode are modified to `var` in runtime. This is done in order to be able to redefine created variables;\n- before switching to the REPL mode `process.cwd` is replaced with the path to the folder of the executed test. After exiting from the REPL mode `process.cwd` is restored. This feature allows you to import modules relative to the test correctly;\n- ability to pass the context to the REPL interface. For example:\n\n    ```js\n    it('foo', async ({browser}) => {\n        const foo = 1;\n\n        await browser.switchToRepl({foo});\n    });\n    ```\n\n    And now `foo` variable is available in REPL:\n\n    ```bash\n    console.log(\"foo:\", foo);\n    // foo: 1\n    ```\n\n#### Test development in runtime\n\nFor quick test development without restarting the test or the browser, you can run the test in the terminal of IDE with enabled REPL mode:\n\n```bash\nnpx hermione --repl-before-test --grep \"foo\" -b \"chrome\"\n```\n\nAfter that, you need to configure the hotkey in IDE to run the selected one or more lines of code in the terminal. As a result, each new written line can be sent to the terminal using a hotkey and due to this, you can write a test much faster.\n\nAlso, during the test development process, it may be necessary to execute commands in a clean environment (without side effects from already executed commands). You can achieve this with the following commands:\n- [clearSession](#clearsession) - clears session state (deletes cookies, clears local and session storages). In some cases, the environment may contain side effects from already executed commands;\n- [reloadSession](https://webdriver.io/docs/api/browser/reloadSession/) - creates a new session with a completely clean environment.\n\n##### How to set up using VSCode\n\n1. Open `Code` -> `Settings...` -> `Keyboard Shortcuts` and print `run selected text` to search input. After that, you can specify the desired key combination\n2. Run hermione in repl mode (examples were above)\n3. Select one or mode lines of code and press created hotkey\n\n##### How to set up using Webstorm\n\nAbility to run selected text in terminal will be available after this [issue](https://youtrack.jetbrains.com/issue/WEB-49916/Debug-JS-file-selection) will be resolved.\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools. To do this, you must require `hermione` module and create instance:\n\n```js\nconst Hermione = require('hermione');\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\nNext, you will have access to the following parameters and methods:\n\nName           | Description\n-------------- | -------------\n`config`       | Returns parsed hermione config.\n`events`       | Returns hermione events on which you can subscribe to.\n`errors`       | Errors which hermione may return.\n`intercept`    | Method to intercept Hermione's events.\n`run`          | Starts running tests. By default run all tests from the config. Can also run only the specified tests.\n`addTestToRun` | Adds test to the current run.\n`readTests`    | Starts reading tests. By default read all tests from the config. Can also read only the specified tests.\n`isFailed`     | Returns `true` or `false` depending on whether there has been an error or a test fail while running tests.\n`isWorker`     | Returns `true` or `false` depending on whether you call the method in one of the workers or in the master process.\n`halt`         | Abnormal termination of the test run in case of a terminal error.\n\n### config\n\nReturns parsed hermione config. Useful when you need to read some field from the config.\n\n```js\n// create hermione instance\nconsole.log('plugins:', hermione.config.plugins);\n```\n\n### events\n\nReturns hermione events on which you can subscribe to. Useful when you need to subscribe to a specific event.\n\n```js\n// create hermione instance\nhermione.on(hermione.events.INIT, async () => {\n    console.info('INIT event is being processed...');\n});\n```\n\n### errors\n\nHermione may return errors of the following type:\n\n- [CoreError](#coreerror)\n- [CancelledError](#cancellederror)\n- [ClientBridgeError](#clientbridgeerror)\n- [HeightViewportError](#heightviewporterror)\n- [OffsetViewportError](#offsetviewporterror)\n- [AssertViewError](#assertviewerror)\n- [ImageDiffError](#imagedifferror)\n- [NoRefImageError](#norefimageerror)\n\n#### CoreError\n\nA `CoreError` is returned if the browser fails to calibrate a blank page (about:blank). The error contains the following message:\n\n```\nCould not calibrate. This could be due to calibration page has failed to open properly\n```\n\n#### CancelledError\n\nThe `CanceledEror` error is returned if the [halt](#halt) command terminates abnormally. The error contains the following message:\n\n```\nBrowser request was cancelled\n```\n\n#### ClientBridgeError\n\nA `ClientBridgeError` is returned when JavaScript injection on the client (browser) side fails. Hermione injects the code using the [execute](https://webdriver.io/docs/api/browser/execute/) WebDriverIO command. The error contains the following message:\n\n```\nUnable to inject client script\n```\n\n#### HeightViewportError\n\nThe `HeightViewportError` is returned when trying to take a screenshot of an area whose bottom border does not fit into the viewport area. The error contains the following message:\n\n```\nCan not capture the specified region of the viewport.\nThe region bottom bound is outside of the viewport height.\nAlternatively, you can test such cases by setting \"true\" value to option \"compositeImage\" in the config file\nor setting \"false\" to \"compositeImage\" and \"true\" to option \"allowViewportOverflow\" in \"assertView\" command.\nElement position: <cropArea.left>, <cropArea.top>; size: <cropArea.width>, <cropArea.height>.\nViewport size: <viewport.width>, <viewport.height>.\n```\n\nIn this case, the message prompts the Hermione user what settings need to be set in the Hermione config in order to be able to take a screenshot for the specified area.\n\n#### OffsetViewportError\n\nAn `OffsetViewportError` is returned when attempting to take a screenshot of an area whose borders on the left, right, or top extend beyond the viewport. The error contains the following message:\n\n```\nCan not capture the specified region of the viewport.\nPosition of the region is outside of the viewport left, top or right bounds.\nCheck that elements:\n- does not overflow the document\n- does not overflow browser viewport\nAlternatively, you can increase browser window size using\n\"setWindowSize\" or \"windowSize\" option in the config file.\nBut if viewport overflow is expected behavior then you can use\noption \"allowViewportOverflow\" in \"assertView\" command.\n```\n\nIn this case, the message prompts the Hermione user what settings need to be set in the Hermione config in order to be able to take a screenshot for the specified area.\n\n#### AssertViewError\n\nAn `AssertViewError` is returned when an attempt to take a screenshot fails. The error may contain one of the following messages, depending on the cause of the crash:\n\n```\nduplicate name for \"<state>\" state\n```\n\n```\nelement (\"<selector>\") still not existing after <this.options.waitforTimeout> ms\n```\n\n```\nelement (\"<this.selector>\") still not existing after <this.options.waitforTimeout> ms\n```\n\n#### ImageDiffError\n\nAn `ImageDiffError` is returned from the [assertView](#assertview) command if a diff (difference in images) is detected when taking and comparing a screenshot with a reference screenshot. The error contains the following message:\n\n```\nimages are different for \"<stateName>\" state\n```\n\nIn addition, the `ImageDiffError` error contains the following data:\n\n* **stateName** `String` - Name of the state for which the screenshot was taken.\n* **currImg** `Object` - Link to actual image.\n* **refImg** `Object` - Link to reference image.\n* **diffOpts** `Object` - Diff detection settings.\n* **diffBounds** `Object` - Boundaries of areas with diffs in the image.\n* **diffClusters** `Object` - Clusters with diffs in the image.\n\nRead more about [diffBounds](https://github.com/gemini-testing/looks-same/blob/master/README.md#getting-diff-bounds) and [diffClusters](https://github.com/gemini-testing/looks-same/blob/master/README.md#getting-diff-clusters) in the documentation of the [looks-same](https://github.com/gemini-testing/looks-same) package.\n\n#### NoRefImageError\n\nThe `NoRefImageError` error is returned from the [assertView](#assertview) command if, when taking and comparing a screenshot, Hermione does not find a reference screenshot on the file system. The error contains the following message:\n\n```\ncan not find reference image at <refImg.path> for \"<stateName>\" state\n```\n\nIn addition, the `NoRefImageError` error contains the following data:\n\n* **stateName** `String` - Name of the state for which the screenshot was taken.\n* **currImg** `Object` - Link to actual image.\n* **refImg** `Object` - Link to reference image.\n\n### intercept\n\nMethod to intercept Hermione's events. The first argument of the method is the event that needs to be intercepted, and the second is the event handler. Example:\n\n```js\n// create hermione instance\nhermione.intercept(hermione.events.TEST_FAIL, ({ event, data }) => {\n    return {event: hermione.events.TEST_PASS, test}; // make the test successful\n});\n```\n\nRead more about event interception in the section [about plugins](#plugins).\n\n### run\n\nStarts running tests. By default run all tests from the config. Can also run only the specified tests. Returns `true` if the test run succeeded, and `false` if it failed. Example:\n\n```js\n// create hermione instance\nconst success = await hermione.run(testPaths, options);\n```\n\nAvailable parameters:\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\nAdds test to the current run. Returns `false` if the current run has already ended or has been cancelled. Otherwise returns `true`. Example:\n\n```js\n// create hermione instance\nconst success = hermione.addTestToRun(test, browserId);\n```\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\n### readTests\n\nStarts reading tests. By default read all tests from the config. Can also read only the specified tests. Returns promise which resolves to the instance of [TestCollection](#test-collection) initialized by parsed tests. Example:\n\n```js\n// create hermione instance\nawait hermione.readTests(testPaths, options);\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### isFailed\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests. Can be useful in plugins to determine Hermione's current status. Example:\n\n```js\n// create hermione instance\nconst failed = hermione.isFailed();\n```\n\n### isWorker\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process. Can be useful in plugins in order to distinguish the code execution context. Example:\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n\nAbnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n```js\n// create hermione instance\nhermione.halt(error, [timeout=60000ms]);\n```\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":"^18.17.0 || ^20.3.0 || >=21.0.0"},"gitHead":"15139845d9d98dbf410173c379804d9fba4233ff","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.6.7","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.17.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.33.2","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"10.0.0-rc.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"4.5.0","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"2.14.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_9.0.0-rc.1_1709811561382_0.139635538030203","host":"s3://npm-registry-packages"}},"8.2.2":{"name":"hermione","version":"8.2.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.2.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"51e2325eee6211e924a45ab3faadeaf0eb936e24","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.2.2.tgz","fileCount":463,"integrity":"sha512-4MphIajTyhRimQAel0X1KZAOr9hbKjev4/kY7kR9agAj7sgvSNb5bmIaYOaJSgToFDLHhP0/r80477k9Gf4JIg==","signatures":[{"sig":"MEQCIBjWwTYaIKEOTcmlbrO61UYwNawdM0fdTstro/uwF+i0AiA+8KWWRLnNgywhYMsD4bY7EnoUvGD4yiIGutHPXOWgEQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":788622},"main":"build/src/index.js","engines":{"node":">= 18.0.0"},"gitHead":"cc9d2675bfee3de1aa77d88806889a89ebe57a84","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.6.7","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.17.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.2.2_1709823060587_0.11550367854227672","host":"s3://npm-registry-packages"}},"8.3.0":{"name":"hermione","version":"8.3.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.3.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"a5dd84e320efd118771211c4d5ca54023de280ce","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.3.0.tgz","fileCount":463,"integrity":"sha512-KAbgZ3+KKVwe+JEyDPRbYvAjBhEOWacGFUxhiMfrEaGch0IkQgStefTrszDTYIKJp9s6EcVTo2msbGp0J67diw==","signatures":[{"sig":"MEYCIQCiaNiKmigEp7M/YDSGNGVmZthAwlTSr2l5kHdCt5zmVgIhALBhap5SxT/kZCDasHj/BSogxGyL39DbirYS6y0y/UTy","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":789754},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"2d5e27ebf05a87b854aab12f9400e45897b938d0","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"10.2.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.19.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.2.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.3.0_1710245348136_0.6732795385785537","host":"s3://npm-registry-packages"}},"8.4.0":{"name":"hermione","version":"8.4.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.4.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"967042e4e097c2b738ed430c7325d3561b9e2f24","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.4.0.tgz","fileCount":463,"integrity":"sha512-e7bPJn5jxkAxGMyH63BO2YeFMxX0W/9BiXNdQntk4WZv5KIRLZaEwlxbdosylngShpqtTw9DDwgNPzhQHqod3Q==","signatures":[{"sig":"MEQCIEQQtRrD5MSWbneSOOzBVF1zfCew4hji8TSIXzubauuvAiBhS1VEf/0CeOFiBOlU45uWYOSIaV1BHYk3ICH4pcSwSA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":789754},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"refs/heads/master","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"10.2.3","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.19.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.4.0_1710347359319_0.22116157124608016","host":"s3://npm-registry-packages"}},"8.4.1":{"name":"hermione","version":"8.4.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.4.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"6fd43769caf3d197677b6604fc90f004fdd6d847","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.4.1.tgz","fileCount":463,"integrity":"sha512-pcX0NlXUbB31zoTiH3hTMJQf1WY2Uos1tqEBNVGWAj+vJIORLIpK014WSVr9a/7J/LwiIgT98DdVM0eFX4IYlA==","signatures":[{"sig":"MEQCIFyFxbflRS5ZyqPiDxVp9wKPUw7dNpts10dtCQ8Aa1OUAiBZ5JyatX4a3kPjai2g0hq7JNmpec7e4cR2vCZ5G58Lkw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":789821},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"refs/heads/master","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.4.1_1710408723042_0.5968599259326697","host":"s3://npm-registry-packages"}},"8.5.0":{"name":"hermione","version":"8.5.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.5.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f8a469d0026b28fef81a3fa46bb1082c00314630","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.5.0.tgz","fileCount":463,"integrity":"sha512-LiKQac2Yg0nxied9gz8NNlSyQn8fennrfqNJaKULQM+OrMN5in08n32A/wr/lIbu+qOAOy5oNw/PAYPy5OTwSA==","signatures":[{"sig":"MEQCIC5gc0cYlswpKrbdMVzlru28nBWzBk4EnefSN0KEnVyiAiAn9LRSwO19Ugw9mYsWdmxNBlg26IN4/N9C3x8KQfZwxA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":791490},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"4dc6c2fd812e6a3c9d4d82671d59187049d52761","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"sipayrt","email":"sipayrt@yandex.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.16.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.5.0_1710772186032_0.15668458366723392","host":"s3://npm-registry-packages"}},"8.5.1":{"name":"hermione","version":"8.5.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.5.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"176e540f90e635a95410a4c7d70f71ff20a7db56","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.5.1.tgz","fileCount":463,"integrity":"sha512-AKJVNidvbxLFuuGQrHZ8Nd3nSQJ7SBPCUzyh9J2gGNnxdGj3T5fgFfqGOIqwdEQNBO0p8DZN8yoZ1aReMtFNPg==","signatures":[{"sig":"MEYCIQCtrc/oyxIN9UUNtC8O5xRtUUDnbHWeJABbqtiFi2c11AIhAJlwcoycTDnAaLzl2pxAJXfC1wTgLVECkAMeGH02TKy8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":793326},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"14439c274b69c45b88e13a942b59340c1f4d0e43","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.16.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.5.1_1710969847972_0.21002131760487397","host":"s3://npm-registry-packages"}},"8.5.2":{"name":"hermione","version":"8.5.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.5.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"cf34a134336c1bcdee0f2d6fa2a60631e0e19489","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.5.2.tgz","fileCount":463,"integrity":"sha512-WfLgpwqiMKEE23V8R8QEz50t+TiwQZeeniyYmwzpqK7I+zuIdkiQGd/R5CFND695w9bvIKeLOzNdj/8en7deRQ==","signatures":[{"sig":"MEQCIFeBS5AsJ2Zj/4vobyR98tFACzCkLB21gEc/Pha+oLTEAiA6pZLRum0j8MkbT1VwI9cF6fKTEyvDLPVSRgc8d4kBAw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":794173},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"3e3078a0f7df560e944693f173453043a8451e81","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.5.2_1711456196875_0.5750029902813292","host":"s3://npm-registry-packages"}},"8.6.0":{"name":"hermione","version":"8.6.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.6.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"7db732abf5d43bcf71105c9dfca5341689cb4be3","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.6.0.tgz","fileCount":463,"integrity":"sha512-zzZUQ630LFFXKOTql+LWM40/SCzcWZ+X+fUx1iE1KV5Hf3K1RzWU2HnPtpxjTH15iKy+xW0we+/9KNsmjPim7w==","signatures":[{"sig":"MEQCIAdara/cE8XUmyAI6mHcUy42MoetKFCx/MExd0+7M2EJAiBM+1/dmj8evDdt5FW5/hBHrPgxOWb6l+gm8mbmIpgI1A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":794410},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"58aba75dbd6f7c90ed6215d08b2ee4e8dbebfed3","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.6.0_1711467054249_0.8938071335354572","host":"s3://npm-registry-packages"}},"8.7.0":{"name":"hermione","version":"8.7.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.7.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"57acc5f331dc9f107d8f35616f82e02b0e97bd4a","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.7.0.tgz","fileCount":463,"integrity":"sha512-Hf9R4WadOCS7ffyHieM4Z9FZf/bPAo1pIpFa/cm4aXgxXmtANDF4PAgoj9Lc9v4lnWF7IrMoxmVFeqUM/mAEmw==","signatures":[{"sig":"MEUCIFNNJqyD6J5qjUb0CnvFd2d/t/Cej82fhEbJsAp5nFvmAiEAnJcsnHiu2XBt7XFXGY5m86Ib9fcFHdkn69yL/WpaB4Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":795319},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"76623111abd90c5f3213b75f211025129a67859f","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.7.0_1711541844630_0.7584962574967593","host":"s3://npm-registry-packages"}},"8.7.1":{"name":"hermione","version":"8.7.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.7.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"954a4b57e1ea5cc2f4ea4fe6cb2fa212d44e2593","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.7.1.tgz","fileCount":463,"integrity":"sha512-mjsI1RyZ0haY3HCqBXY/w9v0mwPZWK/l7T5R4hx3+d1Jtxecyc2aKDX8g58U8DMuLGJjn37/AM400P4IoNE8Rg==","signatures":[{"sig":"MEYCIQDdhoic8DTFQhXxsZ4nSVgZICLLm8WMORzq0MoO5L6REQIhAJ3cyzJtAAZiFVAhX/95PY7Ot9yKrVpDJb1fQG7KC5SI","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":795574},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"5d2b653c513844cb922bee24b18fab94f6e66a1e","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.7.1_1711639703687_0.35040130892080334","host":"s3://npm-registry-packages"}},"8.7.2":{"name":"hermione","version":"8.7.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.7.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"c4098e9f1d75dd98aabe2489955d65f40659785a","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.7.2.tgz","fileCount":463,"integrity":"sha512-RE+GW/2yGatgpRqOJQ73E2Eu1OjMo4MzW1Ahc0ZCzda64ppWhsrnYk6YC9wBQ3h3XwFJGpb/V4drUW1MVrxBEw==","signatures":[{"sig":"MEUCIDAAKurKkDR/W2nAJZYh6ztndHAIDiq+uL1uEhPVwsDzAiEA/YfqD3GDtjfEPYa2BptwXf3Xu8l3NB3kFMVegSaTUgI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":795587},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"4523c8852807295cd4af612ea603a499c262dcbe","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.7.2_1711712105480_0.6249675455075505","host":"s3://npm-registry-packages"}},"7.5.5":{"name":"hermione","version":"7.5.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"403a8cf1f49a0d3711f0196720f5107764ffbed2","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.5.tgz","fileCount":431,"integrity":"sha512-tgKV/5Y31LMRc05JAnKdL5SMKeRb+vM7qBlsg3uMxGqIyhLd5qvwunREaJnZxQv0IL2SjlQqc1BWOCR/t/0VwA==","signatures":[{"sig":"MEYCIQDepQeg3FMVunsJO048MCjalmlG8G4j129i1nHCyBNvSAIhANGwupA9gRFqFEVeJkKbuCt6kQ0lj4WzF2ClTbc8J6TJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":715705},"main":"build/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.handler[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `false`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"e5bdf965e33aa7630924d454b07c614172bbaa79","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.19.0","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.5_1711967777822_0.5636516072037603","host":"s3://npm-registry-packages"}},"8.8.0":{"name":"hermione","version":"8.8.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.8.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"dee68f5d62f0026f20fcf903d684ac1aaf49b222","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.8.0.tgz","fileCount":463,"integrity":"sha512-dEPmpIYQ/yokcDD3qhfRl/1xiz/5ziIMuFZRLM7pkgWDwHnRqkbXH/kBMhLXY8DHGyWbYRkIruwlmQKkiWx6nA==","signatures":[{"sig":"MEQCIG1yp2cWqWqG291x9RqgrQ3PYM8zbgoTtKDPH4yK+KWTAiBzL5Ji20SgxHyqnAau0/1WxvnSnsnT97V3/7b4w+N8jQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":795602},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"d0b3fec10496371364cab071547af074a32c2b9c","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.8.0_1712151908061_0.8276418536143992","host":"s3://npm-registry-packages"}},"8.8.1":{"name":"hermione","version":"8.8.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.8.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"8abd8972f34be0b7c810feae328c430abdaf2f86","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.8.1.tgz","fileCount":463,"integrity":"sha512-HOtAxX0LKQVvZCIb1zmjuf2Ch+GuKp/94fvX8Gsxwzjen5wEeWLejCGJg9/P0Ox+I0dh+gig2WuMbWPulEXVsA==","signatures":[{"sig":"MEUCIQCsppBkRpgZyTQ9iScjxT3u35xh4NFwpR8NITGOuhRj1gIgd0vX7dyEUDwGvmbOvZ3JBPYRxdCzi/CJxZIZpsgUk1A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":796062},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"217b39c999786a45bb8f89c15f36828df63751db","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.8.1_1712323555211_0.9866840198645277","host":"s3://npm-registry-packages"}},"7.5.6":{"name":"hermione","version":"7.5.6","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.6","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"5b68d8499d747d0e0708c3fb10241a29fa0a01c4","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.6.tgz","fileCount":431,"integrity":"sha512-ctKiHyv7AIxS+D/bTrUqOhhaAY/lzMZeTwO2ebJWUsLG+7gzM1My1I3DbZ9UPEmF7RCO1WfZJjK6OKOJCNJKaA==","signatures":[{"sig":"MEQCIHvRYSrRE3DsB63+Jn3pBtkzybPxxzq3IvY/LdHjVth/AiBrurPgnSzqOKXhELLnipqK+k+rEgPQfcLF8W/008lhBA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":711309},"main":"build/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.handler[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `false`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"aa5abd0d813252416631d9efea6e41dfffb64067","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.1.0","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.6_1712324976222_0.46047457895205013","host":"s3://npm-registry-packages"}},"8.9.0":{"name":"hermione","version":"8.9.0","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.0","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f1f269e741c5848e633d1826c6e2a7e7ecfefe52","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.0.tgz","fileCount":469,"integrity":"sha512-A3Hs566F7AfkEmyJA6qSDCq6sJ4y1Kp11ffVA8VVpjITD5Hl422+q83E6TlR5JBW1vASot3rkozz0105FgB4YA==","signatures":[{"sig":"MEQCIDban38l1uAYoytBxYJB9SYwR2JPvVE5vFVx0JSzY3vxAiAd33CK0KrCTAOjb4egaHTiUpPbvunqwO9mi1mdRxP9hg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":819337},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"30740495fd95a6ca2eedb9a9ff893351a1ca9db7","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.0_1713466947289_0.9499067281522249","host":"s3://npm-registry-packages"}},"8.9.1":{"name":"hermione","version":"8.9.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"f412e36bd151c1b3a3eec839c3d6a09c834df3f3","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.1.tgz","fileCount":469,"integrity":"sha512-sJevk5eofc214a7vGxmkvzS1REbiu+xDqcFLTyJya1c/Vcb1QH9HrtLFXOa6clWQoOILpFEFD4EhXv1qdFNkHg==","signatures":[{"sig":"MEQCIBYcUhndQ/WBvdvKU293ytJqcY4XVsdwoBi6YNmT3zQoAiB5ozkKucwhI+3sgDHNskqvgEaD8aMCJniF0Gxn7NThwg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":819472},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"784c46e35ea841faa4dab155beb7ad4913fb6e7c","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"9.5.1","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.16.0","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.0","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.1_1713961830125_0.5381253058977349","host":"s3://npm-registry-packages"}},"8.9.2":{"name":"hermione","version":"8.9.2","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.2","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"eef4ba0f5b8adfa4783f0ce53724080154285cec","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.2.tgz","fileCount":469,"integrity":"sha512-bswqa4ECF3lgk16ihZAUpAdO72v2QB8u1p7Rwe8IPHeyvzB/+PP9Q8glmOVy5IE7qV7/3YFWk0DFo4IB3nn3Uw==","signatures":[{"sig":"MEYCIQDE192QTtEb0KQkfpqaHxqHH1y72/FNaMcTRRKAEtUpxwIhAIxHwDxjpGmBJ0DrvrRE8TR+impCNZchboL5RrDPc+J/","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":819739},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"03bff88549ff135150e4b9c8bf945b611395a543","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.1","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.2_1715766671860_0.43766451831911657","host":"s3://npm-registry-packages"}},"8.9.3":{"name":"hermione","version":"8.9.3","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.3","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"2ec420957836c8afc359659ca5131361ea596bc0","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.3.tgz","fileCount":469,"integrity":"sha512-LwFhDHFB7lgEZDWp3EORQtouMAlYhdrGFnbVUv4IJrmahXyDsunpG3jKP8gvOg5QuDkx+9wSn080jMv70XI3kw==","signatures":[{"sig":"MEQCIDc01SA0bBGI2/6myAQK5TpOGnTS/ge9rRS9gjW3pyCDAiBF02jIQBic7bCGH9/Mkr8fm5aV2nvfLX4L3hqhC+0cPg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":820226},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"473d9b6b6722fcfd5d3d91719b3f9a05c3a3d0a4","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.1","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.3_1715869105172_0.7036544763814125","host":"s3://npm-registry-packages"}},"7.5.7":{"name":"hermione","version":"7.5.7","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.7","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"36a4256edbb12ad30f5315cf253e665b3ed28ca5","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.7.tgz","fileCount":431,"integrity":"sha512-POC0e8PD6FoNmebTh7XVVf1KaSof5MfMQjMoRX1iLNbssGfKjpW8msOAesqXG6ur7Fu8DWoRQqhUyMCf/Ge/Sg==","signatures":[{"sig":"MEUCIQCjd760q+nzZvS71KP0MwicbnfLkzxxcH57UjQe+g4JdAIgCdmCtZdpSoXyJLAsw+EIWb31qsKF83MVNGGR5xNQbqk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":711872},"main":"build/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.handler[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `false`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"a67b802bc96984cb682bab865d7c001bbe39efb7","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.3.1","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.7_1715934734484_0.874703239182314","host":"s3://npm-registry-packages"}},"7.5.8-rc.1":{"name":"hermione","version":"7.5.8-rc.1","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@7.5.8-rc.1","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"6124c8a26f9b61c9bf05c72769674b2d3c6b11a2","tarball":"https://registry.npmjs.org/hermione/-/hermione-7.5.8-rc.1.tgz","fileCount":434,"integrity":"sha512-MeKM8PF0PINLhTyfeaTY+/QKjI7jMN+tPHBESDrgRVYjztv7DC5T7B433btMYESuGFQ0sQxFqdcjJqzHfpAIrQ==","signatures":[{"sig":"MEUCIExmySy55jYkySNx0pasvX48tDstTtx3gJLmbcbiekMGAiEA47Il3co8acVcbV4I1gyCbVOtHmJLwZRaMdW6NL/76jw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":715170},"main":"build/hermione.js","types":"./typings/index.d.ts","readme":"# Hermione\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n  - [Debug mode](#debug-mode)\n- [Programmatic API](#programmatic-api)\n  - [init](#init)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: false\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.handler[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`.\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `false`.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` event\n        console.log(opts.flag);\n    });\n};\n```\n\nBesides, you have the ability to intercept events in plugins and translate them to other events:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data: test}) => {\n        test.skip({reason: 'intercepted failure'});\n\n        return {event: hermione.events.TEST_PENDING, test};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will never be called\n    });\n\n    hermione.on(hermione.evenst.TEST_PENDING, (test) => {\n        // this event handler will always be called instead of 'TEST_FAIL' one\n    });\n};\n```\n\nIf for some reason interceptor should not translate passed event to another one you can return the same object or some falsey value:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {event, data};\n        // return;\n        // return null;\n        // return false;\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will be called as usual because interceptor does not change event\n    });\n};\n```\n\nIf for some reason interceptor should ignore passed event and do not translate it to any other listeners you can return an empty object:\n\n```js\nmodule.exports = (hermione) => {\n    hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        return {};\n    });\n\n    hermione.on(hermione.events.TEST_FAIL, (test) => {\n        // this event handler will NEVER be called because interceptor ignores it\n    });\n};\n```\n\nThe above feature can be used to delay triggering of some events, for example:\n\n```js\nmodule.exports = (hermione) => {\n  const intercepted = [];\n\n  hermione.intercept(hermione.events.TEST_FAIL, ({event, data}) => {\n        intercepted.push({event, data});\n        return {};\n    });\n\n    hermione.on(hermione.events.END, () => {\n        intercepted.forEach(({event, data}) => hermione.emit(event, data));\n    });\n};\n```\n\n**Available events which can be intercepted**\n\nEvent                     |\n------------------------- |\n`SUITE_BEGIN`             |\n`SUITE_END`               |\n`TEST_BEGIN`              |\n`TEST_END`                |\n`TEST_PASS`               |\n`TEST_FAIL`               |\n`RETRY`                   |\n\n#### Parallel execution plugin code\n\nRunner has a method `registerWorkers` which register plugin's code for parallel execution in Hermione's worker farm. The method accepts parameters `workerFilepath` (string, absolute path), `exportedMethods` (array of string) and return object which contains async functions with names from `exportedMethods`. File with path `workerFilepath` should export object which contains async functions with names from `exportedMethods`.\n\n*Example*\n```js\n// plugin code\nlet workers;\n\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.RUNNER_START, async (runner) => {\n        const workerFilepath = require.resolve('./worker');\n        const exportedMethods = ['foo'];\n        workers = runner.registerWorkers(workerFilepath, exportedMethods);\n\n        // outputs `FOO_RUNNER_START`\n        console.log(await workers.foo('RUNNER_START'));\n    });\n\n    hermione.on(hermione.events.RUNNER_END, async () => {\n        // outputs `FOO_RUNNER_END`\n        console.log(await workers.foo('RUNNER_END'));\n    });\n};\n\n// worker.js\nmodule.exports = {\n    foo: async function(event) {\n        return 'FOO_' + event;\n    }\n};\n\n```\n\n#### List of useful plugins\nThere are several plugins that may be useful:\n\n* [html-reporter](https://github.com/gemini-testing/html-reporter)\n* [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands)\n* [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome)\n* ...and many others that you can find in [gemini-testing](https://github.com/search?q=topic%3Ahermione-plugin+org%3Agemini-testing&type=Repositories).\n\n### prepareBrowser\nPrepare the browser session before tests are run. For example, add custom user commands.\n```js\nprepareBrowser: function(browser) {\n    browser.addCommand('commandName', require('./path/to/commands/commandName.js'));\n}\n```\n\nThe `browser` argument is a `WebdriverIO` session.\n\n### prepareEnvironment\nConfiguration data can be changed depending on extra conditions in the `prepareEnvironment` function.\n\n## CLI\n\n```\nhermione --help\n```\n\nshows the following\n\n```\n  Usage: hermione [options] [paths...]\n\n  Options:\n\n    -V, --version                output the version number\n    -c, --config <path>          path to configuration file\n    -b, --browser <browser>      run tests only in specified browser\n    -s, --set <set>              run tests only in the specified set\n    -r, --require <module>       require a module before running hermione\n    --reporter <reporter>        test reporters\n    --grep <grep>                run only tests matching the pattern\n    --update-refs                update screenshot references or gather them if they do not exist (\"assertView\" command)\n    --inspect [inspect]          nodejs inspector on [=[host:]port]\n    --inspect-brk [inspect-brk]  nodejs inspector with break at the start\n    -h, --help                   output usage information\n```\n\nFor example,\n```\nhermione --config ./config.js --reporter flat --browser firefox --grep name\n```\n\n**Note.** All CLI options override config values.\n\n### Reporters\n\nYou can choose `flat`, `plain` or `jsonl` reporter by option `--reporter`. Default is `flat`.\nInformation about test results is displayed to the command line by default. But there is an ability to redirect the output to a file, for example:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}'\n```\n\nIn that example specified file path and all directories will be created automatically. Moreover you can use few reporters:\n```\nhermione --reporter '{\"type\": \"jsonl\", \"path\": \"./some-path/result.jsonl\"}' --reporter flat\n```\n\nInformation about each report type:\n* `flat` – all information about failed and retried tests would be grouped by browsers at the end of the report;\n* `plain` – information about fails and retries would be placed after each test;\n* `jsonl` - displays detailed information about each test result in [jsonl](https://jsonlines.org/) format.\n\n### Require modules\n\nUsing `-r` or `--require` option you can load external modules, which exists in your local machine, before running hermione. This is useful for:\n\n- compilers such as TypeScript via [ts-node](https://www.npmjs.com/package/ts-node) (using `--require ts-node/register`) or Babel via [@babel/register](https://www.npmjs.com/package/@babel/register) (using `--require @babel/register`);\n- loaders such as ECMAScript modules via [esm](https://www.npmjs.com/package/esm).\n\nBe sure to update [fileExtensions](#fileExtensions) apropriately, if you are planning to import anything other than `.js`.\n\n### Overriding settings\n\nAll options can also be overridden via command-line flags or environment variables. Priorities are the following:\n\n* A command-line option has the highest priority. It overrides the environment variable and config file value.\n\n* An environment variable has second priority. It overrides the config file value.\n\n* A config file value has the lowest priority.\n\n* If there isn't a command-line option, environment variable or config file option specified, the default is used.\n\nTo override a config setting with a CLI option, convert the full option path to `--kebab-case`. For example, if you want to run tests against a different base URL, call:\n\n```\nhermione path/to/mytest.js --base-url http://example.com\n```\n\nTo change the number of sessions for Firefox (assuming you have a browser with the `firefox` id in the config):\n\n```\nhermione path/to/mytest.js --browsers-firefox-sessions-per-browser 7\n```\n\nTo override a setting with an environment variable, convert its full path to `snake_case` and add the `hermione_` prefix. The above examples can be rewritten to use environment variables instead of CLI options:\n\n```\nhermione_base_url=http://example.com hermione path/to/mytest.js\nhermione_browsers_firefox_sessions_per_browser=7 hermione path/to/mytest.js\n```\n\n### Environment variables\n\n#### HERMIONE_SKIP_BROWSERS\nSkip the browsers specified in the config by passing the browser IDs. Multiple browser IDs should be separated by commas\n(spaces after commas are allowed).\n\nFor example,\n```\nHERMIONE_SKIP_BROWSERS=ie10,ie11 hermione\n```\n\n#### HERMIONE_SETS\nSpecify sets to run using the environment variable as an alternative to using the CLI option `--set`.\n\nFor example,\n```\nHERMIONE_SETS=desktop,touch hermione\n```\n\n### Debug mode\n\nIn order to understand what is going on in the test step by step, there is a debug mode. You can run tests in this mode using these options: --inspect and --inspect-brk. The difference between them is that the second one stops before executing the code.\n\nExample:\n```\nhermione path/to/mytest.js --inspect\n```\n\n**Note**: In the debugging mode, only one worker is started and all tests are performed only in it.\nUse this mode with option `sessionsPerBrowser=1` in order to debug tests one at a time.\n\n## Programmatic API\n\nWith the API, you can use Hermione programmatically in your scripts or build tools.\n\n```js\nconst Hermione = require('hermione');\n\nconst hermione = new Hermione(config);\n```\n\n* **config** (required) `Object|String` – Configuration object or path to the configuration file that will be read relative to `process.cwd`.\n\n### init\n\n```js\nhermione.init().done();\n```\n\nInitializes hermione instance, load all plugins ans so on.\n\n### run\n\n```js\nhermione.run(testPaths, options)\n    .then((success) => process.exit(success ? 0 : 1))\n    .catch((e) => {\n        console.log(e.stack);\n        process.exit(1);\n    })\n    .done();\n```\n\n* **testPaths** (optional) `String[]|TestCollection` – Paths to tests relative to `process.cwd`. Also accepts test collection returned by `readTests`.\n* **options** (optional) `Object`\n  * **reporters** (optional) `String[]` – Test result reporters.\n  * **browsers** (optional) `String[]` – Browsers to run tests in.\n  * **sets** (optional) `String[]`– Sets to run tests in.\n  * **grep** (optional) `RegExp` – Pattern that defines which tests to run.\n\n### addTestToRun\n\n```js\nhermione.addTestToRun(test, browser);\n```\n\nAdds test to the current run.\n\n* **test** (required) `Test` – Test to run.\n* **browserId** (required) `String` – Browser to run test in.\n\nReturns `false` if current run is ended or cancelled, `true` otherwise.\n\n### readTests\n\n```js\nhermione.readTests(testPaths, options).done();\n```\n\n* **testPaths** (required) `String[]` – Paths to tests relative to `process.cwd`.\n* **options** (optional) `Object`:\n  * **browsers** (optional) `String[]` – Read tests only for the specified browsers.\n  * **silent** (optional) `Boolean` – flag to disable events emitting while reading tests; default is `false`.\n  * **ignore** (optional) `String|Glob|Array<String|Glob>` - patterns to exclude paths from the test search.\n\nReturns promise which resolves to the instance of `TestCollection` initialized by parsed tests\n\n### isFailed\n\n```js\nhermione.isFailed();\n```\n\nReturns `true` or `false` depending on whether there has been an error or a test fail while running tests; can be useful in plugins to\ndetermine current Hermione status.\n\n### isWorker\n\n```js\nhermione.isWorker();\n```\n\nReturns `true` or `false` depending on whether you call the method in one of the workers or in the master process; can be useful in plugins to share some code execution between the master process and its workers, for example:\n\n\n```js\n// implementation of some plugin\nmodule.exports = (hermione) => {\n    if (hermione.isWorker()) {\n        // do some stuff only in workers\n    } else {\n        // do some stuff only in the master process\n    }\n};\n```\n\n### halt\n```js\nhermione.halt(error, [timeout=60000ms]);\n```\n\nMethod for abnormal termination of the test run in case of a terminal error. If process fails to gracefully shutdown in `timeout` milliseconds, it would be forcibly terminated (unless `timeout` is explicitly set to `0`).\n\n### Test Collection\n\nTestCollection object is returned by `hermione.readTests` method.\n\nTestCollection API:\n\n* `getBrowsers()` — returns list of browsers for which there are tests in collection.\n\n* `mapTests(browserId, (test, browserId) => ...)` - maps over tests for passed browser. If first argument (`browserId`) is omitted then method will map over tests for all browsers.\n\n* `sortTests(browserId, (currentTest, nextTest) => ...)` - sorts over tests for passed browser. If first argument (`browserId`) is omitted then method will sort over tests for all browsers.\n\n* `eachTest(browserId, (test, browserId) => ...)` - iterates over tests for passed browser. If first argument (`browserId`) is omitted then method will iterate over tests for all browsers.\n\n* `eachTestByVersion(browserId, (test, browserId, version) => ...)` - iterates over tests and over browser versions for passed browser. Implicitly sets browser version for each test in `browserVersion` property.\n\n* `disableAll([browserId])` - disables all tests. Disables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableAll([browserId])` - enables all previously disabled tests. Enables tests for specific browser if `browserId` passed. Returns current test collection instance.\n\n* `disableTest(fullTitle, [browserId])` - disables test with passed full title. Disables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `enableTest(fullTitle, [browserId])` - enables test with passed full title. Enables test only in specific browser if `browserId` passed. Returns current test collection instance.\n\n* `getRootSuite(browserId)` - returns root suite for passed browser. Returns `undefined` if there are no tests in collection for passed browser.\n\n* `eachRootSuite((root, browserId) => ...)` - iterates over all root suites in collection which have some tests.\n\n### Test Parser API\n\n`TestParserAPI` object is emitted on `BEFORE_FILE_READ` event. It provides the ability to customize test parsing process.\n\n#### setController(name, methods)\n\nAdds controller to `hermione` object in test files.\n\n* `name` - controller name\n* `methods` - an object with names as keys and callbacks as values describing controller methods. Each callback will be called on corresponding test or suite.\n\nExample:\n```js\n// in plugin\nhermione.on(hermione.events.BEFORE_FILE_READ, ({file, testParser}) => {\n    testParser.setController('logger', {\n        log: function(prefix) {\n            console.log(`${prefix}: Just parsed ${this.fullTitle()} from file ${file}`);\n        }\n    });\n});\n\n// in test file\ndescribe('foo', () => {\n    hermione.logger.log('some-prefix');\n    it('bar', function() {\n        // ...\n    });\n});\n```\n\n**Note**: controller will be removed as soon as current file will be parsed\n","engines":{"node":">= 16.0.0"},"gitHead":"116f56ca917a840b3b2cbfe6d89546f1284bfc59","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && copyfiles --up 1 'src/browser/client-scripts/*' build","clean":"rimraf build/ *.tsbuildinfo","prepack":"npm run clean && npm run build","release":"standard-version","coverage":"nyc --reporter=text npm run test-unit","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.4","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"16.20.1","dependencies":{"temp":"^0.8.3","chalk":"^1.1.1","debug":"^2.6.9","fastq":"^1.13.0","mocha":"^10.2.0","sharp":"~0.30.7","urijs":"^1.19.11","lodash":"^4.17.21","sizzle":"^2.3.6","inherit":"^2.2.2","yallist":"^3.1.1","aliasify":"^1.9.0","bluebird":"^3.5.1","date-fns":"^2.29.3","fs-extra":"^5.0.0","url-join":"^4.0.1","uglifyify":"^3.0.4","browserify":"^13.3.0","glob-extra":"^5.0.2","looks-same":"^8.2.4","micromatch":"^4.0.5","@wdio/types":"^8.4.0","@wdio/utils":"^7.26.0","webdriverio":"8.13.4","worker-farm":"^1.7.0","@types/mocha":"^10.0.1","@wdio/globals":"^8.5.7","clear-require":"^1.0.1","png-validator":"1.1.0","plugins-loader":"^1.3.1","expect-webdriverio":"^3.5.3","gemini-configparser":"^1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"nyc":"^15.1.0","chai":"^4.1.1","husky":"^0.11.4","jsdom":"^16.6.0","sinon":"^4.4.2","doctoc":"^2.2.0","eslint":"^8.25.0","rimraf":"^4.1.2","ts-node":"^10.9.1","onchange":"^7.1.0","prettier":"^2.8.4","@swc/core":"^1.3.40","copyfiles":"^2.4.1","proxyquire":"^1.7.3","sinon-chai":"^2.12.0","typescript":"^4.9.5","@types/chai":"^4.3.4","@types/node":"^12.20.28","@types/sharp":"^0.31.1","@types/sinon":"^4.3.3","jsdom-global":"^3.0.2","@types/lodash":"^4.14.191","@commitlint/cli":"^17.1.2","app-module-path":"^2.2.0","chai-as-promised":"^7.1.1","standard-version":"^9.5.0","@types/proxyquire":"^1.3.28","escape-string-regexp":"1.0.5","eslint-config-prettier":"^8.7.0","@types/chai-as-promised":"^7.1.5","@typescript-eslint/parser":"^5.54.1","eslint-config-gemini-testing":"^2.8.0","@commitlint/config-conventional":"^17.1.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_7.5.8-rc.1_1716462119259_0.4993353020454203","host":"s3://npm-registry-packages"}},"8.9.4":{"name":"hermione","version":"8.9.4","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.4","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"bfbd2ab21e9097fa616df786b64cf8193b0bb786","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.4.tgz","fileCount":472,"integrity":"sha512-lsnSA5eM8PMBa8dcBazbkVLlG4q5gTjBbPA3diE00qafIeTGfprmz6gTPYDL3xkMMxIn4zeCIZlsIBpIXqafug==","signatures":[{"sig":"MEYCIQChCx9PJgaptxPuu8PMS/ZCFYlYiras+OKQk43S4l3BDQIhANRGgeRv06oEQT2kbK8Q90KDDHn/qTeQc+RyJI3Kc8Wi","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":823694},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"e2d050c9640988d7e4270f43657f3b20568f4853","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.1","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.4_1716981013065_0.5857460274647268","host":"s3://npm-registry-packages"}},"8.9.5":{"name":"hermione","version":"8.9.5","keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","_id":"hermione@8.9.5","maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"bin":{"hermione":"bin/hermione"},"dist":{"shasum":"26c3ef2d371eebb9af59b9cb521386f70d36da23","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.5.tgz","fileCount":472,"integrity":"sha512-hK4FBUfZQH8WRwtS7Az6bbVGE618zlT8HczE81uts9GpVM0l6Y00G49zAFlqrkuIZW6jfEJ2ozDFtv74luhOZA==","signatures":[{"sig":"MEUCIQDvnC3Lmb3ZAeLqBtXg+Qi07L0xQrVJgUkPykPCM7L/mgIgKKlbvZD6RMZ7rUb1GFQZyes7m6OhdMjnrjoey5Cgbgs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":823712},"main":"build/src/index.js","types":"./build/src/index.d.ts","engines":{"node":">= 18.0.0"},"gitHead":"50ade2be235a20c7e7f6b81c6e98a19322541509","scripts":{"toc":"doctoc README.md","lint":"eslint --cache . && prettier --check .","test":"npm run test-unit && npm run check-types && npm run lint","build":"tsc && npm run copy-static","clean":"rimraf build/ *.tsbuildinfo","watch":"npm run copy-static && tsc --watch","prepack":"npm run clean && npm run build","release":"standard-version -t hermione/","reformat":"eslint --fix . && prettier --write .","commitmsg":"commitlint -e","precommit":"npm run lint","test-unit":"_mocha test/","preversion":"npm run lint && npm test","check-types":"tsc --project tsconfig.spec.json","copy-static":"copyfiles 'src/browser/client-scripts/*' build","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}"},"_npmUser":{"name":"dudagod","email":"dudkevich@yandex-team.ru"},"repository":{"url":"git://github.com/gemini-testing/hermione.git","type":"git"},"_npmVersion":"8.19.2","description":"Tests framework based on mocha and wdio","directories":{},"_nodeVersion":"18.12.1","dependencies":{"temp":"0.8.3","chalk":"2.4.2","debug":"2.6.9","fastq":"1.13.0","mocha":"10.2.0","sharp":"0.32.6","urijs":"1.19.11","lodash":"4.17.21","sizzle":"2.3.6","yallist":"3.1.1","aliasify":"1.9.0","bluebird":"3.5.1","devtools":"8.21.0","fs-extra":"5.0.0","strftime":"0.10.2","url-join":"4.0.1","uglifyify":"3.0.4","browserify":"13.3.0","glob-extra":"5.0.2","looks-same":"9.0.0","micromatch":"4.0.5","strip-ansi":"6.0.1","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","webdriverio":"8.21.0","worker-farm":"1.7.0","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","clear-require":"1.0.1","png-validator":"1.1.0","plugins-loader":"1.3.1","expect-webdriverio":"3.5.3","gemini-configparser":"1.3.0","@gemini-testing/commander":"2.15.3"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.2.0","husky":"0.11.4","jsdom":"^24.0.0","sinon":"17.0.1","doctoc":"2.2.0","eslint":"8.25.0","rimraf":"4.1.2","ts-node":"10.9.1","onchange":"7.1.0","prettier":"2.8.4","@swc/core":"1.3.40","copyfiles":"2.4.1","type-fest":"3.11.1","proxyquire":"1.8.0","sinon-chai":"3.7.0","typescript":"5.3.2","@types/chai":"4.3.4","@types/node":"18.19.3","@types/debug":"4.1.12","@types/sharp":"0.31.1","@types/sinon":"4.3.3","jsdom-global":"3.0.2","@types/lodash":"4.14.191","@commitlint/cli":"^19.0.3","@types/bluebird":"3.5.38","app-module-path":"2.2.0","chai-as-promised":"7.1.1","standard-version":"9.5.0","@types/proxyquire":"1.3.28","@sinonjs/fake-timers":"10.3.0","escape-string-regexp":"1.0.5","eslint-config-prettier":"8.7.0","@types/chai-as-promised":"7.1.5","@typescript-eslint/parser":"6.12.0","@types/sinonjs__fake-timers":"8.1.2","eslint-config-gemini-testing":"2.8.0","@commitlint/config-conventional":"^19.0.3","@typescript-eslint/eslint-plugin":"6.12.0"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/hermione_8.9.5_1716992860194_0.8912469287646458","host":"s3://npm-registry-packages"}},"8.9.6":{"name":"hermione","version":"8.9.6","description":"Tests framework based on mocha and wdio","main":"build/src/index.js","scripts":{"build":"tsc && npm run copy-static","copy-static":"copyfiles 'src/browser/client-scripts/*' build","check-types":"tsc --project tsconfig.spec.json","clean":"rimraf build/ *.tsbuildinfo","lint":"eslint --cache . && prettier --check .","reformat":"eslint --fix . && prettier --write .","prettier-watch":"onchange '**' --exclude-path .prettierignore -- prettier --write {{changed}}","test-unit":"_mocha test/","test":"npm run test-unit && npm run check-types && npm run lint","toc":"doctoc README.md","precommit":"npm run lint","prepack":"npm run clean && npm run build","preversion":"npm run lint && npm test","commitmsg":"commitlint -e","release":"standard-version -t hermione/","watch":"npm run copy-static && tsc --watch"},"repository":{"type":"git","url":"git://github.com/gemini-testing/hermione.git"},"engines":{"node":">= 18.0.0"},"keywords":["hermione","webdriverio","mocha","test"],"bin":{"hermione":"bin/hermione"},"license":"MIT","dependencies":{"@gemini-testing/commander":"2.15.3","@types/mocha":"10.0.1","@wdio/globals":"8.21.0","@wdio/types":"8.21.0","@wdio/utils":"7.26.0","aliasify":"1.9.0","bluebird":"3.5.1","browserify":"13.3.0","chalk":"2.4.2","clear-require":"1.0.1","debug":"2.6.9","devtools":"8.21.0","expect-webdriverio":"3.5.3","fastq":"1.13.0","fs-extra":"5.0.0","gemini-configparser":"1.3.0","glob-extra":"5.0.2","lodash":"4.17.21","looks-same":"9.0.0","micromatch":"4.0.5","mocha":"10.2.0","plugins-loader":"1.3.1","png-validator":"1.1.0","sharp":"0.32.6","sizzle":"2.3.6","strftime":"0.10.2","strip-ansi":"6.0.1","temp":"0.8.3","uglifyify":"3.0.4","urijs":"1.19.11","url-join":"4.0.1","webdriverio":"8.21.0","worker-farm":"1.7.0","yallist":"3.1.1"},"devDependencies":{"@commitlint/cli":"^19.0.3","@commitlint/config-conventional":"^19.0.3","@sinonjs/fake-timers":"10.3.0","@swc/core":"1.3.40","@types/bluebird":"3.5.38","@types/chai":"4.3.4","@types/chai-as-promised":"7.1.5","@types/debug":"4.1.12","@types/lodash":"4.14.191","@types/node":"18.19.3","@types/proxyquire":"1.3.28","@types/sharp":"0.31.1","@types/sinon":"4.3.3","@types/sinonjs__fake-timers":"8.1.2","@typescript-eslint/eslint-plugin":"6.12.0","@typescript-eslint/parser":"6.12.0","app-module-path":"2.2.0","chai":"4.2.0","chai-as-promised":"7.1.1","copyfiles":"2.4.1","doctoc":"2.2.0","escape-string-regexp":"1.0.5","eslint":"8.25.0","eslint-config-gemini-testing":"2.8.0","eslint-config-prettier":"8.7.0","husky":"0.11.4","jsdom":"^24.0.0","jsdom-global":"3.0.2","onchange":"7.1.0","prettier":"2.8.4","proxyquire":"1.8.0","rimraf":"4.1.2","sinon":"17.0.1","sinon-chai":"3.7.0","standard-version":"9.5.0","ts-node":"10.9.1","type-fest":"3.11.1","typescript":"5.3.2"},"peerDependencies":{"ts-node":">=10.5.0"},"peerDependenciesMeta":{"ts-node":{"optional":true}},"_id":"hermione@8.9.6","contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}],"gitHead":"d65077a100981af0185d577e493c2ded8f4ea863","types":"./build/src/index.d.ts","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"homepage":"https://github.com/gemini-testing/hermione#readme","_nodeVersion":"18.20.3","_npmVersion":"10.7.0","dist":{"integrity":"sha512-8tuOtfb1FbZ70YUuFQshtPs38h3MW3GXDCPBJZ+S3k9yYQk3bnC/OMMWhqC1u04IG3lUoUNVzKqqPFnEIu00Mg==","shasum":"6307af462b8d4669780fd894354567801d44b445","tarball":"https://registry.npmjs.org/hermione/-/hermione-8.9.6.tgz","fileCount":475,"unpackedSize":827062,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGN1QEl4mjZCj2Dl/7r2hlMuVM83X2QeHzRt4F8uSPxzAiEApQ/ODosdls7ixvUfaJI4733P25L8l4NHbkZql3GrUho="}]},"_npmUser":{"name":"shadowusr","email":"nikhakerlab@mail.ru"},"directories":{},"maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/hermione_8.9.6_1718379093293_0.21192834727365617"},"_hasShrinkwrap":false}},"time":{"created":"2016-01-21T20:08:33.304Z","modified":"2024-06-14T15:31:33.686Z","0.0.0-reserved":"2016-01-21T20:08:33.304Z","0.0.1-reserved":"2016-02-12T11:17:13.010Z","0.5.0":"2016-02-17T14:00:51.245Z","0.5.1":"2016-02-18T15:34:02.046Z","0.5.2":"2016-02-20T06:13:40.493Z","0.5.3":"2016-03-04T10:05:18.570Z","0.6.0":"2016-03-30T12:57:43.845Z","0.6.1":"2016-04-01T16:02:47.263Z","0.6.2":"2016-04-27T11:35:59.315Z","0.6.3":"2016-05-04T15:24:45.805Z","0.7.0":"2016-05-12T15:06:43.767Z","0.8.0":"2016-06-30T12:21:55.644Z","0.8.1":"2016-07-04T17:18:47.835Z","0.9.0":"2016-07-12T11:00:05.508Z","0.9.1":"2016-07-12T19:38:36.996Z","0.10.0":"2016-08-01T10:38:13.466Z","0.11.0":"2016-08-01T14:54:51.593Z","0.11.1":"2016-08-05T08:53:41.788Z","0.11.2":"2016-08-08T12:06:55.668Z","0.11.3":"2016-08-11T12:41:02.875Z","0.11.4":"2016-08-11T13:12:41.028Z","0.12.0":"2016-08-22T17:53:16.390Z","0.12.1":"2016-08-24T16:52:32.384Z","0.13.0":"2016-09-07T14:39:56.802Z","0.14.0":"2016-10-05T17:47:05.965Z","0.15.0":"2016-10-10T16:22:56.013Z","0.15.1":"2016-10-27T09:38:28.684Z","0.15.2":"2016-10-31T07:29:45.538Z","0.15.3":"2016-11-11T11:29:16.793Z","0.15.4":"2016-11-16T14:22:10.625Z","0.16.0":"2016-11-17T10:27:50.887Z","0.17.0":"2016-11-23T11:44:09.778Z","0.18.0":"2016-11-29T13:05:00.572Z","0.18.1":"2016-12-02T20:50:18.441Z","0.18.2":"2016-12-05T20:07:06.179Z","0.19.0":"2016-12-12T06:49:11.110Z","0.20.0":"2016-12-20T11:16:39.580Z","0.21.0":"2016-12-22T06:41:59.429Z","0.22.0":"2016-12-26T21:16:49.813Z","0.23.0":"2016-12-30T14:23:51.661Z","0.23.1":"2017-01-15T21:57:32.457Z","0.24.0":"2017-01-25T08:38:53.757Z","0.24.1":"2017-01-25T11:39:36.499Z","0.25.0":"2017-01-25T13:17:18.285Z","0.25.1":"2017-01-25T15:28:59.097Z","0.25.2":"2017-02-07T11:13:32.554Z","0.26.0":"2017-02-08T11:01:13.374Z","0.27.0":"2017-02-13T11:19:24.343Z","0.28.0":"2017-02-13T14:07:42.435Z","0.28.1":"2017-02-22T13:28:59.339Z","0.28.2":"2017-02-23T19:59:19.559Z","0.28.3":"2017-02-28T05:40:13.288Z","0.28.4":"2017-03-02T06:59:15.472Z","0.29.0":"2017-03-06T20:43:41.762Z","0.30.0":"2017-03-15T08:31:36.349Z","0.30.1":"2017-03-15T19:15:14.672Z","0.30.2":"2017-03-15T20:10:11.230Z","0.31.0":"2017-04-03T07:58:37.079Z","0.32.0":"2017-04-04T12:47:55.839Z","0.33.0":"2017-04-05T13:56:16.124Z","0.34.0":"2017-04-22T13:41:13.737Z","0.35.0":"2017-04-25T13:37:48.763Z","0.35.1":"2017-05-02T14:24:07.491Z","0.36.0":"2017-05-04T18:30:47.066Z","0.37.0":"2017-06-08T13:34:42.596Z","0.37.1":"2017-06-14T16:47:03.545Z","0.37.2":"2017-06-19T10:52:53.607Z","0.37.3":"2017-06-20T07:59:03.760Z","0.37.4":"2017-06-23T21:37:53.211Z","0.38.0":"2017-07-03T08:50:45.482Z","0.39.0":"2017-07-04T11:23:02.878Z","0.39.1":"2017-07-25T10:49:05.491Z","0.40.0":"2017-08-01T15:07:53.172Z","0.41.0":"2017-08-01T23:04:46.372Z","0.42.0":"2017-08-08T12:51:31.672Z","0.43.0":"2017-08-15T07:12:15.918Z","0.43.1":"2017-08-15T19:06:15.741Z","0.43.2":"2017-08-15T22:14:20.593Z","0.43.3":"2017-08-16T15:13:43.184Z","0.43.4":"2017-08-17T12:17:11.179Z","0.43.5":"2017-08-18T20:08:53.301Z","0.43.6":"2017-08-25T10:59:30.690Z","0.43.7":"2017-08-29T15:30:00.374Z","0.43.8":"2017-09-08T08:26:36.480Z","0.44.0":"2017-09-10T10:49:35.109Z","0.45.0":"2017-09-13T06:47:53.012Z","0.45.1":"2017-09-13T07:13:36.510Z","0.46.0":"2017-09-15T14:43:04.403Z","0.47.0":"2017-09-19T14:27:14.004Z","0.48.0":"2017-09-20T16:29:54.580Z","0.48.1":"2017-09-29T10:51:07.095Z","0.49.0":"2017-10-05T08:35:37.229Z","0.50.0":"2017-10-17T15:20:03.748Z","0.50.1":"2017-10-19T07:12:22.731Z","0.50.2":"2017-10-19T16:27:13.288Z","0.50.3":"2017-10-31T11:59:44.172Z","0.51.0":"2017-11-01T13:59:00.574Z","0.52.0":"2017-11-10T12:46:48.155Z","0.52.1":"2017-11-22T14:22:12.256Z","0.53.0":"2017-12-01T08:08:09.111Z","0.54.0":"2017-12-07T07:08:14.321Z","0.54.1":"2017-12-07T09:07:11.200Z","0.54.2":"2017-12-07T19:50:33.006Z","0.54.3":"2017-12-08T11:36:30.214Z","0.55.0":"2018-01-12T15:28:07.266Z","0.56.0":"2018-01-17T14:53:00.959Z","0.56.1":"2018-01-27T19:02:16.585Z","0.56.2":"2018-01-30T14:56:27.172Z","0.57.0":"2018-02-04T18:08:21.140Z","0.58.0":"2018-02-04T21:37:56.770Z","0.58.1":"2018-02-07T10:47:54.811Z","0.59.0":"2018-02-08T08:06:47.445Z","0.60.0":"2018-02-08T14:21:22.331Z","0.60.1":"2018-02-09T07:22:23.752Z","0.61.0":"2018-02-14T15:18:40.583Z","0.62.0":"2018-02-20T09:08:37.597Z","0.63.0":"2018-03-02T13:58:35.033Z","0.64.0":"2018-03-15T20:00:55.644Z","0.65.0":"2018-03-15T22:05:23.662Z","0.65.1":"2018-03-16T13:43:16.873Z","0.65.2":"2018-03-19T09:59:38.136Z","0.66.0":"2018-04-10T10:10:11.033Z","0.66.1":"2018-04-26T08:37:11.381Z","0.67.0":"2018-05-07T13:54:00.186Z","0.68.0":"2018-05-17T14:49:08.340Z","0.69.0":"2018-05-17T15:41:14.029Z","0.70.0":"2018-06-04T10:32:02.853Z","0.71.0":"2018-06-08T13:48:43.654Z","0.72.0":"2018-06-25T20:53:22.844Z","0.73.0":"2018-06-26T12:35:45.307Z","0.74.0":"2018-06-26T20:26:19.117Z","0.75.0":"2018-06-29T14:02:39.900Z","0.76.0":"2018-07-02T11:06:08.224Z","0.76.1":"2018-07-04T10:09:39.978Z","0.77.0":"2018-07-06T13:52:11.074Z","0.78.0":"2018-07-15T20:22:43.621Z","0.78.1":"2018-07-17T11:46:32.643Z","0.78.2":"2018-07-18T18:27:24.579Z","0.78.3":"2018-07-19T15:15:17.302Z","0.78.4":"2018-07-19T17:27:45.837Z","0.79.0":"2018-07-25T20:05:32.157Z","0.79.1":"2018-07-26T13:41:12.372Z","0.79.2":"2018-07-27T08:41:51.409Z","0.79.3":"2018-07-27T09:26:33.613Z","0.79.4":"2018-07-27T09:53:40.647Z","0.79.5":"2018-07-31T09:51:52.052Z","0.80.0":"2018-08-08T05:47:51.764Z","0.81.0":"2018-08-09T08:38:47.755Z","0.81.1":"2018-08-09T09:30:38.506Z","0.81.2":"2018-08-13T15:14:34.210Z","0.82.0":"2018-08-19T13:13:38.199Z","0.83.0":"2018-08-28T16:30:47.767Z","0.84.0":"2018-09-04T10:43:16.150Z","0.85.0":"2018-09-04T13:52:39.410Z","0.86.0":"2018-09-11T08:14:52.376Z","0.87.0":"2018-09-12T08:18:49.598Z","0.88.0":"2018-09-13T03:58:05.391Z","0.89.0":"2018-09-13T19:47:49.991Z","0.89.1":"2018-09-14T06:07:11.190Z","0.90.0":"2018-09-17T20:41:58.035Z","0.90.1":"2018-10-02T14:56:49.823Z","0.90.2":"2018-10-27T11:13:01.834Z","0.91.0":"2018-11-02T08:33:28.479Z","0.92.0":"2018-11-08T14:08:27.524Z","0.93.0":"2018-11-26T16:07:18.436Z","0.94.0":"2018-11-29T13:46:51.815Z","1.0.0":"2018-11-29T16:41:53.171Z","1.0.1":"2018-12-13T11:29:55.852Z","1.0.2":"2018-12-14T20:45:53.301Z","1.0.3":"2018-12-18T13:49:36.015Z","1.1.0":"2018-12-25T08:24:25.423Z","1.2.0":"2018-12-26T11:04:05.062Z","1.2.1":"2018-12-26T16:30:06.829Z","1.2.2":"2019-01-10T07:51:37.228Z","1.2.3":"2019-01-16T10:20:23.140Z","1.2.4":"2019-01-18T12:59:47.484Z","1.3.0":"2019-01-24T08:42:35.030Z","1.3.1":"2019-01-28T16:38:14.072Z","1.4.0":"2019-01-29T08:34:33.420Z","1.5.0":"2019-01-29T22:34:01.426Z","1.5.1":"2019-02-01T09:54:17.033Z","1.6.0":"2019-02-05T18:50:22.078Z","1.6.1":"2019-02-05T22:17:54.699Z","1.7.0":"2019-02-06T14:54:14.073Z","1.7.1":"2019-02-07T14:10:36.977Z","1.7.2":"2019-02-12T11:57:42.067Z","1.8.0":"2019-02-15T15:37:42.071Z","1.9.0":"2019-02-19T13:42:20.820Z","1.10.0":"2019-02-25T12:57:06.570Z","2.0.0":"2019-02-27T20:10:58.104Z","2.1.0-alpha.0":"2019-03-12T11:46:18.411Z","2.1.0":"2019-03-13T16:16:01.309Z","2.2.0":"2019-03-15T17:05:04.930Z","2.2.1":"2019-03-20T12:57:35.277Z","2.3.0":"2019-03-27T15:25:31.034Z","2.3.1":"2019-04-03T12:15:23.972Z","2.4.0":"2019-04-04T14:38:52.504Z","2.5.0":"2019-04-18T23:59:58.472Z","2.6.0":"2019-04-30T13:09:48.286Z","2.6.1":"2019-05-06T10:59:03.012Z","2.7.0":"2019-05-27T19:07:37.451Z","2.7.1":"2019-06-06T10:26:46.554Z","2.8.0":"2019-06-26T13:15:11.788Z","2.8.1":"2019-06-27T09:37:29.862Z","2.9.0":"2019-07-07T10:21:37.816Z","2.10.0":"2019-07-09T14:10:44.458Z","2.10.1":"2019-07-15T23:10:14.993Z","2.11.0":"2019-07-18T14:53:14.219Z","2.11.1":"2019-07-18T16:11:59.423Z","2.11.2":"2019-07-23T21:46:51.863Z","2.12.0":"2019-07-24T15:26:24.672Z","2.12.1":"2019-07-25T09:27:49.795Z","2.12.2":"2019-07-25T12:19:00.717Z","2.12.3":"2019-07-30T09:33:02.068Z","2.12.4":"2019-08-08T15:47:44.299Z","2.12.5":"2019-08-19T09:27:15.615Z","2.12.6-rc1":"2019-08-19T16:04:05.259Z","2.12.6-rc2":"2019-08-19T16:05:30.273Z","2.12.6":"2019-08-20T12:03:50.331Z","2.13.0":"2019-10-10T14:59:26.776Z","2.13.1":"2019-10-15T16:20:10.828Z","2.13.2":"2019-11-25T15:28:11.295Z","2.13.3":"2019-11-25T15:49:55.759Z","2.13.4":"2019-12-03T17:33:05.167Z","2.13.5":"2019-12-17T10:18:37.619Z","2.13.6":"2020-01-21T14:40:22.781Z","3.0.0":"2020-01-28T07:17:53.916Z","3.0.1":"2020-03-11T13:41:18.883Z","3.1.0":"2020-03-29T20:23:25.447Z","3.2.0":"2020-04-25T20:49:45.208Z","3.3.0":"2020-04-29T07:44:49.638Z","3.3.1":"2020-05-09T12:47:29.815Z","3.4.0":"2020-06-01T15:12:49.179Z","3.5.0":"2020-06-16T14:29:06.167Z","3.5.1":"2020-06-16T16:09:17.445Z","3.5.2":"2020-06-16T18:30:56.496Z","3.5.3":"2020-06-20T20:58:52.794Z","3.6.0":"2020-06-24T07:12:28.113Z","3.7.0":"2020-07-02T07:33:36.321Z","3.7.1":"2020-07-02T17:45:11.855Z","3.8.0":"2020-07-08T10:18:30.330Z","3.8.1":"2020-07-17T09:38:12.301Z","3.8.2":"2020-08-07T13:33:59.320Z","3.8.3":"2020-08-11T12:24:31.672Z","3.8.4":"2020-08-12T14:58:58.905Z","3.8.5":"2020-08-23T17:17:53.441Z","3.8.6":"2020-09-18T20:28:51.066Z","3.8.7":"2020-09-25T11:44:25.225Z","3.9.0":"2020-09-27T06:44:09.966Z","3.9.1":"2020-11-13T18:17:40.874Z","3.10.0":"2020-12-14T07:47:02.962Z","3.10.1":"2020-12-14T10:28:03.611Z","3.10.2":"2021-01-14T19:01:35.421Z","3.10.3":"2021-02-03T08:49:28.516Z","3.10.4":"2021-02-18T12:37:50.201Z","3.11.0":"2021-02-25T21:10:52.245Z","4.0.0-alpha.0":"2021-03-10T13:42:09.509Z","4.0.0-alpha.1":"2021-03-29T21:32:59.012Z","4.0.0-alpha.2":"2021-04-05T15:01:18.712Z","4.0.0-alpha.3":"2021-04-20T18:49:08.605Z","4.0.0-alpha.4":"2021-04-20T20:21:43.919Z","4.0.0-alpha.5":"2021-04-21T09:52:07.227Z","4.0.0-alpha.6":"2021-05-27T13:17:54.014Z","3.11.1":"2021-05-27T13:32:11.553Z","4.0.0-alpha.7":"2021-06-10T10:17:14.464Z","4.0.0-alpha.8":"2021-06-10T10:50:29.821Z","4.0.0-alpha.9":"2021-06-24T08:50:14.180Z","4.0.0":"2021-06-28T10:24:20.126Z","4.1.0":"2021-06-28T22:39:35.548Z","3.11.2":"2021-07-01T13:14:35.321Z","4.1.1":"2021-07-02T15:16:10.211Z","4.1.2":"2021-07-06T08:58:38.365Z","3.11.3":"2021-07-06T09:28:27.822Z","4.1.3":"2021-07-06T10:43:39.090Z","4.1.4":"2021-07-07T11:48:37.974Z","4.2.0":"2021-08-10T17:21:25.697Z","4.2.1":"2021-08-17T21:13:44.089Z","4.2.2":"2021-08-23T15:14:49.837Z","4.3.0":"2021-08-24T13:13:13.217Z","4.4.0":"2021-08-26T14:47:07.787Z","4.4.1":"2021-09-03T11:20:49.107Z","3.11.4":"2021-09-09T14:54:14.539Z","4.4.2":"2021-09-09T15:01:23.376Z","3.12.0":"2021-09-16T10:18:32.700Z","3.12.1":"2021-09-17T14:00:09.002Z","4.4.3":"2021-09-17T14:08:11.280Z","4.4.4":"2021-10-01T08:23:21.382Z","4.5.0":"2021-10-11T18:05:29.016Z","4.6.0":"2021-10-12T14:10:21.459Z","4.6.1":"2021-10-13T11:34:08.927Z","4.6.2":"2021-10-13T15:00:06.439Z","4.6.3":"2021-10-13T15:26:37.219Z","4.6.4":"2021-10-15T10:02:54.769Z","4.7.0":"2021-11-08T09:35:09.158Z","4.7.1":"2021-11-08T16:39:05.946Z","4.7.2":"2021-11-11T17:07:42.981Z","4.7.3":"2021-11-22T15:03:48.301Z","4.7.4":"2021-11-24T15:06:07.725Z","4.7.5":"2021-12-15T07:20:07.778Z","4.7.6":"2022-01-26T17:53:51.907Z","4.7.7":"2022-02-07T14:49:52.626Z","4.7.8":"2022-03-04T12:01:31.482Z","4.8.0":"2022-03-22T09:47:27.206Z","3.13.0":"2022-05-05T12:58:53.132Z","4.9.0":"2022-05-24T15:20:43.499Z","4.9.1":"2022-05-24T23:50:55.179Z","5.0.0":"2022-06-11T20:27:45.128Z","5.0.1":"2022-06-29T12:23:45.736Z","5.1.0":"2022-08-15T15:39:02.711Z","5.1.1":"2022-08-19T09:09:38.442Z","5.1.2":"2022-08-29T16:15:41.917Z","5.2.0":"2022-08-30T19:12:39.905Z","5.2.1":"2022-09-08T21:29:36.930Z","5.2.2":"2022-09-09T18:35:54.208Z","5.3.0":"2022-10-10T13:35:45.025Z","5.3.1":"2022-10-11T08:08:17.532Z","5.4.0":"2022-11-08T21:22:18.128Z","5.4.1":"2022-11-15T23:59:49.081Z","5.5.0":"2022-11-21T17:33:42.409Z","5.5.1":"2022-11-21T19:31:24.308Z","5.5.2":"2022-11-23T15:57:00.826Z","5.6.0":"2022-12-06T19:47:52.247Z","5.6.1":"2022-12-13T17:38:35.088Z","6.0.0":"2022-12-21T23:20:29.328Z","6.0.1":"2023-01-09T10:42:36.427Z","6.0.2":"2023-01-11T18:04:46.082Z","6.0.3":"2023-01-20T01:38:18.173Z","6.1.0":"2023-01-30T10:23:10.864Z","6.1.1":"2023-01-30T14:24:06.114Z","5.6.2":"2023-02-15T11:24:32.094Z","7.0.0":"2023-03-30T12:26:27.231Z","7.0.1":"2023-03-31T10:54:51.093Z","7.0.2":"2023-04-03T16:10:16.752Z","7.0.3":"2023-04-04T13:18:16.651Z","5.6.3":"2023-04-06T11:46:05.768Z","7.0.4":"2023-04-06T12:19:56.438Z","6.1.2":"2023-04-06T17:53:22.421Z","6.1.3":"2023-04-13T19:30:19.140Z","7.0.5":"2023-04-27T11:30:17.370Z","7.0.6":"2023-05-02T11:14:40.333Z","7.0.7":"2023-05-02T21:26:08.067Z","7.0.8":"2023-05-03T12:01:06.013Z","7.0.9":"2023-05-30T15:30:42.992Z","7.1.0":"2023-06-14T09:11:15.976Z","8.0.0-beta.0":"2023-06-21T05:47:34.423Z","8.0.0-beta.1":"2023-07-04T11:41:55.748Z","7.1.1":"2023-07-04T12:58:25.178Z","6.1.4":"2023-07-04T14:18:56.708Z","5.6.4":"2023-07-04T14:35:08.875Z","4.9.2":"2023-07-04T16:20:11.335Z","7.1.2":"2023-08-04T13:00:51.034Z","7.1.3":"2023-08-16T11:29:40.272Z","7.1.4":"2023-08-22T10:04:32.895Z","8.0.0-beta.2":"2023-09-06T15:55:10.892Z","7.1.5":"2023-09-26T11:16:33.710Z","7.1.6":"2023-09-27T08:24:46.233Z","7.2.0":"2023-10-18T08:17:56.879Z","7.3.0":"2023-10-19T13:01:23.313Z","8.0.0-beta.3":"2023-11-14T22:07:17.576Z","7.3.1":"2023-11-29T10:56:56.193Z","7.4.0":"2023-12-01T13:10:33.782Z","7.4.1":"2023-12-19T12:09:44.001Z","7.5.0":"2023-12-28T09:23:49.289Z","7.5.1":"2024-01-16T14:12:54.466Z","8.0.0":"2024-01-17T13:42:20.629Z","8.0.1":"2024-01-23T09:43:25.528Z","7.5.2":"2024-01-24T14:49:06.956Z","8.0.2":"2024-01-24T14:51:51.245Z","8.0.3":"2024-01-24T15:28:07.267Z","8.0.4":"2024-01-25T19:07:08.430Z","8.0.5":"2024-01-31T13:54:29.715Z","8.0.6":"2024-02-12T13:56:14.147Z","7.5.4":"2024-02-12T14:24:39.660Z","8.1.0":"2024-02-20T10:39:11.581Z","8.2.0":"2024-02-29T19:58:04.654Z","8.2.1":"2024-03-04T15:09:48.168Z","9.0.0-rc.0":"2024-03-07T10:17:37.071Z","9.0.0-rc.1":"2024-03-07T11:39:21.637Z","8.2.2":"2024-03-07T14:51:00.881Z","8.3.0":"2024-03-12T12:09:08.371Z","8.4.0":"2024-03-13T16:29:19.532Z","8.4.1":"2024-03-14T09:32:03.214Z","8.5.0":"2024-03-18T14:29:46.255Z","8.5.1":"2024-03-20T21:24:08.169Z","8.5.2":"2024-03-26T12:29:57.209Z","8.6.0":"2024-03-26T15:30:54.561Z","8.7.0":"2024-03-27T12:17:24.875Z","8.7.1":"2024-03-28T15:28:23.989Z","8.7.2":"2024-03-29T11:35:05.789Z","7.5.5":"2024-04-01T10:36:18.076Z","8.8.0":"2024-04-03T13:45:08.382Z","8.8.1":"2024-04-05T13:25:55.542Z","7.5.6":"2024-04-05T13:49:36.471Z","8.9.0":"2024-04-18T19:02:27.618Z","8.9.1":"2024-04-24T12:30:30.314Z","8.9.2":"2024-05-15T09:51:12.113Z","8.9.3":"2024-05-16T14:18:25.389Z","7.5.7":"2024-05-17T08:32:14.671Z","7.5.8-rc.1":"2024-05-23T11:01:59.476Z","8.9.4":"2024-05-29T11:10:13.273Z","8.9.5":"2024-05-29T14:27:40.438Z","8.9.6":"2024-06-14T15:31:33.521Z"},"maintainers":[{"name":"miripiruni","email":"miripiruni@gmail.com"},{"name":"egavr","email":"job.egavr@yandex.ru"},{"name":"mcheshkov","email":"mcheshkov@gmail.com"},{"name":"j0tunn","email":"j0tunn@ya.ru"},{"name":"unlok","email":"unlok@yandex-team.ru"},{"name":"dudagod","email":"dudkevich@yandex-team.ru"},{"name":"kolesnikovde","email":"kolesnikovde@gmail.com"},{"name":"sipayrt","email":"sipayrt@yandex.ru"},{"name":"rostik404","email":"shtanko243@gmail.com"},{"name":"kvmamich","email":"kvmamich@gmail.com"},{"name":"xrsd","email":"rashid.online@ya.ru"},{"name":"oldskytree","email":"ilyashassen@gmail.com"},{"name":"shadowusr","email":"nikhakerlab@mail.ru"},{"name":"kuznetsovroman","email":"kuznetsov.roman.orenburg@gmail.com"}],"repository":{"type":"git","url":"git://github.com/gemini-testing/hermione.git"},"keywords":["hermione","webdriverio","mocha","test"],"license":"MIT","homepage":"https://github.com/gemini-testing/hermione#readme","bugs":{"url":"https://github.com/gemini-testing/hermione/issues"},"readme":"# Hermione\n\n> ⚠️ This project has been renamed to [testplane](https://www.npmjs.com/package/testplane), which is backward compatible and you can migrate to it very quickly. More info [here](https://github.com/gemini-testing/testplane/tree/master?tab=readme-ov-file#rename-from-hermione).\n\nHermione is a utility for integration testing of web pages using [WebdriverIO](https://webdriver.io/docs/api) and [Mocha](https://mochajs.org).\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n- [Why you should choose hermione](#why-you-should-choose-hermione)\n  - [Easy to use](#easy-to-use)\n  - [Runs tests in parallel](#runs-tests-in-parallel)\n  - [Runs tests in subprocesses](#runs-tests-in-subprocesses)\n  - [Extensible](#extensible)\n  - [Built-in assert library](#built-in-assert-library)\n  - [Retries failed tests](#retries-failed-tests)\n  - [Executes separate tests](#executes-separate-tests)\n  - [Skips tests in specific browsers](#skips-tests-in-specific-browsers)\n  - [Override browser configuration for test](#override-browser-configuration-for-test)\n    - [`version(<browserVersion>)`](#versionbrowserversion)\n  - [Offers flexible test configuration](#offers-flexible-test-configuration)\n  - [Automatically initializes and closes grid sessions](#automatically-initializes-and-closes-grid-sessions)\n  - [Fairly waits for screen rotate](#fairly-waits-for-screen-rotate)\n- [Prerequisites](#prerequisites)\n  - [Selenium-standalone](#selenium-standalone)\n- [Quick start](#quick-start)\n  - [Using create-hermione-app (a quick way)](#using-create-hermione-app-a-quick-way)\n  - [Configuring .hermione.conf.js by yourself (a slow way)](#configuring-hermioneconfjs-by-yourself-a-slow-way)\n    - [Chrome Devtools Protocol](#chrome-devtools-protocol)\n    - [Webdriver protocol](#webdriver-protocol)\n- [Commands API](#commands-api)\n  - [Browser commands](#browser-commands)\n    - [clearSession](#clearsession)\n  - [Element commands](#element-commands)\n    - [moveCursorTo](#movecursorto)\n- [Tests API](#tests-api)\n  - [Arguments](#arguments)\n  - [Hooks](#hooks)\n  - [Skip](#skip)\n  - [Only](#only)\n  - [Config overriding](#config-overriding)\n    - [testTimeout](#testtimeout)\n  - [WebdriverIO extensions](#webdriverio-extensions)\n    - [Sharable meta info](#sharable-meta-info)\n    - [Execution context](#execution-context)\n  - [AssertView](#assertview)\n  - [RunStep](#runstep)\n  - [OpenAndWait](#openandwait)\n- [Typescript usage](#typescript-usage)\n  - [hermione.ctx typings](#hermionectx-typings)\n- [.hermione.conf.js](#hermioneconfjs)\n  - [sets](#sets)\n  - [browsers](#browsers)\n    - [desiredCapabilities](#desiredcapabilities)\n    - [gridUrl](#gridurl)\n    - [baseUrl](#baseurl)\n    - [browserWSEndpoint](#browserwsendpoint)\n    - [automationProtocol](#automationprotocol)\n    - [sessionEnvFlags](#sessionenvflags)\n    - [httpTimeout](#httptimeout)\n    - [urlHttpTimeout](#urlhttptimeout)\n    - [pageLoadTimeout](#pageloadtimeout)\n    - [sessionRequestTimeout](#sessionrequesttimeout)\n    - [sessionQuitTimeout](#sessionquittimeout)\n    - [testTimeout](#testtimeout-1)\n    - [waitTimeout](#waittimeout)\n    - [waitInterval](#waitinterval)\n    - [sessionsPerBrowser](#sessionsperbrowser)\n    - [takeScreenshotOnFails](#takescreenshotonfails)\n    - [takeScreenshotOnFailsMode](#takescreenshotonfailsmode)\n    - [takeScreenshotOnFailsTimeout](#takescreenshotonfailstimeout)\n    - [testsPerSession](#testspersession)\n    - [retry](#retry)\n    - [shouldRetry](#shouldretry)\n    - [calibrate](#calibrate)\n    - [meta](#meta)\n    - [windowSize](#windowsize)\n    - [screenshotDelay](#screenshotdelay)\n    - [orientation](#orientation)\n    - [waitOrientationChange](#waitorientationchange)\n    - [resetCursor](#resetcursor)\n    - [tolerance](#tolerance)\n    - [antialiasingTolerance](#antialiasingtolerance)\n    - [compareOpts](#compareopts)\n    - [buildDiffOpts](#builddiffopts)\n    - [assertViewOpts](#assertviewopts)\n    - [openAndWaitOpts](#openandwaitopts)\n    - [screenshotsDir](#screenshotsdir)\n    - [strictTestsOrder](#stricttestsorder)\n    - [compositeImage](#compositeimage)\n    - [screenshotMode](#screenshotmode)\n    - [saveHistoryMode](#savehistorymode)\n    - [agent](#agent)\n    - [headers](#headers)\n    - [transformRequest](#transformrequest)\n    - [transformResponse](#transformresponse)\n    - [strictSSL](#strictssl)\n    - [user](#user)\n    - [key](#key)\n    - [region](#region)\n    - [headless](#headless)\n    - [isolation](#isolation)\n  - [system](#system)\n    - [debug](#debug)\n    - [mochaOpts](#mochaopts)\n    - [expectOpts](#expectopts)\n    - [ctx](#ctx)\n    - [patternsOnReject](#patternsonreject)\n    - [workers](#workers)\n    - [testsPerWorker](#testsperworker)\n    - [parallelLimit](#parallellimit)\n    - [fileExtensions](#fileextensions)\n  - [plugins](#plugins)\n    - [Parallel execution plugin code](#parallel-execution-plugin-code)\n    - [List of useful plugins](#list-of-useful-plugins)\n  - [prepareBrowser](#preparebrowser)\n  - [prepareEnvironment](#prepareenvironment)\n  - [devServer](#devserver)\n- [CLI](#cli)\n  - [Reporters](#reporters)\n  - [Require modules](#require-modules)\n  - [Overriding settings](#overriding-settings)\n  - [Debug mode](#debug-mode)\n  - [REPL mode](#repl-mode)\n    - [switchToRepl](#switchtorepl)\n    - [Test development in runtime](#test-development-in-runtime)\n      - [How to set up using VSCode](#how-to-set-up-using-vscode)\n      - [How to set up using Webstorm](#how-to-set-up-using-webstorm)\n  - [Environment variables](#environment-variables)\n    - [HERMIONE_SKIP_BROWSERS](#hermione_skip_browsers)\n    - [HERMIONE_SETS](#hermione_sets)\n- [Programmatic API](#programmatic-api)\n  - [config](#config)\n  - [events](#events)\n  - [errors](#errors)\n    - [CoreError](#coreerror)\n    - [CancelledError](#cancellederror)\n    - [ClientBridgeError](#clientbridgeerror)\n    - [HeightViewportError](#heightviewporterror)\n    - [OffsetViewportError](#offsetviewporterror)\n    - [AssertViewError](#assertviewerror)\n    - [ImageDiffError](#imagedifferror)\n    - [NoRefImageError](#norefimageerror)\n  - [intercept](#intercept)\n  - [run](#run)\n  - [addTestToRun](#addtesttorun)\n  - [readTests](#readtests)\n  - [isFailed](#isfailed)\n  - [isWorker](#isworker)\n  - [halt](#halt)\n  - [Test Collection](#test-collection)\n  - [Test Parser API](#test-parser-api)\n    - [setController(name, methods)](#setcontrollername-methods)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Why you should choose hermione\n`Hermione` provides several features that `WebdriverIO` doesn't, and makes the testing process easier.\n\n### Easy to use\nIf you are familiar with [WebdriverIO](http://webdriver.io/) and [Mocha](https://mochajs.org), you can start writing and running tests in 5 minutes! You need to install `hermione` via npm and add a tiny config to your project. For details, see the [Quick start](#quick-start) section.\n\n### Runs tests in parallel\nWhen tests are run one by one, it takes a lot of time. `Hermione` can run tests in parallel sessions in different browsers out of the box.\n\n### Runs tests in subprocesses\nRunning of too many tests in parallel can lead to the overloading of the main process CPU usage which causes degradation in test passing time, so Hermione runs all tests in subprocesses in order to solve this problem.\n\n### Extensible\n`WebdriverIO` provides built-in commands for browser and page manipulation. Often projects need to store some common code and reuse it throughout all tests, so the developer needs to create some helpers and include them in the tests.\n\nWith `hermione` this is very simple and straightforward. You can add any number of custom commands in the hermione config and use them as `browser.myCustomCommand` in tests.\n\nMoreover, `hermione` provides plugins that work like hooks. They allow the developer to prepare the testing environment and react properly to test execution events.\n\n### Built-in assert library\nwhen writing integration tests, we need to check for various conditions, such as that a button element has certain attributes. So hermione provides global `expect` variable that gives you access to a number of `matchers` that let you validate different things on the browser, an element or mock object. More about using `expect` and its API you can find [here](https://webdriver.io/docs/api/expect-webdriverio/).\n\n### Retries failed tests\nIntegration tests use a dynamic environment with a lot of dependencies, where any of them could be unstable from time to time. As a result, integration tests turn red randomly, which makes them imprecise. This spoils the entire testing process.\n\nTo prevent incidental fails, `hermione` retries a failed test before marking it as failed. This makes it possible to get rid of a majority of incidental fails. The number of retries can be specified for all browsers or for a specific browser.\n\n:warning: `Hermione` reruns tests in a new browser session to exclude situations when the browser environment is the cause of the failure.\n\n### Executes separate tests\nSometimes you only need to run specific tests, not all the tests in a set. `Hermione` makes this possible. You can specify the path to the test file\n```\nhermione tests/func/mytest.js\n```\n\nor filter describes by using the `--grep` option\n\n```\nhermione --grep login\n```\n\nor simply use the `mocha` `only()` API in the test\n\n```js\ndescribe.only('user login', function() {...});\n```\n\n### Skips tests in specific browsers\nSometimes you need to skip a test just in a specific browser, not in all browsers. For example, you don't need to run\nsome test in ~~ugly~~ IE browsers. In `hermione` you can do this with [hermione helper](#skip). For example,\nyou can skip some tests in a specific browser\n```js\ndescribe('feature', function() {\n    hermione.skip.in('ie8', 'it cannot work in this browser');\n    it('nowaday functionality', function() {...});\n});\n```\n\nor run tests in just one browser\n```js\ndescribe('feature', function() {\n    // will be skipped in all browsers except Chrome\n    hermione.skip.notIn('chrome', 'it should work only in Chrome');\n    it('specific functionality', function() {...});\n});\n```\n\nIn these cases you will see messages in reports with the reason for skipping.\n\nTo skip a suite or test silently (without any messages in reports), you can pass the third argument with the silent flag:\n```js\nhermione.skip.in('ie8', 'skipReason', {silent: true});\n// or\nhermione.skip.notIn('chrome', 'skipReason', {silent: true});\n```\n\nOr you can use another hermione helper, [only](#only), which is silent by default:\n```js\nhermione.only.in('chrome');\n// or\nhermione.only.notIn('ie8');\n```\n\n`hermione.only.in` will run tests only in the specified browsers and skip the rest silently.\n\n`hermione.only.notIn` will run tests in all browsers except the specified ones.\n\n### Override browser configuration for test\n`Hermione` allows you to override a browser configuration for each test or a whole suite.\nEach method of `hermione.browser(<browserName>)` provide chaining.\n\n#### `version(<browserVersion>)`\n\n```js\n// change the browser version for all chindren\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    // ...\n});\n```\n\n```js\n// change the browser version for a specific test\nhermione.browser('chrome').version('70.3');\nit('test', function() {...});\n```\n\n```js\nhermione.browser('chrome').version('70.3');\ndescribe('suite', function() {\n    it('test 1', function() {...});\n\n    // this call will override the version only for test below\n    hermione.browser('chrome').version('70.1');\n    it('test 2', function() {...});\n});\n```\n\n### Offers flexible test configuration\n`Hermione` lets you configure running some set of tests in specific browsers. For example,\n```js\nsets: {\n    desktop: {\n        files: 'tests/desktop',\n        browsers: ['ie8', 'opera']\n    },\n    touch: {\n        files: 'tests/touch',\n        browsers: ['iphone', 'android']\n    }\n}\n```\nSee [sets](#sets) for more details.\n\n\n### Automatically initializes and closes grid sessions\nAll work with the grid client is encapsulated in hermione. Forget about `client.init` and `client.end` in your tests ;)\n\n### Fairly waits for screen rotate\nRequest `/session/:sessionId/orientation` is not a part of the official Webdriver specification, so commands `orientation` and `setOrientation` which are provided by client `webdriverio` from the box do not guarantee screen rotate before the next command will start to execute, but `Hermione` solves this problem.\n\n## Prerequisites\nAll you need are browsers that `Hermione` could use for testing. To do this you need to install some browsers, such as [chrome](https://www.google.com/chrome/) (to automate this process you can use the [hermione-headless-chrome](https://github.com/gemini-testing/hermione-headless-chrome) plugin).\n\nNext, you have two ways to configure `Hermione` to work with browsers:\n\n* Using the devtools protocol (available only for `Chromium`-based browsers). This method does not need to be pre-configured. Just go to the [quick start](#quick-start).\n* Using the webdriver protocol. In this case you need to set up [Selenium](http://www.seleniumhq.org/) grid. The simplest way to get started is to use one of the NPM selenium standalone packages, such as [vvo/selenium-standalone](https://github.com/vvo/selenium-standalone). For more information about setting up, see [selenium-standalone](#selenium-standalone).\n\n### Selenium-standalone\nInstall `selenium-standalone` by command:\n\n```\nnpm i -g selenium-standalone\n```\n\nNext you need to install browser drivers\n\n```\nselenium-standalone install\n```\n\nand run your server by executing\n\n```\nselenium-standalone start\n```\n\n:warning: If you will get error like `No Java runtime present, requesting install.` you should install [Java Development Kit (JDK)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) for your OS.\n\n## Quick start\nFirst of all, make sure that all [prerequisites](#prerequisites) are satisfied.\n\nNow you have two ways to configure project.\n\n### Using create-hermione-app (a quick way)\n\nYou just need to run the cli command from [create-hermione-app](https://github.com/gemini-testing/create-hermione-app) tool and answer a few questions:\n```\nnpm init hermione-app YOUR_PROJECT_PATH\n```\n\nTo skip all questions just add the option `-y` at the end.\n\n### Configuring .hermione.conf.js by yourself (a slow way)\n\nCreate hermione config file with name `.hermione.conf.js` in the project root. There are two configuration options depending on the method selected in the `prerequisites` section.\n\n#### Chrome Devtools Protocol\n\n```javascript\nmodule.exports = {\n    sets: {\n        desktop: {\n            files: 'tests/desktop/**/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'devtools',\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n#### Webdriver protocol\n\n```javascript\nmodule.exports = {\n    gridUrl: 'http://localhost:4444/wd/hub',\n\n    sets: {\n        desktop: {\n            files: 'tests/desktop/*.hermione.js'\n        }\n    },\n\n    browsers: {\n        chrome: {\n            automationProtocol: 'webdriver', // default value\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\nWrite your first test in `tests/desktop/github.hermione.js` file.\n```javascript\ndescribe('github', function() {\n    it('should check repository name', async ({ browser }) => {\n        await browser.url('https://github.com/gemini-testing/hermione');\n\n        await expect(browser.$('#readme h1')).toHaveText('Hermione');\n    });\n});\n```\n\nFinally, run tests (be sure that you have already run `selenium-standalone start` command in next tab).\n```\nnode_modules/.bin/hermione\n```\n\n## Commands API\n\nSince Hermione is based on [WebdriverIO v8](https://webdriver.io/docs/api/), all the commands provided by WebdriverIO are available in it. But Hermione also has her own commands.\n\n### Browser commands\n\n#### clearSession\n\nBrowser command that clears session state (deletes cookies, clears local and session storages). For example:\n\n```js\nit('test', async ({ browser }) => {\n    await browser.url('https://github.com/gemini-testing/hermione');\n\n    (await browser.getCookies()).length; // 5\n    await browser.execute(() => localStorage.length); // 2\n    await browser.execute(() => sessionStorage.length); // 1\n\n    await browser.clearSession();\n\n    (await browser.getCookies()).length; // 0\n    await browser.execute(() => localStorage.length); // 0\n    await browser.execute(() => sessionStorage.length); // 0\n});\n```\n\n### Element commands\n\n#### moveCursorTo\n\n> This command is temporary and will be removed in the next major (hermione@9). Differs from the standard [moveTo](https://webdriver.io/docs/api/element/moveTo/) in that it moves the cursor relative to the top-left corner of the element (like it was in hermione@7).\n\nMove the mouse by an offset of the specified element. If offset is not specified then mouse will be moved to the top-left corder of the element.\n\nUsage:\n\n```typescript\nawait browser.$(selector).moveCursorTo({ xOffset, yOffset });\n```\n\nAvailable parameters:\n\n* **xOffset** (optional) `Number` – X offset to move to, relative to the top-left corner of the element;\n* **yOffset** (optional) `Number` – Y offset to move to, relative to the top-left corner of the element.\n\n## Tests API\n\n### Arguments\nHermione calls test and hook callback with one argument. This argument is an object with the next properties:\n- **browser** - browser client\n- **currentTest** - current executing test\n\nExample:\n```js\nbeforeEach(async ({ browser, currentTest }) => {\n    await browser.url(`/foo/bar?baz=${currentTest.id}`);\n});\n\nafterEach(async ({ browser, currentTest }) => {\n    // Do some post actions with browser\n});\n\nit('some test', async ({ browser, currentTest }) => {\n    await browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\nYou also can pass any data into your test through parameters:\n```js\nbeforeEach(async (opts) => {\n    opts.bar = 'bar';\n});\n\nit('some test', async ({ browser, bar }) => {\n    await browser.url(`/foo/${bar}`);\n\n    // Do some actions and asserts\n});\n```\n\n**browser** and **currentTest** also available through callback context:\n```js\nbeforeEach(async function() {\n    await this.browser.url(`/foo/bar?baz=${this.currentTest.id}`);\n});\n\nafterEach(async function() {\n    // Do some post actions with this.browser\n});\n\nit('some test', async function() {\n    await this.browser.click('.some-button');\n\n    // Do some actions and asserts\n});\n```\n\n### Hooks\n\n`before` and `after` hooks **are forbidden** in `hermione`, you should use `beforeEach` and `afterEach` hooks instead. This feature was implemented in order to ensure better stability while running tests and make them independent of each other.\n\n### Skip\nThis feature allows you to ignore the specified suite or test in any browser, with an additional comment.\nYou can do this by using the global `hermione.skip` helper. It supports the following methods:\n\n - `.in` – Adds matchers for browsers with the additional comment.\n - `.notIn` – `.in` method with the reverted value.\n\nEach of these methods takes the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} – Matcher for browser(s) to skip.\n - [comment] {String} – Comment for skipped test.\n - [options] {Object} – Additional options.\n\n**Note that matchers will be compared with `browserId` specified in the config file, e.g. `chrome-desktop`.**\n\nFor example,\n```js\ndescribe('feature', function() {\n    hermione.skip.in('chrome', \"It shouldn't work this way in Chrome\");\n    it('should work this way', function() {\n        return runTestThisWay();\n    });\n\n    it('should work that way', function() {\n        return runTestThatWay();\n    });\n\n    hermione.skip.in(['chrome', 'firefox', /ie\\d*/], 'Unstable test, see ticket TEST-487');\n    it('should have done some tricky things', function() {\n        return runTrickyTest();\n    });\n});\n```\n\nIn this case, the behaviour `it should work this way` will be skipped only in `chrome` browser, but will be run in other browsers. `It should work that way` will not be ignored. So only the nearest test will be skipped. If you need to skip all tests within a suite, you can apply the `skip` helper to a `describe` so all tests within this suite will be skipped with the same comment.\n```js\nhermione.skip.in('chrome', 'skip comment');\ndescribe('some feature', function() {\n    it(...);\n    it(...);\n});\n```\n\nYou can also use the `.notIn` method to invert matching. For example,\n```js\n// ...\nhermione.skip.notIn('chrome', 'some comment');\nit('should work this way', function() {\n    return doSomething();\n});\n// ...\n```\n\nIn this case, the test will be skipped in all browsers except `chrome`.\n\nAll of these methods are chainable, so you can skip a test in several browsers with different comments. For example,\n```js\n// ...\nhermione.skip\n    .in('chrome', 'some comment')\n    .notIn('ie9', 'another comment');\nit('test1', function() {\n    return doSomething();\n});\n// ...\n```\n\nIf you need to skip a test in all browsers without a comment, you can use [mocha `.skip` method](http://mochajs.org/#inclusive-tests) instead of `hermione.skip.in(/.*/);`. The result will be the same.\n\n### Only\nThis feature allows you to ignore the specified suite or test in any browser silently (without any messages in reports).\nYou can do this by using the global `hermione.only` helper. It supports two methods:\n\n- `.in` — The `hermione.skip.notIn` method with the silent flag,\n- `.notIn` — The `hermione.skip.in` with the silent flag.\n\nThese methods take the following arguments:\n\n - browser {String|RegExp|Array<String|RegExp>} — A matcher for browser(s) to skip.\n\nFor example:\n```js\n// ...\nhermione.only.in('chrome');\n\nit('should work this way', function() {\n    return doSomething();\n});\n```\nThe test will be skipped all browsers **silently** except in `chrome`.\n\n```js\nhermione.only.notIn('ie9');\nit('should work another way', function() {\n    return doSomething();\n});\n```\nThe test will be processed in all browsers and **silently** skipped in `ie9`.\n\n### Config overriding\nYou can override some config settings for specific test, suite or hook via `hermione.config.*` notation.\n\n#### testTimeout\nOverrides [testTimeout](#testtimeout-1) config setting. Can be set for tests and suites.\n\n```js\nhermione.config.testTimeout(100500);\nit('some test', function() {\n    return doSomething();\n});\n```\n\n### WebdriverIO extensions\n`Hermione` adds some useful methods and properties to the `webdriverio` session after its initialization.\n\n#### Sharable meta info\nImplemented via two commands:\n\n* setMeta(key, value)\n* getMeta([key])\n\nThese methods allow you to store some information between webdriver calls and it can then be used in custom commands, for instance. This meta information will be shown in the [html-reporter](https://github.com/gemini-testing/html-reporter).\n\n**Note**: hermione saves the last URL opened in the browser in meta info.\n\nExample:\n```js\nit('test1', async ({ browser }) => {\n    await browser.setMeta('foo', 'bar');\n    await browser.url('/foo/bar?baz=qux');\n\n    const val = await browser.getMeta('foo');\n    console.log(val); // prints 'bar'\n\n    const url = await browser.getMeta('url');\n    console.log(url); // prints '/foo/bar?baz=qux'\n\n    const meta = await browser.getMeta();\n    console.log(meta); // prints `{foo: 'bar', url: '/foo/bar?baz=qux'}`\n});\n```\n\n#### Execution context\nThe execution context can be accessed by the `browser.executionContext` property, which contains the current test/hook object extended with the browser id.\n\nExample:\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('/foo/bar');\n    console.log('test', browser.executionContext);\n});\n```\nwill print something like this\n```\ntest: {\n  \"title\": \"some test\",\n  \"async\": 0,\n  \"sync\": true,\n  \"timedOut\": false,\n  \"pending\": false,\n  \"type\": \"test\",\n  \"body\": \"...\",\n  \"file\": \"/foo/bar/baz/qux.js\",\n  \"parent\": \"#<Suite>\",\n  \"ctx\": \"#<Context>\",\n  \"browserId\": \"chrome\",\n  \"meta\": {},\n  \"timer\": {}\n}\n```\n\n### AssertView\n\nCommand that adds ability to take screenshot for test state. Each state should have his own unique name. For example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView('plain', '.button');\n\n    await browser.click('.button');\n    await browser.assertView('clicked', '.button');\n});\n```\n\nCould also be used as element's method:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n\n    const elem = await browser.$('.button');\n\n    await elem.assertView('plain');\n    await elem.click();\n    await elem.assertView('clicked');\n});\n```\n\n*Note: assertView will trigger [waitForExist](https://webdriver.io/docs/api/element/waitForExist/) with [waitTimeout](#waittimeout) and [waitInterval](#waitinterval)*\n\nParameters:\n\n - state (required) `String` – state name; should be unique within one test\n - selector (required) `String|String[]` – DOM-node selector that you need to capture\n - opts (optional) `Object`:\n   - ignoreElements (optional) `String|String[]` – elements, matching specified selectors will be ignored when comparing images\n   - tolerance (optional) `Number` – overrides config [browsers](#browsers).[tolerance](#tolerance) value\n   - antialiasingTolerance (optional) `Number` – overrides config [browsers](#browsers).[antialiasingTolerance](#antialiasingTolerance) value\n   - ignoreDiffPixelCount (optional) `Number | string` - the maximum amount of different pixels to still consider screenshots \"the same\". For example, when set to 5, it means that if there are 5 or fewer different pixels between two screenshots, they will still be considered the same. Alternatively, you can also define the maximum difference as a percentage (for example, 3%) of the image size. This option is useful when you encounter a few pixels difference that cannot be eliminated using the tolerance and antialiasingTolerance settings. The default value is 0.\n   - allowViewportOverflow (optional) `Boolean` – by default Hermione throws an error if element is outside the viewport bounds. This option disables check that element is outside of the viewport left, top, right or bottom bounds. And in this case if browser option [compositeImage](#compositeimage) set to `false`, then only visible part of the element will be captured. But if [compositeImage](#compositeimage) set to `true` (default), then in the resulting screenshot will appear the whole element with not visible parts outside of the bottom bounds of viewport.\n   - captureElementFromTop (optional) `Boolean` - ability to set capture element from the top area or from current position. In the first case viewport will be scrolled to the top of the element. Default value is `true`\n   - compositeImage (optional) `Boolean` - overrides config [browsers](#browsers).[compositeImage](#compositeImage) value\n   - screenshotDelay (optional) `Number` - overrides config [browsers](#browsers).[screenshotDelay](#screenshotDelay) value\n   - selectorToScroll (optional) `String` - DOM-node selector which should be scroll when the captured element does not completely fit on the screen. Useful when you capture the modal (popup). In this case a duplicate of the modal appears on the screenshot. That happens because we scroll the page using `window` selector, which scroll only the background of the modal, and the modal itself remains in place. Works only when `compositeImage` is `true`.\n   - disableAnimation (optional): `Boolean` - ability to disable animations and transitions while capturing a screenshot.\n\nAll options inside `assertView` command override the same options in the [browsers](#browsers).[assertViewOpts](#assertViewOpts).\n\nFull example:\n\n```js\nit('some test', async ({ browser }) => {\n    await browser.url('some/url');\n    await browser.assertView(\n        'plain', '.form',\n        {\n            ignoreElements: ['.link'],\n            tolerance: 5,\n            antialiasingTolerance: 4,\n            allowViewportOverflow: true,\n            captureElementFromTop: true,\n            compositeImage: true,\n            screenshotDelay: 10,\n            selectorToScroll: '.modal'\n        }\n    );\n});\n```\n\nFor tests which have been just written using `assertView` command you need to update reference images, so for the first time `hermione` should be run with option `--update-refs` or via command `gui` which is provided by plugin [html-reporter](https://github.com/gemini-testing/html-reporter) (we highly recommend to use `gui` command instead of option `--update-refs`).\n\n### RunStep\n\nCommand that allows to add human-readable description for commands in `history`, when it is enabled ([html-reporter](https://github.com/gemini-testing/html-reporter) required) with [saveHistoryMode](#savehistorymode). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.runStep('some step name', async () => {\n        await browser.url('some/url');\n        await browser.$('some-selector').click();\n    });\n\n    await browser.runStep('other step name', async () => {\n        await browser.runStep('some nested step', async () => {\n            await browser.$('not-exist').click();\n        });\n    });\n\n    await browser.runStep('another step', async () => {\n        ...\n    });\n});\n```\n\nWill produce the following history, if test fails on 'Can't call click on element with selector \"not-exist\" because element wasn't found':\n\n- hermione: init browser\n- some step name\n- other step name\n  - some nested step\n    - $(\"not-exist\")\n    - click()\n      - waitForExist\n\nIn this example step `some step name` is collapsed, because it is completed successfully.\n\nYou can also return values from step:\n\n```js\nconst parsedPage = await browser.runStep('parse page', async () => {\n    ...\n    return someData;\n});\n```\n\nParameters:\n\n - stepName (required) `String` – step name\n - stepCb (required) `Function` – step callback\n\n*Note: [html-reporter](https://github.com/gemini-testing/html-reporter) v9.7.7+ provides better history representation.*\n\n### OpenAndWait\n\nCommand that allows to open page and wait until it loads (by combination of the specified factors). For example:\n\n```js\nit('some test', async ({browser}) => {\n    await browser.openAndWait('some/url', {\n        selector: ['.some', '.selector'],\n        predicate: () => document.isReady,\n        ignoreNetworkErrorsPatterns: ['https://mc.yandex.ru'],\n        waitNetworkIdle: true,\n        waitNetworkIdleTimeout: 500,\n        failOnNetworkError: true,\n        timeout: 20000,\n    });\n});\n```\n\nIn this example, page will be considered as loaded, if elements with selectors `.some` and `.selector` exists, `document.isReady` is `true`, it has been 500 ms since the last network request succeeded, and there were no errors, while trying to load images, fonts and stylesheets.\n\nParameters:\n\n - url (required) `String` – page url\n - waitOpts (optional) `Object`:\n   - selector (optional) `String|String[]` – Selector(s) to element(s), which should exist on the page.\n   - predicate (optional) `() => Promise<bool> | bool` – Predicate, which should return `true` if page is loaded. Predicate is being executed in the browser context: [waitUntil](https://webdriver.io/docs/api/element/waitUntil).\n   - waitNetworkIdle (optional) `Boolean` – Waits until all network requests are done. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - waitNetworkIdleTimeout (optional) `Number` - Time (ms) after all network requests are resolved to consider network idle. 500 by default.\n   - failOnNetworkError (optional) `Boolean` – If `true`, throws an error when network requests are failed. `true` by default. Only works in chrome browser or when using [Chrome Devtools Protocol](#chrome-devtools-protocol).\n   - shouldThrowError (optional) `(match) => Boolean` - Predicate, which should return `true` on [Match](https://webdriver.io/docs/api/mock#match), if network error is considered critical for page load. By default, throws an error on image, stylesheet and font load error.\n   - ignoreNetworkErrorsPatterns (optional) `Array<String | RegExp>` - Array of url patterns to ignore network requests errors. Has a priority over `shouldThrowError`\n   - timeout (optional) `Number` - Page load timeout. [pageLoadTimeout](#pageloadtimeout) by default. Throws an error, if selectors are still not exist after timeout, or predicate is still resolving false.\n\n## Typescript usage\n\nTo write hermione tests on typescript, you would need to install `ts-node`:\n\n```bash\nnpm i -D ts-node\n```\n\nAnd include hermione types in your `tsconfig.json` file:\n\n```js\n// tsconfig.json\n{\n    // other tsconfig options\n    \"compilerOptions\": {\n        // other compiler options\n        \"types\": [\n            // other types\n            \"hermione\",\n        ]\n    }\n}\n```\n\nNow you will be able to write hermione tests using typescript.\n\n### hermione.ctx typings\n\nIf you want to extend hermione.ctx typings, you could use module augmentation:\n\n```ts\nimport type { HermioneCtx } from \"hermione\";\n\ndeclare module \"hermione\" {\n    interface HermioneCtx {\n        someVariable: string;\n    }\n}\n```\n\nNow `hermione.ctx` will have `someVariable` typings\n\n## .hermione.conf.js\n`hermione` is tuned using a configuration file. By default, it uses `.hermione.conf.js`, but you can use the `--config` option to specify a path to the configuration file.\n\nThere is only one required field – `browsers`.\n```javascript\nmodule.exports = {\n    browsers: {\n        chrome: {\n            desiredCapabilities: {\n                browserName: 'chrome'\n            }\n        }\n    }\n};\n```\n\n### sets\nYou can use sets to bind some set of tests to certain browsers.\n\nFormat of the sets section:\n```javascript\nsets: {\n    common: {                 // run tests associated with this path in all browsers\n        files: 'tests/common' // which are configured in the `browsers` option\n    },\n    desktop: {\n        files: [\n            'tests/desktop/*.hermione.js',\n            'tests/common/*.hermione.js'\n        ],\n        ignoreFiles: ['tests/desktop/fixtures/**'], // exclude directories from reading while test finding\n        browsers: ['browser'] // run tests which match the specified masks in the browser with the `browser` id\n    }\n}\n```\n\n* `files` – A list of test files or directories with test files. This can be a string if you want to specify just one file or directory. Also, you can use\nmasks for this property.\n\n* `ignoreFiles` - A list of paths or masks to ignore from reading while test finding. When you write `!**/some-dir/**` it means that the directory will be read, but all the entries will not be included in the results. So using `ignoreFiles` you can speed up test reading for your project.\n\n* `browsers` – A list of browser IDs to run the tests specified in `files`. All browsers by default.\n\nYou can specify sets to run using the CLI option `--set`.\n\nIf sets are not specified in the config and paths were not passed from CLI, all files from the `hermione`\ndirectory are launched in all browsers specified in the config.\n\nRunning tests using sets:\n\n ```\n hermione --set desktop\n ```\n\n### browsers\n**Required.** The list of browsers to use for running tests.\n\nThe browser section has the following format\n```javascript\nbrowsers: {\n    <browser_id>: {\n        <option>:<value>\n        <option>:<value>\n    }\n}\n```\n`<browser-id>` value is used for browser identification.\n\nAvailable browser options:\n\nOption name               | Description\n------------------------- | -------------\n`desiredCapabilities`     | **Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities)\n`gridUrl`                 | Selenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n`baseUrl`                 | Base service-under-test URL. Default value is `http://localhost`.\n`browserWSEndpoint`       | Websocket endpoint to connect to the browser in order to be able to use CDP protocol. Default value is `null`.\n`automationProtocol`      | Browser automation protocol. Default value is `webdriver`.\n`sessionEnvFlags`         | Environment flags that determine which protocol will be used in created browser session. Default value is `{}`.\n`waitTimeout`             | Timeout for web page event. Default value is `1000` ms.\n`waitInterval`            | Interval for web page event. Default value is `250` ms.\n`httpTimeout`             | Timeout for any requests to Selenium server. Default value is `30000` ms.\n`urlHttpTimeout`          | Timeout for `/url` request to Selenium server. Default value is `httpTimeout`.\n`pageLoadTimeout`         | Timeout for the page loading to complete. Default value is `20000` ms.\n`sessionRequestTimeout`   | Timeout for getting a browser session. Default value is `httpTimeout`.\n`sessionQuitTimeout`      | Timeout for quitting a session. Default value is `5000`.\n`testTimeout`             | Timeout for test execution (in milliseconds). Default value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n`sessionsPerBrowser`      | Number of sessions which are run simultaneously. Default value is `1`.\n`takeScreenshotOnFails`   | Options for setting up taking a screenshot of a test fail. Default value is `{testFail: true, assertViewFail: false}`.\n`takeScreenshotOnFailsMode` | Mode for taking a screenshot on test fail. Available options are `fullpage` and `viewport`. Default value is `fullpage`.\n`takeScreenshotOnFailsTimeout`| Timeout for taking screenshot on test fail. Default value is `5000`.\n`testsPerSession`         | Maximum amount of tests (`it`s) to run in each web driver session.\n`retry`                   | How many times a test should be rerun. Default value is `0`.\n`shouldRetry`             | Function that determines whether to make a retry. By default returns `true `if retry attempts are available otherwise returns `false`.\n`calibrate`               | Allows to correctly capture the image. Default value is `false`.\n`meta`                    | Additional data that can be obtained via .getMeta() method.\n`windowSize`              | Browser window dimensions. Default value is `null`.\n`screenshotDelay`         | Allows to specify a delay (in milliseconds) before making any screenshot.\n`orientation`             | Browser orientation that will be set before each test run. Default value is `null`.\n`waitOrientationChange`   | Allows to wait until screen orientation is changed. Default value is `true`.\n`resetCursor`             | Allows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run.\n`tolerance`               | Maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Default value is `2.3`.\n`antialiasingTolerance`   | Minimum difference in brightness between the darkest/lightest pixel (which is adjacent to the antiasing pixel) and theirs adjacent pixels. Default value is `4`.\n`compareOpts`             | Options for comparing images.\n`buildDiffOpts`           | Options for building diff image.\n`assertViewOpts`          | Options for `assertView` command, used by default.\n`openAndWaitOpts`         | Options for `openAndWaitOpts` command, used by default\n`screenshotsDir`          | Directory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`.\n`strictTestsOrder`        | `hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n`compositeImage`          | Allows testing of regions which bottom bounds are outside of a viewport height. In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height. `true` by default.\n`screenshotMode`          | Image capture mode.\n`saveHistoryMode`         | Allows to save history of executed commands. `all` by default.\n`agent`                   | Allows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null`.\n`headers`                 | Allows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n`transformRequest`        | Allows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`.\n`transformResponse`       | Allows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`.\n`strictSSL`               | Whether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n`user`                    | Cloud service username. Default value is `null`.\n`key`                     | Cloud service access key or secret key. Default value is `null`.\n`region`                  | Ability to choose different datacenters for run in cloud service. Default value is `null`.\n`headless`                | Ability to run headless browser in cloud service. Default value is `null`.\n`isolation`               | Ability to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). Default value is `false`, but `true` for chrome@93 and higher.\n\n#### desiredCapabilities\n**Required.** Used WebDriver [DesiredCapabilities](https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities). For example,\n\n```js\n'chrome': {\n  desiredCapabilities: {\n    browserName: 'chrome',\n    version: '75.0', // or \"browserVersion\" if browser support w3c\n    chromeOptions: {...}\n  }\n}\n```\n\n#### gridUrl\nSelenium grid URL. Default value is `http://localhost:4444/wd/hub`.\n\n#### baseUrl\nBase service-under-test URL. Default value is `http://localhost`.\n\n#### browserWSEndpoint\nWebsocket endpoint to connect to the browser in order to be able to use [CDP protocol](https://chromedevtools.github.io/devtools-protocol/). For example you specify `browserWSEndpoint: \"ws://YOUR_HOST/devtools\"` to which `sessionId` of the browser will be added to the end: `ws://YOUR_HOST/devtools/12345`, where `12345` is a `sessionId`. Default value is `null`, it means that `webdriverio` is trying to figure out the websocket endpoint on its own.\n\n#### automationProtocol\nBrowser automation protocol (`webdriver`, `devtools`) that will be used. Default value is `webdriver`.\n\n#### sessionEnvFlags\nEnvironment flags that determine which protocol will be used in created browser session. By default environment flags are set automatically according to the used `desiredCapabilities` but in rare cases they are determined inaccurately and using this option they can be overriden explicitly.\n\nAvailable flags:\n- isW3C - should apply [`WebDriverProtocol`](https://webdriver.io/docs/api/webdriver) or use default [`JsonWProtocol`](https://webdriver.io/docs/api/jsonwp);\n- isChrome - should apply [`ChromiumProtocol`](https://webdriver.io/docs/api/chromium);\n- isMobile - should apply [MJsonWProtocol](https://webdriver.io/docs/api/mjsonwp) and [AppiumProtocol](https://webdriver.io/docs/api/appium);\n- isSauce - should apply [Sauce Labs specific vendor commands](https://webdriver.io/docs/api/saucelabs);\n- isSeleniumStandalone - should apply [special commands when running tests using Selenium Grid or Selenium Standalone server](https://webdriver.io/docs/api/selenium);\n\nFor example:\n\n```js\n'chrome': {\n    sessionEnvFlags: {\n        isW3C: true,\n        isChrome: true\n    }\n}\n```\n\n#### httpTimeout\nTimeout for any requests to Selenium server. Default value is `30000` ms.\n\n#### urlHttpTimeout\nTimeout for `/url` request to Selenium server. Default value is `httpTimeout`.\nIt may be useful when opening url takes a long time (for example a lot of logic is executed in middlewares), and you don't want to increase timeout for other commands.\n\n#### pageLoadTimeout\nTimeout for the page loading to complete. Default value is `20000` ms.\n\n#### sessionRequestTimeout\nTimeout for getting a browser session. Default value is `httpTimeout`.\n\n#### sessionQuitTimeout\nTimeout for quitting a session. Default value is `5000`.\n\n#### testTimeout\nTimeout for test execution (in milliseconds).\nIf applied to suite then timeout will be set for all tests and hooks inside this suite.\nDefault value is `null`, in this case will be used common timeout for all browsers from `system.mochaOpts.timeout`.\n\n#### waitTimeout\nTimeout for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in the search for elements and web page events. Default value is `3000` ms.\n\n*For example: `browser.$('.element').click()` will wait up to 3000ms for element to exist before clicking it by default*\n\n#### waitInterval\nInterval for [waitUntil](https://webdriver.io/docs/api/element/waitUntil) which is used to all `waitFor*` commands. It is used in element finding and web page events. Default value is `500` ms.\n\n*For example: `browser.$('.element').click()` will check element existence every 500ms by default*\n\n#### sessionsPerBrowser\nNumber of sessions which are run simultaneously. Global value for all browsers. Default value is `1`.\n\n#### takeScreenshotOnFails\nOptions for setting up taking a screenshot of a test fail. Can be an object with `testFail` and `assertViewFail` keys.\n\n* `testFail` (default: `true`) – takes a screenshot when an error occurs in the test, except `assertView` fail.\n* `assertViewFail` (default: `true`) – takes a screenshot if the test fails on the `assetView` command.\n\n#### takeScreenshotOnFailsMode\nMode for taking a screenshot on test fail. There are two available options:\n\n* `fullpage` – Hermione will take a screenshot of the entire page from top. Default value.\n* `viewport` – Hermione will take a screenshot of the current viewport.\n\n#### takeScreenshotOnFailsTimeout\nTimeout for taking screenshot on test fail. Default value is `5000`.\n\n#### testsPerSession\nMaximum amount of tests (`it`s) to run in each web driver session. After limit is reached, session will be closed and new one will be started.\nBy default is `Infinity` (no limit, all tests will be run in the same session). Set to smaller number in case of problems with stability.\n\n#### retry\nHow many times a test should be retried if it fails. Global value for all browsers. Default value is `0`.\n\n#### shouldRetry\nFunction that determines whether to make a retry. Must return boolean value. By default returns `true` if retry attempts are available otherwise returns `false`.\nArgument of this function is object with fields:\n\n  * `retriesLeft {Number}` — number of available retries\n  * `ctx` — in case of test `TEST_FAIL` it would be bound data, in case of `ERROR` it would be link to `Runnable`\n  * `[error]` — error type (available only in case of ERROR)\n\n\n#### calibrate\nDoes this browser need to perform the calibration procedure. This procedure allows to correctly capture the image in case the particular WebDriver implementation captures browser UI along with web page. Default value is `false`.\n\n#### meta\nAdditional data that can be obtained via .getMeta() method\n\n#### windowSize\nBrowser window dimensions (i.e. `1600x1200`). If not specified, the size of the window depends on WebDriver. Can be specified as string with pattern `800x1000` or object with `width` and `height` keys (both keys should be number). For example,\n\n```javascript\nwindowSize: '800x1000'\n```\nand\n```javascript\nwindowSize: {\n  width: 800,\n  height: 1000\n}\n```\nare the same.\n\n:warning: You can't set specific resolutions for browser Opera or mobile platforms. They use only full-screen resolution.\n\n#### screenshotDelay\nAllows to specify a delay (in milliseconds) before making any screenshot. This is useful when the page has elements which are animated or if you do not want to screen a scrollbar. Default value is `0`.\n\n#### orientation\nBrowser orientation (`landscape`, `portrait`) that will be set before each test run. It is necessary in order to return the browser orientation to the default state after test execution in which orientation is changed. Default value is `null`.\n\n#### waitOrientationChange\nAllows to wait until screen orientation is changed. Works inside `webdriverio` commands `orientation` and `setOrientation`. This option guarantee that screen rotated before the next command will start to execute. Default value is `true`.\n\n#### resetCursor\nAllows to configure whether to move mouse cursor to `body` coordinates `(0, 0)` before each test run. This can be useful to escape cases when a default position of a cursor affects your tests. We recommend to set this option *truthy* value for desktop browsers and *falsey* for mobile devices. Default value is `true`.\n\n#### tolerance\nIndicates maximum allowed [CIEDE2000](http://en.wikipedia.org/wiki/Color_difference#CIEDE2000) difference between colors. Used only in non-strict mode. By default it's 2.3 which should be enough for the most cases. Increasing global default is not recommended, prefer changing tolerance for particular suites or states instead.\n\n#### antialiasingTolerance\nRead more about this option in [looks-same](https://github.com/gemini-testing/looks-same#comparing-images-with-ignoring-antialiasing).\n\n#### compareOpts\nExtra options for comparing images. See [looks-same](https://github.com/gemini-testing/looks-same#comparing-images) documentation for the list of available options. Default values are:\n```javascript\ncompareOpts: {\n    shouldCluster: false,\n    clustersSize: 10,\n    stopOnFirstFail: false\n}\n```\n\n#### buildDiffOpts\nExtra options for building diff image. See [looks-same](https://github.com/gemini-testing/looks-same#building-diff-image) documentation for the list of available options. Default values are:\n```javascript\nbuildDiffOpts: {\n    ignoreAntialiasing: true,\n    ignoreCaret: true\n}\n```\n\n#### assertViewOpts\nDefault options used when calling [assertView](https://github.com/gemini-testing/hermione/#assertview), can be overridden by `assertView` options. Default values are:\n```javascript\n    ignoreElements: [],\n    captureElementFromTop: true,\n    allowViewportOverflow: false,\n    disableAnimation: true,\n    ignoreDiffPixelCount: 0,\n```\n\n#### openAndWaitOpts\nDefault options used when calling [openAndWait](https://github.com/gemini-testing/hermione/#openandwait), can be overriden by `openAndWait` options. Default values are:\n```javascript\n    waitNetworkIdle: true,\n    waitNetworkIdleTimeout: 500,\n    failOnNetworkError: true,\n    ignoreNetworkErrorsPatterns: []\n```\n\n#### screenshotsDir\n\nDirectory to save reference images for command `assertView`. Default dir is `hermione/screens` which is relative to `process.cwd()`. The value of this option can also be a function which accepts one argument - an instance of a test within which comand `assertView` is called:\n\n```javascript\n    screenshotsDir: (test) => `tests/screenshots/${test.parent.title}`\n```\n\n#### strictTestsOrder\n\n`hermione` will guarantee tests order in [readTests](#readtests) results. `false` by default.\n\n#### compositeImage\n\nAllows testing of regions which bottom bounds are outside of a viewport height (default: true). In the resulting screenshot the area which fits the viewport bounds will be joined with the area which is outside of the viewport height.\n\n#### screenshotMode\n\nImage capture mode. There are 3 allowed values for this option:\n\n  * `auto` (default). Mode will be obtained automatically;\n  * `fullpage`. Hermione will deal with screenshot of full page;\n  * `viewport`. Only viewport area will be used.\n\nBy default, `screenshotMode` on android browsers is set to `viewport` to work around [the chromium bug](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2853).\n\n#### saveHistoryMode\n\nAllows to save history of all executed commands. `'all'` by default.\n\nAvailable options:\n - `'all'` - history is enabled\n - `'none'` - history is disabled\n - `'onlyFailed'` - history is saved for failed tests only\n\nSome plugins can rely on this history, for instance:\n - [html-reporter](https://github.com/gemini-testing/html-reporter)\n - [hermione-profiler](https://github.com/gemini-testing/hermione-profiler)\n\nThe history is available from such events: `TEST_END`, `TEST_PASS`, `TEST_FAIL` through payload:\n```js\n// example of plugin code\nmodule.exports = (hermione) => {\n    hermione.on(hermione.events.TEST_PASS, async (test) => {\n        console.log(test.history);\n    });\n};\n```\n\n#### agent\nAllows to use a custom `http`/`https`/`http2` [agent](https://www.npmjs.com/package/got#agent) to make requests. Default value is `null` (it means that will be used default http-agent from got).\n\n####  headers\nAllows to set custom [headers](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers) to pass into every webdriver request. These headers aren't passed into browser request. Read more about this option in [wdio](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md#headers). Default value is `null`.\n\n####  transformRequest\nAllows to intercept [HTTP request options](https://github.com/sindresorhus/got#options) before a WebDriver request is made. Default value is `null`. If function is passed then it takes `RequestOptions` as the first argument and should return modified `RequestOptions`. Example:\n\n```javascript\n(RequestOptions) => RequestOptions\n```\n\nIn runtime a unique `X-Request-ID` header is generated for each browser request which consists of `${FIRST_X_REQ_ID}__${LAST_X_REQ_ID}`, where:\n- `FIRST_X_REQ_ID` - unique uuid for each test (different for each retry), allows to find all requests related to a single test run;\n- `LAST_X_REQ_ID` - unique uuid for each browser request, allows to find one unique request in one test (together with `FIRST_X_REQ_ID`).\n\nHeader `X-Request-ID` can be useful if you manage the cloud with browsers yourself and collect logs with requests. Real-world example: `2f31ffb7-369d-41f4-bbb8-77744615d2eb__e8d011d8-bb76-42b9-b80e-02f03b8d6fe1`.\n\nTo override generated `X-Request-ID` to your own value you need specify it in `transformRequest` handler. Example:\n\n```javascript\ntransformRequest: (req) => {\n    req.headers[\"X-Request-ID\"] = \"my_x_req_id\";\n}\n```\n\n####  transformResponse\nAllows to intercept [HTTP response object](https://github.com/sindresorhus/got#response) after a WebDriver response has arrived. Default value is `null`. If function is passed then it takes `Response` (original response object) as the first and `RequestOptions` as the second argument. Should return modified `Response`. Example:\n\n```javascript\n(Response, RequestOptions) => Response\n```\n\n####  strictSSL\nWhether it does require SSL certificate to be valid. Default value is `null` (it means that will be used [default value from wdio](https://webdriver.io/docs/options/#strictssl)).\n\n####  user\nCloud service username. Default value is `null`.\n\n####  key\nCloud service access key or secret key. Default value is `null`.\n\n####  region\nAbility to choose different datacenters for run in cloud service. Default value is `null`.\n\n####  headless\nAbility to run headless browser in cloud service. Default value is `null`. Can be set as a Boolean (the default value of the browser will be used). For Chrome browsers starting from version 112 also can be specified as a string with \"new\"|\"old\" values  - this will enable the new headless mode (see [Chrome's blog post](https://developer.chrome.com/docs/chromium/new-headless)).\n\n####  isolation\nAbility to execute tests in isolated clean-state environment ([incognito browser context](https://chromedevtools.github.io/devtools-protocol/tot/Target/#method-createBrowserContext)). It means that `testsPerSession` can be set to `Infinity` in order to speed up tests execution and save browser resources. Currently works only in chrome@93 and higher. Default value is `null`, but `true` for chrome@93 and higher.\n\n### system\n\n#### debug\nTurn webdriver debug mode on. Default value is `false`.\n\n#### mochaOpts\n\nExtra options for `mocha` which are passed to `mocha.setup`. See [Mocha](https://mochajs.org/) documentation for the list of options. Default values are:\n```javascript\nmochaOpts: {\n    slow: 10000, // If test execution time is greater than this value, then the test is slow.\n    timeout: 60000 // timeout for test execution.\n}\n```\n\n#### expectOpts\n\nOptions for [expect-webdriverio](https://webdriver.io/docs/api/expect-webdriverio/) that allow you to change default wait timeout and interval between attempts. Default values are:\n\n```javascript\nexpectOpts: {\n    wait: 3000, // wait timeout for expectation to succeed\n    interval: 100 // interval between attempts\n}\n```\n\n#### ctx\nA context which will be available in tests via method `hermione.ctx`:\n```javascript\nctx: {\n    foo: 'bar'\n}\n```\n\n```javascript\nit('awesome test', function() {\n    console.log(hermione.ctx); // {foo: 'bar'}\n});\n```\n\n**Recommendation**: use `ctx` in your tests in favor of global variables.\n\n#### patternsOnReject\nSession would be rejected if test has been faile with error message which matches to specified patterns:\n```javascript\npatternsOnReject: [\n    /some-pattern/,\n    'other-pattern'\n]\n```\n\n#### workers\nHermione runs all tests in subprocesses in order to decrease the main process CPU usage. This options defines the numbers of subprocesses to start for running tests. Default value is `1`.\n\n#### testsPerWorker\nThe maximum number of tests to be run in one worker before it will be restarted.\n\n#### parallelLimit\nBy default, `hermione` will run all browsers simultaneously. Sometimes (i.e. when using cloud services, such as SauceLabs) you have to limit the amount of browsers that can be run at the same time. This option effectively limits how many browsers `hermione` will try to run in parallel. Default value is `Infinity`.\n\n#### fileExtensions\nAbility to set file extensions, which hermione will search on the file system. Default value is `[.js]`.\n\n### plugins\n`Hermione` plugins are commonly used to extend built-in functionality. For example, [html-reporter](https://github.com/gemini-testing/html-reporter) and [hermione-safari-commands](https://github.com/gemini-testing/hermione-safari-commands).\n\nA plugin is a module that exports a single function. The function has two arguments:\n\n* The hermione instance\n* Plugin options from the configuration file\n\nPlugins will be loaded before `hermione` runs tests.\n\nIt's strongly recommended to name `hermione` plugins with the `hermione-` prefix. This makes searching for user plugins [very simple](https://github.com/search?l=JavaScript&q=hermione-&type=Repositories&utf8=%E2%9C%93).\n\nIf a plugin name starts with `hermione-`, then the prefix can be ommited in the configuration file. If two modules with names `hermione-some-module` and `some-module` are specified, the module with the prefix will have higher priority.\n\nFor example:\n```js\n// .hermione.conf.js\n// ...\nplugins: {\n    'my-cool-plugin': {\n        param: 'value'\n    }\n}\n// ...\n\n// hermione-my-cool-plugin/index.js\nmodule.exports = function(hermione, opts) {\n    hermione.on(hermione.events.RUNNER_START, function(runner) {\n        return setUp(hermione.config, opts.param); // config can be mutated\n    });\n\n    hermione.on(hermione.events.RUNNER_END, function() {\n        return tearDown();\n    });\n}\n```\n\n**Properties of the `hermione` object**\n\nProperty name             | Description\n------------------------- | -------------\n`config`                  | Config that is used in the test runner. Can be mutated.\n`events`                  | Events list for subscription.\n\n**Available events which are triggered in the main process**\n\nEvent                     | Description\n------------------------- | -------------\n`INIT`                    | Will be triggered before any job start (`run` or `readTests`). If handler returns a promise then job will start only after the promise will be resolved. Emitted only once no matter how many times job will be performed.\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read via `readTests` or `run` methods with `TestCollection` object.\n`RUNNER_START`            | Will be triggered after worker farm initialization and before test execution. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of a runner as the first argument. You can use this instance to emit and subscribe to any other available events.\n`RUNNER_END`              | Will be triggered after test execution and before worker farm ends. If a handler returns a promise, worker farm will be ended only after the promise is resolved. The handler accepts an object with tests execution statistics.\n`NEW_WORKER_PROCESS`      | Will be triggered after new subprocess is spawned. The handler accepts a restricted process object with only `send` method.\n`SESSION_START`           | Will be triggered after browser session initialization. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`SESSION_END`             | Will be triggered after the browser session ends. If a handler returns a promise, tests will be executed only after the promise is resolved. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier as the second.\n`BEGIN`                   | Will be triggered before test execution, but after all the runners are initialized.\n`END`                     | Will be triggered just before `RUNNER_END` event. The handler accepts a stats of tests execution.\n`SUITE_BEGIN`             | Test suite is about to execute.\n`SUITE_END`               | Test suite execution is finished.\n`TEST_BEGIN`              | Test is about to execute.\n`TEST_END`                | Test execution is finished.\n`TEST_PASS`               | Test passed.\n`TEST_FAIL`               | Test failed.\n`TEST_PENDING`            | Test is skipped.\n`RETRY`                   | Test failed but went to retry.\n`ERROR`                   | Generic (no tests) errors.\n`INFO`                    | Reserved.\n`WARNING`                 | Reserved.\n`EXIT`                    | Will be triggered when SIGTERM is received (for example, Ctrl + C). The handler can return a promise.\n\n**Available events which are triggered in subprocesses**\n\nEvent                     | Description\n------------------------- | -------------\n`BEFORE_FILE_READ`        | Will be triggered on test files parsing before reading the file. The handler accepts data object with `file`, `hermione` (helper which will be available in test file) and `testParser` (`TestParserAPI` object) fields.\n`AFTER_FILE_READ`         | Will be triggered on test files parsing right after reading the file. The handler accepts data object with `file` and `hermione` (helper which will be available in test file) fields.\n`AFTER_TESTS_READ`        | Will be triggered right after tests read each time some file is being reading during test run.\n`NEW_BROWSER`             | Will be triggered after new browser instance created. The handler accepts an instance of webdriverIO as the first argument and an object with a browser identifier and version as the second.\n`UPDATE_REFERENCE`        | Will be triggered after updating reference image.\n\n**REMARK!**\n\nEvents which are triggered in the main process and subprocesses can not share information between each other, for example:\n\n```js\nmodule.exports = (hermione) => {\n    let flag = false;\n\n    hermione.on(hermione.events.RUNNER_START, () => {\n        flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `false`, because `NEW_BROWSER` event was triggered in a subprocess,\n        // but `RUNNER_START` was not\n        console.log(flag);\n    });\n\n    hermione.on(hermione.events.RUNNER_END, () => {\n        // outputs `true`\n        console.log(flag);\n    });\n};\n```\n\nBut you can solve such problem this way:\n\n```js\nmodule.exports = (hermione, opts) => {\n    hermione.on(hermione.events.RUNNER_START, () => {\n      opts.flag = true;\n    });\n\n    hermione.on(hermione.events.NEW_BROWSER, () => {\n        // outputs `true`, because properties in a config (variable `opts` is a part of a config)\n        // which have raw data types are passed to subprocesses after `RUNNER_START` ev","readmeFilename":"README.md","users":{"lestad":true},"contributors":[{"name":"The following authors have created the source code of \"Hermione\""},{"name":"published and distributed by YANDEX LLC as the owner:"},{"name":"Anton Usmansky","email":"cody0@yandex-team.ru"},{"name":"Evgeniy Gavryushin","email":"gavryushin@yandex-team.ru"},{"name":"Evgeniy Konstantinov","email":"sipayrt@yandex-team.ru"},{"name":"Rostislav Shtanko","email":"rostik404@yandex-team.ru"},{"name":"Alexey Rybakov","email":"flack@yandex-team.ru"},{"name":"Pavel Zorin","email":"pazone@yandex-team.ru"},{"name":"Contributers:"},{"name":"Alexander Tarmolov","email":"tarmolov@gmail.com"},{"name":"Roman Rozhdestvenskiy","email":"sbmaxx@gmail.com"},{"name":"Leonid Rudenko","email":"leonid.a.rudenko@gmail.com"},{"name":"Andrey Prokopyuk"},{"name":"Ruslan Khusnetdinov","email":"ruslankhh@gmail.com"}]}