nightwatchjs / nightwatch

Integrated end-to-end testing framework written in Node.js and using W3C Webdriver API. Developed at @browserstack
https://nightwatchjs.org
MIT License
11.79k stars 1.31k forks source link

No screenshot is made for failed test cases if last test cases passed or have no assertion #2643

Closed pawlakmaly closed 3 years ago

pawlakmaly commented 3 years ago

Describe the bug

I've notice that Nightwatch does not do the screenshot when tests cases fails in test suit if the last test case in the suit is passed or have no assertion. This makes the screenshot on failed feature useless, especially when I integrate NW tests on Pipeline with publishing test result with screenshots. The screenshot when few last assertion failed is made only for last assertion.

Sample test

sampleTest.js

```ts import { NightwatchBrowser } from 'nightwatch'; module.exports = { after(browser: NightwatchBrowser) { browser.end() }, "Opening the page and first failed assertion": function (browser: NightwatchBrowser) { browser.url('https://www.ecosia.org/') .verify.visible("someElement") }, "Second failed assertion": function (browser: NightwatchBrowser) { browser.verify.elementPresent('someElement') }, "Third passed assertion": function (browser: NightwatchBrowser) { browser.verify.elementPresent('body') }, }; } ```

Run with command

$ nightwatch test/sampleTest.js --your-other-arguments-here

Verbose output

debug.log

