From f4bffeaecb2d3dd4d677c602d573c3b807f6e27c Mon Sep 17 00:00:00 2001 From: andres Date: Fri, 16 Feb 2018 10:30:55 +0100 Subject: [PATCH 01/14] readme examples fixed --- CHANGELOG.md | 5 +++++ README.md | 28 ++++++++++++++-------------- package.json | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48cd6c58..eeea1d23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +0.3.3 / ####-##-## +================== + + * Minor fixes in readme example code + 0.3.2 / 2018-02-16 ================== diff --git a/README.md b/README.md index c0fdc44d..b8b99c93 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ await browser.waitFor(".popup"); Returns an array with the elements with text content matching the given text. ```js -const elements=await browser.findByText("My First Paragraph"); +const elements = await browser.findByText("My First Paragraph"); elements.length; // 1 ``` @@ -209,7 +209,7 @@ elements.length; // 1 Returns an array with all the elements with a text that contains the given text. ```js -const elements=await browser.findByTextContaining("Paragraph"); +const elements = await browser.findByTextContaining("Paragraph"); elements.length; // 2 ``` @@ -297,26 +297,26 @@ The count parameter can be a number of the exact number of elements expected or ``` ```js -browser.assert.elements("p", 2); // Ok -browser.assert.elements("p", {equal: 2}); // Ok -browser.assert.elements("p", {atLeast: 1, atMost:3}); // Ok -browser.assert.elements("p.first", 0); //Ok +await browser.assert.elements("p", 2); // Ok +await browser.assert.elements("p", {equal: 2}); // Ok +await browser.assert.elements("p", {atLeast: 1, atMost:3}); // Ok +await browser.assert.elements("p.first", 0); //Ok -browser.assert.elements("p.second", 2); // Fails -browser.assert.elements("p.second", {atLeast: 1}); // Ok +await browser.assert.elements("p.second", 2); // Fails +await browser.assert.elements("p.second", {atLeast: 1}); // Ok ``` **attribute(selector, attribute, expected, msg)** Asserts that the first element matching the given selector contains an attribute matching the expected value. If no expected value is given, any not null value for the attribute will pass. ```js -browser.assert.attribute(".hidden-class", "class", "hidden-class"); -browser.assert.attribute(".hidden-class", "hidden"); +await browser.assert.attribute(".hidden-class", "class", "hidden-class"); +await browser.assert.attribute(".hidden-class", "hidden"); ``` To pass a custom message without specifying an expected value, you can pass null: ```js -browser.assert.attribute(".hidden-class", "hidden", null, "hidden-class doesn't have attribute hidden"); +await browser.assert.attribute(".hidden-class", "hidden", null, "hidden-class doesn't have attribute hidden"); ``` If the element doesn't exists, the assertion will fail. @@ -354,13 +354,13 @@ Asserts that the first element with the given selector doesn't have the expected Asserts that the first element matching the given selector doesn't contain an attribute with the expected value. If no expected value is given, any not null value on the attribute will fail. ```js -browser.assert.not.attribute(".not-hidden-class", "class", "hidden-class"); -browser.assert.not.attribute(".not-hidden-class", "hidden"); +await browser.assert.not.attribute(".not-hidden-class", "class", "hidden-class"); +await browser.assert.not.attribute(".not-hidden-class", "hidden"); ``` To pass a custom message without specifying an expected value, you can pass null: ```js -browser.assert.not.attribute(".hidden-class", "href", null, "hidden-class has attribute href"); +await browser.assert.not.attribute(".hidden-class", "href", null, "hidden-class has attribute href"); ``` If the element doesn't exists, the assertion will fail. diff --git a/package.json b/package.json index 18bee239..7a03c193 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wendigo", - "version": "0.3.2", + "version": "0.3.3", "description": "A proper monster for front-end testing", "engines": { "node": ">=8.9.4" From c8d3038846013ea3d6b6cc0bd7e7a7b94464bd8e Mon Sep 17 00:00:00 2001 From: andres Date: Fri, 16 Feb 2018 10:41:25 +0100 Subject: [PATCH 02/14] readme improvements --- CHANGELOG.md | 2 +- README.md | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eeea1d23..91f25224 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ 0.3.3 / ####-##-## ================== - * Minor fixes in readme example code + * Readme improvements 0.3.2 / 2018-02-16 ================== diff --git a/README.md b/README.md index b8b99c93..ecd884e0 100644 --- a/README.md +++ b/README.md @@ -56,12 +56,20 @@ Will create and return a [Browser](#Browser) instance. It will automatically lau > **Warning:** the settings will only take effect the first time a browser page is created, to fully restart the settings you must close the browser connection using `Wendigo.stop()` before executing createBrowser again -Example: +Examples: ```js const Wendigo=require('wendigo'); const browser=Wendigo.createBrowser(); // Using default options ``` +```js +const Wendigo=require('wendigo'); +const browser=Wendigo.createBrowser({ + headless: false, + slowMo: 500 +}); // Using options to see what's happening +``` + **static stop()** Will stop and disconnect all the browsers. It should be called after finishing all the tests. @@ -447,6 +455,8 @@ test: - npm test ``` +> Remember to check [Puppeteer Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) + ## Acknowledgements * [Puppeteer](https://github.com/GoogleChrome/puppeteer) and Chrome Headless as base headless browser. From cad3626476570aae76b8395ebb60bd247279073c Mon Sep 17 00:00:00 2001 From: andres Date: Fri, 16 Feb 2018 13:55:30 +0100 Subject: [PATCH 03/14] mocha updated --- README.md | 1 + package-lock.json | 238 +++++++++++++++++++++++++--------------------- package.json | 2 +- 3 files changed, 129 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index ecd884e0..96ab07c4 100644 --- a/README.md +++ b/README.md @@ -454,6 +454,7 @@ test: script: - npm test ``` +_Example of .gitlab-ci.yml_ > Remember to check [Puppeteer Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) diff --git a/package-lock.json b/package-lock.json index b533c0ce..f872ce96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wendigo", - "version": "0.3.0", + "version": "0.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -82,9 +82,9 @@ "dev": true }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "1.0.3" @@ -154,6 +154,12 @@ "requires": { "ansi-regex": "2.1.1" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -178,12 +184,23 @@ "qs": "6.5.1", "raw-body": "2.3.2", "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -217,14 +234,14 @@ "dev": true }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" }, "dependencies": { "ansi-styles": { @@ -236,13 +253,19 @@ "color-convert": "1.9.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -312,7 +335,7 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "typedarray": "0.0.6" } }, @@ -357,9 +380,9 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } @@ -457,7 +480,7 @@ "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", - "chalk": "2.3.0", + "chalk": "2.3.1", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "3.1.0", @@ -492,26 +515,6 @@ "strip-json-comments": "2.0.1", "table": "4.0.2", "text-table": "0.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } } }, "eslint-scope": { @@ -619,6 +622,17 @@ "type-is": "1.6.15", "utils-merge": "1.0.1", "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "external-editor": { @@ -641,6 +655,24 @@ "debug": "2.6.9", "mkdirp": "0.5.0", "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "requires": { + "minimist": "0.0.8" + } + } } }, "fast-deep-equal": { @@ -701,6 +733,17 @@ "parseurl": "1.3.2", "statuses": "1.3.1", "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "flat-cache": { @@ -837,16 +880,6 @@ "requires": { "agent-base": "4.2.0", "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } } }, "iconv-lite": { @@ -888,7 +921,7 @@ "dev": true, "requires": { "ansi-escapes": "3.0.0", - "chalk": "2.3.0", + "chalk": "2.3.1", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.1.0", @@ -974,7 +1007,7 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", + "argparse": "1.0.10", "esprima": "4.0.0" } }, @@ -1065,7 +1098,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -1074,17 +1107,18 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", + "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -1097,35 +1131,6 @@ "he": "1.1.1", "mkdirp": "0.5.1", "supports-color": "4.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } } }, "ms": { @@ -1265,9 +1270,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.0", @@ -1308,6 +1313,16 @@ "proxy-from-env": "1.0.0", "rimraf": "2.6.2", "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } } }, "qs": { @@ -1335,14 +1350,14 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", + "process-nextick-args": "2.0.0", "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" @@ -1438,6 +1453,15 @@ "statuses": "1.3.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", @@ -1548,10 +1572,13 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } }, "table": { "version": "4.0.2", @@ -1561,7 +1588,7 @@ "requires": { "ajv": "5.5.2", "ajv-keywords": "2.1.1", - "chalk": "2.3.0", + "chalk": "2.3.1", "lodash": "4.17.5", "slice-ansi": "1.0.0", "string-width": "2.1.1" @@ -1667,17 +1694,6 @@ "dev": true, "requires": { "mkdirp": "0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - } } }, "ws": { diff --git a/package.json b/package.json index 7a03c193..d879bce3 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,6 @@ "devDependencies": { "eslint": "^4.13.1", "express": "^4.16.2", - "mocha": "^4.0.1" + "mocha": "^5.0.1" } } From ff0dd68f0e24fe9e466d5b7694b7cac4e13d2217 Mon Sep 17 00:00:00 2001 From: andres Date: Sat, 17 Feb 2018 19:55:25 +0100 Subject: [PATCH 04/14] small styling improvements in readme --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 96ab07c4..69554a05 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ const elements = await browser.queryXPath('//p[contains(text(),"My first paragra elements[0].textContent; // "My first paragraph" ``` -**class(selector)** +**class(selector)** Returns and array with the classes of the first element returned from the given css selector. ```js @@ -147,14 +147,14 @@ const node=await browser.query("div.container.main"); const classes=await browser.class(node); // Returns ["container", "main", "another-class"] ``` -**value(selector)** +**value(selector)** Returns the value of the first element with given selector. Returns _null_ if no element or value found. ```js const value = await browser.value("input.my-input"); ``` -**attribute(selector, attributeName)** +**attribute(selector, attributeName)** Return the attribute value of the first element found with given selector. Throws if no element is found. Returns `""` if the attribute is set but no value is given and `null` if the attribute doesn't exists. ```js @@ -221,7 +221,7 @@ const elements = await browser.findByTextContaining("Paragraph"); elements.length; // 2 ``` -**type(selector, text)** +**type(selector, text)** Types given text (as element value) in all the elements (input) with given selector. If a value is already present, appends the new text at the end. @@ -229,7 +229,7 @@ Types given text (as element value) in all the elements (input) with given selec await browser.type("input.my-input", "My Input"); ``` -**clearValue(selector)** +**clearValue(selector)** Clears any value that exists in any of the elements matched by the given selector. Setting the value to "". ```js @@ -280,7 +280,7 @@ await browser.assert.class("div.container.main-div", "container"); **url(expected, msg)** Asserts that the current url matches the given string. -**value(selector, expected, msg)** +**value(selector, expected, msg)** Asserts that the first element matching the selector has the expected value. ```js @@ -288,10 +288,10 @@ await browser.type("input.my-input", "Dont Panic"); await browser.assert.value("input.my-input", "Dont Panic"); ``` -**element(selector, msg)** +**element(selector, msg)** Asserts that exactly one element matches given selector. Same as `elements(selector, 1)`. -**elements(selector, count, msg)** +**elements(selector, count, msg)** Asserts the number of element that matches given selector. The count parameter can be a number of the exact number of elements expected or an object with the following properties: @@ -314,7 +314,7 @@ await browser.assert.elements("p.second", 2); // Fails await browser.assert.elements("p.second", {atLeast: 1}); // Ok ``` -**attribute(selector, attribute, expected, msg)** +**attribute(selector, attribute, expected, msg)** Asserts that the first element matching the given selector contains an attribute matching the expected value. If no expected value is given, any not null value for the attribute will pass. ```js @@ -355,10 +355,10 @@ Asserts that the title of the page is not the expected string. **not.url(expected, msgs)** Asserts that the url of the page doesn't match the expected string. -**not.value(selector, expected, msg)** +**not.value(selector, expected, msg)** Asserts that the first element with the given selector doesn't have the expected value. -**not.attribute(selector, attribute, expected, msg)** +**not.attribute(selector, attribute, expected, msg)** Asserts that the first element matching the given selector doesn't contain an attribute with the expected value. If no expected value is given, any not null value on the attribute will fail. ```js From 73263044bd808babdfde4fade5c9979a2068f785 Mon Sep 17 00:00:00 2001 From: andres Date: Mon, 19 Feb 2018 00:03:13 +0100 Subject: [PATCH 05/14] fixed keyboard events in type, close #56 --- CHANGELOG.md | 4 +- README.md | 2 +- lib/browser.js | 12 ++--- package.json | 2 +- tests/browser_forms.test.js | 38 ------------- tests/browser_interactions.test.js | 62 ---------------------- tests/dummy_server/static/forms.html | 7 +++ tests/interactions/click.test.js | 79 ++++++++++++++++++++++++++++ tests/interactions/input.test.js | 62 ++++++++++++++++++++++ 9 files changed, 158 insertions(+), 110 deletions(-) create mode 100644 tests/interactions/click.test.js create mode 100644 tests/interactions/input.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 91f25224..cb603b58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -0.3.3 / ####-##-## +0.4.0 / ####-##-## ================== + * Type will trigger the keyboard events + * Type behaviour changed * Readme improvements 0.3.2 / 2018-02-16 diff --git a/README.md b/README.md index 69554a05..5ea94a78 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ elements.length; // 2 ``` **type(selector, text)** -Types given text (as element value) in all the elements (input) with given selector. If a value is already present, appends the new text at the end. +Types given text in the first element matching given selector. If a value is already present, writes the new value at the beginning. ```js diff --git a/lib/browser.js b/lib/browser.js index d4343445..9ce71734 100644 --- a/lib/browser.js +++ b/lib/browser.js @@ -102,13 +102,11 @@ module.exports = class Browser extends BrowserBase { } type(selector, text) { - return this.page.evaluate((q, text) => { - const elements = WendigoUtils.queryAll(q); - for(const element of elements) { - const currentText = element.value; - element.value = currentText + text; - } - }, selector, text); + if(typeof selector === "string") { + return this.page.type(selector, text); + }else { + return selector.type(text); + } } clearValue(selector) { diff --git a/package.json b/package.json index d879bce3..43ebe6f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wendigo", - "version": "0.3.3", + "version": "0.4.0", "description": "A proper monster for front-end testing", "engines": { "node": ">=8.9.4" diff --git a/tests/browser_forms.test.js b/tests/browser_forms.test.js index 18bedc37..0d84a88b 100644 --- a/tests/browser_forms.test.js +++ b/tests/browser_forms.test.js @@ -120,42 +120,4 @@ describe("Browser Forms", function() { await browser.assert.not.value("input.input1", "", "not value failed"); }, `not value failed`); }); - - it("Type", async () => { - await browser.open(configUrls.forms); - await browser.type("input.input1", "firstText"); - await browser.type("input.input2", "secondText"); - await browser.assert.value("input.input1", "firstText"); - await browser.assert.value("input.input2", "default valuesecondText"); - }); - - it("Type Multiple Elements", async () => { - await browser.open(configUrls.forms); - await browser.type("input", "firstText"); - await browser.assert.value("input.input1", "firstText"); - await browser.assert.value("input.input2", "default valuefirstText"); - }); - - it("Type Node", async () => { - await browser.open(configUrls.forms); - const node = await browser.query("input.input1"); - - await browser.type(node, "firstText"); - await browser.assert.value("input.input1", "firstText"); - }); - - it("Clear Input", async() => { - await browser.open(configUrls.forms); - await browser.clearValue("input.input1"); - await browser.clearValue("input.input2"); - await browser.assert.value("input.input1", ""); - await browser.assert.value("input.input2", ""); - }); - - it("Clear Input From Node", async() => { - await browser.open(configUrls.forms); - const node = await browser.query("input.input2"); - await browser.clearValue(node); - await browser.assert.value("input.input2", ""); - }); }); diff --git a/tests/browser_interactions.test.js b/tests/browser_interactions.test.js index 4b8d085a..de18a7c9 100644 --- a/tests/browser_interactions.test.js +++ b/tests/browser_interactions.test.js @@ -1,6 +1,5 @@ "use strict"; -const assert = require('assert'); const Wendigo = require('../lib/wendigo'); const utils = require('./utils'); const configUrls = require('./config.json').urls; @@ -17,48 +16,6 @@ describe("Browser Interactions", function() { await browser.close(); }); - it("Click", async() => { - await browser.open(configUrls.click); - await browser.assert.text("#switch", "On"); - const clickedElements = await browser.click(".btn"); - await browser.assert.text("#switch", "Off"); - assert.strictEqual(clickedElements, 1); - }); - - it("Click Multiple Elements", async() => { - await browser.open(configUrls.click); - await browser.assert.text("#switch", "On"); - const clickedElements = await browser.click("button"); - assert.strictEqual(clickedElements, 2); - await browser.assert.text("#switch", "Off"); - await browser.waitFor("#switch.on", 600); - }); - - it("Click With Index", async() => { - await browser.open(configUrls.click); - await browser.assert.text("#switch", "On"); - const clickedElements = await browser.click("button", 1); - assert.strictEqual(clickedElements, 1); - await browser.assert.text("#switch", "On"); - await browser.waitFor("#switch.off", 600); - }); - - it("Click From Node", async() => { - await browser.open(configUrls.click); - const node = await browser.query(".btn"); - const clickedElements = await browser.click(node); - assert.strictEqual(clickedElements, 1); - await browser.assert.text("#switch", "Off"); - }); - - it("Click With Invalid Index", async() => { - await browser.open(configUrls.click); - await browser.assert.text("#switch", "On"); - await utils.assertThrowsAsync(async () => { - await browser.click("button", 10); - }, `Error: browser.click, invalid index "10" for selector "button", 2 elements found.`); - await browser.assert.text("#switch", "On"); - }); it("Button Text", async() => { await browser.open(configUrls.click); @@ -99,23 +56,6 @@ describe("Browser Interactions", function() { await browser.assert.text("#switch", "On"); }); - it("Click Text", async() => { - await browser.open(configUrls.click); - const clickedElements = await browser.clickText("click me"); - assert.strictEqual(clickedElements, 1); - await browser.assert.text("#switch", "Off"); - await browser.clickText("click me"); - await browser.assert.text("#switch", "On"); - }); - - it("Click Invalid Text", async() => { - await browser.open(configUrls.click); - await utils.assertThrowsAsync(async () => { - await browser.clickText("not click me"); - }, `Error: No element with text "not click me" found when trying to click.`); - await browser.assert.text("#switch", "On"); - }); - it("Find By Text Containing And Click", async() => { await browser.open(configUrls.click); const elements = await browser.findByTextContaining("click"); @@ -123,6 +63,4 @@ describe("Browser Interactions", function() { await browser.assert.text("#switch", "Off"); await browser.waitFor("#switch.on", 600); }); - - it("Click Invalid Element"); }); diff --git a/tests/dummy_server/static/forms.html b/tests/dummy_server/static/forms.html index 85797bc7..40940cb2 100644 --- a/tests/dummy_server/static/forms.html +++ b/tests/dummy_server/static/forms.html @@ -7,6 +7,13 @@