```txt > tsc && nightwatch ./tests/screenshotIssue.js --env firefox --verbose Starting GeckoDriver on port 4444... GeckoDriver up and running on port 4444 with pid: 13076 (150ms). [Screenshot Issue] Test Suite ============================= - Connecting to localhost on port 4444... Request POST /session { capabilities: { browserName: 'firefox', chromeOptions: { prefs: { download: [Object], profile: [Object] }, args: [] }, alwaysMatch: { 'moz:firefoxOptions': { prefs: [Object], args: [] } }, name: 'Screenshot Issue' }, desiredCapabilities: { browserName: 'firefox', platform: 'ANY', chromeOptions: { prefs: { download: [Object], profile: [Object] }, args: [] }, alwaysMatch: { 'moz:firefoxOptions': { prefs: [Object], args: [] } }, / Connecting to localhost on port 4444... Response 200 POST /session (2718ms) { value: { sessionId: 'c095b18f-7b7f-479a-acb2-211f21c8f749', capabilities: { acceptInsecureCerts: false, browserName: 'firefox', browserVersion: '87.0', 'moz:accessibilityChecks': false, 'moz:buildID': '20210318103112', 'moz:geckodriverVersion': '0.29.0', 'moz:headless': false, 'moz:processID': 3024, 'moz:profile': 'C:\\Users\\admin\\AppData\\Local\\Temp\\rust_mozprofilenDPyQ1', 'moz:shutdownTimeout': 60000, 'moz:useNonSpecCompliantPointerOrigin': false, 'moz:webdriverClick': true, pageLoadStrategy: 'normal', platformName: 'windows', platformVersion: '10.0', rotatable: false, setWindowRect: true, strictFileInteractability: false, timeouts: { implicit: 0, pageLoad: 300000, script: 30000 }, i Connected to localhost on port 4444 (2772ms). Using: firefox (87.0) on windows 10.0 platform. Received session with ID: c095b18f-7b7f-479a-acb2-211f21c8f749 → Running command: status ([Function]) Request GET /status Response 200 GET /status (2ms) { value: { message: 'Session already started', ready: false } } → Completed command: status ([Function]) (5ms) → Running [before]: → Completed [before]. Running: Opening the page and first failed assertion → Running [beforeEach]: → Completed [beforeEach]. → Running command: url ('https://www.ecosia.org/') Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/url { url: 'https://www.ecosia.org/' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/url (2555ms) { value: null } → Completed command: url ('https://www.ecosia.org/') (2557ms) → Running command: verify.visible ('someElement') → Running command: isVisible ('someElement', [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (97ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (8ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (12ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (10ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (10ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (15ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (10ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (13ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (8ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (10ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (10ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } × Testing if element is visible in 20000ms - expected "is visible" but got: "element could not be located" (20271ms) at Object.Opening the page and first failed assertion (C:\Users\admin\Documents\Repo\CS\QA-TestingTools\DTP-TestingTools\playground\nightwatch\tests\screenshotIssue.js:9:21) → Completed command: isVisible ('someElement', [Function]) (20274ms) → Completed command: verify.visible ('someElement') (20279ms) → Running [afterEach]: → Completed [afterEach]. FAILED: 1 assertions failed and 1 errors (22.848s) Running: Second failed assertion → Running [beforeEach]: → Completed [beforeEach]. → Running command: verify.elementPresent ('someElement') → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (12ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (17ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (5ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (5ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (4ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (7ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (6ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (4ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (5ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (7ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (8ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (8ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (8ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (3ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (5ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (9ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (5ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (6ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (4ms) { value: [] } → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (5ms) → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'someElement' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (7ms) { value: [] } × Testing if element is present in 20000ms - expected "is present" but got: "not present" (20228ms) at Object.Second failed assertion (C:\Users\admin\Documents\Repo\CS\QA-TestingTools\DTP-TestingTools\playground\nightwatch\tests\screenshotIssue.js:12:24) → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (10ms) → Completed command: verify.elementPresent ('someElement') (20230ms) → Running [afterEach]: → Completed [afterEach]. FAILED: 1 assertions failed (20.235s) Running: Third passed assertion → Running [beforeEach]: → Completed [beforeEach]. → Running command: verify.elementPresent ('body') → Running command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) Request POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements { using: 'css selector', value: 'body' } Response 200 POST /session/c095b18f-7b7f-479a-acb2-211f21c8f749/elements (13ms) { value: [ { 'element-6066-11e4-a52e-4f735466cecf': 'ca9777a1-342a-4cf7-ba00-018556fb38ea' } ] } √ Testing if element is present (20ms) → Completed command: elements ('css selector', {name, __index, __selector, locateStrategy, pseudoSelector, parent, resolvedElement}, [Function]) (19ms) → Completed command: verify.elementPresent ('body') (23ms) → Running [afterEach]: → Completed [afterEach]. OK. 1 assertions passed. (31ms) → Running [after]: → Running command: end () → Running command: session ('delete', [Function]) Request DELETE /session/c095b18f-7b7f-479a-acb2-211f21c8f749 Response 200 DELETE /session/c095b18f-7b7f-479a-acb2-211f21c8f749 (732ms) { value: null } → Completed command: end () (750ms) → Completed command: session ('delete', [Function]) (735ms) → Completed [after]. _________________________________________________ TEST FAILURE: 1 error during execution; 2 assertions failed, 1 passed (46.943s) × screenshotIssue – Opening the page and first failed assertion (22.848s) Testing if element is visible in 20000ms - expected "is visible" but got: "element could not be located" (20271ms) at Object.Opening the page and first failed assertion (C:\Users\admin\Documents\Repo\CS\QA-TestingTools\DTP-TestingTools\playground\nightwatch\tests\screenshotIssue.js:9:21) – Second failed assertion (20.235s) Testing if element is present in 20000ms - expected "is present" but got: "not present" (20228ms) at Object.Second failed assertion (C:\Users\admin\Documents\Repo\CS\QA-TestingTools\DTP-TestingTools\playground\nightwatch\tests\screenshotIssue.js:12:24) NoSuchElementError: An error occurred while running .isVisible() command on : {"value":[]} Wrote report file to: reports\junit\FIREFOX_87.0_10.0_screenshotIssue.xml. Wrote log file to: C:\Users\admin\Documents\Repo\CS\QA-TestingTools\DTP-TestingTools\playground\nightwatch\geckodriver.log. GeckoDriver process closed. npm ERR! code ELIFECYCLE npm ERR! errno 5 npm ERR! nightwatch-playground@1.0.0 e2e_test: `tsc && nightwatch ./tests/screenshotIssue.js --env firefox --verbose` npm ERR! Exit status 5 npm ERR! npm ERR! Failed at the nightwatch-playground@1.0.0 e2e_test script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\admin\AppData\Roaming\npm-cache\_logs\2021-04-14T19_24_31_246Z-debug.log ```

Configuration

nightwatch.json

```js // Autogenerated by Nightwatch // Refer to the online docs for more details: https://nightwatchjs.org/gettingstarted/configuration/ const Services = {}; const path = require('path'); const downloadsChromePath = path.resolve('downloads_chrome'); const downloadsFirefoxPath = path.resolve('downloads_firefox'); loadServices(); module.exports = { // An array of folders (excluding subfolders) where your tests are located; // if this is not specified, the test source must be passed as the second argument to the test runner. //src_folders: ['./tests'], // See https://nightwatchjs.org/guide/working-with-page-objects/ page_objects_path: './pages', // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-commands custom_commands_path: './commands', // See https://nightwatchjs.org/guide/extending-nightwatch/#writing-custom-assertions custom_assertions_path: './assertions', // See https://nightwatchjs.org/guide/#external-globals globals_path: './globals/globalsModule.js', skip_testcases_on_fail: false, output_folder: './reports/junit', webdriver: { start_process: true }, live_output: true, disable_error_log: false, parallel_process_delay: 1000, test_settings: { default: { skiptags: 'firefox', screenshots: { enabled: true, path: 'screens_chrome', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'chrome', chromeOptions: { prefs : { download: { prompt_for_download: false, default_directory: downloadsChromePath }, profile: { default_content_setting_values : { automatic_downloads: 1 } } }, args: [] } }, webdriver: { port: 9515, server_path: Services.chromedriver ? Services.chromedriver.path : '', cli_args: [] } }, firefox: { skiptags: 'chrome', screenshots: { enabled: true, path: 'screens_firefox', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'firefox', alwaysMatch: { 'moz:firefoxOptions': { prefs : { "browser.helperApps.neverAsk.saveToDisk": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "browser.download.folderList": 2, "browser.download.dir": downloadsFirefoxPath, "browser.download.lastDir": downloadsFirefoxPath }, args: [] } } }, webdriver: { port: 4444, server_path: Services.geckodriver ? Services.geckodriver.path : '', cli_args: [] } }, firefox_cli: { skiptags: 'chrome', screenshots: { enabled: true, path: 'screens_firefox', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'firefox', alwaysMatch: { 'moz:firefoxOptions': { prefs : { "browser.helperApps.neverAsk.saveToDisk": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "browser.download.folderList": 2, "browser.download.dir": downloadsFirefoxPath, "browser.download.lastDir": downloadsFirefoxPath }, args: [ '-headless' ] } } }, webdriver: { port: 4444, server_path: Services.geckodriver ? Services.geckodriver.path : '', cli_args: [] } }, chrome: { skiptags: 'firefox', screenshots: { enabled: true, path: 'screens_chrome', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'chrome', chromeOptions: { prefs : { download: { prompt_for_download: false, default_directory: downloadsChromePath }, profile: { default_content_setting_values : { automatic_downloads: 1 } } }, args: [] } }, webdriver: { port: 9515, server_path: Services.chromedriver ? Services.chromedriver.path : '', cli_args: [] } }, chrome_cli: { skiptags: 'firefox', screenshots: { enabled: true, path: 'screens_chrome', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'chrome', chromeOptions: { prefs : { download: { prompt_for_download: false, default_directory: downloadsChromePath }, profile: { default_content_setting_values : { automatic_downloads: 1 } } }, args: [ '--headless' ] } }, webdriver: { port: 9515, server_path: Services.chromedriver ? Services.chromedriver.path : '', cli_args: [] } }, chrome_networkTraffic: { screenshots: { enabled: true, path: 'screens_chrome', on_failure: true, on_error: true }, desiredCapabilities: { browserName: 'chrome', chromeOptions: { args: [ '--ignore-certificate-errors', ] }, // browsermob-proxy proxy: { proxyType: 'manual', sslProxy: 'localhost' }, }, webdriver: { port: 9515, server_path: Services.chromedriver ? Services.chromedriver.path : '', cli_args: [] } } } }; function loadServices() { try { Services.seleniumServer = require('selenium-server'); } catch (err) { } try { Services.chromedriver = require('chromedriver'); } catch (err) { } try { Services.geckodriver = require('geckodriver'); } catch (err) { } } ```

Your Environment

No screenshots are made after above test.

Executable Version
nightwatch --version 1.4.2
Browser driver Version
NAME VERSION
OS Version
Windows 10 1607
NAME VERSION
mkelly2000 commented 3 years ago

I'll add my same comment here as this seems similar to the other request

To take screenshots for each failed test cases you need to close the browser session after it fails (this is why the last test case takes the screenshot) Im not sure if this will solve all your issues above but should take at least 1 screenshot for each case

afterEach: function(browser) { browser.end(); },

beatfactor commented 3 years ago

This would be handled as well if #2645 is implemented. You do not need to call browser.end() in afterEach, unless you disable closing the session on failure (by setting end_session_on_fail to true). See also my comment on #2402.