Main Title

First Input: Last Input: +

+ + diff --git a/tests/interactions/click.test.js b/tests/interactions/click.test.js new file mode 100644 index 00000000..2ad93aec --- /dev/null +++ b/tests/interactions/click.test.js @@ -0,0 +1,79 @@ + +"use strict"; + +const assert = require('assert'); +const Wendigo = require('../../lib/wendigo'); +const utils = require('.././utils'); +const configUrls = require('.././config.json').urls; + +describe("Click", function() { + this.timeout(5000); + let browser; + + before(async () => { + browser = await Wendigo.createBrowser(); + }); + + beforeEach(async () => { + await browser.open(configUrls.click); + }); + + after(async() => { + await browser.close(); + }); + it("Click", async() => { + await browser.assert.text("#switch", "On"); + const clickedElements = await browser.click(".btn"); + await browser.assert.text("#switch", "Off"); + assert.strictEqual(clickedElements, 1); + }); + + it("Click Multiple Elements", async() => { + await browser.assert.text("#switch", "On"); + const clickedElements = await browser.click("button"); + assert.strictEqual(clickedElements, 2); + await browser.assert.text("#switch", "Off"); + await browser.waitFor("#switch.on", 600); + }); + + it("Click With Index", async() => { + await browser.assert.text("#switch", "On"); + const clickedElements = await browser.click("button", 1); + assert.strictEqual(clickedElements, 1); + await browser.assert.text("#switch", "On"); + await browser.waitFor("#switch.off", 600); + }); + + it("Click From Node", async() => { + const node = await browser.query(".btn"); + const clickedElements = await browser.click(node); + assert.strictEqual(clickedElements, 1); + await browser.assert.text("#switch", "Off"); + }); + + it("Click With Invalid Index", async() => { + await browser.assert.text("#switch", "On"); + await utils.assertThrowsAsync(async () => { + await browser.click("button", 10); + }, `Error: browser.click, invalid index "10" for selector "button", 2 elements found.`); + await browser.assert.text("#switch", "On"); + }); + + it("Click Text", async() => { + const clickedElements = await browser.clickText("click me"); + assert.strictEqual(clickedElements, 1); + await browser.assert.text("#switch", "Off"); + await browser.clickText("click me"); + await browser.assert.text("#switch", "On"); + }); + + it("Click Invalid Text", async() => { + await utils.assertThrowsAsync(async () => { + await browser.clickText("not click me"); + }, `Error: No element with text "not click me" found when trying to click.`); + await browser.assert.text("#switch", "On"); + }); + + it("Click Invalid Element"); + +}); diff --git a/tests/interactions/input.test.js b/tests/interactions/input.test.js new file mode 100644 index 00000000..12dd25e4 --- /dev/null +++ b/tests/interactions/input.test.js @@ -0,0 +1,62 @@ +"use strict"; + +const Wendigo = require('../../lib/wendigo'); +const configUrls = require('../config.json').urls; + +describe("Input", function() { + this.timeout(5000); + let browser; + + before(async () => { + browser = await Wendigo.createBrowser(); + }); + + beforeEach(async() => { + await browser.open(configUrls.forms); + }); + + after(async() => { + await browser.close(); + }); + + it("Type", async () => { + await browser.type("input.input1", "firstText"); + await browser.assert.value("input.input1", "firstText"); + }); + it("Type With Existing Text", async () => { + await browser.type("input.input2", "secondText"); + await browser.assert.value("input.input2", "secondTextdefault value"); + }); + + it("Type Multiple Elements", async () => { + await browser.type("input", "firstText"); + await browser.assert.value("input.input1", "firstText"); + await browser.assert.value("input.input2", "default value"); + }); + + it("Type Node", async () => { + const node = await browser.query("input.input1"); + + await browser.type(node, "firstText"); + await browser.assert.value("input.input1", "firstText"); + }); + + it("Clear Input", async() => { + await browser.clearValue("input.input1"); + await browser.clearValue("input.input2"); + await browser.assert.value("input.input1", ""); + await browser.assert.value("input.input2", ""); + }); + + it("Clear Input From Node", async() => { + const node = await browser.query("input.input2"); + await browser.clearValue(node); + await browser.assert.value("input.input2", ""); + }); + + it("Type With Keypress Event", async() => { + await browser.type(".input1", "dontpanic"); + await browser.assert.text("#value-input", "c"); + }); + +}); From c6a3dae838e8deca47ccbdd2deee12eafbaf7d0c Mon Sep 17 00:00:00 2001 From: andres Date: Mon, 19 Feb 2018 00:05:17 +0100 Subject: [PATCH 06/14] added multiple assertions to same node test, close #62 --- tests/browser_assert.test.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/browser_assert.test.js b/tests/browser_assert.test.js index d7dad782..b2156cfd 100644 --- a/tests/browser_assert.test.js +++ b/tests/browser_assert.test.js @@ -108,6 +108,13 @@ describe("Assertions", function() { await browser.assert.visible(node); }); + it("Multiple Assertions From Same Node", async () => { + await browser.open(configUrls.index); + const node = await browser.query("h1"); + await browser.assert.text(node, "Main Title"); + await browser.assert.visible(node); + }); + it("Title", async() => { assert(browser.assert.title); await browser.open(configUrls.index); From 4bfd64968496c229225174df9dc0a1ec5cd56300 Mon Sep 17 00:00:00 2001 From: andres Date: Mon, 19 Feb 2018 00:09:34 +0100 Subject: [PATCH 07/14] click invalid element test --- tests/assertions/assert_text.test.js | 61 ++++++++++++++++++++++++++++ tests/browser_assert.test.js | 43 -------------------- tests/interactions/click.test.js | 6 ++- 3 files changed, 66 insertions(+), 44 deletions(-) create mode 100644 tests/assertions/assert_text.test.js diff --git a/tests/assertions/assert_text.test.js b/tests/assertions/assert_text.test.js new file mode 100644 index 00000000..97fffce8 --- /dev/null +++ b/tests/assertions/assert_text.test.js @@ -0,0 +1,61 @@ +"use strict"; + +const Wendigo = require('../../lib/wendigo'); +const utils = require('../utils'); +const configUrls = require('../config.json').urls; + +describe("Assert Text", function() { + this.timeout(5000); + let browser; + + before(async () => { + browser = await Wendigo.createBrowser(); + }); + + beforeEach(async() => { + await browser.open(configUrls.index); + }); + + after(async() => { + await browser.close(); + }); + + it("Text", async () => { + await browser.assert.text("h1", "Main Title"); + }); + + it("Text From Node", async () => { + const node = await browser.query("h1"); + await browser.assert.text(node, "Main Title"); + }); + + it("Multiple Texts", async () => { + await browser.assert.text("p", "My first paragraph"); + await browser.assert.text("p", "My second paragraph"); + }); + + it("Text Throws", async () => { + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.text("h1", "My first paragraph"); + }, `Expected element "h1" to have text "My first paragraph", "Main Title" found`); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.text("h2", "My first paragraph"); + }, `Expected element "h2" to have text "My first paragraph", no text found`); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.text(".container p", "My second paragraph"); + }, `Expected element ".container p" to have text "My second paragraph", "My first paragraph" found`); + }); + + it("Multiple Text Throws", async () => { + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.text("p", "My paragraph"); + }, `Expected element "p" to have text "My paragraph", "My first paragraph My second paragraph" found`); + }); + + it("Text Throws With Custom Message", async () => { + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.text("h1", "My first paragraph", "text failed"); + }, `text failed`); + }); + +}); diff --git a/tests/browser_assert.test.js b/tests/browser_assert.test.js index b2156cfd..9b5c25c2 100644 --- a/tests/browser_assert.test.js +++ b/tests/browser_assert.test.js @@ -17,49 +17,6 @@ describe("Assertions", function() { await browser.close(); }); - it("Text", async () => { - await browser.open(configUrls.index); - await browser.assert.text("h1", "Main Title"); - }); - - it("Text From Node", async () => { - await browser.open(configUrls.index); - const node = await browser.query("h1"); - await browser.assert.text(node, "Main Title"); - }); - - it("Multiple Texts", async () => { - await browser.open(configUrls.index); - await browser.assert.text("p", "My first paragraph"); - await browser.assert.text("p", "My second paragraph"); - }); - - it("Text Throws", async () => { - await browser.open(configUrls.index); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.text("h1", "My first paragraph"); - }, `Expected element "h1" to have text "My first paragraph", "Main Title" found`); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.text("h2", "My first paragraph"); - }, `Expected element "h2" to have text "My first paragraph", no text found`); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.text(".container p", "My second paragraph"); - }, `Expected element ".container p" to have text "My second paragraph", "My first paragraph" found`); - }); - - it("Multiple Text Throws", async () => { - await browser.open(configUrls.index); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.text("p", "My paragraph"); - }, `Expected element "p" to have text "My paragraph", "My first paragraph My second paragraph" found`); - }); - - it("Text Throws With Custom Message", async () => { - await browser.open(configUrls.index); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.text("h1", "My first paragraph", "text failed"); - }, `text failed`); - }); it("Is Visible", async() => { assert(browser.assert.visible); diff --git a/tests/interactions/click.test.js b/tests/interactions/click.test.js index 2ad93aec..10cf9f15 100644 --- a/tests/interactions/click.test.js +++ b/tests/interactions/click.test.js @@ -74,6 +74,10 @@ describe("Click", function() { await browser.assert.text("#switch", "On"); }); - it("Click Invalid Element"); + it("Click Invalid Element", async() => { + await utils.assertThrowsAsync(async() => { + await browser.click("#not-an-element"); + }, `Error: No element "#not-an-element" found when trying to click.`); + }); }); From 529b43ad8d76f9038adbaabdd31730aff2ba5f3b Mon Sep 17 00:00:00 2001 From: andres Date: Mon, 19 Feb 2018 00:12:53 +0100 Subject: [PATCH 08/14] small project reorganization --- lib/{ => assertions}/browser_assertions.js | 4 ++-- lib/{ => assertions}/browser_not_assertions.js | 2 +- lib/{assertions_utils => assertions/utils}/assert_elements.js | 2 +- lib/{ => browser}/browser.js | 4 ++-- lib/{ => browser}/browser_base.js | 0 lib/wendigo.js | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename lib/{ => assertions}/browser_assertions.js (97%) rename lib/{ => assertions}/browser_not_assertions.js (98%) rename lib/{assertions_utils => assertions/utils}/assert_elements.js (98%) rename lib/{ => browser}/browser.js (96%) rename lib/{ => browser}/browser_base.js (100%) diff --git a/lib/browser_assertions.js b/lib/assertions/browser_assertions.js similarity index 97% rename from lib/browser_assertions.js rename to lib/assertions/browser_assertions.js index d1894028..5638a574 100644 --- a/lib/browser_assertions.js +++ b/lib/assertions/browser_assertions.js @@ -3,8 +3,8 @@ const assert = require('assert'); const BrowserNotAssertions = require('./browser_not_assertions'); -const elementsAssertionUtils = require('./assertions_utils/assert_elements'); -const utils = require('./utils'); +const elementsAssertionUtils = require('./utils/assert_elements'); +const utils = require('../utils'); module.exports = class BrowserAssertions { diff --git a/lib/browser_not_assertions.js b/lib/assertions/browser_not_assertions.js similarity index 98% rename from lib/browser_not_assertions.js rename to lib/assertions/browser_not_assertions.js index d1f50bc3..7b93c272 100644 --- a/lib/browser_not_assertions.js +++ b/lib/assertions/browser_not_assertions.js @@ -1,7 +1,7 @@ "use strict"; const assert = require('assert'); -const utils = require('./utils'); +const utils = require('../utils'); function invertify(cb, msg) { return cb().then(() => { diff --git a/lib/assertions_utils/assert_elements.js b/lib/assertions/utils/assert_elements.js similarity index 98% rename from lib/assertions_utils/assert_elements.js rename to lib/assertions/utils/assert_elements.js index 5e445ef1..00b93f24 100644 --- a/lib/assertions_utils/assert_elements.js +++ b/lib/assertions/utils/assert_elements.js @@ -1,5 +1,5 @@ "use strict"; -const utils = require('../utils'); +const utils = require('../../utils'); const assert = require('assert'); const countCases = { diff --git a/lib/browser.js b/lib/browser/browser.js similarity index 96% rename from lib/browser.js rename to lib/browser/browser.js index 9ce71734..aafd3032 100644 --- a/lib/browser.js +++ b/lib/browser/browser.js @@ -2,7 +2,7 @@ "use strict"; const path = require('path'); -const BrowserAssertions = require('./browser_assertions'); +const BrowserAssertions = require('../assertions/browser_assertions'); const BrowserBase = require('./browser_base'); module.exports = class Browser extends BrowserBase { @@ -19,7 +19,7 @@ module.exports = class Browser extends BrowserBase { return this.page.goto(url).then(() => { return this.page.content().then((content) => { this._originalHtml = content; - return this.page.addScriptTag({path: path.join(__dirname, "..", "injection_scripts/wendigo_utils.js")}); + return this.page.addScriptTag({path: path.join(__dirname, "../..", "injection_scripts/wendigo_utils.js")}); }); }); } diff --git a/lib/browser_base.js b/lib/browser/browser_base.js similarity index 100% rename from lib/browser_base.js rename to lib/browser/browser_base.js diff --git a/lib/wendigo.js b/lib/wendigo.js index 4cff3f7b..44466954 100644 --- a/lib/wendigo.js +++ b/lib/wendigo.js @@ -1,7 +1,7 @@ "use strict"; const process = require('process'); -const Browser = require('./browser'); +const Browser = require('./browser/browser'); const puppeteer = require('puppeteer'); From cbbebbb298e3e0906bdf22536a73da4e614999e2 Mon Sep 17 00:00:00 2001 From: andres Date: Tue, 20 Feb 2018 18:34:10 +0100 Subject: [PATCH 09/14] added browser.styles #19 --- CHANGELOG.md | 1 + README.md | 7 +++++ injection_scripts/wendigo_utils.js | 20 ++++++++++--- lib/browser/browser_base.js | 7 +++++ tests/browser.test.js | 6 ---- tests/browser_base.test.js | 13 +++++---- tests/browser_base/styles.test.js | 42 ++++++++++++++++++++++++++++ tests/dummy_server/static/styles.css | 14 ++++++++++ 8 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 tests/browser_base/styles.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index cb603b58..4c7da5f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ 0.4.0 / ####-##-## ================== + * browser.styles will return the computed css styles * Type will trigger the keyboard events * Type behaviour changed * Readme improvements diff --git a/README.md b/README.md index 5ea94a78..16fb23f0 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,14 @@ const classAttribute = await browser.attribute(".my-element", "class"); // Retur const hiddentAttr = await browser.attribute(".my-hidden-element", "hidden"); // Returns "" const hiddentAttr2 = await browser.attribute(".not-hidden-element", "hidden"); // Returns null +``` + +**styles(selector, pseudoSelector)** +Returns an object with all the computed css styles of the first element matching the given selector. +```js +const styles=await browser.styles("h1.my-title"); +styles.color; // 'rgb(255, 0, 0)' ``` **text(selector)** diff --git a/injection_scripts/wendigo_utils.js b/injection_scripts/wendigo_utils.js index b8151881..24a36cbc 100644 --- a/injection_scripts/wendigo_utils.js +++ b/injection_scripts/wendigo_utils.js @@ -3,7 +3,7 @@ window.WendigoUtils = { isVisible(element) { if(!element) return false; - let style = window.getComputedStyle(element, ""); + const style = window.getComputedStyle(element); if (style.display === 'none') return false; if (style.visibility === 'hidden') return false; else return true; @@ -16,9 +16,12 @@ window.WendigoUtils = { queryAll(selector) { if(typeof selector === 'string') { return document.querySelectorAll(selector); - } else if(!Array.isArray(selector)) { - return [selector]; - } else return selector; + } else{ + if(!Array.isArray(selector)) { + selector = [selector]; + } + return selector; + } }, xPathQuery: function(xPath) { let xPathResult = document.evaluate(xPath, document, null, XPathResult.ANY_TYPE, null); @@ -29,5 +32,14 @@ window.WendigoUtils = { r = xPathResult.iterateNext(); } return result; + }, + getStyles(element, pseudoSelector) { + const rawStyles = getComputedStyle(element, pseudoSelector); + const result = {}; + for(let i = 0;i < rawStyles.length;i++) { + const name = rawStyles[i]; + result[name] = rawStyles.getPropertyValue(name); + } + return result; } }; diff --git a/lib/browser/browser_base.js b/lib/browser/browser_base.js index faa2f518..8d1079d2 100644 --- a/lib/browser/browser_base.js +++ b/lib/browser/browser_base.js @@ -57,4 +57,11 @@ module.exports = class BrowserBase { return Promise.reject(new Error(`Element "${selector}" not found when trying to get attribute "${attributeName}".`)); }); } + + styles(selector, pseudoSelector) { + return this.page.evaluate((selector, pseudoSelector) => { + const element = WendigoUtils.queryElement(selector); + return WendigoUtils.getStyles(element, pseudoSelector); + }, selector, pseudoSelector); + } }; diff --git a/tests/browser.test.js b/tests/browser.test.js index d3ee30ab..c9d18897 100644 --- a/tests/browser.test.js +++ b/tests/browser.test.js @@ -64,8 +64,6 @@ describe("Browser", function() { await browser.open(configUrls.index); const headerElement = await browser.findByText("Main Title"); assert.strictEqual(headerElement.length, 1); - // assert.strictEqual(headerElement[0].textContent, "Main Title"); - // assert.strictEqual(headerElement[0].tagName, "h1"); }); it("Find By Text Empty", async() => { await browser.open(configUrls.index); @@ -77,10 +75,6 @@ describe("Browser", function() { await browser.open(configUrls.index); const elements = await browser.findByTextContaining("paragraph"); assert.strictEqual(elements.length, 2); - // assert.strictEqual(elements[0].textContent, "My first paragraph"); - // assert.strictEqual(elements[0].tagName, "p"); - // assert.strictEqual(elements[1].textContent, "My second paragraph"); - // assert.strictEqual(elements[1].tagName, "p"); }); it("Url", async() => { diff --git a/tests/browser_base.test.js b/tests/browser_base.test.js index 3ba8c5eb..eaeb5a65 100644 --- a/tests/browser_base.test.js +++ b/tests/browser_base.test.js @@ -21,14 +21,12 @@ describe("Browser Base", function() { await browser.open(configUrls.index); const element = await browser.query("h1"); assert(element); - // assert.strictEqual(element.textContent, "Main Title"); }); it("Query Multiple Elements", async () => { await browser.open(configUrls.index); const element = await browser.query("p"); assert(element); - // assert.strictEqual(element.textContent, "My first paragraph"); }); it("Query Not Element Found", async() => { @@ -37,26 +35,29 @@ describe("Browser Base", function() { assert.strictEqual(element, null); }); + it("Query Node", async () => { + await browser.open(configUrls.index); + const element = await browser.query("h1"); + const element2 = await browser.query(element); + assert(element2); + }); + it("QueryAll", async () => { await browser.open(configUrls.index); const elements = await browser.queryAll("p"); assert.strictEqual(elements.length, 2); - // assert.strictEqual(elements[0].textContent, "My first paragraph"); - // assert.strictEqual(elements[1].textContent, "My second paragraph"); }); it("QueryAll One Element", async () => { await browser.open(configUrls.index); const elements = await browser.queryAll(".container p"); assert.strictEqual(elements.length, 1); - // assert.strictEqual(elements[0].textContent, "My first paragraph"); }); it("XPath Query", async() => { await browser.open(configUrls.index); const elements = await browser.queryXPath('//p[contains(text(),"My first paragraph")]'); assert.strictEqual(elements.length, 1); - // assert.strictEqual(elements[0].textContent, "My first paragraph"); }); it("Class", async() => { diff --git a/tests/browser_base/styles.test.js b/tests/browser_base/styles.test.js new file mode 100644 index 00000000..8f4f0fce --- /dev/null +++ b/tests/browser_base/styles.test.js @@ -0,0 +1,42 @@ +"use strict"; + +const Wendigo = require('../../lib/wendigo'); +const assert = require('assert'); +const configUrls = require('../config.json').urls; + +describe("Browser Base", function() { + this.timeout(5000); + + let browser; + before(async () => { + browser = await Wendigo.createBrowser(); + }); + + after(async() => { + await browser.close(); + }); + + it("Get Styles", async() => { + await browser.open(configUrls.index); + const styles = await browser.styles("h1"); + assert.strictEqual(styles.color, "rgb(255, 0, 0)"); + }); + + it("Get Dynamic Styles", async() => { + await browser.open(configUrls.click); + const styles = await browser.styles("#switch"); + assert.strictEqual(styles["background-color"], "rgb(0, 0, 255)"); + assert.strictEqual(styles["color"], "rgb(0, 0, 0)"); + await browser.click(".btn"); + const styles2 = await browser.styles("#switch"); + assert.strictEqual(styles2["background-color"], "rgb(255, 0, 0)"); + assert.strictEqual(styles2["color"], "rgb(0, 0, 0)"); + assert.strictEqual(styles["background-color"], "rgb(0, 0, 255)"); + assert.strictEqual(styles["color"], "rgb(0, 0, 0)"); + }); + + it("Styles On Invalid Element"); + it("Styles From Node Element"); + it("Styles With PseudoSelector"); + +}); diff --git a/tests/dummy_server/static/styles.css b/tests/dummy_server/static/styles.css index 61039145..faff2fb7 100644 --- a/tests/dummy_server/static/styles.css +++ b/tests/dummy_server/static/styles.css @@ -1,3 +1,17 @@ .hidden-text2 { visibility: hidden; } + +h1 { + color: red; +} + + +.on{ + background-color: blue; +} + +.off{ + background-color: red; + +} From a27f0df1950be78eb74f8450bcf2a00a45b05bc4 Mon Sep 17 00:00:00 2001 From: andres Date: Tue, 20 Feb 2018 18:42:12 +0100 Subject: [PATCH 10/14] added some styles tests #19 --- lib/browser/browser_base.js | 7 +++++-- tests/browser_base/styles.test.js | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/browser/browser_base.js b/lib/browser/browser_base.js index 8d1079d2..50a210fc 100644 --- a/lib/browser/browser_base.js +++ b/lib/browser/browser_base.js @@ -53,7 +53,7 @@ module.exports = class BrowserBase { const element = WendigoUtils.queryElement(q); if(!element) return Promise.reject(); return element.getAttribute(attributeName); - }, selector, attributeName).catch(() => { + }, selector, attributeName).catch(() => { // To avoid Error: Evaluation Failed return Promise.reject(new Error(`Element "${selector}" not found when trying to get attribute "${attributeName}".`)); }); } @@ -61,7 +61,10 @@ module.exports = class BrowserBase { styles(selector, pseudoSelector) { return this.page.evaluate((selector, pseudoSelector) => { const element = WendigoUtils.queryElement(selector); + if(!element) return Promise.reject(); return WendigoUtils.getStyles(element, pseudoSelector); - }, selector, pseudoSelector); + }, selector, pseudoSelector).catch(() => { // To avoid Error: Evaluation Failed + return Promise.reject(new Error(`Element "${selector}" not found when trying to get styles.`)); + }); } }; diff --git a/tests/browser_base/styles.test.js b/tests/browser_base/styles.test.js index 8f4f0fce..8c121c6c 100644 --- a/tests/browser_base/styles.test.js +++ b/tests/browser_base/styles.test.js @@ -3,6 +3,7 @@ const Wendigo = require('../../lib/wendigo'); const assert = require('assert'); const configUrls = require('../config.json').urls; +const utils = require('../utils'); describe("Browser Base", function() { this.timeout(5000); @@ -35,8 +36,19 @@ describe("Browser Base", function() { assert.strictEqual(styles["color"], "rgb(0, 0, 0)"); }); - it("Styles On Invalid Element"); - it("Styles From Node Element"); + it("Styles On Invalid Element", async() => { + await browser.open(configUrls.index); + await utils.assertThrowsAsync(async () => { + await browser.styles("#not-an-element"); + }, `Error: Element "#not-an-element" not found when trying to get styles.`); + }); + + it("Styles From Node Element", async() => { + await browser.open(configUrls.index); + const node = await browser.query("h1"); + const styles = await browser.styles(node); + assert.strictEqual(styles.color, "rgb(255, 0, 0)"); + }); it("Styles With PseudoSelector"); }); From b4f11a6027b0320aee409fac52146422d6368781 Mon Sep 17 00:00:00 2001 From: andres Date: Tue, 20 Feb 2018 23:18:27 +0100 Subject: [PATCH 11/14] minor fixes in browser.style #19 --- README.md | 2 +- injection_scripts/wendigo_utils.js | 4 ++-- lib/browser/browser_base.js | 8 ++++---- tests/browser_base/styles.test.js | 2 -- tests/dummy_server/static/styles.css | 1 - 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 16fb23f0..55910bbf 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ const hiddentAttr = await browser.attribute(".my-hidden-element", "hidden"); // const hiddentAttr2 = await browser.attribute(".not-hidden-element", "hidden"); // Returns null ``` -**styles(selector, pseudoSelector)** +**styles(selector)** Returns an object with all the computed css styles of the first element matching the given selector. ```js diff --git a/injection_scripts/wendigo_utils.js b/injection_scripts/wendigo_utils.js index 24a36cbc..54649016 100644 --- a/injection_scripts/wendigo_utils.js +++ b/injection_scripts/wendigo_utils.js @@ -33,8 +33,8 @@ window.WendigoUtils = { } return result; }, - getStyles(element, pseudoSelector) { - const rawStyles = getComputedStyle(element, pseudoSelector); + getStyles(element) { + const rawStyles = getComputedStyle(element); const result = {}; for(let i = 0;i < rawStyles.length;i++) { const name = rawStyles[i]; diff --git a/lib/browser/browser_base.js b/lib/browser/browser_base.js index 50a210fc..52dd4c10 100644 --- a/lib/browser/browser_base.js +++ b/lib/browser/browser_base.js @@ -58,12 +58,12 @@ module.exports = class BrowserBase { }); } - styles(selector, pseudoSelector) { - return this.page.evaluate((selector, pseudoSelector) => { + styles(selector) { + return this.page.evaluate((selector) => { const element = WendigoUtils.queryElement(selector); if(!element) return Promise.reject(); - return WendigoUtils.getStyles(element, pseudoSelector); - }, selector, pseudoSelector).catch(() => { // To avoid Error: Evaluation Failed + return WendigoUtils.getStyles(element); + }, selector).catch(() => { // To avoid Error: Evaluation Failed return Promise.reject(new Error(`Element "${selector}" not found when trying to get styles.`)); }); } diff --git a/tests/browser_base/styles.test.js b/tests/browser_base/styles.test.js index 8c121c6c..71f5c44c 100644 --- a/tests/browser_base/styles.test.js +++ b/tests/browser_base/styles.test.js @@ -49,6 +49,4 @@ describe("Browser Base", function() { const styles = await browser.styles(node); assert.strictEqual(styles.color, "rgb(255, 0, 0)"); }); - it("Styles With PseudoSelector"); - }); diff --git a/tests/dummy_server/static/styles.css b/tests/dummy_server/static/styles.css index faff2fb7..404103df 100644 --- a/tests/dummy_server/static/styles.css +++ b/tests/dummy_server/static/styles.css @@ -6,7 +6,6 @@ h1 { color: red; } - .on{ background-color: blue; } From f7602d0af477c6fab8e349f88b9e23db060ef2c5 Mon Sep 17 00:00:00 2001 From: andres Date: Wed, 21 Feb 2018 12:20:21 +0100 Subject: [PATCH 12/14] style assertion #19 --- README.md | 7 +++ lib/assertions/browser_assertions.js | 19 +++++++ tests/assertions/assert_style.test.js | 63 +++++++++++++++++++++++ tests/assertions/assert_visible.test.js | 68 +++++++++++++++++++++++++ tests/browser_assert.test.js | 48 ----------------- tests/browser_base/styles.test.js | 6 +++ 6 files changed, 163 insertions(+), 48 deletions(-) create mode 100644 tests/assertions/assert_style.test.js create mode 100644 tests/assertions/assert_visible.test.js diff --git a/README.md b/README.md index 55910bbf..0d4e0d64 100644 --- a/README.md +++ b/README.md @@ -336,6 +336,13 @@ await browser.assert.attribute(".hidden-class", "hidden", null, "hidden-class do If the element doesn't exists, the assertion will fail. +**style(selector, style, expected, msg)** +Asserts that the first element matching the given selector has an style with the expected value. The assertion will throw an error if no element is found. + +```js +await browser.assert.style("h1", "color", "rgb(0, 0, 0)"); +``` + ### Negative assertions Most of the browser assertions have a negative version that can be used with `browser.assert.not`. Most of the behaviours of the "not" assertions are simply the inverse of the positive version. diff --git a/lib/assertions/browser_assertions.js b/lib/assertions/browser_assertions.js index 5638a574..4a223e10 100644 --- a/lib/assertions/browser_assertions.js +++ b/lib/assertions/browser_assertions.js @@ -126,4 +126,23 @@ module.exports = class BrowserAssertions { return utils.rejectAssertion(msg); }); } + + style(selector, style, expected, msg) { + return this._browser.page.evaluate((selector, style) => { + const element = WendigoUtils.queryElement(selector); + if(!element) return Promise.reject(); + const styles = getComputedStyle(element); + return styles.getPropertyValue(style); + }, selector, style).catch(() => { + return Promise.reject(new Error(`Element "${selector}" not found when trying to assert style.`)); + }).then((value) => { + if(!msg) { + msg = `Expected element "${selector}" to have style "${style}" with value "${expected}"`; + if(value) msg = `${msg}, "${value}" found.`; + else msg = `${msg}, style not found.`; + } + assert.strictEqual(value, expected, msg); + }); + + } }; diff --git a/tests/assertions/assert_style.test.js b/tests/assertions/assert_style.test.js new file mode 100644 index 00000000..9e500b5c --- /dev/null +++ b/tests/assertions/assert_style.test.js @@ -0,0 +1,63 @@ +"use strict"; + +const assert = require('assert'); +const Wendigo = require('../../lib/wendigo'); +const utils = require('../utils'); +const configUrls = require('../config.json').urls; + +describe("Assert Style", function() { + this.timeout(5000); + let browser; + + before(async () => { + browser = await Wendigo.createBrowser({log: true}); + await browser.open(configUrls.index); + }); + + after(async() => { + await browser.close(); + }); + + it("Style", async () => { + await browser.assert.style("h1", "color", "rgb(255, 0, 0)"); + await browser.assert.style("p", "color", "rgb(0, 0, 0)"); + }); + + it("Style Multiple Elements", async() => { + await browser.assert.style("b", "visibility", "hidden"); + }); + + it("Style From Node", async() => { + const node = await browser.query("h1"); + await browser.assert.style(node, "color", "rgb(255, 0, 0)"); + }); + + it("Style Throws", async() => { + assert(browser.assert.style); + await utils.assertThrowsAssertionAsync(async() => { + await browser.assert.style("h1", "color", "rgb(0, 0, 0)"); + }, `Expected element "h1" to have style "color" with value "rgb(0, 0, 0)", "rgb(255, 0, 0)" found.`); + }); + it("Style Not Found Throws", async() => { + await utils.assertThrowsAssertionAsync(async() => { + await browser.assert.style("h1", "not-style", "0"); + }, `Expected element "h1" to have style "not-style" with value "0", style not found.`); + }); + it("Style Element Not Found", async() => { + await utils.assertThrowsAsync(async() => { + await browser.assert.style(".not-element", "color", "rgb(0, 0, 0)"); + }, `Error: Element ".not-element" not found when trying to assert style.`); + }); + it("Style Throws Custom Message", async() => { + await utils.assertThrowsAssertionAsync(async() => { + await browser.assert.style("h1", "color", "rgb(0, 0, 0)", "style fails"); + }, `style fails`); + }); + + it("Not Style"); + it("Not Style Multiple Elements"); + it("Not Style From Node"); + it("Not Style Throws"); + it("Not Style Element Not Found"); + it("Not Style Throws Custom Message"); +}); diff --git a/tests/assertions/assert_visible.test.js b/tests/assertions/assert_visible.test.js new file mode 100644 index 00000000..a859a846 --- /dev/null +++ b/tests/assertions/assert_visible.test.js @@ -0,0 +1,68 @@ +"use strict"; + +const assert = require('assert'); +const Wendigo = require('../../lib/wendigo'); +const utils = require('../utils'); +const configUrls = require('../config.json').urls; + +describe("Assert Visible", function() { + this.timeout(5000); + let browser; + + before(async () => { + browser = await Wendigo.createBrowser(); + }); + + after(async() => { + await browser.close(); + }); + + it("Is Visible", async() => { + assert(browser.assert.visible); + await browser.open(configUrls.index); + await browser.assert.visible("h1"); + await browser.assert.visible(".container p"); + await browser.assert.visible("p"); + }); + + it("Is Visible Throws", async() => { + await browser.open(configUrls.index); + assert(browser.assert.visible); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.visible(".hidden-text"); + }, `Expected element ".hidden-text" to be visible`); + }); + + it("Is Visible When Styled Hidden", async() => { + await browser.open(configUrls.index); + assert(browser.assert.visible); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.visible(".hidden-text2"); + }, `Expected element ".hidden-text2" to be visible`); + }); + + it("Is Visible When Element Not Exists", async() => { + await browser.open(configUrls.index); + assert(browser.assert.visible); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.visible(".not-exists"); + }, `Expected element ".not-exists" to be visible`); + }); + + it("Is Visible Throws With Custom Message", async() => { + await browser.open(configUrls.index); + assert(browser.assert.visible); + await utils.assertThrowsAssertionAsync(async () => { + await browser.assert.visible(".hidden-text", "visible test failed"); + }, `visible test failed`); + }); + + it("Is Visible From Node", async() => { + assert(browser.assert.visible); + await browser.open(configUrls.index); + const node = await browser.query("h1"); + await browser.assert.visible(node); + }); + + +}); diff --git a/tests/browser_assert.test.js b/tests/browser_assert.test.js index 9b5c25c2..38f11081 100644 --- a/tests/browser_assert.test.js +++ b/tests/browser_assert.test.js @@ -17,54 +17,6 @@ describe("Assertions", function() { await browser.close(); }); - - it("Is Visible", async() => { - assert(browser.assert.visible); - await browser.open(configUrls.index); - await browser.assert.visible("h1"); - await browser.assert.visible(".container p"); - await browser.assert.visible("p"); - }); - - it("Is Visible Throws", async() => { - await browser.open(configUrls.index); - assert(browser.assert.visible); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.visible(".hidden-text"); - }, `Expected element ".hidden-text" to be visible`); - }); - - it("Is Visible When Styled Hidden", async() => { - await browser.open(configUrls.index); - assert(browser.assert.visible); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.visible(".hidden-text2"); - }, `Expected element ".hidden-text2" to be visible`); - }); - - it("Is Visible When Element Not Exists", async() => { - await browser.open(configUrls.index); - assert(browser.assert.visible); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.visible(".not-exists"); - }, `Expected element ".not-exists" to be visible`); - }); - - it("Is Visible Throws With Custom Message", async() => { - await browser.open(configUrls.index); - assert(browser.assert.visible); - await utils.assertThrowsAssertionAsync(async () => { - await browser.assert.visible(".hidden-text", "visible test failed"); - }, `visible test failed`); - }); - - it("Is Visible From Node", async() => { - assert(browser.assert.visible); - await browser.open(configUrls.index); - const node = await browser.query("h1"); - await browser.assert.visible(node); - }); - it("Multiple Assertions From Same Node", async () => { await browser.open(configUrls.index); const node = await browser.query("h1"); diff --git a/tests/browser_base/styles.test.js b/tests/browser_base/styles.test.js index 71f5c44c..31c96e8f 100644 --- a/tests/browser_base/styles.test.js +++ b/tests/browser_base/styles.test.js @@ -49,4 +49,10 @@ describe("Browser Base", function() { const styles = await browser.styles(node); assert.strictEqual(styles.color, "rgb(255, 0, 0)"); }); + + it("Style Multiple Elements", async() => { + await browser.open(configUrls.index); + const styles = await browser.styles("b"); + assert.strictEqual(styles.visibility, "hidden"); + }); }); From adec2b4154386542328dac03963fe689b8ea15e0 Mon Sep 17 00:00:00 2001 From: andres Date: Wed, 21 Feb 2018 12:55:08 +0100 Subject: [PATCH 13/14] assert style and not style, close #19 --- CHANGELOG.md | 1 + README.md | 3 ++ lib/assertions/browser_not_assertions.js | 13 ++++++-- tests/assertions/assert_style.test.js | 38 ++++++++++++++++++++---- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c7da5f3..e4af77d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ 0.4.0 / ####-##-## ================== + * Browser style and not style assertions * browser.styles will return the computed css styles * Type will trigger the keyboard events * Type behaviour changed diff --git a/README.md b/README.md index 0d4e0d64..514efad9 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,9 @@ await browser.assert.not.attribute(".hidden-class", "href", null, "hidden-class ``` If the element doesn't exists, the assertion will fail. +**not.style(selector, style, expected, msg)** +Asserts the first element matching the selector doesn't has a style with given value. + ## Examples **Testing a simple page with Mocha and Wendigo** diff --git a/lib/assertions/browser_not_assertions.js b/lib/assertions/browser_not_assertions.js index 7b93c272..1a1c5d2c 100644 --- a/lib/assertions/browser_not_assertions.js +++ b/lib/assertions/browser_not_assertions.js @@ -6,8 +6,9 @@ const utils = require('../utils'); function invertify(cb, msg) { return cb().then(() => { return Promise.reject(new assert.AssertionError({message: msg})); - }, () => { - return Promise.resolve(); + }, (err) => { + if(err instanceof assert.AssertionError) return Promise.resolve(); + else return Promise.reject(err); }); } @@ -88,4 +89,12 @@ module.exports = class BrowserAssertions { return utils.rejectAssertion(msg); }); } + + style(selector, style, expected, msg) { + if(!msg) msg = `Expected element "${selector}" not to have style "${style}" with value "${expected}".`; + return invertify(() => { + return this._assertions.style(selector, style, expected); + }, msg); + + } }; diff --git a/tests/assertions/assert_style.test.js b/tests/assertions/assert_style.test.js index 9e500b5c..00b3f920 100644 --- a/tests/assertions/assert_style.test.js +++ b/tests/assertions/assert_style.test.js @@ -54,10 +54,36 @@ describe("Assert Style", function() { }, `style fails`); }); - it("Not Style"); - it("Not Style Multiple Elements"); - it("Not Style From Node"); - it("Not Style Throws"); - it("Not Style Element Not Found"); - it("Not Style Throws Custom Message"); + it("Not Style", async() => { + await browser.assert.not.style("h1", "color", "rgb(0, 0, 0)"); + await browser.assert.not.style("p", "color", "not-color"); + }); + + it("Not Style Multiple Elements", async() => { + await browser.assert.not.style("b", "visibility", "visible"); + }); + + it("Not Style From Node", async() => { + const node = await browser.query("h1"); + await browser.assert.not.style(node, "color", "rgb(0, 0, 0)"); + }); + it("Not Style Throws", async() => { + assert(browser.assert.not.style); + await utils.assertThrowsAssertionAsync(async() => { + await browser.assert.not.style("h1", "color", "rgb(255, 0, 0)"); + }, `Expected element "h1" not to have style "color" with value "rgb(255, 0, 0)".`); + }); + + it("Not Style Element Not Found", async() => { + assert(browser.assert.not.style); + await utils.assertThrowsAsync(async() => { + await browser.assert.not.style(".not-element", "color", "rgb(0, 0, 0)"); + }, `Error: Element ".not-element" not found when trying to assert style.`); + }); + + it("Not Style Throws Custom Message", async() => { + await utils.assertThrowsAssertionAsync(async() => { + await browser.assert.not.style("h1", "color", "rgb(255, 0, 0)", "not style fails"); + }, `not style fails`); + }); }); From 093437758f0595b08ca5918d6723515fc2a0fc7c Mon Sep 17 00:00:00 2001 From: andres Date: Wed, 21 Feb 2018 13:03:43 +0100 Subject: [PATCH 14/14] changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4af77d1..49f549e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -0.4.0 / ####-##-## +0.4.0 / 2018-02-21 ================== * Browser style and not style assertions